Mining
只能更改header的額外數據來探勘一個新塊嗎?
修復 ’
nonce
’ 和 ’mixDigest
’,只更改 ’extra
’ 來挖一個新區塊。
您可以更改任何數據以嘗試找到一個有效的區塊。如果需要,您可以更改交易的順序。礦工不這樣做的原因是因為它的效率非常低。這意味著礦工將不得不重新計算狀態根、日誌根、收據根以及標頭中的一半其他內容。相反,他們只是更改隨機數,因為它比更改整個塊更有效。
最簡單的方法是找到原始碼
func (ethash *Ethash) mine(block *types.Block, id int, seed uint64, abort chan struct{}, found chan *types.Block) { // Extract some data from the header var ( header = block.Header() hash = ethash.SealHash(header).Bytes() target = new(big.Int).Div(two256, header.Difficulty) number = header.Number.Uint64() dataset = ethash.dataset(number, false) )
獲取塊頭並選擇用於探勘的值
ethHash.sealHash(header)
在consensus.go中定義// SealHash returns the hash of a block prior to it being sealed. func (ethash *Ethash) SealHash(header *types.Header) (hash common.Hash) { hasher := sha3.NewKeccak256() rlp.Encode(hasher, []interface{}{ header.ParentHash, header.UncleHash, header.Coinbase, header.Root, header.TxHash, header.ReceiptHash, header.Bloom, header.Difficulty, header.Number, header.GasLimit, header.GasUsed, header.Time, header.Extra, }) hasher.Sum(hash[:0]) return hash }
header.Extra
也用於雜湊值因此,如果 nonce 和 mixDigest 是固定的,我們就不能改變 Extra
這是塊頭結構
type Header struct { ParentHash common.Hash `json:"parentHash" gencodec:"required"` UncleHash common.Hash `json:"sha3Uncles" gencodec:"required"` Coinbase common.Address `json:"miner" gencodec:"required"` Root common.Hash `json:"stateRoot" gencodec:"required"` TxHash common.Hash `json:"transactionsRoot" gencodec:"required"` ReceiptHash common.Hash `json:"receiptsRoot" gencodec:"required"` Bloom Bloom `json:"logsBloom" gencodec:"required"` Difficulty *big.Int `json:"difficulty" gencodec:"required"` Number *big.Int `json:"number" gencodec:"required"` GasLimit uint64 `json:"gasLimit" gencodec:"required"` GasUsed uint64 `json:"gasUsed" gencodec:"required"` Time *big.Int `json:"timestamp" gencodec:"required"` Extra []byte `json:"extraData" gencodec:"required"` MixDigest common.Hash `json:"mixHash"` Nonce BlockNonce `json:"nonce"` }
Ethahs.SealHash() 函式從塊頭中獲取所有值,除了 nonce 和 mixDigest