You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用HashPack与Hedera JavaScript SDK签名交易时遇TypeError错误求助

问题与解决方案

问题描述

我尝试在前端对交易进行签名,然后将签名后的字节发送到后端执行交易,但签名环节一直失败。我已经将应用与HashConnect配对并获取了signer,但签名操作始终无法成功。当前代码如下:

const transactionId = new TransactionId(AccountId.fromString(accountId));
const transaction = new TopicMessageSubmitTransaction()
    .setTopicId(id)
    .setMessage(JSON.stringify(message))
    .setTransactionId(transactionId);

const signedTransaction = await transaction.signWithSigner(signer);

运行代码时抛出以下错误:

TopicMessageSubmitTransaction.js:293 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'seconds')
at TopicMessageSubmitTransaction.freezeWith (TopicMessageSubmitTransaction.js:293:1)
at HashConnectSigner.signTransaction (signer.ts:66:1)
at TopicMessageSubmitTransaction.signWithSigner (Transaction.js:990:1)
at postReply (Thread.js:133:1)
at onSubmit (Thread.js:252:1)
at HTMLUnknownElement.callCallback (react-dom.development.js:4164:1)
at Object.invokeGuardedCallbackDev (react-dom.development.js:4213:1)
at invokeGuardedCallback (react-dom.development.js:4277:1)
at invokeGuardedCallbackAndCatchFirstError (react-dom.development.js:4291:1)
at executeDispatch (react-dom.development.js:9041:1)

问题原因

报错核心是手动创建的TransactionId缺少有效时间戳(validStart)。当交易执行freezeWith操作时,需要读取TransactionId中validStart的seconds属性,但你只传入了AccountId,导致validStart为undefined,触发类型错误。

解决方法

方法一:自动生成合法交易ID

改用SDK的TransactionId.generate()方法创建包含有效时间戳的交易ID:

const transactionId = TransactionId.generate(AccountId.fromString(accountId));
const transaction = new TopicMessageSubmitTransaction()
    .setTopicId(id)
    .setMessage(JSON.stringify(message))
    .setTransactionId(transactionId);

const signedTransaction = await transaction.signWithSigner(signer);

方法二:省略手动设置交易ID

直接跳过setTransactionId调用,TopicMessageSubmitTransaction会在内部自动生成符合要求的交易ID:

const transaction = new TopicMessageSubmitTransaction()
    .setTopicId(id)
    .setMessage(JSON.stringify(message));

const signedTransaction = await transaction.signWithSigner(signer);

额外说明

Hedera交易ID必须包含账户ID和有效起始时间戳,这是交易合法性的必要条件。手动创建时忽略时间戳会导致后续签名、冻结流程因缺少必要字段失败,使用generate()方法可确保生成合规的交易ID,避免此类问题。

内容的提问来源于stack exchange,提问作者Pathorn Teng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 09:57:04