在上一篇文章中,我们介绍了以太坊geth节点的基本操作。在本文中,我们将向您展示如何在不同环境下构建geth服务、相关配置和操作流程。
开发模式启动
开发模式,也叫回归测试模式,主要用于为开发者提供一个方便的开发和测试环境。这样我们就可以轻松获取以太币,方便发起交易,交易快速打包,节省时间,方便验证;并且我们也可以使用 dev 模式来测试块隔离的场景。 dev模式的启动与上一篇文章中提到的启动命令不同。下面我们就来详细看看吧。
默认开启开发模式
--dev 使用POA共识网络,默认预分配一个开发者账户并且会自动开启挖矿。
启动dev模式其实很简单,只要在我们之前内容的命令后面加上-dev即可。
>./geth --datadir /Users/zzs/develop/eth/geth/data-test --rpc --rpcapi "db,eth,net,web3,miner,personal" -dev
这就启动了dev模式,我们来看看启动日志信息:
WARN [04-02|09:04:34] No etherbase set and no accounts found as default
INFO [04-02|09:04:35] Using developer account address=0xADCE6e0E1eE491e7c1945e76d3dc5975418C4e45
INFO [04-02|09:04:35] Starting peer-to-peer node instance=Geth/v1.7.3-stable-4bb3c89d/darwin-amd64/go1.9.2
INFO [04-02|09:04:35] Allocated cache and file handles database=/Users/zzs/develop/eth/geth/data-test/geth/chaindata cache=128 handles=1024
INFO [04-02|09:04:35] Writing custom genesis block
INFO [04-02|09:04:35] Initialised chain configuration config="{ChainID: 1337 Homestead: 0 DAO: DAOSupport: false EIP150: 0 EIP155: 0 EIP158: 0 Byzantium: 0 Engine: clique}"
INFO [04-02|09:04:35] Initialising Ethereum protocol versions="[63 62]" network=1
INFO [04-02|09:04:35] Loaded most recent local header number=0 hash=419c07…e277dd td=1
INFO [04-02|09:04:35] Loaded most recent local full block number=0 hash=419c07…e277dd td=1
INFO [04-02|09:04:35] Loaded most recent local fast block number=0 hash=419c07…e277dd td=1
INFO [04-02|09:04:35] Regenerated local transaction journal transactions=0 accounts=0
INFO [04-02|09:04:35] Starting P2P networking
INFO [04-02|09:04:35] started whisper v.5.0
INFO [04-02|09:04:35] RLPx listener up self="enode://e630c712e4c2f52f4d535a9ded1c7489a579abea4420753e4d6a899736ed512a4858684e24457484d61d3093a9b1882cc3d11e92241e1f91a1300f9aa117f671@[::]:52275?discport=0"
INFO [04-02|09:04:35] IPC endpoint opened: /Users/zzs/develop/eth/geth/data-test/geth.ipc
INFO [04-02|09:04:35] HTTP endpoint opened: http://127.0.0.1:8545
INFO [04-02|09:04:35] Transaction pool price threshold updated price=18000000000
INFO [04-02|09:04:35] Starting mining operation
INFO [04-02|09:04:35] Commit new mining work number=1 txs=0 uncles=0 elapsed=69.581µs
WARN [04-02|09:04:35] Block sealing failed err="waiting for transactions"
INFO [04-02|09:04:38] Mapped network port proto=tcp extport=52275 intport=52275 interface="UPNP IGDv1-IP1"
从日志中可以看到,在dev模式下,启动节点后以太同步数据库多大,会默认提供一个开发者账号:45,这个账号会作为当前账号使用,还有对应的加密私钥文件在目录中。
实践经验
默认启动模式在当前版本中有点混乱,但请相信 geth 开发人员首先是友好的。启动节点后,指定miner.start()命令不会返回true进行挖矿。
> miner.start()
null
这是每个人都经常问的问题,为什么?实际上,默认模式dev启动的时候,已经开启了挖矿,所以再次执行挖矿命令时,会返回null。下面是挖矿命令对应的源码,也就是说无论挖矿成功与否,都会返回null。
func (s *Ethereum) StartMining(local bool) error {
eb, err := s.Etherbase()
if err != nil {
log.Error("Cannot start mining without etherbase", "err", err)
return fmt.Errorf("etherbase missing: %v", err)
}
if clique, ok := s.engine.(*clique.Clique); ok {
wallet, err := s.accountManager.Find(accounts.Account{Address: eb})
if wallet == nil || err != nil {
log.Error("Etherbase account unavailable locally", "err", err)
return fmt.Errorf("signer missing: %v", err)
}
clique.Authorize(eb, wallet.SignHash)
}
if local {
// If local (CPU) mining is started, we can disable the transaction rejection
// mechanism introduced to speed sync times. CPU mining on mainnet is ludicrous
// so noone will ever hit this path, whereas marking sync done on CPU mining
// will ensure that private networks work in single miner mode too.
atomic.StoreUint32(&s.protocolManager.acceptTxs, 1)
}
go s.miner.Start(eb)
return nil
}
交易模式
再次查看启动日志中的这一行:
WARN [04-02|09:04:35] Block sealing failed err="waiting for transactions"
这是什么?这是默认启用的开发模式的功能之一。为了给测试环境提供更友好的操作,geth节点的开发者:你发交易我只会挖矿打包。如果交易没有发送,我不会挖矿和打包。是不是很方便,不用被一些没有交易的区块筛选?
但是这种模式有一个缺点,就是发送一笔交易想要多次确认是不是很费力,而且后面还需要发送N笔交易?这个不用担心,后面会讨论另一种模式。
实践经验
有同学又问了,我想用这种模式发起交易以太同步数据库多大,但是没有ether怎么办?因为以太币只有在发起交易后才能开采,而发起交易需要以太币。这不是形成无限循环吗?对于这个问题,别着急,geth节点已经为你想好了,我们来看看开发者账户的余额:
> eth.getBalance("0xadce6e0e1ee491e7c1945e76d3dc5975418c4e45")
1.15792089237316195423570985008687907853269984665640564039457584007913129639927e+77
看看里面是否有足够的以太? !
开发者的自动挖掘
在官方文档中,我们可以看到以下参数。该参数默认为0,也就是上面提到的被动挖矿模式。仅当待处理的交易到达时才执行挖掘。同时它还有一个参数值1。主动挖矿。
--dev.period value 开发者模式下挖矿周期 (0 = 有pending状态交易时进行挖矿) (默认: 0)
启动命令如下:
>./geth --datadir /Users/zzs/develop/eth/geth/data-test --rpc --rpcapi "db,eth,net,web3,miner,personal" -dev --dev.period 1
这将回到常见的疯狂挖矿模式。当然,此时你仍然可以执行停止命令停止挖矿。以下是挖矿时的日志输出:
INFO [04-02|09:33:59] Starting mining operation
INFO [04-02|09:33:59] Commit new mining work number=1 txs=0 uncles=0 elapsed=103.436µs
INFO [04-02|09:33:59] Successfully sealed new block number=1 hash=3fe3df…3a0a53
INFO [04-02|09:33:59]
挖矿网Ethos中文站简单易用的挖矿系统,为挖矿产业提供教程软件以及矿机测评交易信息等,挖矿网各种数字货币挖矿收益对比计算,挖矿网介绍挖矿的工具,以及矿场的最新消息等。http://www.ethospool.com/