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>
32 lines
1.7 KiB
Python
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']))
|