1. 程式人生 > >[區塊鏈]2 以太坊 geth dev模式、互動console、有交易挖礦、自動挖礦

[區塊鏈]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 命令來停止挖礦。