在咱们发布eth智能合约后但愿能够同时转帐多笔代币,又不但愿将群发币写入智能合约,因此只能手动写web3脚本交易,当咱们测试geth接口在一个交易失败问题后,以后的交易都将阻塞,也没法看到pendding状态,最终他们将被取消。最后发现交易设置了相同nonce。git
nonce有两个意义在以太坊官方:
1.工做量证实:为了证实工做量的无心义的值,这是采矿的本质,这个值将决定采矿的难度,
2.帐户的随机数:在一个帐户中的防止多重交易的用途。例如一个交易从A到B 20个币,可能从A到B发送屡次。github
要求:
以太坊要求一个帐户的每笔交易有一个连续的计数。每一个节点将根据计数顺序严格执行来自一个用户的交易。
错误:
重复的计数:若是咱们发送一笔交易设置一个等于或者小于121的计数交易,节点将拒绝它。
间隔:若是咱们发送一个新的交易123或者更高,交易将不被执行直到间隔交易成功,也就是122成功执行。web
如以前提到的,咱们由于发送交易设置相同的nonce,致使了重复计数错误,为了解释缘由让咱们先了解以太坊交易流程和pending状态:api
以太坊交易过程测试
交易的pending状态:当一笔交易已经被转发到大多数的挖矿节点的txpool时候
获取当前nonce方法web3.eth.getTransactionCount: 获取已完成区块中的该帐号最后的nonce
结论:因此错误缘由已经浮出水面了,若是有处于pending中的交易正在挖矿节点的txpool中,web3.eth.getTransactionCount只能获取成功区块的最后nonce而不能获取txpool的最后的nonce,因此当使用getTransactionCount方法将致使发送一样的nonce号给挖矿节点。这时已经已在节点中的大于或者等于该nonce的交易将被取消。接口
中间若是有交易失败没法监控,由于只有补全间隔才能继续交易。rpc