mirror of
https://github.com/bitcoin/bitcoin.git
synced 2024-11-20 10:38:42 +01:00
Tests: Refactor to create witness script creation function
* Refactor blocktools.py so that witness script creation is its own function * Changed p2p-segwit to use new function
This commit is contained in:
parent
987a6c0956
commit
c39a6b9ec8
@ -8,7 +8,7 @@ from test_framework.mininode import *
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.util import *
|
||||
from test_framework.script import *
|
||||
from test_framework.blocktools import create_block, create_coinbase, add_witness_commitment, WITNESS_COMMITMENT_HEADER
|
||||
from test_framework.blocktools import create_block, create_coinbase, add_witness_commitment, get_witness_script, WITNESS_COMMITMENT_HEADER
|
||||
from test_framework.key import CECKey, CPubKey
|
||||
import time
|
||||
import random
|
||||
@ -1721,15 +1721,10 @@ class SegWitTest(BitcoinTestFramework):
|
||||
assert('default_witness_commitment' in gbt_results)
|
||||
witness_commitment = gbt_results['default_witness_commitment']
|
||||
|
||||
# TODO: this duplicates some code from blocktools.py, would be nice
|
||||
# to refactor.
|
||||
# Check that default_witness_commitment is present.
|
||||
block = CBlock()
|
||||
witness_root = block.get_merkle_root([ser_uint256(0), ser_uint256(txid)])
|
||||
check_commitment = uint256_from_str(hash256(ser_uint256(witness_root)+ser_uint256(0)))
|
||||
from test_framework.blocktools import WITNESS_COMMITMENT_HEADER
|
||||
output_data = WITNESS_COMMITMENT_HEADER + ser_uint256(check_commitment)
|
||||
script = CScript([OP_RETURN, output_data])
|
||||
witness_root = CBlock.get_merkle_root([ser_uint256(0),
|
||||
ser_uint256(txid)])
|
||||
script = get_witness_script(witness_root, 0)
|
||||
assert_equal(witness_commitment, bytes_to_hex_str(script))
|
||||
|
||||
# undo mocktime
|
||||
|
@ -25,6 +25,13 @@ def create_block(hashprev, coinbase, nTime=None):
|
||||
# From BIP141
|
||||
WITNESS_COMMITMENT_HEADER = b"\xaa\x21\xa9\xed"
|
||||
|
||||
|
||||
def get_witness_script(witness_root, witness_nonce):
|
||||
witness_commitment = uint256_from_str(hash256(ser_uint256(witness_root)+ser_uint256(witness_nonce)))
|
||||
output_data = WITNESS_COMMITMENT_HEADER + ser_uint256(witness_commitment)
|
||||
return CScript([OP_RETURN, output_data])
|
||||
|
||||
|
||||
# According to BIP141, blocks with witness rules active must commit to the
|
||||
# hash of all in-block transactions including witness.
|
||||
def add_witness_commitment(block, nonce=0):
|
||||
@ -32,14 +39,12 @@ def add_witness_commitment(block, nonce=0):
|
||||
# transactions, with witnesses.
|
||||
witness_nonce = nonce
|
||||
witness_root = block.calc_witness_merkle_root()
|
||||
witness_commitment = uint256_from_str(hash256(ser_uint256(witness_root)+ser_uint256(witness_nonce)))
|
||||
# witness_nonce should go to coinbase witness.
|
||||
block.vtx[0].wit.vtxinwit = [CTxInWitness()]
|
||||
block.vtx[0].wit.vtxinwit[0].scriptWitness.stack = [ser_uint256(witness_nonce)]
|
||||
|
||||
# witness commitment is the last OP_RETURN output in coinbase
|
||||
output_data = WITNESS_COMMITMENT_HEADER + ser_uint256(witness_commitment)
|
||||
block.vtx[0].vout.append(CTxOut(0, CScript([OP_RETURN, output_data])))
|
||||
block.vtx[0].vout.append(CTxOut(0, get_witness_script(witness_root, witness_nonce)))
|
||||
block.vtx[0].rehash()
|
||||
block.hashMerkleRoot = block.calc_merkle_root()
|
||||
block.rehash()
|
||||
|
@ -610,7 +610,8 @@ class CBlock(CBlockHeader):
|
||||
return r
|
||||
|
||||
# Calculate the merkle root given a vector of transaction hashes
|
||||
def get_merkle_root(self, hashes):
|
||||
@classmethod
|
||||
def get_merkle_root(cls, hashes):
|
||||
while len(hashes) > 1:
|
||||
newhashes = []
|
||||
for i in range(0, len(hashes), 2):
|
||||
|
Loading…
Reference in New Issue
Block a user