以太坊挖礦返回null原始碼分析

2021-08-17 07:29:25 字數 2692 閱讀 6826

在以太坊版本1.7.3中,無論是dev環境或是公鏈環境在console中執行miner.start()始終返回null,而不是期待的true。這是為什麼呢?這篇文章就帶大家從原始碼中找找原因。在這個過程中我們會了解到更多底層的知識。

首先看一下呼叫挖礦的程式,在console中我們執行的是:

miner.start()

##或miner.start(n)

其中引數n是系統cpu的核心數。在go語言中對應的方法是:

miner.start(threads *rpc.hexnumber) (bool, error)
此方法對應的api呼叫在eth/api.go檔案中,具體**如下:

// start the miner with the given number

of threads. if threads is nil the number

// of workers started is equal to the number

of logical cpus that are usable by

// this process. if mining is already running, this method adjust the number

of// threads allowed to use.

func (api *privateminerapi) start(threads *int) error else

if *threads == 0

type threaded inte***ce

if th, ok := api.e.engine.(threaded); ok

// start the miner and return

if !api.e.ismining()

return nil

}

通過此段**我們可以分析得知以下內容:

- 挖礦時傳遞的引數為系統cpu的核心數,可指定,如果未指定則預設按照系統的核心數。

- 如果已經在挖礦中,再執行挖礦程式可更改使用的cpu核心數。

- 如果系統已經在挖礦返回的結果為nil(null)。

- 如果未開始挖礦,那麼執行api.e.startmining(true)方法。

看一下api.e.startmining(true)方法對應的**內容:

func (s *ethereum) startmining(local bool) error 

if clique, ok := s.engine.(*clique.clique); ok )

if wallet == nil || err != nil

clique.authorize(eb, wallet.signhash)

}if local

go s.miner

.start(eb)

return nil

}

通過上面的**我們可以分析得出:

- 能成功挖礦的前提是需要存在有效的coinbase賬號;

- 即使成功開始挖礦(執行go s.miner.start(eb)),此方法返回的結果也是nil(null)。

因此通過,上面兩段**的分析,在此版本中無論執行挖礦成功或者執行挖礦失敗,返回的結果都是null。這也正是為什麼這個版本中通過返回值無法確定是否成功開啟了挖礦。

再進一步看看s.miner.start(eb)中的**:

func (self *miner) start(coinbase common.address) 

atomic.storeint32(&self.mining, 1)

log.info("starting mining operation")

self.worker

.start()

self.worker

.commitnewwork()

}

這段**的基本實現就是設定一些相關引數項,然後開始執行挖礦。通過這段**我們能獲得乙個判斷是否開啟挖礦的日誌資訊——「starting mining operation」,因此如果日誌中有此行輸出可以作為乙個必要不充分條件來確認已經開始挖礦。

與之相對應的stop函式就不一樣了:

// stop the miner

func (api *privateminerapi) stop() bool

if th, ok := api.e.engine.(threaded); ok

api.e.stopmining()

return

true

}

很明顯,無論stop是否執行成功,或者說無論當前是否在挖礦,只要執行stop,那麼始終會返回true。

通過上面的分析,我們獲得一些經驗和常識,同時也告訴我們在這個版本中通過呼叫miner.start()返回null並不能說明什麼,有可能已經開始挖礦,有可能沒有。

延伸閱讀:

《以太坊同步模式原始碼解析》

獲得一對一技術諮詢請掃碼加入知識星球(小密圈)

原始碼安裝以太坊 wtc

1 安裝go 先更新一下 sudo apt get update sudo apt get y upgradesudo tar xvf go1.9 2.linux amd64.tar gzsudo mv go usr local設定路徑vi etc profile export path path ...

以太坊原始碼 交易(一)

交易是區塊鏈中最基本也是最核心的乙個概念,在以太坊中,交易更是重中之重,因為以太坊是乙個智慧型合約平台,以太坊上的應用都是通過智慧型合約與區塊鏈進行互動,而智慧型合約的執行是由交易觸發的,沒有交易,智慧型合約就是一段死的 可以說在以太坊中,一切都源於交易。下面就來看看在以太坊中交易是什麼樣的,交易裡...

以太坊原始碼分析 Whisper

whisper具有以下基本特性和概念 通訊加密 每一條whisper訊息在網路上都是加密傳輸的,可以選擇非對稱加密 橢圓曲線 和對稱加密 aes gsm 兩種加密演算法之一。envelope 信封 envelope是網路中傳輸的whisper訊息的基本單位,它包含已加密的原始訊息以及訊息相關的控制資...