Korrigieren Sie „ nonce
“ und „ mixDigest
“, ändern Sie nur „ extra
“, um einen neuen Block abzubauen.
Sie können beliebige Daten ändern, um zu versuchen, eine Mine als gültigen Block zu finden. Sie können die Reihenfolge der Transaktionen ändern, wenn Sie möchten. Der Grund, warum Bergleute das nicht tun, ist, weil es schrecklich ineffizient wäre. Das bedeutet, dass der Miner den State Root, Log Root, Receipt Root und die Hälfte der anderen Dinge im Header neu berechnen müsste. Stattdessen ändern sie nur die Nonce, da dies viel effizienter ist, als den gesamten Block zu ändern.
Der einfachste Weg ist, den Quellcode zu finden
Sealer.go führt den Hashimoto-Algorithmus aus
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)
)
Holen Sie sich den Block-Header und wählen Sie Werte für das Mining aus
ethHash.sealHash(header)
ist in Consensus.go definiert
// 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
wird auch für den Hashwert verwendet
Wenn also Nonce und MixDigest fixiert sind, können wir Extra nicht ändern
und hier ist die Block-Header-Struktur
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"`
}
Die Funktion Ethahs.SealHash() ruft alle Werte aus dem Blockheader ab, außer Nonce und MixDigest
Krapfen
input data
Feld? Dasnonce
Feld dort geändert werden. Das ist sein Zweck.