以太坊执行miner.start返回null

问题场景

最近技术群中的朋友经常问到这样的问题,环境搭建已经搭建好,geth节点也成功启动,可为什么当执行miner.start()方法时却没有挖矿,返回null。

其实,不仅仅这些朋友,本人在启动最新节点进行挖矿的时候也遇到类似的问题。今天就带大家分析一下引起这个问题可能的几个原因。

 

是否设置miner地址

启动节点挖矿之前,需要查看当前节点中是否已经存在账号,可执行以下命令,查看当前节点下面是否有账号存在。

>personal.listAccounts

["0xc040cbd8a189d36f580fa83c2ffe3a26fb3e6a7e", "0xe0d1de6c934049fe4847b64becff5885bdb83fa4"]

 

当确认账户已经存在时,可以设置Etherbase。先查看以下coinbase账户:

>eth.coinbase

"0xc040cbd8a189d36f580fa83c2ffe3a26fb3e6a7e"

 

通过上面的命令,可以看到coinbase的账户地址,也就是上面查看地址查到第一个地址。

执行设置miner地址:

>miner.setEtherbase(eth.coinbase)

true

 

也可以执行执行以下命令进行设置:

>miner.setEtherbase(eth.accounts[0])

true

然后,可以再执行挖矿命令,查看是否问题是否解决。

 

节点误报

另外一种情况就是其实miner.start()命令已经执行成功,只不过节点返回null。如果是dev模式,可以使用eth.blockNumber查看一下区块高度是否增加。

节点版本问题

本人安装的geth-1.7.3版本的节点,在dev环境下验证发现,当执行miner.start()时,返回null。但其实miner已经执行,只不过它在等待你发送交易之后才会生成新的区块。也就是说执行了miner.start(),它一直在等待,这是发送一笔交易,再查看区块高度发现已经增加一块。

 

以上讲解的以太坊执行miner.start返回null的解决方案,是搜罗了网上各种解决方案的汇总。但并不能有效的解决问题只有发送交易才会自动挖矿。因此,针对此问题又进行了大量资料的阅读查阅,终于找到原因和解决方案。

原因及解决方案

出现此问题的原因在于geth版本更新之后,–dev模式下新增了一个参数项:

--dev               Ephemeral proof-of-authority network with a pre-funded developer account, mining enabled
--dev.period value  Block period to use in developer mode (0 = mine only if transaction pending) (default: 0)

 

我们先看一下上面的两个参数,–dev是我们常用的参数,之前版本中我们只用使用–dev然后执行miner.start()就可以挖矿,但是在后面的版本中,当我们会发现只有发送交易了才会挖一个块。

引起此问题的原因就是新增了–dev.period value配置项。此配置默认值为0,也就是说只有有pending中的交易才会挖矿。

明白了这个参数的含义之后,解决问题就很简答了,之前的–dev参数依旧使用,然后再在后面添加–dev.period 1,注意,参数值为1,不是默认的0。

再重新启动节点,然后执行挖矿,先不管返回是否是null,执行之后,无论查看日志或执行eth.blockNumber都会发现块在不停的增高。

总结

此问题网上的资料几乎为零,只有官网的一个简单的命令说明,反而是有很多针对此问题的提问,却没有一个正确的答案。此文提到的解决方案估计少有人注意到。本人花费大量的时间查阅尝试才找到答案,如果对你有帮助,欢迎转发。感谢支持!

 

延伸阅读:[原创] 【1-4】区块链量化投资系列课程 - 动态平衡策略

免责声明:信息仅供参考,不构成投资及交易建议。投资者据此操作,风险自担。
如果觉得文章对你有用,请随意赞赏收藏
史鲁比 1人赞赏收藏
相关推荐
相关下载
登录后评论
最新评论 (2)

  • avatar
    2018-12-20 15:40:59 咪啾q-q [宽客网友]:
    咪啾q-q
    0
    文章
    0
    关注
    1
    粉丝

    请问你有用过Windows的geth搭建私有链吗?

Copyright © 2019 宽客在线