Klärung der hierarchischen deterministischen Multisig-Skripte von BIP32

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\ signrawtransactionin Bitcoin-CLI erfolgreich signieren konnte.

Wie genau wird P2SH in Kombination mit HD-Wallets umgesetzt (am besten im Sinne des oben genannten Python-Codes)?

Haben Sie Probleme beim Erstellen dieser Ausgaben oder beim Signieren einer Transaktion, um sie auszugeben, nachdem Sie sie erstellt haben?
@NickODell Ich möchte mit dem Python-Code signieren können. Ich möchte die Dinge nicht zu sehr verwirren, aber Electrum 2.0.4 signiert teilweise und gibt diese JSON-Daten zurück: gist.github.com/d6397e62bdb78f905cfa ... Es macht keinen Sinn, weil es den erweiterten öffentlichen Schlüssel im Skript ersetzt. (Hinweis: Die Daten können sicher geteilt werden, keine Sorge wegen gestohlener Schlüssel oder was auch immer)
Mich würde auch interessieren, wie Multisig mit dem HD Wallet implementiert werden kann. Generiert es automatisch Multisig-Adressen?

Antworten (1)

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_addrdie 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/1in 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_scriptdamit 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!