@@ -398,14 +398,10 @@ class BitcoinD(TailableProc):
398398 def __init__ (self , bitcoin_dir = "/tmp/bitcoind-test" , rpcport = None ):
399399 TailableProc .__init__ (self , bitcoin_dir , verbose = False )
400400
401- if rpcport is None :
402- self .reserved_rpcport = reserve_unused_port ()
403- rpcport = self .reserved_rpcport
404- else :
405- self .reserved_rpcport = None
406-
407401 self .bitcoin_dir = bitcoin_dir
408402 self .rpcport = rpcport
403+ self .reserved_rpcport = None
404+ self .port_setup = False
409405 self .prefix = 'bitcoind'
410406 self .canned_blocks = None
411407
@@ -429,21 +425,29 @@ def __init__(self, bitcoin_dir="/tmp/bitcoind-test", rpcport=None):
429425 '-debug=validation' ,
430426 '-rpcthreads=20' ,
431427 ]
432- # For up to and including 0.16.1, this needs to be in main section.
433- BITCOIND_CONFIG ['rpcport' ] = rpcport
434- # For after 0.16.1 (eg. 3f398d7a17f136cd4a67998406ca41a124ae2966), this
435- # needs its own [regtest] section.
436- BITCOIND_REGTEST = {'rpcport' : rpcport }
437428 self .conf_file = os .path .join (bitcoin_dir , 'bitcoin.conf' )
429+
430+ def set_port (self , rpcport ):
431+ assert self .port_setup is False
432+
433+ BITCOIND_REGTEST = {'rpcport' : rpcport }
438434 write_config (self .conf_file , BITCOIND_CONFIG , BITCOIND_REGTEST )
439- self .rpc = SimpleBitcoinProxy (btc_conf_file = self .conf_file )
440- self .proxies = []
435+ self .port_setup = True
441436
442437 def __del__ (self ):
443438 if self .reserved_rpcport is not None :
444439 drop_unused_port (self .reserved_rpcport )
445440
446441 def start (self , wallet_file = None ):
442+ if not self .port_setup :
443+ if self .rpcport is None :
444+ self .reserved_rpcport = reserve_unused_port ()
445+ self .rpcport = self .reserved_rpcport
446+ self .set_port (self .rpcport )
447+
448+ self .rpc = SimpleBitcoinProxy (btc_conf_file = self .conf_file )
449+ self .proxies = []
450+
447451 TailableProc .start (self )
448452 self .wait_for_log ("Done loading" , timeout = TIMEOUT )
449453
@@ -1666,6 +1670,7 @@ def split_options(self, opts):
16661670 'start' ,
16671671 'gossip_store_file' ,
16681672 'no_entropy' ,
1673+ 'base_port' ,
16691674 ]
16701675 node_opts = {k : v for k , v in opts .items () if k in node_opt_keys }
16711676 cli_opts = {k : v for k , v in opts .items () if k not in node_opt_keys }
@@ -1712,10 +1717,14 @@ def get_nodes(self, num_nodes, opts=None):
17121717 def get_node (self , node_id = None , options = None , dbfile = None ,
17131718 bkpr_dbfile = None , feerates = (15000 , 11000 , 7500 , 3750 ),
17141719 start = True , wait_for_bitcoind_sync = True , may_fail = False ,
1715- expect_fail = False , cleandir = True , gossip_store_file = None , unused_grpc_port = True , ** kwargs ):
1720+ expect_fail = False , cleandir = True , gossip_store_file = None , unused_grpc_port = True , base_port = None , ** kwargs ):
17161721 node_id = self .get_node_id () if not node_id else node_id
1717- port = reserve_unused_port ()
1718- grpc_port = self .get_unused_port () if unused_grpc_port else None
1722+ if base_port :
1723+ port = base_port + node_id * 2 - 1
1724+ grpc_port = base_port + node_id * 2
1725+ else :
1726+ port = reserve_unused_port ()
1727+ grpc_port = self .get_unused_port () if unused_grpc_port else None
17191728
17201729 lightning_dir = os .path .join (
17211730 self .directory , "lightning-{}/" .format (node_id ))
@@ -1739,7 +1748,8 @@ def get_node(self, node_id=None, options=None, dbfile=None,
17391748 node .set_feerates (feerates , False )
17401749
17411750 self .nodes .append (node )
1742- self .reserved_ports .append (port )
1751+ if not base_port :
1752+ self .reserved_ports .append (port )
17431753 if dbfile :
17441754 out = open (os .path .join (node .daemon .lightning_dir , TEST_NETWORK ,
17451755 'lightningd.sqlite3' ), 'xb' )
0 commit comments