Loading... ### 遇到的问题 > bsc链转账时,使用`web3j.ethSendRawTransaction()`发送交易,生成了交易hash值,但是一直没有上链,将交易签名重试了很多次,都能出现hash,但是在区块链上一直查不到。 后面发现是`nonce`重复使用了原因。下面就介绍下`nonce`的基本信息吧; `nonce`:账户随机数,在一个账户中防止重复交易提交攻击。例如一个签名交易从A到B转账1个币,如果多次将这个签名广播就会出现很多次相同的交易hash出现。 为了防止交易的重播攻击,每笔交易必须有一个`nonce`随机数,针对每一个账户`nonce`都是从0开始的,当上一个`nonce`交易处理完过后,才会处理另外一个大于上一次nonce的交易。 <div class="tip inlineBlock share"> 1. 当`nonce`太小,交易会直接被拒绝。 2. 当`nonce`太大,交易会一直处于队列之中,这就是为什么有些交易一直处于pending状态的原因。 3. 当发送一个比较大的`nonce`值,然后补齐开始`nonce`到那个值之间的`nonce`,那么交易依旧可以被执行。 4. 当交易处于queue中时停止geth客户端,那么交易queue中的叫会被清除掉。 </div> 基于eth的源码addTx()首先调用add()将交易添加到交易池pool,如果成功,则调用promoteExecutables()函数去执行交易。promoteExecutables()函数会手机到所有可执行交易并且执行它们。 `pool.pendingState.GetNonce(addr)`会得到和地址addr相关的nonce范围N,N=len(addr.nonces)+addr.netart。其实就是等于该地址已经发送成功的交易个数。所以nonce值设置多少?最好的方案就是设置成账户的交易笔数+1。账户交易笔数可以通过:`web3j.ethGetTransactionCount(address, DefaultBlockParameterName.PENDING)`获取。 **如果要在for循环里同时发起多笔交易,因为当前交易尚没有被处理成功,所以通过上述方法得到的Nonce将会与上一次交易的Nonce相同,如果这笔交易的Gas比上次交易大,则会替换上次交易,否则将会报如下错误:** ```java transaction failed,info:replacement transaction underpriced ``` 所以通过这种机制 metamask就可以实现加速交易这种功能,将上一次使用过的nonce重新签名,将gas费调高。 最后修改:2022 年 01 月 27 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 1 社会很单纯~复杂滴是人呐~谁能在乎我呀
2 条评论
bsc合约怎么转账
这个可以先了解下web3,https://web3.tryblockchain.org/