我们常在开发实体项目对接过程中会使用web3来进行链上操作。
收集了一些常见问题,以免大家重复性的造轮子。
1.版本兼容
这是一个常见问题了,各个语言库都会有这个问题。推荐大家跟踪github最新版代码及文档。同时网上找到的案例进行部分接收与文档进行对应。
[1.0 文档] (https://web3js.readthedocs.io/en/1.0/web3-eth.html)
[github] (https://github.com/ethereum/web3.js)
请注意,大家经常会搜寻到文档在github中的wiki
这个版本是0.2x.x!
2.账户有余额
转账费使用GAS支付。也就是账户必须要有ETH。
GAS 为以太坊网络中常用的支付单位。可以认为是“¥”的概念。
PS:无论转账是成功还是失败,都需要支付计算费用。即使失败,节点也验证并执行了交易(计算),因此必须和成功执行支付一样的费用。
每次转账花费的gas = gasPrice * gasLimit。
gasPrice 为每份gas的价格。gasLimit 为你为这笔转账最多愿意花费多少gas。
其中gasPrice越高,转账就越快,因为矿工更愿意优先进行计算。
在这个网站可以查看现在网络上成功的gasPrice参数等。
3.nonce 参数
关于报错交易取消等,必须了解nonce参数。
nonce 是指转账时,该地址进行了多少次转账。从0开始计数,每次加1。
每次交易时要提供本次使用的nonce值。可以使用getTransactionCount函数来获取当前进行了多少次转账。
需要注意的几个问题:
1.如果本次发送请求时填写的nonce偏大(大于当前地址转账次数),则该笔交易为untrack状态,直到nonce-1被执行才会顺序执行到当次nonce。
2.当nonce过小(小于当前地址转账次数),报错且交易会被拒绝,转账失败。
3.当交易处于queue中时停止geth客户端,那么交易queue中的交易会被清除掉。
4.如果一笔交易在等待中,可以用此地址重新发起一笔交易,保持nonce一致。如果手续费高于原来的交易,那么第一笔交易会被覆盖,如果低于原来的交易,那么会发生异常。用这个原理我们可以用给自己发起一笔0的转账,可以取消同nonce的值。
5.使用getTransactionCount获取到的交易数量为已经完成的交易数量。而padding中的交易因为并未发出,所以会发出同一个nonce,往往会导致转账失败,原因同上。
4.不同网络的错误提示
ropsten和mainnet 相同接口返回的错误消息略有区别。非常重要的提示!
5.获取事务及状态
只要发送成功,使用getTransaction
会获取该transactionHash
对应的事务,但是要获取该事务的状态要使用getTransactionReceipt
返回值中有status
字段。