Bitcoin Forum
April 18, 2024, 11:44:12 PM *
News: Latest Bitcoin Core release: 26.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: « 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [20] 21 22 23 »  All
  Print  
Author Topic: Как завещать свои биткоины?  (Read 4881 times)
FontSeli
Hero Member
*****
Offline Offline

Activity: 1218
Merit: 858



View Profile
December 02, 2019, 10:50:19 AM
 #381

Те, которые пишутся не ради бабла, то пишутся по желанию. Не хочет писать - его право. Ну а вообще идея сделать такой сервис довольно интересная, но не скажу что очень уж простая, kzv здесь ошибается.

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

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

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

Дело ваше и только ваше. Тема интересная и востребованная и я думаю что востребованность будет только расти по мере того как люди будут осознавать, что как-то нужно будет передать свои криптовалюты наследникам.
"There should not be any signed int. If you've found a signed int somewhere, please tell me (within the next 25 years please) and I'll change it to unsigned int." -- Satoshi
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction.
1713483852
Hero Member
*
Offline Offline

Posts: 1713483852

View Profile Personal Message (Offline)

Ignore
1713483852
Reply with quote  #2

1713483852
Report to moderator
1713483852
Hero Member
*
Offline Offline

Posts: 1713483852

View Profile Personal Message (Offline)

Ignore
1713483852
Reply with quote  #2

1713483852
Report to moderator
johhnyUA
Legendary
*
Offline Offline

Activity: 2408
Merit: 1834


Crypto for the Crypto Throne!


View Profile
December 02, 2019, 06:48:50 PM
 #382

Скрипт собрал сам. А как иначе?

Ну я думал там OP_CHECKLOCKTIMEVERIFY, без сокращения. Тот же OP_CHECKEQUALVERIFY ведь полностью пишется. Я погуглил, пишут что часто OP_CLTV часто совмещается с другим скриптом, который возможно и вызывает непонятки и некорректную работу.

.freebitcoin.       ▄▄▄█▀▀██▄▄▄
   ▄▄██████▄▄█  █▀▀█▄▄
  ███  █▀▀███████▄▄██▀
   ▀▀▀██▄▄█  ████▀▀  ▄██
▄███▄▄  ▀▀▀▀▀▀▀  ▄▄██████
██▀▀█████▄     ▄██▀█ ▀▀██
██▄▄███▀▀██   ███▀ ▄▄  ▀█
███████▄▄███ ███▄▄ ▀▀▄  █
██▀▀████████ █████  █▀▄██
 █▄▄████████ █████   ███
  ▀████  ███ ████▄▄███▀
     ▀▀████   ████▀▀
BITCOIN
DICE
EVENT
BETTING
WIN A LAMBO !

.
            ▄▄▄▄▄▄▄▄▄▄███████████▄▄▄▄▄
▄▄▄▄▄██████████████████████████████████▄▄▄▄
▀██████████████████████████████████████████████▄▄▄
▄▄████▄█████▄████████████████████████████▄█████▄████▄▄
▀████████▀▀▀████████████████████████████████▀▀▀██████████▄
  ▀▀▀████▄▄▄███████████████████████████████▄▄▄██████████
       ▀█████▀  ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀  ▀█████▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
.PLAY NOW.
igor72
Legendary
*
Offline Offline

Activity: 1820
Merit: 1963


Crypto Swap Exchange


View Profile
December 02, 2019, 06:53:49 PM
 #383

Ну я думал там OP_CHECKLOCKTIMEVERIFY, без сокращения. Тот же OP_CHECKEQUALVERIFY ведь полностью пишется. Я погуглил, пишут что часто OP_CLTV часто совмещается с другим скриптом, который возможно и вызывает непонятки и некорректную работу.
Не, я в байтах сразу писал (b1 то есть, а не CLTV), а тот json выше мне Core выдал.

█▀▀▀











█▄▄▄
▀▀▀▀▀▀▀▀▀▀▀
e
▄▄▄▄▄▄▄▄▄▄▄
█████████████
████████████▄███
██▐███████▄█████▀
█████████▄████▀
███▐████▄███▀
████▐██████▀
█████▀█████
███████████▄
████████████▄
██▄█████▀█████▄
▄█████████▀█████▀
███████████▀██▀
████▀█████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
c.h.
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▀▀▀█











▄▄▄█
▄██████▄▄▄
█████████████▄▄
███████████████
███████████████
███████████████
███████████████
███░░█████████
███▌▐█████████
█████████████
███████████▀
██████████▀
████████▀
▀██▀▀
Balthazar
Legendary
*
Offline Offline

Activity: 3108
Merit: 1358



View Profile
December 03, 2019, 01:34:38 AM
Merited by TechPriest (1)
 #384

В клиенте bitcoin core есть захардкоденный список шаблонов скриптов, которые считаются стандартными. По умолчанию клиент принимает в memory pool только транзакции, скрипты которых совпадают с одним из шаблонов в этом списке. Не используйте нестандартные скрипты. В противном случае вашу транзакцию надо будет ещё постараться подтвердить, если у вас нет прямого выхода на майнинговые мощности. Для этой цели давно придумали P2SH, пользуйтесь им и не будет проблем.

FontSeli
Hero Member
*****
Offline Offline

Activity: 1218
Merit: 858



View Profile
December 03, 2019, 03:13:44 PM
 #385

В клиенте bitcoin core есть захардкоденный список шаблонов скриптов, которые считаются стандартными. По умолчанию клиент принимает в memory pool только транзакции, скрипты которых совпадают с одним из шаблонов в этом списке. Не используйте нестандартные скрипты. В противном случае вашу транзакцию надо будет ещё постараться подтвердить, если у вас нет прямого выхода на майнинговые мощности. Для этой цели давно придумали P2SH, пользуйтесь им и не будет проблем.



А как же фраза "мы не ищем легких путей"? Всегда когда скучно хочется поискать приключений на свою пятую точку.
igor72
Legendary
*
Offline Offline

Activity: 1820
Merit: 1963


Crypto Swap Exchange


View Profile
December 03, 2019, 08:49:18 PM
 #386

В клиенте bitcoin core есть захардкоденный список шаблонов скриптов, которые считаются стандартными. По умолчанию клиент принимает в memory pool только транзакции, скрипты которых совпадают с одним из шаблонов в этом списке. Не используйте нестандартные скрипты. В противном случае вашу транзакцию надо будет ещё постараться подтвердить, если у вас нет прямого выхода на майнинговые мощности.
Логично. Но я вот выше сделал какую-то непонятную транзакцию, и почему-то кор ее не отверг, принял. Особенно интересно, куда монеты улетели ))?
Quote
Для этой цели давно придумали P2SH, пользуйтесь им и не будет проблем.
А как пользоваться? Я этот вопрос всем задаю после подобных пожеланий, и никто не отвечает ).

█▀▀▀











█▄▄▄
▀▀▀▀▀▀▀▀▀▀▀
e
▄▄▄▄▄▄▄▄▄▄▄
█████████████
████████████▄███
██▐███████▄█████▀
█████████▄████▀
███▐████▄███▀
████▐██████▀
█████▀█████
███████████▄
████████████▄
██▄█████▀█████▄
▄█████████▀█████▀
███████████▀██▀
████▀█████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
c.h.
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▀▀▀█











▄▄▄█
▄██████▄▄▄
█████████████▄▄
███████████████
███████████████
███████████████
███████████████
███░░█████████
███▌▐█████████
█████████████
███████████▀
██████████▀
████████▀
▀██▀▀
Balthazar
Legendary
*
Offline Offline

Activity: 3108
Merit: 1358



View Profile
December 04, 2019, 11:42:47 PM
Merited by xandry (1)
 #387

Логично. Но я вот выше сделал какую-то непонятную транзакцию, и почему-то кор ее не отверг, принял.
Потому что в тестнете нет проверки на соответствие шаблонам. Там принимаются любые возможные фантазии, без проверки.

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

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

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

Там для всех нужных инструкций реализованы человекопонятные обертки. Пишете скрипт на JS и он потом вам соберет скрипт для транзакции, а если надо, то и саму транзакцию.
В общем, все как у эфирных пацанов.
igor72
Legendary
*
Offline Offline

Activity: 1820
Merit: 1963


Crypto Swap Exchange


View Profile
December 05, 2019, 03:42:28 PM
 #388

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

█▀▀▀











█▄▄▄
▀▀▀▀▀▀▀▀▀▀▀
e
▄▄▄▄▄▄▄▄▄▄▄
█████████████
████████████▄███
██▐███████▄█████▀
█████████▄████▀
███▐████▄███▀
████▐██████▀
█████▀█████
███████████▄
████████████▄
██▄█████▀█████▄
▄█████████▀█████▀
███████████▀██▀
████▀█████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
c.h.
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▀▀▀█











▄▄▄█
▄██████▄▄▄
█████████████▄▄
███████████████
███████████████
███████████████
███████████████
███░░█████████
███▌▐█████████
█████████████
███████████▀
██████████▀
████████▀
▀██▀▀
Balthazar
Legendary
*
Offline Offline

Activity: 3108
Merit: 1358



View Profile
December 05, 2019, 04:56:42 PM
Merited by igor72 (2), Symmetrick (1)
 #389

Надо будет в основной сети то же самое сделать. Но странно, казалось бы тестовая сеть на то и тестовая, чтобы реагировать на "фантазии" так же, как и основная.
Тут палка о двух концах. Если в тестнете сделать так же, как в основной, то разработчики не смогут придумывать и тестировать новые варианты шаблонов. Если же в основной сделать, как в тестовой, то откроется потенциальный вектор для DoS атак. Потому что в биткойне нет механизма определения стоимости процессорного времени, как в той же Ethereum.

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

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

Ручками я могу сделать скрипт, закодировать его в P2SH-адрес, даже создать тратящую с этого адреса выход транзакцию. Но как ручками эту тратящую транзакцию подписать, вы знаете? Чтобы без программирования.
Конечно знаю, и никакого программирования не надо. Если хотите, покажу пример в реальном битке, чуть попозже сочиню скрипт. И сделаю транзакции для демонстрации.
igor72
Legendary
*
Offline Offline

Activity: 1820
Merit: 1963


Crypto Swap Exchange


View Profile
December 05, 2019, 05:50:49 PM
 #390

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

Ручками я могу сделать скрипт, закодировать его в P2SH-адрес, даже создать тратящую с этого адреса выход транзакцию. Но как ручками эту тратящую транзакцию подписать, вы знаете? Чтобы без программирования.
Конечно знаю, и никакого программирования не надо. Если хотите, покажу пример в реальном битке, чуть попозже сочиню скрипт. И сделаю транзакции для демонстрации.
Отлично, буду ждать.

█▀▀▀











█▄▄▄
▀▀▀▀▀▀▀▀▀▀▀
e
▄▄▄▄▄▄▄▄▄▄▄
█████████████
████████████▄███
██▐███████▄█████▀
█████████▄████▀
███▐████▄███▀
████▐██████▀
█████▀█████
███████████▄
████████████▄
██▄█████▀█████▄
▄█████████▀█████▀
███████████▀██▀
████▀█████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
c.h.
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▀▀▀█











▄▄▄█
▄██████▄▄▄
█████████████▄▄
███████████████
███████████████
███████████████
███████████████
███░░█████████
███▌▐█████████
█████████████
███████████▀
██████████▀
████████▀
▀██▀▀
Balthazar
Legendary
*
Offline Offline

Activity: 3108
Merit: 1358



View Profile
December 06, 2019, 02:43:36 AM
Last edit: December 06, 2019, 08:48:30 PM by Balthazar
Merited by igor72 (10), kzv (10), johhnyUA (2), bomj (2), TechPriest (2), A-Bolt (1), madnessteat (1), zasad@ (1), Symmetrick (1)
 #391

Отлично, буду ждать.

Краткий ликбез 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 подписываемого входа, остальные оставляются пустыми. После получения подписей для всех входов точно так же формируются скрипты и далее добавляются в болванку.
igor72
Legendary
*
Offline Offline

Activity: 1820
Merit: 1963


Crypto Swap Exchange


View Profile
December 06, 2019, 10:41:40 AM
Last edit: December 06, 2019, 11:26:09 AM by igor72
 #392

Спасибо! Попробую как-нибудь. Особенно интересно с openssl попробовать. Если не трудно, напишите еще, плиз, как в openssl подписывать?

█▀▀▀











█▄▄▄
▀▀▀▀▀▀▀▀▀▀▀
e
▄▄▄▄▄▄▄▄▄▄▄
█████████████
████████████▄███
██▐███████▄█████▀
█████████▄████▀
███▐████▄███▀
████▐██████▀
█████▀█████
███████████▄
████████████▄
██▄█████▀█████▄
▄█████████▀█████▀
███████████▀██▀
████▀█████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
c.h.
▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
▀▀▀█











▄▄▄█
▄██████▄▄▄
█████████████▄▄
███████████████
███████████████
███████████████
███████████████
███░░█████████
███▌▐█████████
█████████████
███████████▀
██████████▀
████████▀
▀██▀▀
Balthazar
Legendary
*
Offline Offline

Activity: 3108
Merit: 1358



View Profile
December 06, 2019, 01:12:59 PM
Merited by igor72 (2), xandry (1)
 #393

Спасибо! Попробую как-нибудь. Особенно интересно с openssl попробовать. Если не трудно, напишите еще, плиз, как в openssl подписывать?
Для этого надо сконвертировать приватный ключ в формат PEM. Вообще же не вижу смысла это делать, лишние операции для получения того же результата.
johhnyUA
Legendary
*
Offline Offline

Activity: 2408
Merit: 1834


Crypto for the Crypto Throne!


View Profile
December 06, 2019, 01:17:06 PM
Merited by igor72 (3), bomj (1)
 #394

Спасибо! Попробую как-нибудь. Особенно интересно с 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 лучше не использовать (как я понял из сообщений Бальтазара)

.freebitcoin.       ▄▄▄█▀▀██▄▄▄
   ▄▄██████▄▄█  █▀▀█▄▄
  ███  █▀▀███████▄▄██▀
   ▀▀▀██▄▄█  ████▀▀  ▄██
▄███▄▄  ▀▀▀▀▀▀▀  ▄▄██████
██▀▀█████▄     ▄██▀█ ▀▀██
██▄▄███▀▀██   ███▀ ▄▄  ▀█
███████▄▄███ ███▄▄ ▀▀▄  █
██▀▀████████ █████  █▀▄██
 █▄▄████████ █████   ███
  ▀████  ███ ████▄▄███▀
     ▀▀████   ████▀▀
BITCOIN
DICE
EVENT
BETTING
WIN A LAMBO !

.
            ▄▄▄▄▄▄▄▄▄▄███████████▄▄▄▄▄
▄▄▄▄▄██████████████████████████████████▄▄▄▄
▀██████████████████████████████████████████████▄▄▄
▄▄████▄█████▄████████████████████████████▄█████▄████▄▄
▀████████▀▀▀████████████████████████████████▀▀▀██████████▄
  ▀▀▀████▄▄▄███████████████████████████████▄▄▄██████████
       ▀█████▀  ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀  ▀█████▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
.PLAY NOW.
Balthazar
Legendary
*
Offline Offline

Activity: 3108
Merit: 1358



View Profile
December 06, 2019, 02:15:28 PM
 #395

Забыл вчера сказать. Смысл транзакций на такой адрес отличается от смысла голого lockTime.

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

Скрипт же гарантирует, что отправитель утратил контроль над отправленным на него средствами до даты, которая в нем указана. Кроме того, скрипт позволяет в любое удобное время увеличить сумму наследства, просто отправив на созданный из него адрес ещё одну транзакцию, и так можно делать сколько угодно раз. По сути, это может выступать не только в роли средства передачи наследства, но и в роли личного пенсионного фонда.
johhnyUA
Legendary
*
Offline Offline

Activity: 2408
Merit: 1834


Crypto for the Crypto Throne!


View Profile
December 07, 2019, 10:12:50 AM
Last edit: December 07, 2019, 10:27:09 AM by johhnyUA
 #396

Забыл вчера сказать. Смысл транзакций на такой адрес отличается от смысла голого lockTime.

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

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

А собственно OP_CSV это возможность тратить выходы в будущем после определенного количества блоков с момента майнинга указанного блока (ну или невозможность тратить до момента в будущем который определяется  временем после майнинга определенного блока)

.freebitcoin.       ▄▄▄█▀▀██▄▄▄
   ▄▄██████▄▄█  █▀▀█▄▄
  ███  █▀▀███████▄▄██▀
   ▀▀▀██▄▄█  ████▀▀  ▄██
▄███▄▄  ▀▀▀▀▀▀▀  ▄▄██████
██▀▀█████▄     ▄██▀█ ▀▀██
██▄▄███▀▀██   ███▀ ▄▄  ▀█
███████▄▄███ ███▄▄ ▀▀▄  █
██▀▀████████ █████  █▀▄██
 █▄▄████████ █████   ███
  ▀████  ███ ████▄▄███▀
     ▀▀████   ████▀▀
BITCOIN
DICE
EVENT
BETTING
WIN A LAMBO !

.
            ▄▄▄▄▄▄▄▄▄▄███████████▄▄▄▄▄
▄▄▄▄▄██████████████████████████████████▄▄▄▄
▀██████████████████████████████████████████████▄▄▄
▄▄████▄█████▄████████████████████████████▄█████▄████▄▄
▀████████▀▀▀████████████████████████████████▀▀▀██████████▄
  ▀▀▀████▄▄▄███████████████████████████████▄▄▄██████████
       ▀█████▀  ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀  ▀█████▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
.PLAY NOW.
stmar
Member
**
Offline Offline

Activity: 196
Merit: 52


View Profile
December 07, 2019, 11:36:39 AM
 #397

Приоритет считается исходя из количества уничтоженных монетодней. Если у двух транзакций одинаковый виртуальный размер и одинаковая комиссия, то среди них выше будет та, которая потратила более старые монеты.
Прошу прощения. Что означает более старые монеты?
Balthazar
Legendary
*
Offline Offline

Activity: 3108
Merit: 1358



View Profile
December 07, 2019, 01:48:25 PM
 #398

Приоритет считается исходя из количества уничтоженных монетодней. Если у двух транзакций одинаковый виртуальный размер и одинаковая комиссия, то среди них выше будет та, которая потратила более старые монеты.
Прошу прощения. Что означает более старые монеты?
Это означает монеты с бОльшим количеством подтверждений.
FontSeli
Hero Member
*****
Offline Offline

Activity: 1218
Merit: 858



View Profile
December 07, 2019, 03:28:03 PM
 #399

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

Приоритет считается исходя из количества уничтоженных монетодней. Если у двух транзакций одинаковый виртуальный размер и одинаковая комиссия, то среди них выше будет та, которая потратила более старые монеты.
Прошу прощения. Что означает более старые монеты?
Это означает монеты с бОльшим количеством подтверждений.

Вот здесь можно дополнительно почитать об этом. Там нужно будет дополнительно сделать несколько переходов по ссылкам.
TechPriest
Sr. Member
****
Offline Offline

Activity: 377
Merit: 282


Finis coronat opus


View Profile
December 08, 2019, 10:50:46 AM
 #400

В клиенте bitcoin core есть захардкоденный список шаблонов скриптов, которые считаются стандартными. По умолчанию клиент принимает в memory pool только транзакции, скрипты которых совпадают с одним из шаблонов в этом списке. Не используйте нестандартные скрипты. В противном случае вашу транзакцию надо будет ещё постараться подтвердить, если у вас нет прямого выхода на майнинговые мощности. Для этой цели давно придумали P2SH, пользуйтесь им и не будет проблем.

Здравствуйте.
А где в клиенте можно откопать список этих скриптов для P2PKH? Так то мне кажется можно под каждый новый скрипт открывать ишью на github, думаю добавят в клиент. Я бы и сам открыл, надо вот только сначала разобраться с этим списком.

In science we trust!
Pages: « 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [20] 21 22 23 »  All
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!