@@ -21,7 +21,7 @@ sys.path.insert(0, PATH_BASE_TEST_FUNCTIONAL)
21
21
from test_framework .blocktools import get_witness_script , script_BIP34_coinbase_height # noqa: E402
22
22
from test_framework .messages import CBlock , CBlockHeader , COutPoint , CTransaction , CTxIn , CTxInWitness , CTxOut , from_binary , from_hex , ser_string , ser_uint256 , tx_from_hex # noqa: E402
23
23
from test_framework .psbt import PSBT , PSBTMap , PSBT_GLOBAL_UNSIGNED_TX , PSBT_IN_FINAL_SCRIPTSIG , PSBT_IN_FINAL_SCRIPTWITNESS , PSBT_IN_NON_WITNESS_UTXO , PSBT_IN_SIGHASH_TYPE # noqa: E402
24
- from test_framework .script import CScriptOp # noqa: E402
24
+ from test_framework .script import CScript , CScriptOp # noqa: E402
25
25
26
26
logging .basicConfig (
27
27
format = '%(asctime)s %(levelname)s %(message)s' ,
@@ -93,12 +93,16 @@ def finish_block(block, signet_solution, grind_cmd):
93
93
block .rehash ()
94
94
return block
95
95
96
- def generate_psbt (tmpl , reward_spk , * , blocktime = None ):
96
+ def generate_psbt (tmpl , reward_spk , * , blocktime = None , poolid = None ):
97
97
signet_spk = tmpl ["signet_challenge" ]
98
98
signet_spk_bin = bytes .fromhex (signet_spk )
99
99
100
+ scriptSig = script_BIP34_coinbase_height (tmpl ["height" ])
101
+ if poolid is not None :
102
+ scriptSig = CScript (b"" + scriptSig + CScriptOp .encode_op_pushdata (poolid ))
103
+
100
104
cbtx = CTransaction ()
101
- cbtx .vin = [CTxIn (COutPoint (0 , 0xffffffff ), script_BIP34_coinbase_height ( tmpl [ "height" ]) , 0xffffffff )]
105
+ cbtx .vin = [CTxIn (COutPoint (0 , 0xffffffff ), scriptSig , 0xffffffff )]
102
106
cbtx .vout = [CTxOut (tmpl ["coinbasevalue" ], reward_spk )]
103
107
cbtx .vin [0 ].nSequence = 2 ** 32 - 2
104
108
cbtx .rehash ()
@@ -132,6 +136,17 @@ def generate_psbt(tmpl, reward_spk, *, blocktime=None):
132
136
psbt .o = [ PSBTMap () ]
133
137
return psbt .to_base64 ()
134
138
139
+ def get_poolid (args ):
140
+ if args .poolid is not None :
141
+ if args .poolnum is not None :
142
+ logging .error ("Can only specify one of --poolid and --poolnum" )
143
+ raise Exception ("bad arguments" )
144
+ return args .poolid .encode ('utf8' )
145
+ elif args .poolnum is not None :
146
+ return b"/signet:%d/" % (args .poolnum )
147
+ else :
148
+ return None
149
+
135
150
def get_reward_addr_spk (args , height ):
136
151
assert args .address is not None or args .descriptor is not None
137
152
@@ -160,9 +175,10 @@ def get_reward_addr_spk(args, height):
160
175
return reward_addr , reward_spk
161
176
162
177
def do_genpsbt (args ):
178
+ poolid = get_poolid (args )
163
179
tmpl = json .load (sys .stdin )
164
180
_ , reward_spk = get_reward_addr_spk (args , tmpl ["height" ])
165
- psbt = generate_psbt (tmpl , reward_spk )
181
+ psbt = generate_psbt (tmpl , reward_spk , poolid = poolid )
166
182
print (psbt )
167
183
168
184
def do_solvepsbt (args ):
@@ -214,7 +230,8 @@ class Generate:
214
230
215
231
216
232
def __init__ (self , multiminer = None , ultimate_target = None , poisson = False , max_interval = 1800 ,
217
- standby_delay = 0 , backup_delay = 0 , set_block_time = None ):
233
+ standby_delay = 0 , backup_delay = 0 , set_block_time = None ,
234
+ poolid = None ):
218
235
if multiminer is None :
219
236
multiminer = (0 , 1 , 1 )
220
237
(self .multi_low , self .multi_high , self .multi_period ) = multiminer
@@ -224,6 +241,7 @@ class Generate:
224
241
self .standby_delay = standby_delay
225
242
self .backup_delay = backup_delay
226
243
self .set_block_time = set_block_time
244
+ self .poolid = poolid
227
245
228
246
def next_block_delta (self , last_nbits , last_hash ):
229
247
# strategy:
@@ -307,7 +325,7 @@ class Generate:
307
325
return tmpl
308
326
309
327
def mine (self , bcli , grind_cmd , tmpl , reward_spk ):
310
- psbt = generate_psbt (tmpl , reward_spk , blocktime = self .mine_time )
328
+ psbt = generate_psbt (tmpl , reward_spk , blocktime = self .mine_time , poolid = self . poolid )
311
329
input_stream = os .linesep .join ([psbt , "true" , "ALL" ]).encode ('utf8' )
312
330
psbt_signed = json .loads (bcli ("-stdin" , "walletprocesspsbt" , input = input_stream ))
313
331
if not psbt_signed .get ("complete" ,False ):
@@ -373,10 +391,12 @@ def do_generate(args):
373
391
logging .error ("--max-interval must be at least 960 (16 minutes)" )
374
392
return 1
375
393
394
+ poolid = get_poolid (args )
395
+
376
396
ultimate_target = nbits_to_target (int (args .nbits ,16 ))
377
397
378
398
gen = Generate (multiminer = my_blocks , ultimate_target = ultimate_target , poisson = args .poisson , max_interval = args .max_interval ,
379
- standby_delay = args .standby_delay , backup_delay = args .backup_delay , set_block_time = args .set_block_time )
399
+ standby_delay = args .standby_delay , backup_delay = args .backup_delay , set_block_time = args .set_block_time , poolid = poolid )
380
400
381
401
mined_blocks = 0
382
402
bestheader = {"hash" : None }
@@ -501,6 +521,8 @@ def main():
501
521
cmds = parser .add_subparsers (help = "sub-commands" )
502
522
genpsbt = cmds .add_parser ("genpsbt" , help = "Generate a block PSBT for signing" )
503
523
genpsbt .set_defaults (fn = do_genpsbt )
524
+ genpsbt .add_argument ("--poolnum" , default = None , type = int , help = "Identify blocks that you mine" )
525
+ genpsbt .add_argument ("--poolid" , default = None , type = str , help = "Identify blocks that you mine (eg: /signet:1/)" )
504
526
505
527
solvepsbt = cmds .add_parser ("solvepsbt" , help = "Solve a signed block PSBT" )
506
528
solvepsbt .set_defaults (fn = do_solvepsbt )
@@ -517,6 +539,8 @@ def main():
517
539
generate .add_argument ("--backup-delay" , default = 300 , type = int , help = "Seconds to delay before mining blocks reserved for other miners (default=300)" )
518
540
generate .add_argument ("--standby-delay" , default = 0 , type = int , help = "Seconds to delay before mining blocks (default=0)" )
519
541
generate .add_argument ("--max-interval" , default = 1800 , type = int , help = "Maximum interblock interval (seconds)" )
542
+ generate .add_argument ("--poolnum" , default = None , type = int , help = "Identify blocks that you mine" )
543
+ generate .add_argument ("--poolid" , default = None , type = str , help = "Identify blocks that you mine (eg: /signet:1/)" )
520
544
521
545
calibrate = cmds .add_parser ("calibrate" , help = "Calibrate difficulty" )
522
546
calibrate .set_defaults (fn = do_calibrate )
0 commit comments