multisig-hsm/reference/signet_wallet.py
mineracks 7a17ffd12e Initial public release — multisig HSM reference + recipe book
Open-source 2-of-3 policy-enforced threshold HSM: auto-signs cold→hot treasury
refills under on-device Coldcard policy, no human in the loop. Includes the full
operator manual + quick-start, the reference coordinator/signing code, and a
signer-host bootstrap. No keys, seeds, or secrets — placeholders only.

Live signet demo: https://multisighsm.mineracks.com

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 13:56:51 +10:00

32 lines
1.7 KiB
Python

import subprocess, json, os, time
V='27.0'; SDATA=os.path.expanduser('~/cksim/signet-data')
CLI=os.path.expanduser('~/bitcoin-%s/bin/bitcoin-cli'%V)
def bc(*a, wallet=None):
base=[CLI,'-datadir=%s'%SDATA,'-rpcport=38999','-rpcuser=ck','-rpcpassword=ckms']
if wallet: base.append('-rpcwallet=%s'%wallet)
r=subprocess.run(base+list(a),capture_output=True,text=True)
if r.returncode: raise SystemExit('%s FAIL %s'%(a,r.stderr.strip()[:160]))
return r.stdout.strip()
for _ in range(40):
try: bc('getblockchaininfo'); break
except SystemExit: time.sleep(2)
TPUB={'00000001':'tpubREPLACE_WITH_YOUR_SIGNER_1_XPUB',
'00000002':'tpubREPLACE_WITH_YOUR_SIGNER_2_XPUB',
'00000003':'tpubREPLACE_WITH_YOUR_SIGNER_3_XPUB'}
def desc(b):
keys=','.join('[%s/48h/1h/0h/2h]%s/%d/*'%(x,p,b) for x,p in TPUB.items())
return 'wsh(sortedmulti(2,%s))'%keys
def ck(d): return json.loads(bc('getdescriptorinfo',d))['descriptor']
rcv,chg=ck(desc(0)),ck(desc(1))
wl=json.loads(bc('listwallets'))
if 'ckms23-signet' not in wl:
try: bc('createwallet','ckms23-signet','true','true','','false','true')
except SystemExit: bc('loadwallet','ckms23-signet')
bc('importdescriptors', json.dumps([{'desc':rcv,'active':True,'internal':False,'timestamp':'now','range':[0,30]},
{'desc':chg,'active':True,'internal':True,'timestamp':'now','range':[0,30]}]), wallet='ckms23-signet')
addr=bc('getnewaddress','','bech32',wallet='ckms23-signet')
open(os.path.expanduser('~/cksim/signet_addr.txt'),'w').write(addr+'\n')
print('SIGNET_RECEIVE_ADDRESS', addr)
bci=json.loads(bc('getblockchaininfo'))
print('SYNC blocks=%s headers=%s progress=%.4f'%(bci['blocks'],bci['headers'],bci['verificationprogress']))