如何延长Transaction有效期至180秒以上?求长时签名收集方案
长窗口签名收集的公认模式(Hedera交易)
我的当前策略是创建Transaction对象(比如TransferTransaction),配置必要参数,包括指定所需签名。接着冻结交易并添加本地签名,将其序列化后让用户添加自有签名,同时可以查询交易属性。
等所有签名都添加完成后执行交易,但如果没在transactionValidDuration内完成签名收集,网络会返回TRANSACTION_EXPIRED错误。
示例代码:
const transferTransaction = new TransferTransaction() .addHbarTransfer(senderAccountId, new Hbar(1)) .addHbarTransfer(receiverAccountId, new Hbar(-1)) .setNodeAccountIds(nodeId); // 冻结交易,禁止后续修改 const transaction = await transferTransaction.freezeWith(client); const signature1 = privateKeySigner1.signTransaction(transaction); // 签名者二用私钥签名交易 const signature2 = privateKeySigner2.signTransaction(transaction); // 签名者三用私钥签名交易 const signature3 = privateKeySigner3.signTransaction(transaction); const signedTransaction = transaction.addSignature(publicKey1, signature1).addSignature(publicKey2, signature2).addSignature(publicKey3, signature3);
我想知道有没有公认的签名收集模式,能支持比默认180秒更长的时间窗口?
可行的长窗口签名收集模式
1. 离线签名模板 + 动态续期
- 先创建未冻结的交易模板,只配置核心业务参数(转账金额、参与账户、节点列表等),暂不设置有效期或先设一个较长初始值
- 将模板序列化后分发给各签名者,让他们基于模板哈希完成离线签名(签名过程不绑定具体有效期和节点)
- 待所有签名收集完成后,重新冻结交易:设置符合需求的长
transactionValidDuration(比如几小时)和当前有效的节点ID,直接附加已收集的签名后提交
2. 分阶段签名 + 交易重构
- 第一阶段:创建交易并仅冻结核心结构,不绑定有效期和节点,收集所有签名后保存「公钥+签名值」的集合
- 第二阶段:提交前重新创建参数完全一致的新交易,设置长有效期并冻结,批量添加之前收集的所有签名,最后提交至网络
- 核心要求:两次交易的业务参数必须完全一致,否则签名会因哈希不匹配失效
3. 多签名账户代理
- 预先创建一个多签名账户,将目标交易的权限委托给该账户
- 先完成多签名账户的签名收集(此过程可离线进行,不受交易有效期限制)
- 后续用该多签名账户发起实际交易,只需在有效期内提交即可,签名收集的长窗口被转移到多签名账户的授权阶段
关键注意事项
- 所有签名必须基于相同的交易哈希,重构交易时核心参数不能有任何改动
- 离线签名阶段要确保签名者拿到的模板参数准确,避免后续哈希不匹配
- 长有效期会提升交易被重放的风险,建议在交易中添加唯一
transactionMemo(如UUID)标识唯一性,防止重复提交
内容的提问来源于stack exchange,提问作者Pathorn Teng
相关产品推荐
相关产品推荐

