Es kann getan werden, dass Art und Weise. Eine Möglichkeit ist die Ableitung von X aus G(master), indem einen integer und dann Hashen. Danke für die Antwort, xmlgold.eu-service ist mir neu. über "alle die bereit sind zu zahlen Sie Ihre Kreditkarte für bitcoins," ich soll Ihnen meine Kreditkartennummer, richtig? wie würden Sie bezahlen? nun, wenn Sie erstellen ein zerocoin von 10BTC, verbringen Sie die utxo dieser bitcoin, so können Sie nicht mehr ausgeben, Bob, meine ich. Ich möchte verstehen, wie ist es möglich, dass die gleichen WIF Privaten Schlüssel erzeugt zwei unterschiedliche Adressen? Ich wusste, dass jede Adresse hat Ihren einzigartigen, privaten Schlüssel. @Andrew Chow, sowie von dem, was ich bekam von google-Ergebnissen, scheint es, Sie generieren Sie einfach neue Blöcke sofort in regtest-Modus nicht wirklich tun, PoW-mining, um einen neuen block? Auch der block ist die Bestätigung des 100-Blöcke, die nicht die gleiche ist wie das öffentliche Netz. So sind diese Informationen, die ich online sehen falsch?

Wie zu verwenden OP_BOOLOR und OP_EQUAL?

Sie können die tatsächliche Umsetzung für die Skript-Befehle in der Bitcoin ist script.cpp.

OP_BOOLOR tut:

[...]
CBigNum bn1 = CastToBigNum(stacktop(-2));
CBigNum bn2 = CastToBigNum(stacktop(-1));
CBigNum bn;
[...]
Fall OP_BOOLOR: bn = (bn1 != bnZero || bn2 != bnZero); break;
[...]
popstack(stack);
popstack(stack);
stack.push_back(bn.getvch());
[...]

Es ist also effektiv das Lesen aus dem stack, knallen Sie die Werte und drücken das Ergebnis.

OP_EQUAL ist so ziemlich das gleiche:

[...]
popstack(stack);
popstack(stack);
stack.push_back(fEqual ? vchTrue : vchFalse);
[...]

Es knallen die beiden Werte von oben und schob das Ergebnis des Vergleichs.


Ist das script richtig?

Lassen Sie uns führen Sie die Skripts und sehen, was passiert! scriptSig wird zuerst ausgeführt:

scriptSig: [Wallet] [Wallet] [sig] [pubKey]

Dieser code ist nur einschieben in den Stapel, so dass nach der scriptSig läuft der stack sieht so aus:

[pubKey] <- OBEN auf DEM STAPEL
[sig]
[Brieftasche]
[Brieftasche]

Hinweis die Elemente sind vertauscht. Das erste, was bewegt geht an der Unterseite des Stapels.

Jetzt scriptPubKey ausgeführt wird, halten den Inhalt des Stacks, die aus laufen scriptSig. Wenn wir das tun, mit Ihrem Skript...

scriptPubKey: OP_EQUAL Wallet1_Value [Brieftasche] 
 OP_EQUAL Wallet2_Value [Brieftasche] 
 OP_BOOLOR 
 OP_VERIFY OP_DUP OP_HASH160 [pubKeyHash] OP_EQUALVERIFY OP_CHECKSIG

...das erste was ausgeführt wird, ist OP_EQUAL, die vergleicht die obersten beiden Elemente des Stacks [pubKey] [sig] , die sind natürlich nicht gleich, daher ist 0 (false) gedrückt wird. Ich werde einfach hier aufhören , da es nicht sinnvoll ist an alle weiter.


Gebäude das richtige Skript

Ich erriet, was Sie eigentlich tun sollen, und das sind die von mir vorgeschlagenen scripts.

Erste, ich glaube, die Ausgaben Benutzer [sig], [pubKey] und [Geldbeutel] , wo [Brieftasche] ist entweder Wallet1_Value oder Wallet2_Value verbringen zu können die Fonds:

scriptSig: [sig] [pubKey] [Brieftasche]

Final-stack nach der Ausführung:
 [Brieftasche] <- OBEN auf DEM STAPEL
[pubKey]
[sig]

Das ist scriptSig, und es ist das, was ein Benutzer, wenn er will, zu verbringen der Fonds. Wir sind fertig! Bauen wir also den nächsten Schritt, d.h. die scriptPubKey , der prüft, ob die gelieferten Werte sind in Ordnung.

Das erste, was Sie tun möchten, ist zu überprüfen, ob die [Wallet] ist einer der Wallet1_Value oder Wallet2_Value. Lassen Sie uns zunächst duplizieren [Geldbeutel] , so können wir überprüfen Sie es zweimal. Der erste Schritt in scriptPubKey ist OP_DUP. Wir führen sowohl scriptSig erste und die neue scriptPubKey:

scriptSig: [sig] [pubKey] [Brieftasche]
scriptPubKey: OP_DUP 

Letzte Stapel:
 [Brieftasche] <- OBEN auf DEM STAPEL
[Brieftasche]
[pubKey]
[sig]

Natürlich möchten wir prüfen, es gegen Wallet1_Value ersten:

scriptSig: [sig] [pubKey] [Brieftasche]
scriptPubKey: OP_DUP [Wallet1_value]

Letzte Stapel:
 Wallet1_Value <- OBEN auf DEM STAPEL
[Brieftasche]
[Brieftasche]
[pubKey]
[sig]

Und überprüfen Sie nun die oberen beiden Elemente für die Gleichstellung:

scriptSig: [sig] [pubKey] [Brieftasche]
scriptPubKey: OP_DUP [Wallet1_value] OP_EQUAL

Letzte Stapel:
 (== Wallet1, entweder TRUE oder FALSE) <- OBEN auf DEM STAPEL
[Brieftasche]
[pubKey]
[sig]

Nun wollen wir überprüfen die doppelte [Brieftasche] gegen Wallet2_value aber das bisherige Ergebnis ist oben auf dem stack. Wir wechseln müssen Sie es zuerst mit OP_SWAP:

scriptSig: [sig] [pubKey] [Brieftasche]
scriptPubKey: OP_DUP [Wallet1_value] OP_EQUAL OP_SWAP

Letzte Stapel:
 [Brieftasche] <- OBEN auf DEM STAPEL
 (== Wallet1)
[pubKey]
[sig]

Wieder schieben wir den Wert, den wir prüfen wollen, und OP_EQUAL es:

scriptSig: [sig] [pubKey] [Brieftasche]
scriptPubKey: OP_DUP [Wallet1_value] OP_EQUAL OP_SWAP [Wallet2_value] OP_EQUAL

Letzte Stapel:
 (== Wallet2) <- OBEN auf DEM STAPEL
 (== Wallet1)
[pubKey]
[sig]

Das Skript ist fast fertig. Jetzt nur OP_BOOLOR OP_VERIFY:

scriptSig: [sig] [pubKey] [Brieftasche]
scriptPubKey: OP_DUP [Wallet1_value] OP_EQUAL OP_SWAP [Wallet2_value] OP_EQUAL OP_BOOLOR OP_VERIFY

Wenn OP_VERIFY findet, FALSE oben auf dem stack wird es ablehnen, die Transaktion. Wenn es feststellt, dass TRUE das Skript geht weiter, und der Stapel sieht wie folgt aus:

Final stack, wenn der korrekte [Brieftasche] wurde zur Verfügung gestellt:
[pubKey]
[sig]

Das ist, was der stack sieht aus wie nach einem regulären scriptSig! Also der rest der scriptPubKey ist einfach nur ein normaler pay-to-pubkey-hash - Skript. Die endgültige scriptPubKey ist:

OP_DUP [Wallet1_value] OP_EQUAL OP_SWAP [Wallet2_value] OP_EQUAL OP_BOOLOR OP_VERIFY
OP_DUP OP_HASH160 [pubKeyHash] OP_EQUALVERIFY OP_CHECKSIG

Tatsächliche Sicherheit

Nun, unabhängig von der Reihenfolge, das Skript ist nicht sehr sicher. Ich bekomme dabei nur um eine übung in Verständnis-Skripte oder soll nicht sicher sein (es könnte nur eine überprüfung, um Ausgaben zu vermeiden von unerwünschten Brieftaschen), aber ich denke, es ist wichtig zu zeigen, wie dies tatsächlich nicht sicher.

Wenn Sie veröffentlichen eine Transaktion mit dieser Regelung, die Ausgabe scriptPubKey ist öffentlich zugänglich und sieht so aus:

OP_DUP [Wallet1_value] OP_EQUAL OP_SWAP [Wallet2_value] OP_EQUAL OP_BOOLOR OP_VERIFY
OP_DUP OP_HASH160 [pubKeyHash] OP_EQUALVERIFY OP_CHECKSIG

Beide Wallet1_value und Wallet2_value sind öffentlich für jedermann zu sehen in der blockchain! Die Sicherheit hängt immer noch NUR auf [sig] [pubKey] da weiß ich genau, was erforderlich ist, um verbringen die Transaktion, d.h. das Skript Sicherheit entspricht der eines regulären pay-to-pubkey-hash Transaktion!!!


EDIT: EIN kleines bisschen sicherer (Antwort auf Kommentar)

Könnte Sie verlangen, Wallet1_value und Wallet2_value werden hashes statt? Dann die scriptsig würde, zu liefern haben, einen hash-Wert von einer der beiden Portemonnaies.

Ja. Eigentlich ist es sehr einfach (änderungen angezeigt in Fettdruck):

OP_HASH256 OP_DUP [Wallet1_hash] OP_EQUAL OP_SWAP [Wallet2_hash] OP_EQUAL OP_BOOLOR OP_VERIFY OP_DUP OP_HASH160 [pubKeyHash] OP_EQUALVERIFY OP_CHECKSIG

Wie Sie sehen können, die oben auf dem Stapel ist hashed (OP_HASH160 oder OP_HASH256, je nachdem, was Sie bevorzugen) vor der Vervielfältigung, so jetzt können Sie vergleichen die eingegebenen Daten auf übereinstimmung mit einem der beiden Hashwerte statt der Werte.

Das ist ein bisschen besser, da die Daten nicht dort in plain sight. Sie würde haben, um brute-force zu finden, eine WalletN_hash. Das problem ist, sobald Sie es ausgeben, die WalletN_value wird öffentlich in der Ausgaben-Transaktion, so WalletN_hash kann nicht in einer Transaktion verwendet wieder! Es wäre eines-verwenden Sie nur. Wenn Sie veröffentlichte mehrere Transaktionen mit derselben WalletN_hash, Sie müssten zu verbringen, alle Ausgänge zur gleichen Zeit oder aber auch die nicht ausgegebenen diejenigen, die möglicherweise missbraucht werden.

Beachten Sie das Schema ist immer noch sicher, da gibt es Unterschriften beteiligt. Wenn die scriptPubKey fehlte die standard-signatue überprüfung würde es nur werden:

OP_HASH256 OP_DUP Wallet1_hash OP_EQUAL OP_SWAP Wallet2_hash OP_EQUAL OP_BOOLOR OP_VERIFY

Jeder Bergmann konnte hören, die für diese Art von Transaktionen und, sobald jemand versucht, zu verbringen, mit scriptSig = [WalletN_value], die Transaktion modifiziert werden könnte (auch die Ausgänge!) statt der Weiterleitung, da die Transaktion nicht signiert ist, also der miner einlösen konnte die Ausgänge selbst.