NEAR localnet部署合约需多次重试且频繁交易过期如何解决?
本地NEAR测试链部署合约交易过期问题解决方案
我们搭建了一条运行在本地计算机上的测试链,启动的链包含4个验证节点(与
localnet高度相似),我们在该链上部署智能合约,测试链的各类功能,包括失败交易、异步收据、参数编码、日志等内容。
我部署合约时,总是需要重试2到3次才能让交易成功执行,更严重的是,约33%的情况下,我会达到重试上限,收到Transaction Expired错误。
所有服务都运行在我本地计算机上,部署合约时也是链上唯一的交易,不存在网络拥堵(实际上完全没有其他流量),所以需要这么多次重试非常奇怪。
请问如何实现无需重试即可立即成功部署合约,且完全不会出现交易过期的问题?
- 调整交易有效期参数
NEAR协议默认交易的有效区块高度范围为当前链上高度+10个区块,你可以在构造交易时主动拉长这个阈值:- 若使用
near-cli部署,添加参数--expiry 50即可将有效期提升到50个区块 - 若使用
near-api-js等SDK部署,构造交易时自定义expires_in参数为对应区块数即可
本地测试链不存在公链的重放攻击风险,即使设置到100个区块也不会有安全问题。
- 若使用
- 固定RPC请求目标
如果你在客户端配置了多个本地验证节点的RPC地址轮询,很可能会请求到同步落后的节点,拿到旧的区块高度/区块哈希构造交易,导致交易的有效起始高度本身就低于链上实际高度,有效期被提前耗尽。直接固定请求单个出块节点的RPC端口即可解决该问题。 - 优化本地测试链出块配置
4节点验证集群的BFT法定人数为3,需要保证所有节点的网络连通正常、无CPU/内存资源限制:- 将出块间隔调整为1s,和官方
localnet配置对齐,不要使用主网的3s出块参数 - 关闭状态同步、历史数据归档等非必要功能,降低节点运行负载,避免出块延迟
出块速度稳定后,交易的打包速度会明显提升,不会出现有效期到了还没被打包的情况。
- 将出块间隔调整为1s,和官方
- 修正nonce获取逻辑
不要使用本地缓存的账户nonce构造交易,每次部署前必须从链上拉取最新的nonce值,旧nonce的交易不会被节点打包,会一直挂到过期才返回错误,容易和正常的过期问题混淆。 - 拉长客户端超时时间
不要用默认的5s请求超时,将超时时间调整为和你设置的交易有效期匹配,比如设置了50个区块的有效期,就将超时时间设为60s,避免客户端提前断开连接误认为交易过期。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

