知乎专栏 | 多维度架构 |
有时我们需要将Token发送到多个地址上去。通常的做法就是使用web.js写一个循环程序,但是实际使用过程中发现这种做法存在很多问题,常会发生转账失败情况。
经过分析造成发送失败原因是,频率太高,因为web.js 是异步操作,当前程序还未完成交易,交易尚未确认的情况下第二笔交易发送出去,这时就会出错。
web3.eth.getTransactionCount(from).then(function(nonce){ // 问题就出在 nonce , nonce 如同数据库中的序列主键,如果上一个交易没有完成,下一个交易取得 nonce + 1 后与上一个 pending 的交易相同,产生冲突 }
最好的解方案是在合约中实现批量转账功能,这样需要一个交易 txhash 完成多比交易。
如果你的Token已经在使用了,且没有批量转账的功能怎么解决呢?我们可以在写一个Token 继承原来的Token,在新的 Token 中实现批量转账功能
Function: batchTransfer(address[] _to, uint256[] _value) MethodID: 0x88d695b2 [0]: 0000000000000000000000000000000000000000000000000000000000000040 [1]: 00000000000000000000000000000000000000000000000000000000000000a0 [2]: 0000000000000000000000000000000000000000000000000000000000000002 [3]: 000000000000000000000000372967130b1a7cd386348bc59de905e628e36f3a [4]: 000000000000000000000000372967130b1a7cd386348bc59de905e628e36f3b [5]: 0000000000000000000000000000000000000000000000000000000000000002 [6]: 000000000000000000000000000000000000000000000000000000000000000c [7]: 0000000000000000000000000000000000000000000000000000000000000022