mirror of
https://github.com/basicswap/basicswap.git
synced 2025-11-05 10:28:10 +01:00
Merge pull request #340 from tecnovert/change_keypaths
Change default key derivation paths.
This commit is contained in:
@@ -48,6 +48,7 @@ PIVX_BASE_ZMQ_PORT = 36892
|
||||
PREFIX_SECRET_KEY_REGTEST = 0x2E
|
||||
|
||||
BTC_USE_DESCRIPTORS = toBool(os.getenv("BTC_USE_DESCRIPTORS", False))
|
||||
BTC_USE_LEGACY_KEY_PATHS = toBool(os.getenv("BTC_USE_LEGACY_KEY_PATHS", False))
|
||||
|
||||
|
||||
def prepareDataDir(
|
||||
|
||||
@@ -33,6 +33,7 @@ from tests.basicswap.common import (
|
||||
LTC_BASE_RPC_PORT,
|
||||
PIVX_BASE_PORT,
|
||||
BTC_USE_DESCRIPTORS,
|
||||
BTC_USE_LEGACY_KEY_PATHS,
|
||||
)
|
||||
from tests.basicswap.extended.test_nmc import (
|
||||
NMC_BASE_PORT,
|
||||
@@ -146,6 +147,7 @@ def run_prepare(
|
||||
os.environ["BTC_RPC_PORT"] = str(BITCOIN_RPC_PORT_BASE)
|
||||
os.environ["BTC_PORT"] = str(BITCOIN_PORT_BASE)
|
||||
os.environ["BTC_USE_DESCRIPTORS"] = str(BTC_USE_DESCRIPTORS)
|
||||
os.environ["BTC_USE_LEGACY_KEY_PATHS"] = str(BTC_USE_LEGACY_KEY_PATHS)
|
||||
os.environ["BTC_ONION_PORT"] = str(BITCOIN_TOR_PORT_BASE)
|
||||
os.environ["LTC_RPC_PORT"] = str(LITECOIN_RPC_PORT_BASE)
|
||||
os.environ["DCR_RPC_PORT"] = str(DECRED_RPC_PORT_BASE)
|
||||
|
||||
85
tests/basicswap/extended/test_key_paths.py
Normal file
85
tests/basicswap/extended/test_key_paths.py
Normal file
@@ -0,0 +1,85 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright (c) 2025 The Basicswap developers
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
"""
|
||||
...
|
||||
export BTC_USE_DESCRIPTORS=true
|
||||
export BTC_USE_LEGACY_KEY_PATHS=false
|
||||
export EXTRA_CONFIG_JSON="{\"btc0\":[\"txindex=1\",\"rpcworkqueue=1100\"]}"
|
||||
python tests/basicswap/extended/test_xmr_persistent.py
|
||||
|
||||
|
||||
Start electrumx and electrum daemon
|
||||
|
||||
python tests/basicswap/extended/test_key_paths.py
|
||||
|
||||
"""
|
||||
|
||||
import logging
|
||||
import os
|
||||
import signal
|
||||
import sys
|
||||
import threading
|
||||
import unittest
|
||||
|
||||
from tests.basicswap.util import (
|
||||
read_json_api,
|
||||
waitForServer,
|
||||
)
|
||||
|
||||
|
||||
logger = logging.getLogger()
|
||||
logger.level = logging.DEBUG
|
||||
if not len(logger.handlers):
|
||||
logger.addHandler(logging.StreamHandler(sys.stdout))
|
||||
|
||||
|
||||
PORT_OFS = int(os.getenv("PORT_OFS", 1))
|
||||
UI_PORT = 12700 + PORT_OFS
|
||||
|
||||
ELECTRUM_PATH = os.getenv("ELECTRUM_PATH")
|
||||
ELECTRUM_DATADIR = os.getenv("ELECTRUM_DATADIR")
|
||||
|
||||
|
||||
def signal_handler(self, sig, frame):
|
||||
os.write(sys.stdout.fileno(), f"Signal {sig} detected.\n".encode("utf-8"))
|
||||
self.delay_event.set()
|
||||
|
||||
|
||||
class Test(unittest.TestCase):
|
||||
delay_event = threading.Event()
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super(Test, cls).setUpClass()
|
||||
|
||||
signal.signal(
|
||||
signal.SIGINT, lambda signal, frame: signal_handler(cls, signal, frame)
|
||||
)
|
||||
|
||||
def test_export(self):
|
||||
|
||||
waitForServer(self.delay_event, UI_PORT + 0)
|
||||
waitForServer(self.delay_event, UI_PORT + 1)
|
||||
|
||||
coin_seed = read_json_api(UI_PORT, "getcoinseed", {"coin": "BTC"})
|
||||
assert coin_seed["account_key"].startswith("zprv")
|
||||
|
||||
# override the prefix for testnet
|
||||
coin_seed = read_json_api(
|
||||
UI_PORT,
|
||||
"getcoinseed",
|
||||
{"coin": "BTC", "extkey_prefix": 0x045F18BC, "with_mnemonic": True},
|
||||
)
|
||||
assert (
|
||||
coin_seed["account_key"]
|
||||
== "vprv9K5NS8v2JWNxMeyKtfARGjUSW2zC6F6WbrJUo1HGyZ1NhRZpk6keXadq8XF25KgFMvT5AfXb6Ccn62c6wW2mbJTGfiDFPSE2oaQuvW6tSUX"
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -124,7 +124,7 @@ def callbtcrpc(
|
||||
node_id,
|
||||
method,
|
||||
params=[],
|
||||
wallet=None,
|
||||
wallet="wallet.dat",
|
||||
base_rpc_port=BITCOIN_RPC_PORT_BASE + PORT_OFS,
|
||||
):
|
||||
auth = "test_btc_{0}:test_btc_pwd_{0}".format(node_id)
|
||||
@@ -315,9 +315,7 @@ def start_processes(self):
|
||||
]
|
||||
< num_blocks
|
||||
):
|
||||
logging.info(
|
||||
"Mining {} Monero blocks to {}.".format(num_blocks, self.xmr_addr)
|
||||
)
|
||||
logging.info(f"Mining {num_blocks} Monero blocks to {self.xmr_addr}.")
|
||||
callrpc_xmr(
|
||||
XMR_BASE_RPC_PORT + 1,
|
||||
"generateblocks",
|
||||
@@ -336,7 +334,7 @@ def start_processes(self):
|
||||
if callbtcrpc(0, "getblockcount") < num_blocks:
|
||||
logging.info(f"Mining {num_blocks} Bitcoin blocks to {self.btc_addr}")
|
||||
callbtcrpc(0, "generatetoaddress", [num_blocks, self.btc_addr])
|
||||
logging.info("BTC blocks: %d", callbtcrpc(0, "getblockcount"))
|
||||
logging.info("BTC blocks: {}".format(callbtcrpc(0, "getblockcount")))
|
||||
|
||||
if "litecoin" in TEST_COINS_LIST:
|
||||
self.ltc_addr = callltcrpc(
|
||||
@@ -345,7 +343,7 @@ def start_processes(self):
|
||||
num_blocks: int = 431
|
||||
have_blocks: int = callltcrpc(0, "getblockcount")
|
||||
if have_blocks < 500:
|
||||
logging.info("Mining %d Litecoin blocks to %s", num_blocks, self.ltc_addr)
|
||||
logging.info(f"Mining {num_blocks} Litecoin blocks to {self.ltc_addr}")
|
||||
callltcrpc(
|
||||
0,
|
||||
"generatetoaddress",
|
||||
|
||||
@@ -26,6 +26,7 @@ from basicswap.db import (
|
||||
from basicswap.util import (
|
||||
make_int,
|
||||
)
|
||||
from basicswap.util.address import b58decode
|
||||
from basicswap.util.address import (
|
||||
decodeAddress,
|
||||
)
|
||||
@@ -773,6 +774,10 @@ class TestFunctions(BaseTest):
|
||||
class BasicSwapTest(TestFunctions):
|
||||
|
||||
test_fee_rate: int = 1000 # sats/kvB
|
||||
expected_addresses = {
|
||||
"external": "bcrt1qps7hnjd866e9ynxadgseprkc2l56m00dvwargr",
|
||||
"internal": "bcrt1qdl9ryxkqjltv42lhfnqgdjf9tagxsjpp2xak9a",
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
@@ -1211,7 +1216,7 @@ class BasicSwapTest(TestFunctions):
|
||||
)
|
||||
assert addr_info["hdmasterfingerprint"] == "a55b7ea9"
|
||||
assert addr_info["hdkeypath"] == "m/0'/0'/0'"
|
||||
assert addr == "bcrt1qps7hnjd866e9ynxadgseprkc2l56m00dvwargr"
|
||||
assert addr == self.expected_addresses["external"]
|
||||
|
||||
addr_change = self.callnoderpc("getrawchangeaddress", wallet=new_wallet_name)
|
||||
addr_info = self.callnoderpc(
|
||||
@@ -1223,9 +1228,20 @@ class BasicSwapTest(TestFunctions):
|
||||
)
|
||||
assert addr_info["hdmasterfingerprint"] == "a55b7ea9"
|
||||
assert addr_info["hdkeypath"] == "m/0'/1'/0'"
|
||||
assert addr_change == "bcrt1qdl9ryxkqjltv42lhfnqgdjf9tagxsjpp2xak9a"
|
||||
assert addr_change == self.expected_addresses["internal"]
|
||||
|
||||
self.callnoderpc("unloadwallet", [new_wallet_name])
|
||||
|
||||
address_chains = ci.getWalletKeyChains(bytes.fromhex(test_seed))
|
||||
for chain in ["external", "internal"]:
|
||||
extkey_data = b58decode(address_chains[chain])[4:-4]
|
||||
ek = ExtKeyPair()
|
||||
ek.decode(extkey_data)
|
||||
addr0h = ci.encodeSegwitAddress(
|
||||
ci.getPubkeyHash(ek.derive_path("0h").get_pubkey())
|
||||
)
|
||||
assert addr0h == self.expected_addresses[chain]
|
||||
|
||||
self.swap_clients[0].initialiseWallet(Coins.BTC, raise_errors=True)
|
||||
assert self.swap_clients[0].checkWalletSeed(Coins.BTC) is True
|
||||
for i in range(1500):
|
||||
@@ -1647,7 +1663,7 @@ class BasicSwapTest(TestFunctions):
|
||||
assert addr_info["hdmasterfingerprint"] == "a55b7ea9"
|
||||
assert addr_info["hdkeypath"] == "m/0h/0h/0h"
|
||||
if self.test_coin_from == Coins.BTC:
|
||||
assert addr == "bcrt1qps7hnjd866e9ynxadgseprkc2l56m00dvwargr"
|
||||
assert addr == self.expected_addresses["external"]
|
||||
|
||||
addr_change = self.callnoderpc("getrawchangeaddress", wallet=new_wallet_name)
|
||||
addr_info = self.callnoderpc(
|
||||
@@ -1660,7 +1676,17 @@ class BasicSwapTest(TestFunctions):
|
||||
assert addr_info["hdmasterfingerprint"] == "a55b7ea9"
|
||||
assert addr_info["hdkeypath"] == "m/0h/1h/0h"
|
||||
if self.test_coin_from == Coins.BTC:
|
||||
assert addr_change == "bcrt1qdl9ryxkqjltv42lhfnqgdjf9tagxsjpp2xak9a"
|
||||
assert addr_change == self.expected_addresses["internal"]
|
||||
|
||||
address_chains = ci.getWalletKeyChains(bytes.fromhex(test_seed))
|
||||
for chain in ["external", "internal"]:
|
||||
extkey_data = b58decode(address_chains[chain])[4:-4]
|
||||
ek = ExtKeyPair()
|
||||
ek.decode(extkey_data)
|
||||
addr0h = ci.encodeSegwitAddress(
|
||||
ci.getPubkeyHash(ek.derive_path("0h").get_pubkey())
|
||||
)
|
||||
assert addr0h == self.expected_addresses[chain]
|
||||
|
||||
desc_watch = descsum_create(f"addr({addr})")
|
||||
self.callnoderpc(
|
||||
|
||||
@@ -87,6 +87,7 @@ from tests.basicswap.common import (
|
||||
LTC_BASE_RPC_PORT,
|
||||
PREFIX_SECRET_KEY_REGTEST,
|
||||
BTC_USE_DESCRIPTORS,
|
||||
BTC_USE_LEGACY_KEY_PATHS,
|
||||
)
|
||||
from basicswap.db_util import (
|
||||
remove_expired_data,
|
||||
@@ -177,6 +178,7 @@ def prepare_swapclient_dir(
|
||||
"bindir": cfg.BITCOIN_BINDIR,
|
||||
"use_segwit": True,
|
||||
"use_descriptors": BTC_USE_DESCRIPTORS,
|
||||
"use_legacy_key_paths": BTC_USE_LEGACY_KEY_PATHS,
|
||||
},
|
||||
},
|
||||
"check_progress_seconds": 2,
|
||||
|
||||
Reference in New Issue
Block a user