在我们发布eth智能合约后希望可以同时转账多笔代币,又不希望将群发币写入智能合约,所以只能手动写web3脚本交易,当我们测试geth接口在一个交易失败问题后,之后的交易都将阻塞,也无法看到pendding状态,最终他们将被取消。最后发现交易设置了相同nonce。 什么是nonce?nonce有两个意义在以太坊官方: 要求: 如之前提到的,我们因为发送交易设置相同的nonce,导致了重复计数错误,为了解释原因让我们先了解以太坊交易流程和pending状态: 以太坊交易过程 用户将一笔交易发送到一个以太坊节点 这个以太坊节点将交易转发给其它挖矿的节点 挖矿的节点收到交易后将交易放入txpool(交易池) 所有挖矿节点都在txpool中选择gas价高者,做成交易块,然后运算块的hash 若干个节点中的一个幸运儿运算出来hash,并交该块广播给其它节点验证 其它节点验证通过,在txpool中删除上链交易 交易的pending状态:当一笔交易已经被转发到大多数的挖矿节点的txpool时候 在循环发送交易时候累加nonce,在自己服务其记录发送到多少nonce 通过getBlockByNumber获得正在pending的块,便利所有交易,找到合适的nonce,运算量较大 增强自己以太坊节点查找整个txpool而不是pending block,有一个github的话题在谈论这个问题,并有一个非标准的api parity_nextNonce,也有正在讨论重新定义pendding对另外几个JSON-rpc方法,也包括txpool。 无法解决问题中间如果有交易失败无法监控,因为只有补全间隔才能继续交易。 区块链以太坊 赞2收藏3 分享 阅读 15.4k更新于 2018-05-12 sawyerLi 187 声望12 粉丝 前端工程师,会用点node,用vue,react写过点东西,最近看看区块链。 关注作者 (责任编辑:) |