¿Solo puede cambiar los datos adicionales del encabezado para extraer un nuevo bloque? [cerrado]

Corrija ' nonce' y ' mixDigest', solo cambie ' extra' para extraer un nuevo bloque.

No tengo idea de lo que quieres :D ¿Podrías especificar cuál es tu pregunta y describir tu problema? ¿Te refieres al input datacampo? El noncecampo allí para ser alterado. Ese es su propósito.

Respuestas (2)

Puede cambiar cualquier dato para tratar de encontrar una mina un bloque válido. Puede cambiar el orden de las transacciones si lo desea. La razón por la que los mineros no hacen eso es porque sería terriblemente ineficiente. Significa que el minero tendría que volver a calcular la raíz del estado, la raíz del registro, la raíz del recibo y la mitad de las otras cosas en el encabezado. En cambio, solo cambian el nonce ya que es mucho más eficiente que cambiar todo el bloque.

La forma más fácil es encontrar el código fuente.

Sealer.go realiza el algoritmo hashimoto

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)
    )

obtener el encabezado del bloque y seleccionar valores para la minería

ethHash.sealHash(header)se define en consenso.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.Extratambién se usa para el valor hash

Por lo tanto, si nonce y mixDigest son fijos, no podemos cambiar Extra

y aquí está la estructura del encabezado del bloque

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"`
}

La función Ethahs.SealHash() obtiene todos los valores del encabezado del bloque excepto nonce y mixDigest