Bitcoin Forum
January 24, 2021, 08:04:05 PM *
News: Latest Bitcoin Core release: 0.21.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 24 »  All
  Print  
Author Topic: Как завещать свои биткоины?  (Read 4463 times)
johhnyUA
Legendary
*
Offline Offline

Activity: 1806
Merit: 1374


Crypto for the Crypto Throne!


View Profile
November 30, 2019, 04:58:04 PM
 #381

То есть вы предлагаете не делать P2SH, а просто изменить P2PKH, добавив туда кое-чего. Правильно я вас понял?

Я не знаю как более правильно, но как мне кажется, в scriptpubkey можно вставлять любые скрипты из дозволенных. Ну из той информации что я прошерстил, я так понял.

Вот что на биткоин вики в разделе Script пишут:

Code:
scriptPubKey: <expiry time> OP_CHECKLOCKTIMEVERIFY OP_DROP OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
scriptSig: <sig> <pubKey>

Очевидно что структура P2PKH а не P2SH, ну или мб я ошибаюсь.

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

.
            ▄▄▄▄▄▄▄▄▄▄███████████▄▄▄▄▄
▄▄▄▄▄██████████████████████████████████▄▄▄▄
▀██████████████████████████████████████████████▄▄▄
▄▄████▄█████▄████████████████████████████▄█████▄████▄▄
▀████████▀▀▀████████████████████████████████▀▀▀██████████▄
  ▀▀▀████▄▄▄███████████████████████████████▄▄▄██████████
       ▀█████▀  ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀  ▀█████▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
.PLAY NOW.
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction. Advertise here.
igor72
Hero Member
*****
Offline Offline

Activity: 1008
Merit: 1066


View Profile
November 30, 2019, 09:11:17 PM
 #382

То есть вы предлагаете не делать P2SH, а просто изменить P2PKH, добавив туда кое-чего. Правильно я вас понял?

Я не знаю как более правильно, но как мне кажется, в scriptpubkey можно вставлять любые скрипты из дозволенных. Ну из той информации что я прошерстил, я так понял.

Вот что на биткоин вики в разделе Script пишут:

Code:
scriptPubKey: <expiry time> OP_CHECKLOCKTIMEVERIFY OP_DROP OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
scriptSig: <sig> <pubKey>

Очевидно что структура P2PKH а не P2SH, ну или мб я ошибаюсь.
Сомневаюсь я, что так можно, это уже какой-то несуществующий P2S (pay to script) получается.
Попробовал так сделать, может где-то ошибся. Бабки улетели хз куда.
Неподписанная транзакция выглядела так:
Code:
0200000001f47be86fa76b08df1c2a26a10fbe4bb69fc9f488f6f279aa2455df587d162dae0000000000fdffffff0120030000000000001f03fc9218b17576a914587b00fb2cb23745a5fad03e414c841b00290af988ac00000000
Подписанная, в json:
Code:
{
  "txid": "c5072b9fb144341d992f487e4d675525ddaadb196c2178d1bdd9775ade1fd9be",
  "hash": "c5072b9fb144341d992f487e4d675525ddaadb196c2178d1bdd9775ade1fd9be",
  "version": 2,
  "size": 197,
  "vsize": 197,
  "weight": 788,
  "locktime": 0,
  "vin": [
    {
      "txid": "ae2d167d58df5524aa79f2f688f4c99fb64bbe0fa1262a1cdf086ba76fe87bf4",
      "vout": 0,
      "scriptSig": {
        "asm": "304402206e1a6aaf95200f5fe2ae67553270189c87e35685e5746d46b0d4edf285da6bdd02200359b81e524fab21de8ac2cff40124784dde879198fa06e898c01c001b467ba8[ALL] 0220d77e49788d56fdf4e1330f31902f6f6ca60f1a077bda6b8e203cc77def136c",
        "hex": "47304402206e1a6aaf95200f5fe2ae67553270189c87e35685e5746d46b0d4edf285da6bdd02200359b81e524fab21de8ac2cff40124784dde879198fa06e898c01c001b467ba801210220d77e49788d56fdf4e1330f31902f6f6ca60f1a077bda6b8e203cc77def136c"
      },
      "sequence": 4294967293
    }
  ],
  "vout": [
    {
      "value": 0.00000800,
      "n": 0,
      "scriptPubKey": {
        "asm": "1610492 OP_CHECKLOCKTIMEVERIFY OP_DROP OP_DUP OP_HASH160 587b00fb2cb23745a5fad03e414c841b00290af9 OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "03fc9218b17576a914587b00fb2cb23745a5fad03e414c841b00290af988ac",
        "type": "nonstandard"
      }
    }
  ]
}

В любом случае, даже если я накосячил, и это работает, то не вижу смысла в такой конструкции. Простое изменение nLocktime делает то же, но гораздо проще.
kzv
Legendary
*
Offline Offline

Activity: 1624
Merit: 1230

OpenTrade - Open Source Cryptocurrency Exchange


View Profile WWW
December 01, 2019, 07:04:31 AM
 #383

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

FontSeli
Hero Member
*****
Offline Offline

Activity: 952
Merit: 757



View Profile
December 01, 2019, 10:06:50 AM
 #384

Да о чем вы вообще?
Если бы такой сервис был коммерчески востребованный, то я бы написал его за один день на коленке и зи неделю с юзерфрендли интерфесом...
Но мы же ту пофлудить просто ))

Если на это нужно так мало времени, то почему бы не сделать это?

Потому что не факт, что будет коммерчески востребованным. Разве не очевидно?  Smiley

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

johhnyUA
Legendary
*
Offline Offline

Activity: 1806
Merit: 1374


Crypto for the Crypto Throne!


View Profile
December 01, 2019, 04:31:55 PM
 #385

В любом случае, даже если я накосячил, и это работает, то не вижу смысла в такой конструкции. Простое изменение nLocktime делает то же, но гораздо проще.

Я глянул, мне кажется что есть ошибка. Иначе в BIP-aх и гайдах бы об этом не писали.

OP_CLTV - ты вводил в ручную или оно само вписало?

Потому что не факт, что будет коммерчески востребованным. Разве не очевидно?  Smiley

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

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

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

.
            ▄▄▄▄▄▄▄▄▄▄███████████▄▄▄▄▄
▄▄▄▄▄██████████████████████████████████▄▄▄▄
▀██████████████████████████████████████████████▄▄▄
▄▄████▄█████▄████████████████████████████▄█████▄████▄▄
▀████████▀▀▀████████████████████████████████▀▀▀██████████▄
  ▀▀▀████▄▄▄███████████████████████████████▄▄▄██████████
       ▀█████▀  ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀  ▀█████▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
.PLAY NOW.
igor72
Hero Member
*****
Offline Offline

Activity: 1008
Merit: 1066


View Profile
December 01, 2019, 09:52:39 PM
 #386

Я глянул, мне кажется что есть ошибка. Иначе в BIP-aх и гайдах бы об этом не писали.
Вполне возможно, только я ее не вижу ). Поэтому, пока не увижу такую транзакцию в блокчейне, буду считать использование CLTV и CSV без P2SH невозможным.
Quote
OP_CLTV - ты вводил в ручную или оно само вписало?
Скрипт собрал сам. А как иначе?
kzv
Legendary
*
Offline Offline

Activity: 1624
Merit: 1230

OpenTrade - Open Source Cryptocurrency Exchange


View Profile WWW
December 02, 2019, 07:20:56 AM
 #387

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

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

taikuri13
Legendary
*
Online Online

Activity: 1078
Merit: 1442


shaman


View Profile
December 02, 2019, 07:52:41 AM
 #388

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

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

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

kzv
Legendary
*
Offline Offline

Activity: 1624
Merit: 1230

OpenTrade - Open Source Cryptocurrency Exchange


View Profile WWW
December 02, 2019, 08:13:50 AM
 #389

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

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

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

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

Ну и ваш покорный слуга кое-что пытался двинуть https://bitcointalk.org/index.php?topic=5053247.0
Тоже прекратил из-за никому ненужности.

FontSeli
Hero Member
*****
Offline Offline

Activity: 952
Merit: 757



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

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

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

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

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

Дело ваше и только ваше. Тема интересная и востребованная и я думаю что востребованность будет только расти по мере того как люди будут осознавать, что как-то нужно будет передать свои криптовалюты наследникам.
johhnyUA
Legendary
*
Offline Offline

Activity: 1806
Merit: 1374


Crypto for the Crypto Throne!


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

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

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

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

.
            ▄▄▄▄▄▄▄▄▄▄███████████▄▄▄▄▄
▄▄▄▄▄██████████████████████████████████▄▄▄▄
▀██████████████████████████████████████████████▄▄▄
▄▄████▄█████▄████████████████████████████▄█████▄████▄▄
▀████████▀▀▀████████████████████████████████▀▀▀██████████▄
  ▀▀▀████▄▄▄███████████████████████████████▄▄▄██████████
       ▀█████▀  ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀  ▀█████▀▀▀▀▀▀▀▀▀▀
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
.PLAY NOW.
igor72
Hero Member
*****
Offline Offline

Activity: 1008
Merit: 1066


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

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

Activity: 2996
Merit: 1326


Worship the Eru


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

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


Darkness isn't born, you know. It's created.
FontSeli
Hero Member
*****
Offline Offline

Activity: 952
Merit: 757



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

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



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

Activity: 1008
Merit: 1066


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

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

Activity: 2996
Merit: 1326


Worship the Eru


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

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

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

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

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

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

Darkness isn't born, you know. It's created.
igor72
Hero Member
*****
Offline Offline

Activity: 1008
Merit: 1066


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

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

Activity: 2996
Merit: 1326


Worship the Eru


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

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

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

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

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

Darkness isn't born, you know. It's created.
igor72
Hero Member
*****
Offline Offline

Activity: 1008
Merit: 1066


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

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

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

Activity: 2996
Merit: 1326


Worship the Eru


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

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

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

Darkness isn't born, you know. It's created.
Pages: « 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [20] 21 22 23 24 »  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!