上节我们讲了基于ubuntu geth搭建以太坊私有链,并以dev方式启动。什么是dev模式?有什么特点本节我们探讨。
dev 模式,也叫回归测试模式,主要用来给开发人员提供一个方便的开发测试环境。
在dev模式下,可以轻松的获得以太币,方便发起交易,交易也会被快速的打包,节省时间方便验证。
先来看看dev 启动命令
geth --networkid 15 --dev --rpc --rpcapi "db,eth,net,web3,miner,personal" console 2>>log
查看启动log,在 dev 模式下,启动节点后,系统默认提供一个开发者账号:address=0xD7Ec36444D13Cc079eB116B4f2602CFfCDc9aDEE,这个账号会作为当前的 coinbase 账号,在 keystore 目录下也有对应的加密私钥文件。
Sanitizing cache to Go's GC limits provided=1024 updated=656
INFO [10-18|10:56:44.569] Maximum peer count ETH=25 LES=0 total=25
INFO [10-18|10:56:47.682] Using developer account address=0xD7Ec36444D13Cc079eB116B4f2602CFfCDc9aDEE
INFO [10-18|10:56:47.682] Starting peer-to-peer node instance=Geth/v1.8.17-stable-8bbe7207/linux-amd64/go1.10
INFO [10-18|10:56:47.682] Writing custom genesis block
INFO [10-18|10:56:47.684] Persisted trie from memory database nodes=12 size=1.79kB time=61.278µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [10-18|10:56:47.684] Initialised chain configuration config="{ChainID: 1337 Homestead: 0 DAO: DAOSupport: false EIP150: 0 EIP155: 0 EIP158: 0 Byzantium: 0 Constantinople: Engine: clique}"
INFO [10-18|10:56:47.685] Initialising Ethereum protocol versions="[63 62]" network=15
INFO [10-18|10:56:47.685] Loaded most recent local header number=0 hash=478c38…cd8659 td=1 age=49y6mo2d
INFO [10-18|10:56:47.685] Loaded most recent local full block number=0 hash=478c38…cd8659 td=1 age=49y6mo2d
INFO [10-18|10:56:47.685] Loaded most recent local fast block number=0 hash=478c38…cd8659 td=1 age=49y6mo2d
INFO [10-18|10:56:47.686] Stored checkpoint snapshot to disk number=0 hash=478c38…cd8659
INFO [10-18|10:56:47.685] Starting P2P networking
INFO [10-18|10:56:47.686] started whisper v.6.0
INFO [10-18|10:56:47.688] IPC endpoint opened url=/tmp/geth.ipc
INFO [10-18|10:56:47.689] HTTP endpoint opened url=http://127.0.0.1:8545 cors= vhosts=localhost
INFO [10-18|10:56:47.689] Transaction pool price threshold updated price=1000000000
INFO [10-18|10:56:47.689] Transaction pool price threshold updated price=1
INFO [10-18|10:56:47.689] Etherbase automatically configured address=0xD7Ec36444D13Cc079eB116B4f2602CFfCDc9aDEE
INFO [10-18|10:56:47.690] Commit new mining work number=1 sealhash=c1009a…5452e3 uncles=0 txs=0 gas=0 fees=0 elapsed=120.442µs
INFO [10-18|10:56:47.690] Sealing paused, waiting for transactions
执行上述 geth启动明后,会停留在一个交互界面上如下图:
可以在> 后输入支持的命令 如eth.blockNumber 查看去看高度
dev启动有一些令人迷惑的地方,在 dev 默认模式启动的情况下,已经开启了挖矿,因此当再执行挖矿命令时会返回 null。也就是很多朋友问的为何执行 miner.start() null
> miner.start()
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
}
大家注意,log中最后一条
INFO [10-18|10:56:47.690] Sealing paused, waiting for transactions
这就是默认启动 dev 模式的一个特性。geth 节点的开发者为了给测试环境提供一个更友好的操作:只有发过来交易,系统才会挖矿打包,如果未发送交易过来,就不会去挖矿打包。这样不用被一些并没有交易的区块刷屏了。
但是此模式有一个弊端,我们知道发送一笔交易想让它被确认多次才算成功,如果没交易不挖矿岂不是确认过程很费劲,还需要再在后面发送 N 次交易?这个不用担心,后面会讲到另外一种模式。
上述启动是在有交易才挖矿,我们通过改变参数,可以自动挖矿。此参数默认为 0,也就是上面讲的被动挖矿的模式,当有 pending 交易到来才进行挖矿,同时它还有一个参数值 1,主动挖矿。
--dev.period value 开发者模式下挖矿周期 (0 = 有pending状态交易时进行挖矿) (默认: 0)
此时启动命令如下:
geth --networkid 15 --dev --dev.period 1 --rpc --rpcapi "db,eth,net,web3,miner,personal" console 2>>log
这样就回到常见的自动挖矿的模式了,我们可以执行 stop 命令来停止挖矿。