@@ -21,7 +21,7 @@ sys.path.insert(0, PATH_BASE_TEST_FUNCTIONAL)
2121from test_framework .blocktools import get_witness_script , script_BIP34_coinbase_height # noqa: E402
2222from test_framework .messages import CBlock , CBlockHeader , COutPoint , CTransaction , CTxIn , CTxInWitness , CTxOut , from_binary , from_hex , ser_string , ser_uint256 , tx_from_hex # noqa: E402
2323from 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
2525
2626logging .basicConfig (
2727 format = '%(asctime)s %(levelname)s %(message)s' ,
@@ -93,12 +93,16 @@ def finish_block(block, signet_solution, grind_cmd):
9393 block .rehash ()
9494 return block
9595
96- def generate_psbt (tmpl , reward_spk , * , blocktime = None ):
96+ def generate_psbt (tmpl , reward_spk , * , blocktime = None , poolid = None ):
9797 signet_spk = tmpl ["signet_challenge" ]
9898 signet_spk_bin = bytes .fromhex (signet_spk )
9999
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+
100104 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 )]
102106 cbtx .vout = [CTxOut (tmpl ["coinbasevalue" ], reward_spk )]
103107 cbtx .vin [0 ].nSequence = 2 ** 32 - 2
104108 cbtx .rehash ()
@@ -132,6 +136,17 @@ def generate_psbt(tmpl, reward_spk, *, blocktime=None):
132136 psbt .o = [ PSBTMap () ]
133137 return psbt .to_base64 ()
134138
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+
135150def get_reward_addr_spk (args , height ):
136151 assert args .address is not None or args .descriptor is not None
137152
@@ -160,9 +175,10 @@ def get_reward_addr_spk(args, height):
160175 return reward_addr , reward_spk
161176
162177def do_genpsbt (args ):
178+ poolid = get_poolid (args )
163179 tmpl = json .load (sys .stdin )
164180 _ , 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 )
166182 print (psbt )
167183
168184def do_solvepsbt (args ):
@@ -214,7 +230,8 @@ class Generate:
214230
215231
216232 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 ):
218235 if multiminer is None :
219236 multiminer = (0 , 1 , 1 )
220237 (self .multi_low , self .multi_high , self .multi_period ) = multiminer
@@ -224,6 +241,7 @@ class Generate:
224241 self .standby_delay = standby_delay
225242 self .backup_delay = backup_delay
226243 self .set_block_time = set_block_time
244+ self .poolid = poolid
227245
228246 def next_block_delta (self , last_nbits , last_hash ):
229247 # strategy:
@@ -307,7 +325,7 @@ class Generate:
307325 return tmpl
308326
309327 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 )
311329 input_stream = os .linesep .join ([psbt , "true" , "ALL" ]).encode ('utf8' )
312330 psbt_signed = json .loads (bcli ("-stdin" , "walletprocesspsbt" , input = input_stream ))
313331 if not psbt_signed .get ("complete" ,False ):
@@ -373,10 +391,12 @@ def do_generate(args):
373391 logging .error ("--max-interval must be at least 960 (16 minutes)" )
374392 return 1
375393
394+ poolid = get_poolid (args )
395+
376396 ultimate_target = nbits_to_target (int (args .nbits ,16 ))
377397
378398 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 )
380400
381401 mined_blocks = 0
382402 bestheader = {"hash" : None }
@@ -501,6 +521,8 @@ def main():
501521 cmds = parser .add_subparsers (help = "sub-commands" )
502522 genpsbt = cmds .add_parser ("genpsbt" , help = "Generate a block PSBT for signing" )
503523 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/)" )
504526
505527 solvepsbt = cmds .add_parser ("solvepsbt" , help = "Solve a signed block PSBT" )
506528 solvepsbt .set_defaults (fn = do_solvepsbt )
@@ -517,6 +539,8 @@ def main():
517539 generate .add_argument ("--backup-delay" , default = 300 , type = int , help = "Seconds to delay before mining blocks reserved for other miners (default=300)" )
518540 generate .add_argument ("--standby-delay" , default = 0 , type = int , help = "Seconds to delay before mining blocks (default=0)" )
519541 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/)" )
520544
521545 calibrate = cmds .add_parser ("calibrate" , help = "Calibrate difficulty" )
522546 calibrate .set_defaults (fn = do_calibrate )
0 commit comments