Mining

只能更改header的額外數據來探勘一個新塊嗎?

  • November 27, 2018

修復 ’ nonce’ 和 ’ mixDigest’,只更改 ’ extra’ 來挖一個新區塊。

您可以更改任何數據以嘗試找到一個有效的區塊。如果需要,您可以更改交易的順序。礦工不這樣做的原因是因為它的效率非常低。這意味著礦工將不得不重新計算狀態根、日誌根、收據根以及標頭中的一半其他內容。相反,他們只是更改隨機數,因為它比更改整個塊更有效。

最簡單的方法是找到原始碼

Sealer.go執行橋本算法

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

引用自:https://ethereum.stackexchange.com/questions/63129