区块链 之 以太坊的那些坑
Posted 祁峰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区块链 之 以太坊的那些坑相关的知识,希望对你有一定的参考价值。
- 作者:邹祁峰
- 邮箱:Qifeng.zou.job@hotmail.com
- 博客:http://blog.csdn.net/qifengzou
- 日期:2018.04.04
- 转载请注明来自"祁峰"的CSDN博客
使用以太坊的过程中遇到不少坑,团队成员花了不少时间去研究才找到其中的真正原因.希望此篇能为各位在学习以太坊的过程中少走一些弯路.
主题 | 描述 |
---|---|
问题描述 | 编译以太坊源码时, 出现常量超过int64的表示范围 |
问题原因 | go版本过低. |
解决方案 | 升级go版本 >= 1.9.2 |
问题描述 | 在某个节点上提交的交易无法同步到私链上的其他节点. |
问题原因 | 以太坊的版本过低. |
解决方案 | 升级版本到1.8及以上版本. |
问题描述 | 一个账号同时在多个终端(各类钱包、console、truffle等)上提交交易请求, 出现交易在pending中堆积,一直无法被处理. |
问题原因 | nonce值乱序造成的。从0开始计数,发送一笔nonce对应加1。当前面的nonce处理完成之后才会处理后面的nonce。 ● 当nonce太小(小于之前已经有交易使用的nonce值),交易会被直接拒绝。 ● 当nonce太大,交易会一直处于队列之中,这也就是导致我们上面描述的问题的原因; ● 当发送一个比较大的nonce值,然后补齐开始nonce到那个值之间的nonce,那么交易依旧可以被执行。 ● 当交易处于queue中时停止geth客户端,那么交易queue中的交易会被清除掉。 |
解决方案 | 避免以上操作情况。 |
问题描述 | 账号发起交易时出现如下错误信息: error: replacement transaction underpriced |
问题原因 | nonce值问题。 该账号Ethereum客户端中已经有一币处于pending状态的交易。 新的一笔交易拥有pending状态交易相同的nonce值。新的交易的gas price太小,无法覆盖pending状态的交易。 |
解决方案 | 通常情况下,覆盖掉一笔处于pending状态的交易gas price需要高于原交易的110%。 有效管理nonce值递增。 |
问题描述 | 查看以太坊平台日志中出现如下错误信息: Failed RLPx handshake |
问题原因 | 当前节点admin.peers列表的节点不存在或已结束运行. 注:当前节点admin.peers列表可通过static-nodes.json或admin.addPeer()加入. |
解决方案 | 检查admin.peers中的节点是否不存在或已结束运行. |
问题描述 | 共识算法选择POA时, 配置文件coinbase为一个非0值. 启动以太坊节点后, 出现如下提示: "beneficiary in checkpoint block non-zero". |
问题原因 | 共识算法为POA时, 配置文件中字段coinbase必须为:0x0000000000000000000000000000000000000000, 否则出现问题描述中的异常情况. |
解决方案 | 将字段coinbase设置为: 0x0000000000000000000000000000000000000000 |
问题描述 | 使用Go语言调用智能合约转账(如:"代币")时, 程序提示"gas required exceeds allowance or always failing transaction". |
问题原因 | 设置的交易Gas不足. |
解决方案 | 提交交易前, 将Tranasctor.GasLimit设置为一个较大的值. 但该值又"不能大于"配置文件gensis.json中的gasLimit字段的值. 正确代码如下所示:
|
问题描述 | 使用Go语言调用智能合约进行"以太币"转账时, 却提示失败. 以太坊节点日志信息如下: VM returned with error err="evm: execution reverted". |
问题原因 | 字段Transactor.Value指明授予智能合约动用该账户以太币的最大值. 如果智能合约动用的以太币数量超过Transactor.Value的值, 则会报错. |
解决方案 | 提交交易前, 需将Transactor.Value设置为一个合理值. 正确代码如下: 另外:我们当前的comm.GAS_LIMIT值设置为"0x2DC6C0",comm.GAS_VALUE为"0x52b7d2dcc80cd400000000"。 |
问题描述 | 以太坊日志中出现如下错误信息: Ethereum handshake failed id=7c0a7fc6b6ceee92 conn=staticdial err="Genesis block mismatch - 7fcd7cd9578a5e2c (!= 6c364b3b9143c1eb) |
问题原因 | 节点加入到私链集群时会进行握手操作, 而握手的过程会对配置文件的MD5值进行校验, 只有校验通过后, 才能将节点加入到机群中. 如果发现MD5值不一致, 则会出现问题描述中的异常. |
解决方案 | 私链中的所有节点必须使用完全一致的配置. |
以上是关于区块链 之 以太坊的那些坑的主要内容,如果未能解决你的问题,请参考以下文章