Wenn Sie denken, dass Sie die Antwort auf Ihre Frage können Sie ein Häkchen bei "richtig" markieren, damit andere wissen, dass dies eine akzeptierte Antwort. Schön. Ich erhalte eine Fehlermeldung `../.pid` Verzeichnis oder Datei nicht vorhanden ist. ist pid obligatorisch ? Eröffnen Sie ein ticket? Was bedeutet das überhaupt.. Sie haben zu scherzen, wtf Entweder, und welcher hat die kleinste Lernkurve =) Ich bearbeitete die Antwort auf das hinzufügen der API benötigt plus ein Beispiel mit dem C# - wrapper-Bibliothek. Ich bin nicht sicher, es hilft eine Menge. Es ist eine bekannte Tatsache, dass heute Bitcoin ist eher zentralisierten aufgrund pools. Wie viel ist "zu viel"? Ich bin mir nicht sicher, was für eine Art von Antwort wäre, hier gilt.

Ich erwarte, dass CHECKMULTISIG rufen die CHECKSIG-Funktion und manipulieren der Stapel laufen CHECKSIG in einer Schleife, bis es beendet wird und entweder hat seine M-von-N gültige sigs oder nicht?

Das ist nicht wirklich, wie es intern implementiert, so gibt es ein paar Fallstricke, wenn Sie sich vorstellen, wie es die so.

OP_CHECKMULTISIG

Hier ist die high-level-Beschreibung, wie es funktioniert:

  1. Pop n aus dem Stapel (die Anzahl der öffentlichen Schlüssel)
  2. Pop n öffentliche Schlüssel aus dem Stapel.
  3. Pop m aus dem Stapel (die Anzahl der erforderlichen Unterschriften)
  4. Pop m-Signaturen aus dem Stapel.
  5. Pop ein weiteres element aus dem stack, und es ignorieren. (Dies ist ein Fehler, aber es kann nicht behoben werden, weil das ist Konsens-critical code.)
  6. Eine Schleife durch alle öffentlichen Schlüssel, beginnend mit den Tasten an der Oberseite des Stapels.

    1. Für jeden öffentlichen Schlüssel, prüfen von Einzel-Unterschrift.
    2. Für die ersten public-key überprüft haben, starten mit der Unterschrift am nächsten an der stack-Spitze.
    3. Wenn es scheitert, um zu überprüfen, gehen Sie auf die nächste öffentliche Schlüssel und überprüfen die gleiche Signatur.
    4. Wenn es gelingt, gehen Sie zu der nächsten öffentlichen Schlüssel mit der nächsten Unterschrift.

      Beachten Sie, dass die Unterschriften müssen in der gleichen Reihenfolge wie der Schlüssel ist, dass Sie die Unterzeichnung.

  7. Wenn alle Unterschriften gelungen, mit einem der Schlüssel, CHECKMULTISIG gibt 1 zurück, ansonsten 0.

Dein Beispiel

Sie haben diese scriptSig:

(sig2)
(sig1)
0

Diese scriptPubKey:

3
(pubKey3)
(pubKey2)
(pubKey1)
2

Wenn ausgeführt wird, wird der stack sieht so aus, kurz bevor OP_CHECKMULTISIG führt:

3
(pubKey3)
(pubKey2)
(pubKey1)
2
(sig2)
(sig1)
0

Dies ist, was es sieht aus wie nach der Initialisierung:

n-> 3
ikey-> (pubKey3)
(pubKey2)
(pubKey1)
m-> 2
isig-> (sig2)
(sig1)
0

Es versucht zu überprüfen, pubKey3 gegen sig2, aber das schlägt fehl. Voraus ikey, aber nicht isig:

n-> 3
(pubKey3)
ikey-> (pubKey2)
(pubKey1)
m-> 2
isig-> (sig2)
(sig1)
0

Überprüfen pubKey2 gegen sig2 gelangt, so dass Sie vorher beide ikey und isig:

n-> 3
(pubKey3)
(pubKey2)
ikey-> (pubKey1)
m-> 2
(sig2)
isig-> (sig1)
0

...und so weiter.