Erstellen einer OP_CSV-Transaktion mit bitcoinjs

Ich arbeite an einem Tool zur zeitgebundenen Vertragserstellung. Mein Einlösungsskript sieht so aus:

OP_HASH160 <revocationHash> OP_EQUAL
OP_IF
    <bobPubKey>
OP_ELSE
    <timeDelay> OP_CHECKSEQUENCEVERIFY OP_DROP
    <alicePubKey>
OP_ENDIF
OP_CHECKSIG

Das Ziel ist, dass Alice die Gelder nach einer Zeitverzögerung ausgeben kann, während Bob sie jederzeit ausgeben kann, indem er die Kenntnis des Hash-Preimages nachweist.

Das Ausgeben durch den Widerrufs-Hash ist einfach genug. Ich habe jedoch Probleme beim Erstellen einer Transaktion, die auf der Grundlage des Zeitschlosses ausgegeben wird, erweist sich als schwieriger. Im Wesentlichen sind meine Fragen:

  1. Was stellt der <timeDelay>Wert dar? Wie kann ich zB das Guthaben für 2 Blöcke sperren?
  2. Nach dem, was ich gelesen habe, muss die Sequenznummer für die Ausgabentransaktion festgelegt werden. Aber was soll man einstellen?
  3. Wie realisiere ich dies praktisch mit bitcoinjs-liboder einer anderen Bibliothek?

Antworten (3)

In bitcoin-js könnte man so etwas machen

aliceToBobRedeemScript =  bitcoin.script.compile([,
bitcoin.opcodes.OP_IF,
  bitcoin.opcodes.OP_HASH160,
  aliceSecretHash,
  bitcoin.opcodes.OP_EQUALVERIFY,
  bobPrivKey.getPublicKeyBuffer(),
bitcoin.opcodes.OP_ELSE,
  bitcoin.script.number.encode(10),
  bitcoin.opcodes.OP_NOP3,
  bitcoin.opcodes.OP_DROP, 
  alicePrivKey.getPublicKeyBuffer(),
bitcoin.opcodes.OP_ENDIF,
bitcoin.opcodes.OP_CHECKSIG
]);

Es gibt einige Beispielcodes auf einer alten Atomicswap-Demo, sie hat kein CSV, zeigt aber andere Dinge, wie z. B. das Signieren benutzerdefinierter Transaktionen usw

https://github.com/rubensayshi/counterparty-p2sh-demo/blob/master/atomic-swap.js#L163-L185

ein update bitcoin-js hat auch eine praktische bip68 lib auf dem github github.com/bitcoinjs/bip68 , also könntest du so etwas machen ` var sequenceNumber = bip68.encode({ secondes: timeToLock }); bitcoin.script.number.encode(sequenceNumber), bitcoin.opcodes.OP_NOP3, bitcoin.opcodes.OP_DROP, `

Folgen Sie dem Link https://github.com/bitcoin/bips/blob/master/bip-0112.mediawiki :

1.) die timeDelay in Ihrem Beispiel stellt zwei Möglichkeiten dar:

// There are two kinds of nSequence: lock-by-blockheight
// and lock-by-blocktime, distinguished by whether
// nSequenceMasked < CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG.

2.) Wenn ich das richtig verstehe, hängt es mit BIP68 zusammen. Ursprünglich sollte nSequence ermöglichen, einen Tx zu ändern, während er sich im Mempool befindet, wenn der Wert kleiner als 0xFFFFFFFF ist. Bei CSV gibt es jetzt eine relative Zeit nach dem Punkt, an dem der TX in die Blockchain eintritt. Um den UTXO mit CSV auszugeben, muss eine bestimmte Anzahl von Blöcken verstrichen sein. Während normales tx nSequence auf 0xFFFFFFFF setzen würde, erfordert die Verwendung von CSV, dass es 0xFFFFFFFE oder weniger ist. Weiterlesen empfehlenswert :-)

3.) Keine Ahnung, vielleicht kennen andere Experten hier eine Bibliothek, die CLTV und CSV unterstützt...

Zur Beantwortung der Frage: Was stellt der timeDelay-Wert dar? Wie kann ich zB das Guthaben für 2 Blöcke sperren?

Bitte sehen Sie sich das folgende Beispiel mit bitcoinjs an:

let bip68 = require('bip68')

bip68.encode({blöcke: 54}) // => 0x00000036

bip68.encode({ blocks: 200 }) // => 0x000000c8 Siehe auch den Link unten: https://github.com/bitcoinjs/bip68