Wie funktionieren Multisig-Adressen?

Wie funktionieren Multisig-Adressen? Bestehen sie aus mehreren traditionellen Adressen oder haben sie eine andere Struktur? Wird man angeben können, ob 2 von 2, 2 von 3 oder M von N Unterschriften benötigt werden? Wo kann ich mehr über ihre Spezifikation erfahren?

Multisig-Adressen sind seit 2013 funktionsfähig.
@gladoscc Diese Frage wurde am 12.01.2013 gestellt

Antworten (2)

Ich weiß, dass diese Frage alt ist, aber ich bin darauf gestoßen, als ich versuchte, mir beizubringen, wie Multisig-Adressen funktionieren, und ich stelle mir vor, dass andere dies tun werden. Ich werde also versuchen, den typischen Ablauf zum Erstellen, Hinzufügen von Bitcoins und schließlich zum Ausgeben einer Multisig-Adresse zu erklären. Diese Erklärung richtet sich an Anfänger, entschuldigen Sie bitte meine mangelnde Kürze. Zunächst einmal sollten wir einige Begriffe aus dem Weg räumen.

Bitcoin-Adresse: Eine Bitcoin-Adresse ist eine Zeichenfolge mit (normalerweise) 33 oder 34 Ziffern, die wir Personen geben, wenn wir möchten, dass sie uns Bitcoins senden. Hier ist ein Beispiel für eine öffentliche Ansprache

19evXeJDDLNeRS4st4bGUJNGk8eBgVCCg4

Öffentlicher Schlüssel: Ein öffentlicher Schlüssel wird verwendet, um eine Bitcoin-Adresse abzuleiten, obwohl die Kenntnis einer Bitcoin-Adresse es Ihnen NICHT erlaubt, den entsprechenden öffentlichen Schlüssel dieser Adresse zu finden. Weitere Informationen zur Beziehung zwischen öffentlichem Schlüssel und Bitcoin-Adresse finden Sie unter https://en.bitcoin.it/wiki/Technical_background_of_version_1_Bitcoin_addresses . So sieht der öffentliche Schlüssel für die oben eingefügte Bitcoin-Adresse aus

035739f07de25c205525d81b126ed87bc30377e688705072d186e4f5c88908ce3a

Beachten Sie, dass ich diesen öffentlichen Schlüssel nur kenne, weil er zusammen mit meinem privaten Schlüssel in meiner Brieftasche gespeichert ist. Ich poste diese normalerweise vertraulichen Informationen hier, weil es einfacher ist, Bitcoin zu verstehen, wenn Sie Beispiele haben.

Multisig-Transaktion/Adresse: Eine Multisig-Transaktion ist einfach eine Transaktion, die als eine ihrer Eingaben eine Multisig-Adresse hat. Multisig-Adressen werden verwendet, damit mehrere Schlüssel, die verschiedenen Einheiten gehören, benötigt werden, um die Bitcoins in einer Adresse zu verschieben.

Okay toll! Hier sind nun die Schritte und der Hintergrund zum Erstellen einer Multisig-Adresse. Ich werde die Dinge zuerst in einfachem Englisch erklären und dann mit den Bash-/Terminal-Befehlen fortfahren, mit denen Sie die Multisig-Adresse erstellen/Geld hinzufügen/ausgeben werden. Ich verwende das Standard-Bash-Trennzeichen „$>“, um anzuzeigen, dass Sie alles, was nach dem „$>“ kommt, in Ihr Terminal eingeben sollten. Zeilen, die nach der Zeile mit „$>“ kommen, sind die Ausgabe dieses Befehls. Wenn Sie jemals Fragen zu einem von Ihnen eingegebenen Befehl haben, können Sie Folgendes in das Terminal eingeben, um anzuzeigen, welche Argumente an den Befehl übergeben werden sollen

$> bitcoind help <nameofcommandhere>

Diese Erklärung setzt voraus, dass Sie ein aktuelles Update und einen funktionierenden Bitcoin-Server haben, der RPC-Befehle akzeptieren kann.

ich. Erstellen Sie die öffentlichen Schlüssel, aus denen die Multisig-Adresse besteht. Sie werden diese öffentlichen Schlüssel und eine weitere Information verwenden, um Ihre Multisig-Adresse zu erstellen. Die häufigste Verteilung der Adressen in einer Multisig-Adresse mit 3 Adressen (es ist möglich, eine Multisig-Adresse zu haben, die aus mehr als drei Adressen besteht, aber sie werden nicht von allen Minern unterstützt, daher werden wir uns für diese Erklärung mit den häufigsten befassen 3-Adressen-Multisig-Adresse) lauten wie folgt. PubKey#1 gehört normalerweise Ihnen und wird auf einem Gerät gespeichert, auf das Sie leicht zugreifen können (z. B. Ihr Mobiltelefon). PubKey#2 ist in der Regel auch Ihr Eigentum, wird aber an einem sicheren Ort aufbewahrt (z. B. Cold Storage oder in einer Paper Wallet). PubKey#3 ist oft der öffentliche Schlüssel eines Drittanbieters, wie z. B. Ihres Bruders oder eines Unternehmens, das Bitcoin-bezogene Dienste wie Coinbase anbietet. Nennen wir jeden dieser Besitzer eines öffentlichen Schlüssels eine Entität. Denken Sie daran, dass Bitcoin die Kryptografie mit privaten/öffentlichen Schlüsseln verwendet, sodass jeder, der einen öffentlichen Schlüssel erstellt, auch den entsprechenden privaten Schlüssel für sich behält. Dieser private Schlüssel wird später in der Erklärung wichtig sein. Lassen Sie uns also 3 neue öffentliche Adressen erstellen, die wir letztendlich verwenden werden, um eine Multisig-Adresse zu erstellen! Beachten Sie, dass Sie, wie ich oben erklärt habe, bei Verwendung einer Multisig-Adresse in einer realen Situation wahrscheinlich einen der drei öffentlichen Schlüssel von einem Drittanbieter erhalten würden, aber für diese Erklärung hier werden wir nur alle drei selbst erstellen . Hier sind die relevanten RPC-Befehle zum Erstellen öffentlicher Schlüssel: Dieser private Schlüssel wird später in der Erklärung wichtig sein. Lassen Sie uns also 3 neue öffentliche Adressen erstellen, die wir letztendlich verwenden werden, um eine Multisig-Adresse zu erstellen! Beachten Sie, dass Sie, wie ich oben erklärt habe, bei Verwendung einer Multisig-Adresse in einer realen Situation wahrscheinlich einen der drei öffentlichen Schlüssel von einem Drittanbieter erhalten würden, aber für diese Erklärung hier werden wir nur alle drei selbst erstellen . Hier sind die relevanten RPC-Befehle zum Erstellen öffentlicher Schlüssel: Dieser private Schlüssel wird später in der Erklärung wichtig sein. Lassen Sie uns also 3 neue öffentliche Adressen erstellen, die wir letztendlich verwenden werden, um eine Multisig-Adresse zu erstellen! Beachten Sie, dass Sie, wie ich oben erklärt habe, bei Verwendung einer Multisig-Adresse in einer realen Situation wahrscheinlich einen der drei öffentlichen Schlüssel von einem Drittanbieter erhalten würden, aber für diese Erklärung hier werden wir nur alle drei selbst erstellen . Hier sind die relevanten RPC-Befehle zum Erstellen öffentlicher Schlüssel:

Geben Sie diesen Befehl ein, um alle Ihre Konten anzuzeigen. Angenommen, Sie fangen neu an, haben Sie nur das Konto mit dem Namen leere Zeichenfolge und keine Bitcoins darin

$> bitcoind listaccounts
{
    "" : 0.00000000
}

Geben Sie den folgenden Befehl dreimal ein, um drei neue Adressen in diesem Konto zu erstellen

$> bitcoind getnewaddress “"

Geben Sie diesen Befehl ein, um Ihre neu erstellten Adressen anzuzeigen

$> bitcoind getaddressesbyaccount “”
[
    "1CtfcziAhqx83CtSPdufgZDGmL8ohTFTdd",
    "1JeK7TZR85BL8WvtHgCiTSYtPJupdYYXgR",
    "1MP3BzdhzoBmGoBiVfLmhv7B4Czxm3MbrU"
]

Du bist aber noch nicht fertig. Bisher haben Sie nur die öffentlichen Adressen gesehen. Sie müssen die öffentlichen Schlüssel dieser Adressen abrufen. Glücklicherweise können Sie das einfach tun, indem Sie den folgenden Befehl dreimal eingeben und jedes Mal eine der von Ihnen erstellten Adressen ersetzen

$> bitcoind validateaddress <btcaddress>
{
    "isvalid" : true,
    "address" : "19evXeJDDLNeRS4st4bGUJNGk8eBgVCCg4",
    "ismine" : true,
    "isscript" : false,
    "pubkey" : "035739f07de25c205525d81b126ed87bc30377e688705072d186e4f5c88908ce3a",
    "iscompressed" : true,
    "account" : ""
}

Der Wert rechts von „pubkey“ ist der öffentliche Schlüssel dieser Adresse.

ii. Mit diesen drei Schlüsseln erstellen Sie dann die Multisig-Adresse. Im vorherigen Absatz habe ich erwähnt, dass Sie die öffentlichen Schlüssel plus eine weitere Information benötigen, um die Multisig-Brieftasche zu erstellen. Diese Information ist die Anzahl der Unterschriften, die erforderlich sind, um die Bitcoins in einer Multisig-Adresse auszugeben. Eines der nützlichen Dinge an einer Multisig-Adresse ist, dass zum Senden des Geldes an die Adresse mehrere private Schlüssel erforderlich sind (ich sagte Ihnen, wir würden auf diese zurückkommen!), Die die Transaktion signieren, um sie gültig zu machen. Für dieses Beispiel verwenden wir also die Zahl 2; zwei der drei Unternehmen müssen die Transaktion unterzeichnen, damit Bitcoins überall hin bewegt werden können. Wenn wir die Multisig-Adresse erstellen, gibt Bitcoin die 34-stellige Multisig-Adresse sowie eine Reihe von Hex-Daten zurück, die als „RedeemScript“ bezeichnet werden. Beachten Sie, dass die erste Ziffer in der Adresse eine „3“ ist. Die meisten Adressen, die Sie früher verwendet haben, beginnen wahrscheinlich mit einer „1“, aber alle Multisig-Adressen beginnen mit „3“. Kopieren, fügen und speichern Sie die Adress- und RediseScript-Werte irgendwo, da wir sie in Kürze benötigen. Also erstellen wir die Multisig-Adresse, indem wir den folgenden Befehl eingeben. Stellen Sie sicher, dass Sie die Apostrophe und Anführungszeichen genau so eingeben, wie ich es getan habe, und ersetzen Sie sie durch die öffentlichen Schlüssel, die Sie von validateaddress erhalten haben.

$> bitcoind createmultisig 2 ‘[“<pubkey>", "<pubkey>", "<pubkey>”]'


{
    "address" : "3DS7Y6bdePdnFCoXqddkevovh4s5M8NhgM",
    "redeemScript" :     "5221027ca87e1aa2595ec7771afee8fdc6efdbc301b8370c4386731b4bd82247dc74a321022cc9874ba092095dd    a47a4e4edb1781c43c35b3ec0429ac005df37b9d6eec94b21035739f07de25c205525d81b126ed87bc30377e6887    05072d186e4f5c88908ce3a53ae"
}

Kopieren Sie die Ausgabe, die Sie irgendwo erhalten, wir werden sie bald brauchen.

iii. Senden Sie einige Bitcoins von einem Ihrer Wallets an die Multisig-Adresse. Ich war überrascht zu erfahren, dass Coinbase Multisig-Adressen nicht für gültig hält. Wenn Sie also Coinbase verwenden, können Sie nicht direkt von Ihrem Coinbase-Wallet an die Multisig-Adresse senden. Als Problemumgehung können Sie Coinbase verwenden, um eine kleine Menge Bitcoins (ich habe einen Wert von 1 Dollar gesendet) an eine der drei Adressen zu senden, die Sie ursprünglich erstellt haben, warten, bis diese Transaktion bestätigt wird, und dann den folgenden Befehl verwenden, um Bitcoins zu senden von diese reguläre Adresse an die Multisig-Adresse. Ersetzen Sie durch die Multisig-Adresse und durch eine Menge Bitcoins, die weniger wert sind als der Betrag, den Sie an die reguläre Adresse gesendet haben. Denken Sie daran, dass Sie Transaktionsgebühren zahlen müssen! Wenn der Befehl funktioniert, gibt er den Transaktions-Hash der Transaktion zurück.

$> bitcoind sendtoaddress <bitcoindaddress> <amount>
0ac29fc675909eb565a0984fe13a47dae16ca53fb477b9e03446c898b925ab6b

iv. Schließlich werden wir die Bitcoins, die wir gerade erhalten haben, in der Multisig-Adresse ausgeben. Wir verwenden die privaten Schlüssel der ersten beiden Adressen, die wir in Schritt 1 erstellt haben. Um die privaten Schlüssel zu erhalten, geben wir den folgenden Befehl zweimal in das Terminal ein und ersetzen ihn jedes Mal durch eine der von Ihnen erstellten Bitcoin-Adressen:

$> bitcoind dumpprivkey <btcaddress>
KyiRjmZYPH7cfyKf1WNb3BZFz1ySurWEYKxLngkH6VmTcSCirBPG

(Nebenbei bemerkt, das Schlimmste, was Sie in der Bitcoin-Community tun können, ist, den privaten Schlüssel einer Ihrer Adressen in ein öffentliches Forum einzufügen. TUN SIE DAS NIEMALS! Ich tue dies nur, weil ich sicherstellen möchte, dass es die Leser können folgen Sie meiner Erklärung, und es gibt nur ein paar Dollar in diesen Adressen)

v. Jetzt, da Sie zwei öffentliche/private Schlüsselpaare haben, können wir endlich die Bitcoins ausgeben, die wir an die Multisig-Adresse gesendet haben. Dazu müssen wir zunächst einige Informationen über diese Transaktion sammeln, bei der wir Bitcoins an die Multisig-Adresse gesendet haben, da wir die richtige Ausgabe dieser Transaktion auswählen müssen, um sie als Eingabe in der Rohtransaktion zu verwenden, die wir erstellen werden. Geben Sie Folgendes in das Terminal ein und ersetzen Sie es durch den Transaktions-Hash, der zuvor zurückgegeben wurde.

$> bitcoind getrawtransaction <txid> 1
{
    "hex" : "010000000175783b2ca3381efb15ee7f5f44632a2c699171a924185386460b91d0f211d3bb000000006a47304402207707875d5c29ed0d97cd72087c67c17c57e2ef34d0b6208a054fffece8704477022045aec0ea57830f53fa0e52094400dd4fb654d7712f2ac3341a762d0f46c02d370121027ca87e1aa2595ec7771afee8fdc6efdbc301b8370c4386731b4bd82247dc74a3ffffffff0210270000000000001976a91431e71089318d7b1ea51a1add0dd6525423f713c488ac702402000000000017a91480cff499983050ec4268d749a1f898bec53e9fc28700000000",
    "txid" : "0ac29fc675909eb565a0984fe13a47dae16ca53fb477b9e03446c898b925ab6b",
    "version" : 1,
    "locktime" : 0,
    "vin" : [
        {
            "txid" : "bbd311f2d0910b4686531824a97191692c2a63445f7fee15fb1e38a32c3b7875",
            "vout" : 0,
            "scriptSig" : {
                "asm" : "304402207707875d5c29ed0d97cd72087c67c17c57e2ef34d0b6208a054fffece8704477022045aec0ea57830f53fa0e52094400dd4fb654d7712f2ac3341a762d0f46c02d3701 027ca87e1aa2595ec7771afee8fdc6efdbc301b8370c4386731b4bd82247dc74a3",
                "hex" : "47304402207707875d5c29ed0d97cd72087c67c17c57e2ef34d0b6208a054fffece8704477022045aec0ea57830f53fa0e52094400dd4fb654d7712f2ac3341a762d0f46c02d370121027ca87e1aa2595ec7771afee8fdc6efdbc301b8370c4386731b4bd82247dc74a3"
            },
            "sequence" : 4294967295
        }
    ],
    "vout" : [
        {
            "value" : 0.00010000,
            "n" : 0,
            "scriptPubKey" : {
                "asm" : "OP_DUP OP_HASH160 31e71089318d7b1ea51a1add0dd6525423f713c4 OP_EQUALVERIFY OP_CHECKSIG",
                "hex" : "76a91431e71089318d7b1ea51a1add0dd6525423f713c488ac",
                "reqSigs" : 1,
                "type" : "pubkeyhash",
                "addresses" : [
                    "15Yrv3rAVxYTTGePM3ZZwumSnMfS9St9uD"
                ]
            }
        },
        {
            "value" : 0.00140400,
            "n" : 1,
            "scriptPubKey" : {
                "asm" : "OP_HASH160 80cff499983050ec4268d749a1f898bec53e9fc2 OP_EQUAL",
                "hex" : "a91480cff499983050ec4268d749a1f898bec53e9fc287",
                "reqSigs" : 1,
                "type" : "scripthash",
                "addresses" : [
                    "3DS7Y6bdePdnFCoXqddkevovh4s5M8NhgM"
                ]
            }
        }
    ],
    "blockhash" : "00000000000000002ab5cb0ee400200b8575fe393fef57d41b41a5d533a414a3",
    "confirmations" : 5,
    "time" : 1404775273,
    "blocktime" : 1404775273
}

Suchen Sie nach dem Schlüssel „vout“, der ein JSON-Array als Wert haben sollte. Wir brauchen hier zwei Werte; der Index der Ausgabe in vout, die den größten Wert hat, und der Wert des „Hex“-Schlüssels innerhalb derselben Ausgabe. Als ich diese Transaktion ursprünglich gesendet habe, hatte ich 0,00160400 Bitcoins gesendet. 0,0001 davon gingen an die Zahlung von Miner-Gebühren, und die restlichen 0,0010000 gingen an eine Änderungsadresse, die meine Client-Software für mich erstellt hat. Wir möchten die Ausgabe mit dem größten Wert (hier 0,00140400) als Eingabe in unsere Transaktion verwenden, wenn wir unsere Rohtransaktion erstellen. Hier ist der Index also gleich 1. In derselben Transaktion benötigen wir den Wert für den Schlüssel „hex“ in „scriptPubKey. Es ist zu viel, hier ins Detail zu gehen, was dieser Wert darstellt,https://bitcointalk.org/index.php?topic=377604.0 . Auf hoher Ebene ist der „hex“-Wert von scriptPubKey eine hexadezimale Codierung des Skripts, das als Teil einer Transaktionseingabe ausgeführt wird, um zu überprüfen, ob die Transaktion gültig ist. Wie auch immer, der Wert für „Hex“, den wir wollen, ist also a91480cff499983050ec4268d749a1f898bec53e9fc287

Erinnern Sie sich, als wir die Multisig-Adresse erstellten, war einer der zurückgegebenen Werte etwas namens „redeemScript“? Hoffentlich haben Sie das irgendwo kopiert und eingefügt, weil wir das auch brauchen, um unsere Rohtransaktion zu erstellen. Dies wird auch verwendet, um zu überprüfen, ob die Transaktion gültig ist und somit von den Knoten herumgereicht werden kann, wenn sie an das Netzwerk gesendet wird.

OK, hier kommt der verwirrendste Teil in Bezug auf die Codierung; Wir werden einige Bitcoin-Operationen auf relativ niedriger Ebene durchführen, die tatsächlich ablaufen, wenn Sie Münzen von einer Adresse an eine andere senden, allerdings mit der zusätzlichen Komplikation der Verwendung einer Multisig-Adresse. Wir werden den Transaktions-Hash, den Index im vout-Array, den wir gerade gefunden haben, das scriptPubKey, das requireScript sowie eine Bitcoin-Adresse verwenden, die eine bestimmte Anzahl von Coins erhält, die wir angeben. Geben Sie das Folgende genau so in das Terminal ein, wie ich es geschrieben habe, und ersetzen Sie es durch den Transaktions-Hash, durch 1, durch das scriptPubKey, durch das resolveScript, durch die Adresse, an die Sie diese Bitcoins senden möchten (ich habe eine der drei verwendet, die ich bei der erstellt habe start) und (Sie haben es erraten) mit dem Betrag, den Sie senden möchten. Vergessen Sie nicht, eine Transaktionsgebühr von etwa 0,0001 zu berücksichtigen.

$> bitcoind createrawtransaction '[{"txid”:”<txid>","vout”:<vindex>,"scriptPubKey”:”<scriptPubKey","redeemScript”:”<redeemScript>"}]' ‘{“<sentToAddress”:<amount>}'’


01000000016bab25b998c84634e0b977b43fa56ce1da473ae14f98a065b59e9075c69fc20a0100000000ffffffff0160fd0100000000001976a9145eed147e77af70c64c31c056c3b3474c79c65da088ac00000000

Dieser Befehl hat gerade eine rohe Hex-codierte Transaktion zurückgegeben, dies ist die Sammlung von Bytes, die Bitcoin-Clients an das Netzwerk senden und die die Informationen enthalten, die erforderlich sind, um zu überprüfen, ob die Ausgaben, die als Eingabe in der Transaktion verwendet werden, gültig sind. Aber im Moment ist diese Transaktion NICHT gültig, da sie nicht von mindestens zwei der privaten Schlüssel signiert wurde, die dieser Multisig-Adresse zugeordnet sind. Lass uns das jetzt tun. Wir nehmen diese rohe Hex-Transaktion, die meisten Informationen, die wir gerade im vorherigen Befehl eingegeben haben, und den privaten Schlüssel der ersten Adresse, die wir erstellt haben, und signieren die Transaktion. Der Befehl sieht so aus, wobei Sie ihn durch die Ausgabe des vorherigen Befehls und durch den privaten Schlüssel der ersten von uns erstellten Adresse ersetzen (erinnern Sie sich an die, die wir durch Ausführen von „bitcoind dumprivkey“ erhalten haben?)

$> bitcoind signrawtransaction ‘<rawhextransaction>' '[{"txid”:”<txid>","vout”:<vindex>,"scriptPubKey”:”<scriptPubKey","redeemScript”:”<redeemScript>"}]' ‘[“<privkeyone>”]'


{
    "hex" :     "01000000016bab25b998c84634e0b977b43fa56ce1da473ae14f98a065b59e9075c69fc20a01000000b500483045022100f98068a026e2fc75cfeffe84bbac4223ed172df42bca01fd748a14bd960b1695022062c61a7f4f2a63a65d96b0feaf2a048bc2ca93e5de13013978a187395f880b6d014c695221027ca87e1aa2595ec7771afee8fdc6efdbc301b8370c4386731b4bd82247dc74a321022cc9874ba092095dda47a4e4edb1781c43c35b3ec0429ac005df37b9d6eec94b21035739f07de25c205525d81b126ed87bc30377e688705072d186e4f5c88908ce3a53aeffffffff0160fd0100000000001976a9145eed147e77af70c64c31c056c3b3474c79c65da088ac00000000",
    "complete" : false
}

Sie werden feststellen, dass der „vollständige“ Schlüssel falsch ist. Das liegt daran, dass wir nur eine der beiden Unterschriften bereitgestellt haben, die wir benötigen, um dies zu einer gültigen Transaktion zu machen. Der Wert für „hex“ ist eine hexadezimale Darstellung der von uns erstellten Rohtransaktion, jedoch mit einer enthaltenen Signatur. Als nächstes nehmen wir die Transaktion mit einer Signatur und signieren sie mit dem privaten Schlüssel der zweiten von uns erstellten Adresse. Der Terminal-Befehl ist sehr ähnlich:

$> bitcoind signrawtransaction ‘<onesigrawtransaction>' '[{"txid”:”<txid>","vout”:<vindex>,"scriptPubKey”:”<scriptPubKey","redeemScript”:”<redeemScript>"}]' ‘[“<privkeytwo>”]'

{
    "hex" : "01000000016bab25b998c84634e0b977b43fa56ce1da473ae14f98a065b59e9075c69fc20a01000000fdfd0000483045022100f98068a026e2fc75cfeffe84bbac4223ed172df42bca01fd748a14bd960b1695022062c61a7f4f2a63a65d96b0feaf2a048bc2ca93e5de13013978a187395f880b6d0147304402201ce986e3fd780f4fe81f40ceb271a8ff34c3845e385b8424f8b20d1b91f1282102205dc71831baf5606f59d06b1d115bda3ec28817cdb4bf9df06643d550c30ef193014c695221027ca87e1aa2595ec7771afee8fdc6efdbc301b8370c4386731b4bd82247dc74a321022cc9874ba092095dda47a4e4edb1781c43c35b3ec0429ac005df37b9d6eec94b21035739f07de25c205525d81b126ed87bc30377e688705072d186e4f5c88908ce3a53aeffffffff0160fd0100000000001976a9145eed147e77af70c64c31c056c3b3474c79c65da088ac00000000",
    "complete" : true
}

Sie werden wahrscheinlich erfreut feststellen, dass „vollständig“ jetzt wahr ist. Wir haben jetzt nur noch einen Schritt! Wir nehmen die Ausgabe dieses letzten Befehls, bei der es sich um eine gültige und vollständig signierte Transaktion handelt, die Bitcoins von einer Multisig-Adresse an eine von Ihnen angegebene Adresse sendet, und senden sie wie folgt mit dem Befehl „sendrawtransaction“.

$> bitcoind sendrawtransaction <fullysignedtransaction>

bc26380619a36e0ecbb5bae4eebf78d8fdef24ba5ed5fd040e7bff37311e180d

Und schließlich wird der Transaktions-Hash für die gerade gesendete Transaktion zurückgegeben.

Das ist es! Sie können blockchain.info verwenden, um diese Transaktion im Netzwerk anzuzeigen. Jetzt wissen Sie, wie Multisig-Adressen erstellt werden, wie Sie Geld an Multisig-Adressen senden und vor allem, wie Sie diese Bitcoins ausgeben. Jetzt gehen Sie bitte raus und helfen Sie mit, Wallet-Software zu entwickeln, die Multisig-Transaktionen auf benutzerfreundliche Weise implementiert.

Das ist fantastisch. Vielen Dank für diese sehr ausführliche Antwort. Ich würde +1000 geben ;)
Was ist, wenn der valueBetrag voutder Eingabetransaktion, die Sie verwenden, createrawtransactiongeringer ist als die Gesamtzahl der Bitcoins, die Sie senden möchten? Müssen Sie mehrere Transaktionen auswählen, bis Sie den gewünschten Betrag erreicht haben?
@FelipeLima Entschuldigung, diese Antwort kommt so spät! Werfen Sie einen Blick auf den Befehl createrawtransaction, und Sie werden sehen, dass das erste Argument eigentlich ein Array ist (Sie können es an den eckigen Klammern erkennen), das ein einzelnes „txid + vout + scriptPubKey + resolveScript“-Element enthält. Das bedeutet, dass Sie mehrere dieser Elemente, die jeweils in geschweiften Klammern enthalten sind, übergeben können, um genügend Transaktionen mit Vouts anzugeben, die gleich oder größer als die Menge an BTC sind, die Sie senden möchten (plus ein wenig mehr für Miner-Gebühren!).
@almel: Wie können zwei Personen (z. B. A & B) gemeinsam eine Multisig-Transaktion unterzeichnen?
@anhldbk Nehmen wir an, A signiert zuerst, sie rufen auf signrawtransactionund geben ein Objekt mit einem hexFeld aus. Sie senden diese Hex-Daten an B, der sie dann signiert und die Transaktion an das Netzwerk sendet. Es ist sicher für A, das halb signierte tx an B zu übergeben, weil das Einzige, was B tun kann, die Transaktion signieren soll. Wenn sie versuchen, es zu ändern, wird die Signatur von A ungültig und B kann die geänderte tx nicht senden, selbst wenn B sie signiert.
Falsch. Es gibt keine Bitcoin-Adresse, Ihre gesamte Antwort ist irreführend.
@almel ist es möglich, Multisig ohne Pubkeys zu verwenden? Ich meine, nur Adressen zu verwenden.
@ user2284570 Nein, ist es nicht. Ohne die Pubkeys gibt es keine Möglichkeit, öffentliche Schlüssel zu signieren und zu verifizieren. Wenn Sie nur die Adressen haben, haben Sie nur einen SHA256-Hash der Pubkeys, der für digitale Signaturalgorithmen nutzlos ist. Was genau versuchen Sie zu tun, das erfordert, dass Sie Adressen, aber keine Pubkeys verwenden?

Transaktionen in Bitcoin sind eigentlich Skripte, in denen normalerweise eine Eingabe- und eine Ausgabeadresse angegeben sind. Aber es gibt auch andere Operationscodes wie das CHECKMULTISIGVERIFY-Skript. Jede unterzeichnende Partei hat ihren eigenen öffentlichen Schlüssel und somit ihre eigene Adresse. Die Funktionsweise ist wie gezeigt:

N K1 K2 K3 M PRÜFENMULTISIGVERIFY

Wo :

-N ist die Nummer der Signatur, um fortzufahren
-K1, K2, K3 Die eigentlichen 3 öffentlichen Schlüssel
-M Die Nummer der öffentlichen Schlüssel, die Sie angegeben haben

Was die eigentliche Transaktion tut, sollte im Eingabeskript festgelegt werden.

Sehen Sie hier ein Beispiel für eine Transaktion mit einem Dritten.