区块链 之 以太坊的那些坑

 

  • 作者:邹祁峰
  • 邮箱:[email protected]
  • 博客: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值不一致, 则会出现问题描述中的异常. 

解决方案  私链中的所有节点必须使用完全一致的配置.

你可能感兴趣的:(区块链)