10
10
script_to_p2sh_p2wsh ,
11
11
script_to_p2wsh ,
12
12
)
13
- from .mininode import *
13
+ from .messages import (
14
+ CBlock ,
15
+ COIN ,
16
+ COutPoint ,
17
+ CTransaction ,
18
+ CTxIn ,
19
+ CTxInWitness ,
20
+ CTxOut ,
21
+ FromHex ,
22
+ ToHex ,
23
+ bytes_to_hex_str ,
24
+ hash256 ,
25
+ hex_str_to_bytes ,
26
+ ser_string ,
27
+ ser_uint256 ,
28
+ sha256 ,
29
+ uint256_from_str ,
30
+ )
14
31
from .script import (
15
32
CScript ,
16
33
OP_0 ,
23
40
)
24
41
from .util import assert_equal
25
42
26
- # Create a block (with regtest difficulty)
27
- def create_block (hashprev , coinbase , nTime = None ):
43
+ # From BIP141
44
+ WITNESS_COMMITMENT_HEADER = b"\xaa \x21 \xa9 \xed "
45
+
46
+ def create_block (hashprev , coinbase , ntime = None ):
47
+ """Create a block (with regtest difficulty)."""
28
48
block = CBlock ()
29
- if nTime is None :
49
+ if ntime is None :
30
50
import time
31
- block .nTime = int (time .time ()+ 600 )
51
+ block .nTime = int (time .time () + 600 )
32
52
else :
33
- block .nTime = nTime
53
+ block .nTime = ntime
34
54
block .hashPrevBlock = hashprev
35
- block .nBits = 0x207fffff # Will break after a difficulty adjustment...
55
+ block .nBits = 0x207fffff # difficulty retargeting is disabled in REGTEST chainparams
36
56
block .vtx .append (coinbase )
37
57
block .hashMerkleRoot = block .calc_merkle_root ()
38
58
block .calc_sha256 ()
39
59
return block
40
60
41
- # From BIP141
42
- WITNESS_COMMITMENT_HEADER = b"\xaa \x21 \xa9 \xed "
43
-
44
-
45
61
def get_witness_script (witness_root , witness_nonce ):
46
- witness_commitment = uint256_from_str (hash256 (ser_uint256 (witness_root )+ ser_uint256 (witness_nonce )))
62
+ witness_commitment = uint256_from_str (hash256 (ser_uint256 (witness_root ) + ser_uint256 (witness_nonce )))
47
63
output_data = WITNESS_COMMITMENT_HEADER + ser_uint256 (witness_commitment )
48
64
return CScript ([OP_RETURN , output_data ])
49
65
50
-
51
- # According to BIP141, blocks with witness rules active must commit to the
52
- # hash of all in-block transactions including witness.
53
66
def add_witness_commitment (block , nonce = 0 ):
67
+ """Add a witness commitment to the block's coinbase transaction.
68
+
69
+ According to BIP141, blocks with witness rules active must commit to the
70
+ hash of all in-block transactions including witness."""
54
71
# First calculate the merkle root of the block's
55
72
# transactions, with witnesses.
56
73
witness_nonce = nonce
@@ -65,7 +82,6 @@ def add_witness_commitment(block, nonce=0):
65
82
block .hashMerkleRoot = block .calc_merkle_root ()
66
83
block .rehash ()
67
84
68
-
69
85
def serialize_script_num (value ):
70
86
r = bytearray (0 )
71
87
if value == 0 :
@@ -81,55 +97,59 @@ def serialize_script_num(value):
81
97
r [- 1 ] |= 0x80
82
98
return r
83
99
84
- # Create a coinbase transaction, assuming no miner fees.
85
- # If pubkey is passed in, the coinbase output will be a P2PK output;
86
- # otherwise an anyone-can-spend output.
87
- def create_coinbase (height , pubkey = None ):
100
+ def create_coinbase (height , pubkey = None ):
101
+ """Create a coinbase transaction, assuming no miner fees.
102
+
103
+ If pubkey is passed in, the coinbase output will be a P2PK output;
104
+ otherwise an anyone-can-spend output."""
88
105
coinbase = CTransaction ()
89
- coinbase .vin .append (CTxIn (COutPoint (0 , 0xffffffff ),
90
- ser_string (serialize_script_num (height )), 0xffffffff ))
106
+ coinbase .vin .append (CTxIn (COutPoint (0 , 0xffffffff ),
107
+ ser_string (serialize_script_num (height )), 0xffffffff ))
91
108
coinbaseoutput = CTxOut ()
92
109
coinbaseoutput .nValue = 50 * COIN
93
- halvings = int (height / 150 ) # regtest
110
+ halvings = int (height / 150 ) # regtest
94
111
coinbaseoutput .nValue >>= halvings
95
- if (pubkey != None ):
112
+ if (pubkey is not None ):
96
113
coinbaseoutput .scriptPubKey = CScript ([pubkey , OP_CHECKSIG ])
97
114
else :
98
115
coinbaseoutput .scriptPubKey = CScript ([OP_TRUE ])
99
- coinbase .vout = [ coinbaseoutput ]
116
+ coinbase .vout = [coinbaseoutput ]
100
117
coinbase .calc_sha256 ()
101
118
return coinbase
102
119
103
- # Create a transaction.
104
- # If the scriptPubKey is not specified, make it anyone-can-spend.
105
- def create_transaction (prevtx , n , sig , value , scriptPubKey = CScript ()):
120
+ def create_transaction (prevtx , n , sig , value , script_pub_key = CScript ()):
121
+ """Create a transaction.
122
+
123
+ If the script_pub_key is not specified, make it anyone-can-spend."""
106
124
tx = CTransaction ()
107
125
assert (n < len (prevtx .vout ))
108
126
tx .vin .append (CTxIn (COutPoint (prevtx .sha256 , n ), sig , 0xffffffff ))
109
- tx .vout .append (CTxOut (value , scriptPubKey ))
127
+ tx .vout .append (CTxOut (value , script_pub_key ))
110
128
tx .calc_sha256 ()
111
129
return tx
112
130
113
- def get_legacy_sigopcount_block (block , fAccurate = True ):
131
+ def get_legacy_sigopcount_block (block , accurate = True ):
114
132
count = 0
115
133
for tx in block .vtx :
116
- count += get_legacy_sigopcount_tx (tx , fAccurate )
134
+ count += get_legacy_sigopcount_tx (tx , accurate )
117
135
return count
118
136
119
- def get_legacy_sigopcount_tx (tx , fAccurate = True ):
137
+ def get_legacy_sigopcount_tx (tx , accurate = True ):
120
138
count = 0
121
139
for i in tx .vout :
122
- count += i .scriptPubKey .GetSigOpCount (fAccurate )
140
+ count += i .scriptPubKey .GetSigOpCount (accurate )
123
141
for j in tx .vin :
124
142
# scriptSig might be of type bytes, so convert to CScript for the moment
125
- count += CScript (j .scriptSig ).GetSigOpCount (fAccurate )
143
+ count += CScript (j .scriptSig ).GetSigOpCount (accurate )
126
144
return count
127
145
128
- # Create a scriptPubKey corresponding to either a P2WPKH output for the
129
- # given pubkey, or a P2WSH output of a 1-of-1 multisig for the given
130
- # pubkey. Returns the hex encoding of the scriptPubKey.
131
146
def witness_script (use_p2wsh , pubkey ):
132
- if (use_p2wsh == False ):
147
+ """Create a scriptPubKey for a pay-to-wtiness TxOut.
148
+
149
+ This is either a P2WPKH output for the given pubkey, or a P2WSH output of a
150
+ 1-of-1 multisig for the given pubkey. Returns the hex encoding of the
151
+ scriptPubKey."""
152
+ if not use_p2wsh :
133
153
# P2WPKH instead
134
154
pubkeyhash = hash160 (hex_str_to_bytes (pubkey ))
135
155
pkscript = CScript ([OP_0 , pubkeyhash ])
@@ -140,9 +160,10 @@ def witness_script(use_p2wsh, pubkey):
140
160
pkscript = CScript ([OP_0 , scripthash ])
141
161
return bytes_to_hex_str (pkscript )
142
162
143
- # Return a transaction (in hex) that spends the given utxo to a segwit output,
144
- # optionally wrapping the segwit output using P2SH.
145
163
def create_witness_tx (node , use_p2wsh , utxo , pubkey , encode_p2sh , amount ):
164
+ """Return a transaction (in hex) that spends the given utxo to a segwit output.
165
+
166
+ Optionally wrap the segwit output using P2SH."""
146
167
if use_p2wsh :
147
168
program = CScript ([OP_1 , hex_str_to_bytes (pubkey ), OP_1 , OP_CHECKMULTISIG ])
148
169
addr = script_to_p2sh_p2wsh (program ) if encode_p2sh else script_to_p2wsh (program )
@@ -152,12 +173,13 @@ def create_witness_tx(node, use_p2wsh, utxo, pubkey, encode_p2sh, amount):
152
173
assert_equal (node .getaddressinfo (addr )['scriptPubKey' ], witness_script (use_p2wsh , pubkey ))
153
174
return node .createrawtransaction ([utxo ], {addr : amount })
154
175
155
- # Create a transaction spending a given utxo to a segwit output corresponding
156
- # to the given pubkey: use_p2wsh determines whether to use P2WPKH or P2WSH;
157
- # encode_p2sh determines whether to wrap in P2SH.
158
- # sign=True will have the given node sign the transaction.
159
- # insert_redeem_script will be added to the scriptSig, if given.
160
176
def send_to_witness (use_p2wsh , node , utxo , pubkey , encode_p2sh , amount , sign = True , insert_redeem_script = "" ):
177
+ """Create a transaction spending a given utxo to a segwit output.
178
+
179
+ The output corresponds to the given pubkey: use_p2wsh determines whether to
180
+ use P2WPKH or P2WSH; encode_p2sh determines whether to wrap in P2SH.
181
+ sign=True will have the given node sign the transaction.
182
+ insert_redeem_script will be added to the scriptSig, if given."""
161
183
tx_to_witness = create_witness_tx (node , use_p2wsh , utxo , pubkey , encode_p2sh , amount )
162
184
if (sign ):
163
185
signed = node .signrawtransactionwithwallet (tx_to_witness )
0 commit comments