From 2f42346068a007e7739a5692cf44528dc7dd9b05 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Thu, 10 Feb 2022 12:51:39 +0000 Subject: [PATCH] regtest: enable hdseed wallet for LTC, BCH --- mmgen/base_proto/bitcoin/daemon.py | 1 + mmgen/regtest.py | 51 +++++++++++++++--------------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/mmgen/base_proto/bitcoin/daemon.py b/mmgen/base_proto/bitcoin/daemon.py index 3f846832..39a9d436 100755 --- a/mmgen/base_proto/bitcoin/daemon.py +++ b/mmgen/base_proto/bitcoin/daemon.py @@ -79,6 +79,7 @@ class bitcoin_core_daemon(CoinDaemon): ['--usecashaddr=0', self.coin == 'BCH'], ['--mempoolreplacement=1', self.coin == 'LTC'], ['--txindex=1', self.coin == 'LTC' or self.network == 'regtest'], + ['--addresstype=bech32', self.coin == 'LTC' and self.network == 'regtest'], ) self.lockfile = os.path.join(self.network_datadir,'.cookie') diff --git a/mmgen/regtest.py b/mmgen/regtest.py index 432dbf6a..f72cc2dc 100755 --- a/mmgen/regtest.py +++ b/mmgen/regtest.py @@ -39,15 +39,18 @@ def create_data_dir(data_dir): try: os.makedirs(data_dir) except: pass +miner_addr = { + # cTyMdQ2BgfAsjopRVZrj7AoEGp97pKfrC2NkqLuwHr4KHfPNAKwp hdseed=1 ('beadcafe'*8) + 'btc': 'bcrt1qaq8t3pakcftpk095tnqfv5cmmczysls024atnd', + 'ltc': 'rltc1qaq8t3pakcftpk095tnqfv5cmmczysls05c8zyn', + 'bch': 'n2fxhNx27GhHAWQhyuZ5REcBNrJqCJsJ12', +} + def create_hdseed(proto): - # cTyMdQ2BgfAsjopRVZrj7AoEGp97pKfrC2NkqLuwHr4KHfPNAKwp hdseed=1 - # addr=bcrt1qaq8t3pakcftpk095tnqfv5cmmczysls024atnd - # cTEkSYCWKvNo757uwFPd4yuCXsbZvfJDipHsHWFRapXpnikMHvgn label= - # addr=bcrt1q537rgyctcqdgs8nm8gvku05znka4h2m00lx8ps hdkeypath=m/0'/0'/0' from .tool.api import tool_api t = tool_api() t.init_coin(proto.coin,proto.network) - t.addrtype = 'bech32' + t.addrtype = 'compressed' if proto.coin == 'BCH' else 'bech32' return t.hex2wif('beadcafe'*8) def cliargs_convert(args): @@ -82,24 +85,16 @@ class MMGenRegtest(MMGenObject): blocks = int(blocks) - async def have_generatetoaddress(): - ret = await self.rpc_call('help','generatetoaddress',wallet='miner') - return not 'unknown command:' in ret - - async def get_miner_address(): - return await self.rpc_call('getnewaddress',wallet='miner') - if self.d.state == 'stopped': die(1,'Regtest daemon is not running') self.d.wait_for_state('ready') - if await have_generatetoaddress(): - cmd_args = ( 'generatetoaddress', blocks, await get_miner_address() ) - else: - cmd_args = ( 'generate', blocks ) - - out = await self.rpc_call(*cmd_args,wallet='miner') + out = await self.rpc_call( + 'generatetoaddress', + blocks, + miner_addr[self.coin], + wallet = 'miner' ) if len(out) != blocks: die(4,'Error generating blocks') @@ -126,16 +121,22 @@ class MMGenRegtest(MMGenObject): await rpc.icall( 'createwallet', wallet_name = user, - blank = user != 'miner' or self.coin == 'btc', + blank = True, no_keys = user != 'miner', load_on_startup = False ) - if self.coin == 'btc': # BCH,LTC refuse to set HD seed while in IBD - await rpc.call( - 'sethdseed', - True, - create_hdseed(self.proto), - wallet = 'miner' ) + # BCH and LTC daemons refuse to set HD seed with empty blockchain ("in IBD" error), + # so generate a block: + await self.generate(1,silent=True) + + # Unfortunately, we don’t get deterministic output with BCH and LTC even with fixed + # hdseed, as their 'sendtoaddress' calls produce non-deterministic TXIDs due to random + # input ordering and fee estimation. + await rpc.call( + 'sethdseed', + True, + create_hdseed(self.proto), + wallet = 'miner' ) await self.generate(432,silent=True)