kann nur die zusätzlichen Daten des Headers ändern, um einen neuen Block abzubauen? [geschlossen]

Korrigieren Sie „ nonce“ und „ mixDigest“, ändern Sie nur „ extra“, um einen neuen Block abzubauen.

Ich habe keine Ahnung, was Sie wollen :D Könnten Sie Ihre Frage präzisieren und Ihr Problem beschreiben? Meinst du das input dataFeld? Das nonceFeld dort geändert werden. Das ist sein Zweck.

Antworten (2)

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.Extrawird 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