Wie jeder weiß, bin ich ein großer Befürworter von Vitalik Buterins pybitcointools Python 2.7/3.x-Bibliothek. Ich habe einige Probleme, die BIP32-Konzepte zu verstehen, die in den deterministischen / zusammengesetzten Modulen codiert sind.
Insbesondere dieser Code :
# BIP32 hierarchical deterministic multisig script
def bip32_hdm_script(*args):
if len(args) == 3:
keys, req, path = args
else:
i, keys, path = 0, [], []
while len(args[i]) > 40:
keys.append(args[i])
i += 1
req = int(args[i])
path = map(int, args[i+1:])
pubs = sorted(map(lambda x: bip32_descend(x, path), keys)) #
return mk_multisig_script(pubs, req) # (req = required sigs) ... returns redeemScript hex
# BIP32 hierarchical deterministic multisig address
def bip32_hdm_addr(*args):
return scriptaddr(bip32_hdm_script(*args)) # returns P2SH address
Ich hatte Probleme beim Signieren von 2-von-2-P2SH/HD-Txs mit Electrum, die ich nur mit createrawtransaction
\ signrawtransaction
in Bitcoin-CLI erfolgreich signieren konnte.
Wie genau wird P2SH in Kombination mit HD-Wallets umgesetzt (am besten im Sinne des oben genannten Python-Codes)?
OK, ich habe es mit pybitcointools zum Laufen gebracht .
Der Befehl, , gibt bip32_hdm_script
, wie man schließen kann, Hex des P2SH-Redescripts unter Verwendung der angegebenen öffentlichen/privaten BIP32-Masterschlüssel zurück (was sich nicht von der Verwendung mk_multisig_script(pubkey1 pubkey2 pubkey3 2)
für einen 2-von-3-P2SH unterscheidet). Gibt ebenso bip32_hdm_addr
die P2SH-Adresse zurück, die man aus dem Einlöseskript erhält.
Der Haken ist, dass wir es mit Pfaden und dergleichen zu tun haben und die Funktion Probleme mit Objekttypen hat.
Lassen Sie uns private Hauptschlüssel verwenden, die mit 0,1 bzw. 2 gesät sind ...
b32mprivkeys = [ bip32_master_key(str(x)) for x in range(3)]
gibt['xprv9s21ZrQH143K2FsoUgfptxnkXbTjWSyu7oPKz2BtJm5yWC8pZMtxbx66FhZoY2e6Fwz2rZ4zPZrgpNJHRd68RtQNcFFVbwGf7Vapo4spoqL', 'xprv9s21ZrQH143K2r9LvVthYjmsCLwZGpAc4uAAeovjhf7vaAbiunLgRdp8DAo4fSGUMuYQzzGfNGkdsR9xq6vcaKQSTa2VQx7o31N3kxcZi9k', 'xprv9s21ZrQH143K2AV64RkNhLQEHTphnaGZqrGBhXTw9gBTMfvDAPiKFWpkBmt9otxA2X14bRS6mPdxohX4QCP3PMi8TG7KvCriGcsQHwDHVfT']
Das Signieren mit privaten Master-Schlüsseln funktioniert nicht direkt , holen wir uns die Master-Pubkeys:
b32mpubs = map(bip32_privtopub, b32mprivs)
In diesem Beispiel wollen wir nun 0/1
in einem 2-von-3-Multisig zu Pfad absteigen. Dies wird durch ein int , 2
, und ein Tupel (nur!) des Pfades dargestellt, also (0, 1)
.
redeemscript = bip32_hdm_script(b32mpubss, 2, (0, 1)) = 5221029057ffd5c48f95c46c5e12b837cd0e4a7538dfa8ab9eb3479593724a6109ffb4210316776496822873767c6a91efe85a55871fc4a944c1d1ccab52cebd386cef29d4210318ae5429f67dbf61f54ae947f38637f4bffa1e252922b431eeed397cac49a22953ae
Jetzt verwenden wir bip32_hdm_addr
, um die P2SH-Adresse zu erhalten.
>>> bip32_hdm_addr(redeemscript) 5221029057ffd5c48f95c46c5e12b837cd0e4a7538dfa8ab9eb3479593724a6109ffb4210316776496822873767c6a91efe85a55871fc4a944c1d1ccab52cebd386cef29d4210318ae5429f67dbf61f54ae947f38637f4bffa1e252922b431eeed397cac49a22953ae
Hinweis, FWIW,>>> bip32_hdm_addr(redeemscript) == scriptaddr(redeemscript) True
WIEDER: Versuchen Sie nicht, mit privaten Hauptschlüsseln mit zu signieren , bip32_hdm_script
damit Sie nicht ein Einlöseskript zurückgeben, das, wenn es deserialisiert wird, Folgendes ausgibt:
slice( # we want the privkeys only deserialize_script(bip32_hdm_script(b32mprivkeys, 2, (0, 1))), 1, 4)
Sehen Sie, wie die Schlüssel aus dem Einlöseskript 33 Bytes lang sind? Und nicht mit dem 02.03.04 beginnen? Das ergibt eine unbrauchbare P2SH-Adresse, also hüte dich vor dieser Falle!
Nick Odell
Zauberer von Ozzie
abeikverdi