Ich erstelle eine Bitcoin-basierte Lotterieanwendung. Eine Teilnahme an der Lotterie ist eine Transaktion, die 1 BTC ausgibt.
Wenn jemand einen beliebigen Wert richtig errät, kann er den Eintrag beanspruchen und diese 1 Btc an eine Adresse senden, die er kontrolliert.
Ich wünsche mir folgende Funktionalität: Wenn nach 100 Blöcken niemand die richtige Zahl errät, dann kann ich das als Betreiber der Lotterie beanspruchen.
Kann ich dies tun über: Eingabetransaktion IF CHECKLOCKTIMEVERIFY zahlbar an eine korrekte Schätzung ELSE Zahlbar an meinen öffentlichen Schlüssel END
Wenn ich dann versuche, diese Eingangstransaktion auszugeben, setze ich die nLockTime auf den aktuellen Block.
Ich setze durchgehend alle Sequenznummern auf 0xFFF... Damit die Transaktionen geschürft werden.
Ja, Sie können verwenden OP_CHECKLOCKTIMEVERIFY
, um eine Transaktionsausgabe für eine bestimmte Anzahl von Blöcken unverbrauchbar zu machen. Sie können es jedoch nicht direkt in einem if-else-Block verwenden, wie Sie es beschrieben haben. Bei OP_CHECKLOCKTIMEVERIFY
der Ausführung wird kein Ergebniswert auf dem Stack abgelegt. Es gibt entweder einen Fehler aus (was die Transaktion ungültig macht, die versucht, die Ausgabe auszugeben) oder fährt mit der Ausführung fort, als ob nichts passiert wäre.
Um eine von Ihnen beschriebene Transaktion zu erstellen, müssen Sie Multisig verwenden, sodass eine Partei die Transaktion ausgeben kann, sobald die richtige Nummer bereitgestellt wird (Eingabe in eine Hash-Funktion, nehme ich an?), ODER Sie können sie zurückgeben selbst nach Ablauf der Sperrzeit. So funktioniert das Lightning-Netzwerk im Grunde. Sie sollten sich Lightning Networks Teil II: Hashed Timelock Contracts (HTLCs) ansehen.
Tom Taylor
Jestin
OP_CHECKLOCKTIMEVERIFY
eine Folge einer Bedingung ist, nicht die Bedingung selbst. Die Bedingung ist das0
oder1
am Ende seiner Beispiel-Einlöseskripte. Das bestimmt, obOP_CHECKLOCKTIMEVERIFY
aufgerufen wird.Tom Taylor