mining: extract witness commitment add into method
This commit is contained in:
parent
2d7825cf70
commit
f0f4784c1c
1 changed files with 44 additions and 34 deletions
|
@ -803,40 +803,7 @@ mempoolLoop:
|
||||||
// OP_RETURN output within the coinbase transaction.
|
// OP_RETURN output within the coinbase transaction.
|
||||||
var witnessCommitment []byte
|
var witnessCommitment []byte
|
||||||
if witnessIncluded {
|
if witnessIncluded {
|
||||||
// The witness of the coinbase transaction MUST be exactly 32-bytes
|
witnessCommitment = AddWitnessCommitment(coinbaseTx, blockTxns)
|
||||||
// of all zeroes.
|
|
||||||
var witnessNonce [blockchain.CoinbaseWitnessDataLen]byte
|
|
||||||
coinbaseTx.MsgTx().TxIn[0].Witness = wire.TxWitness{witnessNonce[:]}
|
|
||||||
|
|
||||||
// Next, obtain the merkle root of a tree which consists of the
|
|
||||||
// wtxid of all transactions in the block. The coinbase
|
|
||||||
// transaction will have a special wtxid of all zeroes.
|
|
||||||
witnessMerkleTree := blockchain.BuildMerkleTreeStore(blockTxns,
|
|
||||||
true)
|
|
||||||
witnessMerkleRoot := witnessMerkleTree[len(witnessMerkleTree)-1]
|
|
||||||
|
|
||||||
// The preimage to the witness commitment is:
|
|
||||||
// witnessRoot || coinbaseWitness
|
|
||||||
var witnessPreimage [64]byte
|
|
||||||
copy(witnessPreimage[:32], witnessMerkleRoot[:])
|
|
||||||
copy(witnessPreimage[32:], witnessNonce[:])
|
|
||||||
|
|
||||||
// The witness commitment itself is the double-sha256 of the
|
|
||||||
// witness preimage generated above. With the commitment
|
|
||||||
// generated, the witness script for the output is: OP_RETURN
|
|
||||||
// OP_DATA_36 {0xaa21a9ed || witnessCommitment}. The leading
|
|
||||||
// prefix is referred to as the "witness magic bytes".
|
|
||||||
witnessCommitment = chainhash.DoubleHashB(witnessPreimage[:])
|
|
||||||
witnessScript := append(blockchain.WitnessMagicBytes, witnessCommitment...)
|
|
||||||
|
|
||||||
// Finally, create the OP_RETURN carrying witness commitment
|
|
||||||
// output as an additional output within the coinbase.
|
|
||||||
commitmentOutput := &wire.TxOut{
|
|
||||||
Value: 0,
|
|
||||||
PkScript: witnessScript,
|
|
||||||
}
|
|
||||||
coinbaseTx.MsgTx().TxOut = append(coinbaseTx.MsgTx().TxOut,
|
|
||||||
commitmentOutput)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate the required difficulty for the block. The timestamp
|
// Calculate the required difficulty for the block. The timestamp
|
||||||
|
@ -895,6 +862,49 @@ mempoolLoop:
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// AddWitnessCommitment adds the witness commitment as an OP_RETURN outpout
|
||||||
|
// within the coinbase tx. The raw commitment is returned.
|
||||||
|
func AddWitnessCommitment(coinbaseTx *btcutil.Tx,
|
||||||
|
blockTxns []*btcutil.Tx) []byte {
|
||||||
|
|
||||||
|
// The witness of the coinbase transaction MUST be exactly 32-bytes
|
||||||
|
// of all zeroes.
|
||||||
|
var witnessNonce [blockchain.CoinbaseWitnessDataLen]byte
|
||||||
|
coinbaseTx.MsgTx().TxIn[0].Witness = wire.TxWitness{witnessNonce[:]}
|
||||||
|
|
||||||
|
// Next, obtain the merkle root of a tree which consists of the
|
||||||
|
// wtxid of all transactions in the block. The coinbase
|
||||||
|
// transaction will have a special wtxid of all zeroes.
|
||||||
|
witnessMerkleTree := blockchain.BuildMerkleTreeStore(blockTxns,
|
||||||
|
true)
|
||||||
|
witnessMerkleRoot := witnessMerkleTree[len(witnessMerkleTree)-1]
|
||||||
|
|
||||||
|
// The preimage to the witness commitment is:
|
||||||
|
// witnessRoot || coinbaseWitness
|
||||||
|
var witnessPreimage [64]byte
|
||||||
|
copy(witnessPreimage[:32], witnessMerkleRoot[:])
|
||||||
|
copy(witnessPreimage[32:], witnessNonce[:])
|
||||||
|
|
||||||
|
// The witness commitment itself is the double-sha256 of the
|
||||||
|
// witness preimage generated above. With the commitment
|
||||||
|
// generated, the witness script for the output is: OP_RETURN
|
||||||
|
// OP_DATA_36 {0xaa21a9ed || witnessCommitment}. The leading
|
||||||
|
// prefix is referred to as the "witness magic bytes".
|
||||||
|
witnessCommitment := chainhash.DoubleHashB(witnessPreimage[:])
|
||||||
|
witnessScript := append(blockchain.WitnessMagicBytes, witnessCommitment...)
|
||||||
|
|
||||||
|
// Finally, create the OP_RETURN carrying witness commitment
|
||||||
|
// output as an additional output within the coinbase.
|
||||||
|
commitmentOutput := &wire.TxOut{
|
||||||
|
Value: 0,
|
||||||
|
PkScript: witnessScript,
|
||||||
|
}
|
||||||
|
coinbaseTx.MsgTx().TxOut = append(coinbaseTx.MsgTx().TxOut,
|
||||||
|
commitmentOutput)
|
||||||
|
|
||||||
|
return witnessCommitment
|
||||||
|
}
|
||||||
|
|
||||||
// UpdateBlockTime updates the timestamp in the header of the passed block to
|
// UpdateBlockTime updates the timestamp in the header of the passed block to
|
||||||
// the current time while taking into account the median time of the last
|
// the current time while taking into account the median time of the last
|
||||||
// several blocks to ensure the new time is after that time per the chain
|
// several blocks to ensure the new time is after that time per the chain
|
||||||
|
|
Loading…
Reference in a new issue