【区块链】区块链交易(Transaction)之nonce
【区块链】区块链交易(Transaction)之nonce
一、什么是nonce
?
-
nonce
是 发送方(账户)的交易计数器,表示该账户已经发送的交易数量。 -
以太坊使用
nonce
来防止双重支付(double spending
) 和重放攻击(replay attacks)
。 -
从 0 开始,每次交易都会增加 1。
-
交易必须按 nonce 顺序被区块链确认,否则会被拒绝。
二、为什么需要nonce
?
- 防止交易重复:交易的
nonce
唯一地标识该交易,如果使用相同的nonce
发送多个交易,只有一个会被确认。 - 确保交易顺序:如果你发送多个交易,但 nonce 乱了,较大的 nonce 交易会被卡住,直到前面的 nonce 交易被确认。
- 手动指定 nonce 以替换(Replace-by-Fee, RBF):如果交易卡住了,你可以用相同
nonce
发送一笔新的交易,并 提高 gas费,来加快交易速度。
三、如何获取 nonce
?
Future<int> getNonce(String address) async {final EthereumAddress ethAddress = EthereumAddress.fromHex(address);int nonce = await web3Client.getTransactionCount(ethAddress);print("当前 nonce: $nonce");return nonce;
}
说明:
如果是公司项目,这里面构建交易相关的信息,可以交给服务端获取,然后返给APP端, 这样做的好处是方便以后的扩展。
四、什么时候需要手动指定 nonce?
- 如果你同时发送多个交易 - 你可能需要手动管理 nonce,确保它们按顺序执行。
- 如果你要替换一笔交易(提高 Gas 费) - 你可以用相同 nonce 发送新交易,矿工会优先打包 Gas 费更高 的交易。
示例:
Transaction newTransaction = Transaction(nonce: previousNonce, // 用相同的 noncegasPrice: EtherAmount.inWei(BigInt.from(50000000000)), // 提高 Gas 费...
);
五、总结
nonce
是交易计数器,防止重复和乱序执行。- 可以用
getTransactionCount()
获取当前nonce
。 - 默认情况下
web3dart
会自动计算nonce
,但可以手动设置。 - 如果想要加速交易,可以用相同
nonce
发送新交易,并提高 Gas 费。
六、关于作者(ZFJ_张福杰)
- 官网:https://zfjsafe.com
- 博客:https://zfj1128.blog.csdn.net
- Github:https://github.com/zfjsyqk
- Gitee:https://gitee.com/zfj1128
- 打赏:https://zfjsafe.com/paycode