Pages:
Author

Topic: Как завещать свои биткоины? - page 4. (Read 4984 times)

legendary
Activity: 2436
Merit: 1849
Crypto for the Crypto Throne!
Забыл вчера сказать. Смысл транзакций на такой адрес отличается от смысла голого lockTime.

 LockTime гарантирует лишь то, что обладатель транзакции и приватного ключа не сможет потратить именно эту транзакцию до определённой даты, то есть гарантия односторонняя и отправитель сохраняет полный контроль над средствами. Кроме того, отправитель в случае обычной транзакции с lockTime не может увеличить сумму, не меняя транзакцию.

Об этом вроде бы выше уже писали. Обычный локтайм это просто невозможность отправить транзакцию в сеть до определенного блока. А OP_CLTV это блокирование выходов транзакции до определенного блока/времени.

А собственно OP_CSV это возможность тратить выходы в будущем после определенного количества блоков с момента майнинга указанного блока (ну или невозможность тратить до момента в будущем который определяется  временем после майнинга определенного блока)
legendary
Activity: 3108
Merit: 1359
Забыл вчера сказать. Смысл транзакций на такой адрес отличается от смысла голого lockTime.

 LockTime гарантирует лишь то, что обладатель транзакции и приватного ключа не сможет потратить именно эту транзакцию до определённой даты, то есть гарантия односторонняя и отправитель сохраняет полный контроль над средствами. Кроме того, отправитель в случае обычной транзакции с lockTime не может увеличить сумму, не меняя транзакцию.

Скрипт же гарантирует, что отправитель утратил контроль над отправленным на него средствами до даты, которая в нем указана. Кроме того, скрипт позволяет в любое удобное время увеличить сумму наследства, просто отправив на созданный из него адрес ещё одну транзакцию, и так можно делать сколько угодно раз. По сути, это может выступать не только в роли средства передачи наследства, но и в роли личного пенсионного фонда.
legendary
Activity: 2436
Merit: 1849
Crypto for the Crypto Throne!
Спасибо! Попробую как-нибудь. Особенно интересно с openssl попробовать. Если не трудно, напишите еще, плиз, как в openssl подписывать?

https://raymii.org/s/tutorials/Sign_and_verify_text_files_to_public_keys_via_the_OpenSSL_Command_Line.html
И вот еще - https://www.zimuel.it/blog/sign-and-verify-a-file-using-openssl
Но у open ssl свой формат ключей, там надо будет переводить в них.

А вообще жаль что скрипты по P2PKH лучше не использовать (как я понял из сообщений Бальтазара)
legendary
Activity: 3108
Merit: 1359
Спасибо! Попробую как-нибудь. Особенно интересно с openssl попробовать. Если не трудно, напишите еще, плиз, как в openssl подписывать?
Для этого надо сконвертировать приватный ключ в формат PEM. Вообще же не вижу смысла это делать, лишние операции для получения того же результата.
legendary
Activity: 1848
Merit: 2033
Crypto Swap Exchange
Спасибо! Попробую как-нибудь. Особенно интересно с openssl попробовать. Если не трудно, напишите еще, плиз, как в openssl подписывать?
legendary
Activity: 3108
Merit: 1359
Отлично, буду ждать.

Краткий ликбез P2SH timelock.

Допустим, нам надо заблокировать монеты. Простейший скрипт для блокировки будет выглядеть так:

<таймстамп или номер блока> OP_CHECKLOCKTIMEVERIFY OP_DROP <публичный ключ> OP_CHECKSIG

Пусть будет блок 606800 и адрес 129h9Nj3iKZPMG3qMmHR3fcsNN4qGqUxAD.

Дампим приватный ключ и декодируем с помощью bitaddress.org, или иного инструмента, получается следующее:

770A37063E3E4D0BD76E24F0585C4A56566278BE897C1581AA6DA99DC0F27FD7

Ему соответствует публичный ключ:

021F9AB9E432320627F162B5D9627E02CEF8EE392AD4A986573B1C882B55F82549

606800 в сериализованном виде будет 504209. Подставляем это значение и публичный ключ, собираем скрипт по таблице опкодов:

03504209b17521021F9AB9E432320627F162B5D9627E02CEF8EE392AD4A986573B1C882B55F82549ac

Что эквивалентно этому:

606800 OP_CHECKLOCKTIMEVERIFY OP_DROP 021F9AB9E432320627F162B5D9627E02CEF8EE392AD4A986573B1C882B55F82549 OP_CHECKSIG

Байты, выделенные этим цветом - префиксы, означающие длину последующего вектора в 16-ричном формате.

Это и будет redeem скрипт. Считаем p2sh адрес для него:

Quote
$ btc decodescript 03504209b17521021F9AB9E432320627F162B5D9627E02CEF8EE392AD4A986573B1C882B55F8254 9ac
{
  "asm": "606800 OP_CHECKLOCKTIMEVERIFY OP_DROP 021f9ab9e432320627f162b5d9627e02cef8ee392ad4a986573b1c882b55f82549 OP_CHECKSIG",
  "type": "nonstandard",
  "p2sh": "39LkFZvuM3My1r1bdQKyaLRrKL9nr66Ge9",
  "segwit": {
    "asm": "0 f51002c06d11cf6bcac51594bacb588c11b92ea5741ff6af0621307eda9911bf",
    "hex": "0020f51002c06d11cf6bcac51594bacb588c11b92ea5741ff6af0621307eda9911bf",
    "reqSigs": 1,
    "type": "witness_v0_scripthash",
    "addresses": [
      "bc1q75gq9srdz88khjk9zk2t4j6c3sgmjt49ws0ldtcxyyc8ak5ezxlsj4a784"
    ],
    "p2sh-segwit": "346mg8ETWSqtQXgtteKhPjRVtY8T7FmUPU"
  }
}
$

Отправляю на него монетки:

Code:
$ btc sendtoaddress 39LkFZvuM3My1r1bdQKyaLRrKL9nr66Ge9 0.001
acebe7707eebf6ac66271f0c9f8343d90f8362fa18ba95622e4e26723a0ccc0b
$

https://blockstream.info/tx/acebe7707eebf6ac66271f0c9f8343d90f8362fa18ba95622e4e26723a0ccc0b

Теперь надо потратить. Посмотрим, что оно нам нагенерировало в транзакции.

Code:
$ btc getrawtransaction acebe7707eebf6ac66271f0c9f8343d90f8362fa18ba95622e4e26723a0ccc0b
02000000000101105284e1fa54095164f472edf1ea9af961bd4e01d441272ffefb8190edc7e4ea000000001716001485db6ba29e11f75a1f96ea4a69898d1c939f2f3ffeffffff0271a70a000000000017a9140cf4c70fb2750ff640f799ec206534e2835bbe3487a08601000000000017a91453eb9acee2a540e7ef1678f4b46ddaf571940a6887024730440220263aa894cbace0f042943681ef2acf0b7171793f5becbb76309bbe9b847ac43a02206d3deadeec3f46e625c189a77a4f15bbf07793305d5a99f5fda08f86f5e9c2630121037ca5e2097fb8d8b35c3633a2b58e89a45d3ff46ea8b6f0783dcdd681444aaad980420900
$ btc decoderawtransaction 02000000000101105284e1fa54095164f472edf1ea9af961bd4e01d441272ffefb8190edc7e4ea000000001716001485db6ba29e11f75a1f96ea4a69898d1c939f2f3ffeffffff0271a70a000000000017a9140cf4c70fb2750ff640f799ec206534e2835bbe3487a08601000000000017a91453eb9acee2a540e7ef1678f4b46ddaf571940a6887024730440220263aa894cbace0f042943681ef2acf0b7171793f5becbb76309bbe9b847ac43a02206d3deadeec3f46e625c189a77a4f15bbf07793305d5a99f5fda08f86f5e9c2630121037ca5e2097fb8d8b35c3633a2b58e89a45d3ff46ea8b6f0783dcdd681444aaad980420900
{
  "txid": "acebe7707eebf6ac66271f0c9f8343d90f8362fa18ba95622e4e26723a0ccc0b",
  "hash": "7340f97dfc3e9fd2af227f9e7f5bcedf4a9e8db81a2905684390e224b8920395",
  "version": 2,
  "size": 247,
  "vsize": 166,
  "weight": 661,
  "locktime": 606848,
  "vin": [
    {
      "txid": "eae4c7ed9081fbfe2f2741d4014ebd61f99aeaf1ed72f464510954fae1845210",
      "vout": 0,
      "scriptSig": {
        "asm": "001485db6ba29e11f75a1f96ea4a69898d1c939f2f3f",
        "hex": "16001485db6ba29e11f75a1f96ea4a69898d1c939f2f3f"
      },
      "txinwitness": [
        "30440220263aa894cbace0f042943681ef2acf0b7171793f5becbb76309bbe9b847ac43a02206d3deadeec3f46e625c189a77a4f15bbf07793305d5a99f5fda08f86f5e9c26301",
        "037ca5e2097fb8d8b35c3633a2b58e89a45d3ff46ea8b6f0783dcdd681444aaad9"
      ],
      "sequence": 4294967294
    }
  ],
  "vout": [
    {
      "value": 0.00698225,
      "n": 0,
      "scriptPubKey": {
        "asm": "OP_HASH160 0cf4c70fb2750ff640f799ec206534e2835bbe34 OP_EQUAL",
        "hex": "a9140cf4c70fb2750ff640f799ec206534e2835bbe3487",
        "reqSigs": 1,
        "type": "scripthash",
        "addresses": [
          "32sXGHo3LCMiADZuqLR7Bui3SppFc7eiDq"
        ]
      }
    },
    {
      "value": 0.00100000,
      "n": 1,
      "scriptPubKey": {
        "asm": "OP_HASH160 53eb9acee2a540e7ef1678f4b46ddaf571940a68 OP_EQUAL",
        "hex": "a91453eb9acee2a540e7ef1678f4b46ddaf571940a6887",
        "reqSigs": 1,
        "type": "scripthash",
        "addresses": [
          "39LkFZvuM3My1r1bdQKyaLRrKL9nr66Ge9"
        ]
      }
    }
  ]
}
$

Итого, у нас есть транзакция acebe7707eebf6ac66271f0c9f8343d90f8362fa18ba95622e4e26723a0ccc0b, в которой нас интересует выход 1.

Создаем шаблон транзакции траты:

Code:
 $ btc createrawtransaction '[{"txid": "acebe7707eebf6ac66271f0c9f8343d90f8362fa18ba95622e4e26723a0ccc0b","vout": 1}]' '[{"129h9Nj3iKZPMG3qMmHR3fcsNN4qGqUxAD":0.0009}]' 606800
02000000010bcc0c3a72264e2e6295ba18fa62830fd943839f0c1f2766acf6eb7e70e7ebac0100000000feffffff01905f0100000000001976a9140c9cf6de1a55f192f2e8fc33279c9bfa92678d4988ac50420900

В этой транзакции есть всё нужное, но поле scriptSig не заполнено. Подписывание транзакции делается в 4 этапа:

1. Создается версия транзакции со scriptSig, включающим только redeemScript и не содержащим подписи.
2. Считается её двойной sha256 хэш.
3. Производится подписывание хэша с помощью приватного ключа, который мы ранее получили.
4. Аналогично первому шагу, только собирается полный scriptSig, включающий подпись.

Для выполнения 1 и 4 шага разбираем транзакцию на составные части:

Code:
02000000 <- Версия схемы
01 <- Количество входов
0bcc0c3a72264e2e6295ba18fa62830fd943839f0c1f2766acf6eb7e70e7ebac <- txid входа
01000000 <- номер входа
00 <- Префикс пустого вектора, именно вместо него нужно вставить scriptSig c префиксом
feffffff <- nSequence
01 <- Количество выходов
905f010000000000 <- Сумма выхода
1976a9140c9cf6de1a55f192f2e8fc33279c9bfa92678d4988ac <- Запирающий скрипт выхода
50420900 <- lockTime

Выполняем первый шаг, подставляя redeemScript:

Code:
02000000 <- Версия схемы
01 <- Количество входов
0bcc0c3a72264e2e6295ba18fa62830fd943839f0c1f2766acf6eb7e70e7ebac <- txid входа
01000000 <- номер входа
2903504209b17521021F9AB9E432320627F162B5D9627E02CEF8EE392AD4A986573B1C882B55F82549ac <- префикс + redeemScript
feffffff <- nSequence
01 <- Количество выходов
905f010000000000 <- Сумма выхода
1976a9140c9cf6de1a55f192f2e8fc33279c9bfa92678d4988ac <- Запирающий скрипт выхода
50420900 <- lockTime

Собираем транзакцию, объединяя строки в том же порядке, в каком разбирали:

Code:
02000000010bcc0c3a72264e2e6295ba18fa62830fd943839f0c1f2766acf6eb7e70e7ebac010000002903504209b17521021F9AB9E432320627F162B5D9627E02CEF8EE392AD4A986573B1C882B55F82549acfeffffff01905f0100000000001976a9140c9cf6de1a55f192f2e8fc33279c9bfa92678d4988ac50420900

Добавляем флаг SIGHASH_ALL в Little Endian:

Code:
02000000010bcc0c3a72264e2e6295ba18fa62830fd943839f0c1f2766acf6eb7e70e7ebac010000002903504209b17521021F9AB9E432320627F162B5D9627E02CEF8EE392AD4A986573B1C882B55F82549acfeffffff01905f0100000000001976a9140c9cf6de1a55f192f2e8fc33279c9bfa92678d4988ac5042090001000000

Считаем sha256(sha256(tx + flag)):

Code:
$ echo 02000000010bcc0c3a72264e2e6295ba18fa62830fd943839f0c1f2766acf6eb7e70e7ebac010000002903504209b17521021F9AB9E432320627F162B5D9627E02CEF8EE392AD4A986573B1C882B55F82549acfeffffff01905f0100000000001976a9140c9cf6de1a55f192f2e8fc33279c9bfa92678d4988ac5042090001000000 | xxd -r -p | openssl dgst -sha256 -binary | openssl dgst -sha256 -hex
(stdin)= aca8b6ef49f50b328365ad0d17e3b9affcd91765000ad36513ed37f165b42933
$

Хэш данных для подписи aca8b6ef49f50b328365ad0d17e3b9affcd91765000ad36513ed37f165b42933.

Выполняем подписывание:

Code:
$ python
Python 2.7.12 (default, Oct  8 2019, 14:14:10)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import hashlib, binascii, ecdsa
>>> txhash = bytearray.fromhex('aca8b6ef49f50b328365ad0d17e3b9affcd91765000ad36513ed37f165b42933')
>>> privkey = bytearray.fromhex('770A37063E3E4D0BD76E24F0585C4A56566278BE897C1581AA6DA99DC0F27FD7')
>>> signingkey = ecdsa.SigningKey.from_string(privkey, curve=ecdsa.SECP256k1)
>>> sigbytes = signingkey.sign_digest(txhash, sigencode=ecdsa.util.sigencode_der_canonize)
>>> binascii.hexlify(sigbytes)
'304402205fcd53ba8c4d58d46c110d3ce545c6eef37dfb309625d94ddfa5a45a601ee6a202203b18ee2a35a644b809cdd06ef851a8f795f70ed2aa0878de08ed121f84d28059'
>>> exit()

Наша подпись
Code:
304402205fcd53ba8c4d58d46c110d3ce545c6eef37dfb309625d94ddfa5a45a601ee6a202203b18ee2a35a644b809cdd06ef851a8f795f70ed2aa0878de08ed121f84d28059

К ней нужно добавить флаг SIGHASH_ALL, и тогда она будет выглядеть так:

Code:
304402205fcd53ba8c4d58d46c110d3ce545c6eef37dfb309625d94ddfa5a45a601ee6a202203b18ee2a35a644b809cdd06ef851a8f795f70ed2aa0878de08ed121f84d2805901

Получившийся вектор нужно объединить с redeem скриптом, после чего получится полный скрипт, который можно будет добавить в транзакцию.

Сначала считаем префикс байты:

Code:
47 304402205fcd53ba8c4d58d46c110d3ce545c6eef37dfb309625d94ddfa5a45a601ee6a202203b18ee2a35a644b809cdd06ef851a8f795f70ed2aa0878de08ed121f84d2805901
29 03504209b17521021F9AB9E432320627F162B5D9627E02CEF8EE392AD4A986573B1C882B55F82549ac

Теперь объединяем и проверяем:

Code:
47304402205fcd53ba8c4d58d46c110d3ce545c6eef37dfb309625d94ddfa5a45a601ee6a202203b18ee2a35a644b809cdd06ef851a8f795f70ed2aa0878de08ed121f84d28059012903504209b17521021F9AB9E432320627F162B5D9627E02CEF8EE392AD4A986573B1C882B55F82549ac

Code:
$ btc decodescript 47304402205fcd53ba8c4d58d46c110d3ce545c6eef37dfb309625d94ddfa5a45a601ee6a202203b18ee2a35a644b809cdd06ef851a8f795f70ed2aa0878de08ed121f84d28059012903504209b17521021F9AB9E432320627F162B5D9627E02CEF8EE392AD4A986573B1C882B55F82549ac
{
  "asm": "304402205fcd53ba8c4d58d46c110d3ce545c6eef37dfb309625d94ddfa5a45a601ee6a202203b18ee2a35a644b809cdd06ef851a8f795f70ed2aa0878de08ed121f84d2805901 03504209b17521021f9ab9e432320627f162b5d9627e02cef8ee392ad4a986573b1c882b55f82549ac",
  "type": "nonstandard",
  "p2sh": "3CkKRxxvGxWUa9zk3DnbBS7fPgBJYWhuDt",
  "segwit": {
    "asm": "0 34277eb829c1589343f8ccd261ea531b9392c52849c5537168a5766fdb3d6e7e",
    "hex": "002034277eb829c1589343f8ccd261ea531b9392c52849c5537168a5766fdb3d6e7e",
    "reqSigs": 1,
    "type": "witness_v0_scripthash",
    "addresses": [
      "bc1qxsnhawpfc9vfxslcenfxr6jnrwfe93fgf8z4xutg54mxlkeadelq772sq5"
    ],
    "p2sh-segwit": "3Lc5zXYZRsvW25crtbUjjGZHQ31icN2v4Q"
  }
}
$

Судя по содержимому поля asm, скрипт соответствует нашим желаниям. Считаем префикс байт для скрипта в целом, получается 0x72. Объединяем со скриптом:

Code:
7247304402205fcd53ba8c4d58d46c110d3ce545c6eef37dfb309625d94ddfa5a45a601ee6a202203b18ee2a35a644b809cdd06ef851a8f795f70ed2aa0878de08ed121f84d28059012903504209b17521021F9AB9E432320627F162B5D9627E02CEF8EE392AD4A986573B1C882B55F82549ac

Всё. Теперь у нас есть scriptSig для нашей волшебной транзакции, тратящей заблокированный выход.

Как? Очень просто, берем разобранную ранее на части неподписанную транзакцию и подставляем скрипт:

Code:
02000000 <- Версия схемы
01 <- Количество входов
0bcc0c3a72264e2e6295ba18fa62830fd943839f0c1f2766acf6eb7e70e7ebac <- txid входа
01000000 <- номер входа
7247304402205fcd53ba8c4d58d46c110d3ce545c6eef37dfb309625d94ddfa5a45a601ee6a202203b18ee2a35a644b809cdd06ef851a8f795f70ed2aa0878de08ed121f84d28059012903504209b17521021F9AB9E432320627F162B5D9627E02CEF8EE392AD4A986573B1C882B55F82549ac <- префикс + scriptSig
feffffff <- nSequence
01 <- Количество выходов
905f010000000000 <- Сумма выхода
1976a9140c9cf6de1a55f192f2e8fc33279c9bfa92678d4988ac <- Запирающий скрипт выхода
50420900 <- lockTime

Объединяем строки:

Code:
02000000010bcc0c3a72264e2e6295ba18fa62830fd943839f0c1f2766acf6eb7e70e7ebac010000007247304402205fcd53ba8c4d58d46c110d3ce545c6eef37dfb309625d94ddfa5a45a601ee6a202203b18ee2a35a644b809cdd06ef851a8f795f70ed2aa0878de08ed121f84d28059012903504209b17521021F9AB9E432320627F162B5D9627E02CEF8EE392AD4A986573B1C882B55F82549acfeffffff01905f0100000000001976a9140c9cf6de1a55f192f2e8fc33279c9bfa92678d4988ac50420900

Все, у нас теперь есть подписанная транзакция Smiley

Отправляем в сеть:

Code:
$ btc sendrawtransaction 02000000010bcc0c3a72264e2e6295ba18fa62830fd943839f0c1f2766acf6eb7e70e7ebac010000007247304402205fcd53ba8c4d58d46c110d3ce545c6eef37dfb309625d94ddfa5a45a601ee6a202203b18ee2a35a644b809cdd06ef851a8f795f70ed2aa0878de08ed121f84d28059012903504209b17521021F9AB9E432320627F162B5D9627E02CEF8EE392AD4A986573B1C882B55F82549acfeffffff01905f0100000000001976a9140c9cf6de1a55f192f2e8fc33279c9bfa92678d4988ac50420900
4878dc56a7d29d342c8653582ba9a123036a76a2ea022a8cec8cd8f3427d88e0

Результат:

https://blockstream.info/tx/4878dc56a7d29d342c8653582ba9a123036a76a2ea022a8cec8cd8f3427d88e0

При желании, этот процесс не проблема автоматизировать скриптом из 5-10 строчек. Однако же, это вовсе не сложно сделать руками.
Кроме прочего, вместо консоли питона для подписывания можно использовать утилиту openssl.

P.S. Современный биткойн не принимает неканоничные подписи, которые иногда генерируются openssl и обвязками вокруг него. Самое простое решение - это проверить, встречаются ли в подписи байты 022100 и, если да, то повторять операцию sign_digest до тех пор, пока их в подписи не будет. Иногда, бывает, надо повторить подписывание хэша 2-3 раза, прежде чем получится хорошая подпись.

P.P.S. Если у тратящей транзакции несколько входов, то подписывание каждого из них делается независимо. То есть, для каждого входа подписывается отдельно формируемая болванка, redeemScript или scriptpubKey подставляются только на место для scriptSig подписываемого входа, остальные оставляются пустыми. После получения подписей для всех входов точно так же формируются скрипты и далее добавляются в болванку.
legendary
Activity: 1848
Merit: 2033
Crypto Swap Exchange
Ну хорошо, допустим, что условия я смогу исполнить. Меня интересует для начала, на какой адрес монеты ушли? Как это узнать?
Ни на какой, адресов никаких не существует и вопрос об адресе не имеет смысла. Адреса - это абстракция, физически никаких адресов в сети биткойна нет.
Да, действительно, это я не подумав спросил ). При создании транзакции нужно же просто знать txid предыдущей и номер выхода.
Ручками я могу сделать скрипт, закодировать его в P2SH-адрес, даже создать тратящую с этого адреса выход транзакцию. Но как ручками эту тратящую транзакцию подписать, вы знаете? Чтобы без программирования.
Конечно знаю, и никакого программирования не надо. Если хотите, покажу пример в реальном битке, чуть попозже сочиню скрипт. И сделаю транзакции для демонстрации.
Отлично, буду ждать.
legendary
Activity: 3108
Merit: 1359
Надо будет в основной сети то же самое сделать. Но странно, казалось бы тестовая сеть на то и тестовая, чтобы реагировать на "фантазии" так же, как и основная.
Тут палка о двух концах. Если в тестнете сделать так же, как в основной, то разработчики не смогут придумывать и тестировать новые варианты шаблонов. Если же в основной сделать, как в тестовой, то откроется потенциальный вектор для DoS атак. Потому что в биткойне нет механизма определения стоимости процессорного времени, как в той же Ethereum.

Ну хорошо, допустим, что условия я смогу исполнить. Меня интересует для начала, на какой адрес монеты ушли? Как это узнать?
Ни на какой, адресов никаких не существует и вопрос об адресе не имеет смысла. Адреса - это абстракция, физически никаких адресов в сети биткойна нет. Отправка монет на некий "адрес" лишь означает, что клиент возьмет захардкоденный шаблон скрипта и создаст транзакцию с его использованием. И для траты юзер должен будет предоставить этому скрипту некие данные, которые в случае легаси адреса являются публичным ключом и подписью.

Трата монет, отправленных на некий "адрес" технически ничем не отличается от таковой для монет, отправленных на ваш скрипт, составленный вручную. Если же конкретнее, то вашему скрипту нужно будет предоставить в качестве входных данных публичный ключ и подпись транзакции соответствующим ему приватным ключом. Потому что при выполнении условия по локтайму скрипт полностью эквивалентен стандартному OP_DUP OP_HASH160 587b00fb2cb23745a5fad03e414c841b00290af9 OP_EQUALVERIFY OP_CHECKSIG. Можно считать, что вы отправили их на адрес 194qpLZL9RiVoVcfaooubuHPBYrjynaAne или соответствующий ему адрес в тестнете, хоть на самом деле это и не так.

Ручками я могу сделать скрипт, закодировать его в P2SH-адрес, даже создать тратящую с этого адреса выход транзакцию. Но как ручками эту тратящую транзакцию подписать, вы знаете? Чтобы без программирования.
Конечно знаю, и никакого программирования не надо. Если хотите, покажу пример в реальном битке, чуть попозже сочиню скрипт. И сделаю транзакции для демонстрации.
legendary
Activity: 1848
Merit: 2033
Crypto Swap Exchange
Логично. Но я вот выше сделал какую-то непонятную транзакцию, и почему-то кор ее не отверг, принял.
Потому что в тестнете нет проверки на соответствие шаблонам. Там принимаются любые возможные фантазии, без проверки.
Надо будет в основной сети то же самое сделать. Но странно, казалось бы тестовая сеть на то и тестовая, чтобы реагировать на "фантазии" так же, как и основная.
Особенно интересно, куда монеты улетели ))?
Монеты вполне живы. Если у вас есть возможность исполнить условия, соответствие которым ожидает скрипт, то их трата не должна быть проблемой.
Ну хорошо, допустим, что условия я смогу исполнить. Меня интересует для начала, на какой адрес монеты ушли? Как это узнать?
А как пользоваться? Я этот вопрос всем задаю после подобных пожеланий, и никто не отвечает ).
Ручками. Формат скриптов простейший, даже никаких инструментов не надо. Только прогнать decodescript для проверки, разве что. Если же аллергия на шестнадцатеричную систему счисления, то используйте инструменты вроде bcoin
Ручками я могу сделать скрипт, закодировать его в P2SH-адрес, даже создать тратящую с этого адреса выход транзакцию. Но как ручками эту тратящую транзакцию подписать, вы знаете? Чтобы без программирования. Аллергии на шестнадцатеричную систему у меня нет, я не боюсь командной строки, но с программированием знаком только на уровне написания простых батников (то есть практически никак).
legendary
Activity: 3108
Merit: 1359
Логично. Но я вот выше сделал какую-то непонятную транзакцию, и почему-то кор ее не отверг, принял.
Потому что в тестнете нет проверки на соответствие шаблонам. Там принимаются любые возможные фантазии, без проверки.

Особенно интересно, куда монеты улетели ))?
Монеты вполне живы. Если у вас есть возможность исполнить условия, соответствие которым ожидает скрипт, то их трата не должна быть проблемой.

А как пользоваться? Я этот вопрос всем задаю после подобных пожеланий, и никто не отвечает ).
Ручками. Формат скриптов простейший, даже никаких инструментов не надо. Только прогнать decodescript для проверки, разве что. Если же аллергия на шестнадцатеричную систему счисления, то используйте инструменты вроде bcoin:

https://bcoin.io/guides/cltv.html

Там для всех нужных инструкций реализованы человекопонятные обертки. Пишете скрипт на JS и он потом вам соберет скрипт для транзакции, а если надо, то и саму транзакцию.
В общем, все как у эфирных пацанов.
legendary
Activity: 1848
Merit: 2033
Crypto Swap Exchange
В клиенте bitcoin core есть захардкоденный список шаблонов скриптов, которые считаются стандартными. По умолчанию клиент принимает в memory pool только транзакции, скрипты которых совпадают с одним из шаблонов в этом списке. Не используйте нестандартные скрипты. В противном случае вашу транзакцию надо будет ещё постараться подтвердить, если у вас нет прямого выхода на майнинговые мощности.
Логично. Но я вот выше сделал какую-то непонятную транзакцию, и почему-то кор ее не отверг, принял. Особенно интересно, куда монеты улетели ))?
Quote
Для этой цели давно придумали P2SH, пользуйтесь им и не будет проблем.
А как пользоваться? Я этот вопрос всем задаю после подобных пожеланий, и никто не отвечает ).
hero member
Activity: 1232
Merit: 858
В клиенте bitcoin core есть захардкоденный список шаблонов скриптов, которые считаются стандартными. По умолчанию клиент принимает в memory pool только транзакции, скрипты которых совпадают с одним из шаблонов в этом списке. Не используйте нестандартные скрипты. В противном случае вашу транзакцию надо будет ещё постараться подтвердить, если у вас нет прямого выхода на майнинговые мощности. Для этой цели давно придумали P2SH, пользуйтесь им и не будет проблем.



А как же фраза "мы не ищем легких путей"? Всегда когда скучно хочется поискать приключений на свою пятую точку.
legendary
Activity: 3108
Merit: 1359
В клиенте bitcoin core есть захардкоденный список шаблонов скриптов, которые считаются стандартными. По умолчанию клиент принимает в memory pool только транзакции, скрипты которых совпадают с одним из шаблонов в этом списке. Не используйте нестандартные скрипты. В противном случае вашу транзакцию надо будет ещё постараться подтвердить, если у вас нет прямого выхода на майнинговые мощности. Для этой цели давно придумали P2SH, пользуйтесь им и не будет проблем.

legendary
Activity: 1848
Merit: 2033
Crypto Swap Exchange
Ну я думал там OP_CHECKLOCKTIMEVERIFY, без сокращения. Тот же OP_CHECKEQUALVERIFY ведь полностью пишется. Я погуглил, пишут что часто OP_CLTV часто совмещается с другим скриптом, который возможно и вызывает непонятки и некорректную работу.
Не, я в байтах сразу писал (b1 то есть, а не CLTV), а тот json выше мне Core выдал.
legendary
Activity: 2436
Merit: 1849
Crypto for the Crypto Throne!
Скрипт собрал сам. А как иначе?

Ну я думал там OP_CHECKLOCKTIMEVERIFY, без сокращения. Тот же OP_CHECKEQUALVERIFY ведь полностью пишется. Я погуглил, пишут что часто OP_CLTV часто совмещается с другим скриптом, который возможно и вызывает непонятки и некорректную работу.
hero member
Activity: 1232
Merit: 858
Те, которые пишутся не ради бабла, то пишутся по желанию. Не хочет писать - его право. Ну а вообще идея сделать такой сервис довольно интересная, но не скажу что очень уж простая, kzv здесь ошибается.

Я подумал что он сам знает правильный ответ.  Wink

А что, все пишут программы только для того чтобы иметь коммерческий успех? Тем более если там работы кот наплакал?

Просто эта задача не интересная ни в техническом плане ни в коммерческом. Только в теоретическом немного интересна.
В сто раз более интересная со всех сторон задача - децентрализованныей обменник на атомарных свопах согласитесь? Дак вот, эта задача тоже была неоднократно реализована разными людьми и вызвала такой ажиотаж.., что разработчикам пришлось все выкинуть на помойку ((

Дело ваше и только ваше. Тема интересная и востребованная и я думаю что востребованность будет только расти по мере того как люди будут осознавать, что как-то нужно будет передать свои криптовалюты наследникам.
kzv
legendary
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
~
В сто раз более интересная со всех сторон задача - децентрализованныей обменник на атомарных свопах согласитесь? Дак вот, эта задача тоже была неоднократно реализована разными людьми и вызвала такой ажиотаж.., что разработчикам пришлось все выкинуть на помойку ((

А можно поподробнее узнать об этом? Знаю, что сейчас работает, а вот ранние разработки неизвестны, тем более - реализованные.

Темы на форуме, ссылки, может быть на каких платформах это было реализовано - если знаете, дайте почитать пожалуйста.

https://atomicwallet.io/
Был мультивалютным кошельком с встроенной поддержкой атомарных свопов. Теперь просто еще один стопицотый мультивалютный кошелек без атомарных свопов https://twitter.com/AtomicWallet/status/1195258877501161472?s=19

Ну и ваш покорный слуга кое-что пытался двинуть https://bitcointalksearch.org/topic/working-on-atomic-swap-need-feedback-5053247
Тоже прекратил из-за никому ненужности.
legendary
Activity: 1274
Merit: 1617
~
В сто раз более интересная со всех сторон задача - децентрализованныей обменник на атомарных свопах согласитесь? Дак вот, эта задача тоже была неоднократно реализована разными людьми и вызвала такой ажиотаж.., что разработчикам пришлось все выкинуть на помойку ((

А можно поподробнее узнать об этом? Знаю, что сейчас работает, а вот ранние разработки неизвестны, тем более - реализованные.

Темы на форуме, ссылки, может быть на каких платформах это было реализовано - если знаете, дайте почитать пожалуйста.
kzv
legendary
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
А что, все пишут программы только для того чтобы иметь коммерческий успех? Тем более если там работы кот наплакал?

Просто эта задача не интересная ни в техническом плане ни в коммерческом. Только в теоретическом немного интересна.
В сто раз более интересная со всех сторон задача - децентрализованныей обменник на атомарных свопах согласитесь? Дак вот, эта задача тоже была неоднократно реализована разными людьми и вызвала такой ажиотаж.., что разработчикам пришлось все выкинуть на помойку ((
legendary
Activity: 1848
Merit: 2033
Crypto Swap Exchange
Я глянул, мне кажется что есть ошибка. Иначе в BIP-aх и гайдах бы об этом не писали.
Вполне возможно, только я ее не вижу ). Поэтому, пока не увижу такую транзакцию в блокчейне, буду считать использование CLTV и CSV без P2SH невозможным.
Quote
OP_CLTV - ты вводил в ручную или оно само вписало?
Скрипт собрал сам. А как иначе?
Pages:
Jump to: