Wie verwende ich CHECKLOCKTIMEVERIFY, um zu verhindern, dass eine Transaktion vor 100 Blöcken ausgegeben wird?

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.

Antworten (1)

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_CHECKLOCKTIMEVERIFYder 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.

Danke für die Info. Auf der BIP-Seite schlägt Peter Todd aber ein ähnliches Skript wie meines vor, richtig? github.com/bitcoin/bips/blob/master/bip-0065.mediawiki
Ja, seine Beispiele sind ähnlich. Denken Sie nur daran, dass dies OP_CHECKLOCKTIMEVERIFYeine Folge einer Bedingung ist, nicht die Bedingung selbst. Die Bedingung ist das 0oder 1am Ende seiner Beispiel-Einlöseskripte. Das bestimmt, ob OP_CHECKLOCKTIMEVERIFYaufgerufen wird.
Vielen Dank. Werde bei weiteren Fragen hierher zurückkommen.