Corrija ' nonce
' y ' mixDigest
', solo cambie ' extra
' para extraer un nuevo bloque.
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.Extra
tambié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
Rosquilla
input data
campo? Elnonce
campo allí para ser alterado. Ese es su propósito.