Создание транзакции OP_CSV с биткойнами

Я работаю над инструментом для генерации контрактов с временной блокировкой. Мой сценарий выкупа выглядит так:

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

Цель состоит в том, чтобы Алиса могла потратить средства после временной задержки, а Боб мог потратить их в любое время, доказав знание прообраза хеша.

Потратить через хеш отзыва достаточно просто. Тем не менее, у меня возникли проблемы с созданием транзакции, которая тратит на основе временной блокировки, оказывается более сложной. Собственно, мои вопросы таковы:

  1. Что <timeDelay>представляет значение? Как я могу, например, заблокировать средства для 2 блоков?
  2. Из того, что я прочитал, необходимо установить порядковый номер транзакции расходов. Но на что он должен быть настроен?
  3. Как мне практически реализовать это, используя bitcoinjs-libили другую библиотеку?

Ответы (3)

В биткойн-js вы могли бы сделать что-то вроде этого

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
]);

в старой демонстрации atomicswap есть пример кода, в нем нет csv, но показаны другие вещи, например, как подписывать пользовательские транзакции и т. д.

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

обновление bitcoin-js также имеет удобную библиотеку bip68 на github github.com/bitcoinjs/bip68 , так что вы можете сделать что-то вроде этого ` var sequenceNumber = bip68.encode({seconds: timeToLock }); bitcoin.script.number.encode(sequenceNumber), bitcoin.opcodes.OP_NOP3, bitcoin.opcodes.OP_DROP, `

по ссылке https://github.com/bitcoin/bips/blob/master/bip-0112.mediawiki :

1.) timeDelay в вашем примере представляет две возможности:

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

2.) когда я понимаю это правильно, это связано с BIP68. Изначально nSequence должен позволять модифицировать tx, находясь в мемпуле, когда значение меньше 0xFFFFFFFF. С CSV теперь есть относительное время после того, как tx входит в блокчейн. Для расходования UTXO с помощью CSV требуется, чтобы прошло определенное количество блоков. В то время как обычный tx установил бы nSequence в 0xFFFFFFFF, использование CSV требует, чтобы он был 0xFFFFFFFE или меньше. Рекомендуется дальнейшее чтение :-)

3.) Понятия не имею, может быть другие эксперты знают библиотеку, поддерживающую CLTV и CSV...

Чтобы ответить на вопрос: что представляет собой значение timeDelay? Как я могу, например, заблокировать средства для 2 блоков?

См. следующий пример с использованием bitcoinjs:

пусть bip68 = требуется ('bip68')

bip68.encode({ блоков: 54}) // => 0x00000036

bip68.encode({ blocks: 200 }) // => 0x000000c8 Также смотрите ссылку ниже: https://github.com/bitcoinjs/bip68