[區塊鏈]2 以太坊 geth dev模式、互動console、有交易挖礦、自動挖礦
前言
上節我們講了基於ubuntu geth搭建以太坊私有鏈,並以dev方式啟動。什麼是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: <nil> DAOSupport: false EIP150: 0 EIP155: 0 EIP158: 0 Byzantium: 0 Constantinople: <nil> 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
互動concole
執行上述 geth啟動明後,會停留在一個互動介面上如下圖:
可以在> 後輸入支援的命令 如eth.blockNumber 檢視去看高度
dev挖礦
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 次交易?這個不用擔心,後面會講到另外一種模式。
dev 之自動挖礦
上述啟動是在有交易才挖礦,我們通過改變引數,可以自動挖礦。此引數預設為 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 命令來停止挖礦。