Pages:
Author

Topic: [Методичка] Программирование скриптов Bitcoin. (Read 16327 times)

sr. member
Activity: 770
Merit: 305
Все правильно расшифровал.
Версия транзакции у меня 1, а не 2, потому что я до сих пор пользуюсь версией клиента v0.13.1
У вас скорее всего та же последовательность действий будет с чуть другим результатом - может быть еще locktime у транзакции будет другой. Не проверял. Меня и этот клиент устраивает.
kzv
legendary
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
Если позволите, внесу свою лепту.
Заготовка транзакции 0100000001d0ac0d813c04c5c7d3aa0c6aaa530d104f23f328d8a74f9b3198640ac4155dc701000 00000ffffffff01a6e0f505000000001976a91406599750ae954e00bc73d19a1f4d898659d6c013 88ac00000000

Расшифровывается так:
Версия: 01000000
Флаг: 0001 (Если есть, то это сегвит транзакция, в примере его нет)
Число входов: 01
Вход 1 Хэш предыдущей транзакции (задом наперед): d0ac0d813c04c5c7d3aa0c6aaa530d104f23f328d8a74f9b3198640ac4155dc7
Номер выхода из предыдущей транзакции: 01000000 (да 4 байта Карл!!!)
Длинна скрипта для траты входа: 00 (это число надо поменять на 05 в примере выше)
Сам скрипт: Если длина ноль, то тут ничего нет. Если длина 5, как в примере, то здесь 0000026d51
Input 1 sequence: ffffffff (может быть любое, используется для локтайм скриптов)
Чмсло выходов: 01
Количество отправляемых сатошей в первом выходе: a6e0f50500000000
Длина скрипта в первом выходе: 0x19 (25 байт)
Запирающий скрипт: 76a91406599750ae954e00bc73d19a1f4d898659d6c01388ac
Количество Witness данных: в примере нет
Длина первого Witness: в примере нет
Witness 1: нету
Locktime: 00000000
sr. member
Activity: 770
Merit: 305
Короче, я поискал в интернете.
Нашел https://bitcoin.stackexchange.com/questions/72706/bitcoin-tx-sign-redeem-p2sh-transaction-unable-to-sign-input-invalid-stack-siz
Читаю... прям душа радуется - тот же самый вопрос, только скрипт другой.
У чувака скрипт OP_ADD 7 OP_EQUAL - ну то есть подобрать два числа, сумма которых будет семь
Листаю, значит, листаю... Щас типа ответы пойдут дельные...
А там такой облом! Мой собственный ответ годовалой давности - типа не подписывается это штатным клиентом.
И комментарий уважаемого  Pieter Wuille (это один из главных разработчиков биткойна) - типа не предназначено это.
Хотите нестандартные скрипты использовать - пишите сами себе тулзы.

Не, может как-то и можно. Я не знаю как.

Я вот что сделал.
Те же самые условия.
Запускаем
Code:
"C:\Program Files\Bitcoin\daemon\bitcoin-cli.exe" -testnet -datadir=e:\bitcoin-segwit-testnet createrawtransaction [{\"txid\":\"c75d15c40a6498319b4fa7d828f3234f100d53aa6a0caad3c7c5043c810dacd0\",\"vout\":1}] {\"mg6Xg6sRvJzcQzMTuGPVYAV1XxQbhHnvJR\":\"0.9999991\"}

Получаем "заготовку" транзакции
Code:
0100000001d0ac0d813c04c5c7d3aa0c6aaa530d104f23f328d8a74f9b3198640ac4155dc70100000000ffffffff01a6e0f505000000001976a91406599750ae954e00bc73d19a1f4d898659d6c01388ac00000000

На всякий случай сперва проверяем в консоли

Code:
decoderawtransaction 0100000001d0ac0d813c04c5c7d3aa0c6aaa530d104f23f328d8a74f9b3198640ac4155dc70100000000ffffffff01a6e0f505000000001976a91406599750ae954e00bc73d19a1f4d898659d6c01388ac00000000

Получаем вот такую расшифровку:
Code:
{
  "txid": "e9c8602e616ee54690b32f9eb571bce85867250ead27a662028938be5eff25c8",
  "hash": "e9c8602e616ee54690b32f9eb571bce85867250ead27a662028938be5eff25c8",
  "size": 85,
  "vsize": 85,
  "version": 1,
  "locktime": 0,
  "vin": [
    {
      "txid": "c75d15c40a6498319b4fa7d828f3234f100d53aa6a0caad3c7c5043c810dacd0",
      "vout": 1,
      "scriptSig": {
        "asm": "",
        "hex": ""
      },
      "sequence": 4294967295
    }
  ],
  "vout": [
    {
      "value": 0.99999910,
      "n": 0,
      "scriptPubKey": {
        "asm": "OP_DUP OP_HASH160 06599750ae954e00bc73d19a1f4d898659d6c013 OP_EQUALVERIFY OP_CHECKSIG",
        "hex": "76a91406599750ae954e00bc73d19a1f4d898659d6c01388ac",
        "reqSigs": 1,
        "type": "pubkeyhash",
        "addresses": [
          "mg6Xg6sRvJzcQzMTuGPVYAV1XxQbhHnvJR"
        ]
      }
    }
  ]
}

Эта транзакция невалидная, потому что createrawtransaction ничего не знает как нам выводить с адреса 2N6ijRkcgBwzjvwwop9QRuEdBTeggPcSCpA и оставила поле "scriptSig" пустым. А нам туда надо вписать 0000026d51
Утверждается, что signrawtransaction это делать тоже не умеет
Ну, я просто открываю текстовый редактор и вписываю туда нужные байтики:

0100000001d0ac0d813c04c5c7d3aa0c6aaa530d104f23f328d8a74f9b3198640ac4155dc701000 000050000026d51ffffffff01a6e0f505000000001976a91406599750ae954e00bc73d19a1f4d898659d6c01388ac0 0000000


Вот и всё. Как эту же операцию повторить и возможно ли это с помощью bitcoin-cli - я не знаю и особо не стремлюсь

Вы скажите, что вы хотите, может я вам и так помогу. Недорого или даже забесплатно.
sr. member
Activity: 770
Merit: 305
Твоя тулза не опенсурсная? на Гитхабе есть?
Нету. Фактически, это ведь не тулза, а большая коллекция говна, которую
я умело (сам себя не похвалишь - никто не похвалит) и быстро приспосабливаю
каждый раз под решение подобных задач

Quote
да, вот это бы, очень хотелось понять
Ну ты сперва попробуй понять, то ли это что тебе нужно в конечном итоге?
Если да - я либо разберусь как это делать с помощью bitcoin-cli (но опыта с ним у меня мало)
либо просто такую тулзу тебе скомпилирую под твои цели.
newbie
Activity: 38
Merit: 0
Тут я формирую транзакцию своей тулзой

Твоя тулза не опенсурсная? на Гитхабе есть?

Теперь вопрос. Как сформировать такую же транзакцию, но без моей тулзы, а штатным bitcoin-cli ?
Вот это уже мне сложно - тут щас подумать придется Smiley Может кто-то другой подскажет?

да, вот это бы, очень хотелось понять

sr. member
Activity: 770
Merit: 305
Окей, ща тебе нарисую.

1. Хотим использовать скрипт OP_2DROP OP_TRUE Он же 6d51

2. Заходим в консоль. Пишем
decodescript 6d51
получаем
Code:
{
  "asm": "OP_2DROP 1",
  "type": "nonstandard",
  "p2sh": "2N6ijRkcgBwzjvwwop9QRuEdBTeggPcSCpA"
}

3. Отправляем биткойн на адрес 2N6ijRkcgBwzjvwwop9QRuEdBTeggPcSCpA обычным способом
https://testnet.smartbit.com.au/tx/c75d15c40a6498319b4fa7d828f3234f100d53aa6a0caad3c7c5043c810dacd0

4. Теперь с адреса 2N6ijRkcgBwzjvwwop9QRuEdBTeggPcSCpA можно вывести бабло
зная этот скрипт 6d51 и правила его выполнения, ну то есть ему надо подсунуть
"два чего-нибудь неважного" что он выкинет.

5. То есть сразу в хексе я могу записать каким будет scriptSig: 0000026d51

6. Тут я формирую транзакцию своей тулзой (я не использую bitcoin-cli) и вывожу с этого адреса себе обратно.
https://testnet.smartbit.com.au/tx/13804697568b067b846fafd3a6e15a94ecacb53f7811c4896e5fc1bbc650816f

Там в правом верхнем углу есть кнопочка со стрелочками - если на нее кликнуть - откроется подробная
информация о транзакции. И там как раз написан скрипт 0 0 6d51 - то есть сперва два
пустых значения засовываются в стек, а потом как раз выполняется то что нужно - 6d51 -
выкинуть два значения из стека и положить единичку

Таким образом мы перевели бабло с адреса 2N6ijRkcgBwzjvwwop9QRuEdBTeggPcSCpA на адрес
mg6Xg6sRvJzcQzMTuGPVYAV1XxQbhHnvJR используя скрипт OP_2DROP OP_TRUE и не
используя никаких подписей и приватных ключей

Теперь вопрос. Как сформировать такую же транзакцию, но без моей тулзы, а штатным bitcoin-cli ?
Вот это уже мне сложно - тут щас подумать придется Smiley Может кто-то другой подскажет?
sr. member
Activity: 770
Merit: 305
Это почему? Разьве тестнет не полный аналог маин сети, но только с другими префиксами?
Не полный. В основной сети есть несколько стандартных вариантов скриптов, которые допустимы
в scriptPubkey. Транзакция с нестандартными скриптами в основной сети не релеится и с вероятностью
99.9999% никогда не подтвердится.

Quote
Мне не принципиально, можно и p2sh, я всеровно пока плохо разбираюсь чем разные типы
транзакций отличаются друг от друга по функционалу скриптинга
Окей, ща тебе нарисую.
newbie
Activity: 38
Merit: 0
Прям в scriptPubkey?

А куда еще можно?

Такой вариант в тестнете пройдет, а в основной сети не сработает

Это почему? Разьве тестнет не полный аналог маин сети, но только с другими префиксами?

Потому что кроме этого есть еще два (как минимум) варианта: p2sh и p2wsh

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


sr. member
Activity: 770
Merit: 305
Объясните как с помощью bitcoin-cli отправить транзакцию с кастомным скриптом, например скриптом который не проверяет валидацию hash160:
asm: OP_2DROP OP_TRUE

Ты этот скрипт куда хочешь записать? Прям в scriptPubkey?
Такой вариант в тестнете пройдет, а в основной сети не сработает

Почему я спрашиваю об этом?
Потому что кроме этого есть еще два (как минимум) варианта: p2sh и p2wsh
Эти два варианта сработают и в основной сети
newbie
Activity: 38
Merit: 0
Объясните как с помощью bitcoin-cli отправить транзакцию с кастомным скриптом, например скриптом который не проверяет валидацию hash160:
asm: OP_2DROP OP_TRUE
hex: 6d51

Пытался в тестовой сети создать транзакцию так:

Code:
bitcoin-cli createrawtransaction '[{"txid":"","vout":0}]' '[{"":0.01}]'

Code:
bitcoin-cli signrawtransactionwithkey '' '[""]' '[{"txid":"","vout":0, "scriptPubKey":"6d51"}]'

Получаю ошибку:

Code:
error code: -22
error message:
Previous output scriptPubKey mismatch:
OP_HASH160 OP_EQUAL
vs:
OP_2DROP 1

Что не так, почему он хочет чтоб скрипт у меня был такойже как и в vout был?

kzv
legendary
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
Да я и не собираюсь это реализовывать пока что.
Тема с комиссиями релеям возникла как одно из возможных направлений изучения технологии биткоина. Другие направления которые с ходу крутятся в голове:
1. Лайтинг и атомарные свопы. Вроде как уже изучено и задокументировано, но с практикой как-то тормозится пока.
2. Обмен письмами через блокчейн и его скрипты. Это уже есть в точечных проектах, но неплохо было бы изучить подробней. Особенно возможности шифрования сообщений.
3. "Цветные монеты". Типа токены только на биткоине и его скриптах, а не на эфире. Тоже уже где-то видел такое, но почему-то намного меньше распространение получила тема чем то же самое в эфире
Ну и так далее...
sr. member
Activity: 770
Merit: 305
Во-пераых это кому как.
Для меня передача битков из А в Б тождественна передаче бабок. Особенно если А это Дядя Смит, а Б это я.
Я говорю о технической точке зрения, а не об обыденных понятиях

Quote
Во-вторых тоже не так. Релеи могут че-то блокировать конечно, но когда релеев
много, то блокировщики просто посылаются лесом в обход.
Стоп. Вы чуть выше пели про вариант что релей которому не заплатили транзакцию
дальше не пересылает. Это ли не блокировка? Вас будут в этой парадигме блокировать
не потому что вы оппозиционер и покупаете вещества для создания бомбы, а потому что
вы мало заплатили. Вам этот вариант чем-то больше нравится? Ладно. Мне пора прощаться.
Эта тема (про донаты релеям) мне более не интересна. Я всё, что хотел сказать - сказал.

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

Во-вторых, чтобы было меньше (потенциальных) блокировщиков - надо вообще избавиться от релей-нод.
Тогда их совсем не будет.  Grin


 

Во-пераых это кому как.
Для меня передача битков из А в Б тождественна передаче бабок. Особенно если А это Дядя Смит, а Б это я.
Во-вторых тоже не так. Релеи могут че-то блокировать конечно, но когда релеев много, то блокировщики просто посылаются лесом в обход.
sr. member
Activity: 770
Merit: 305
Чтобы меньше контролеров-блокировщиков было у пересылки моих бабок из точки А в точку Б.
Во-первых, в биткойн-сети нет передачи бабок из точки А в точку Б.
Когда говорят о пересылке монет - это лишь образное выражение.

Во-вторых, чтобы было меньше (потенциальных) блокировщиков - надо вообще избавиться от релей-нод.
Тогда их совсем не будет.  Grin


 
kzv
legendary
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange

И к сетевом протоколу взаимодействия нод это не имеет никакого отношения


Из того, что вы ранее сказали я понял, что по вашему TTL нужен только для протоколов где пакеты идут по определенному маршруту.
Я знаю, что это точно не так. В P2P протоколах TTL тоже есть.
Но я знаю также, что в биткоине TTL нет.
Я пытался обосновать: почему в протоколе биткоина нет TTL. В других P2P протоколах TTL есть, а в биткоине нет. У вас есть свое этому объяснение? Да ради бога.

в зависимости от объема транзакции в байтах.

Quote
Для децентрализации?
А она нахер нам спеклась сама по себе?


Чтобы меньше контролеров-блокировщиков было у пересылки моих бабок из точки А в точку Б.
sr. member
Activity: 770
Merit: 305
Мда, с французким у вас не очень ))
Как с английским?

Quote
There are two ways to send money.  If the recipient is online, you
can enter their IP address and it will connect, get a new public
key and send the transaction with comments.  If the recipient is
not online, it is possible to send to their Bitcoin address, which
is a hash of their public key that they give you.  They'll receive
the transaction the next time they connect and get the block it's
in.  This method has the disadvantage that no comment information
is sent, and a bit of privacy may be lost if the address is used
multiple times, but it is a useful alternative if both users can't
be online at the same time or the recipient can't receive incoming
connections.

Это шо за херня? Мемуары Сатоши Накамото о том, как отправлять биткойны на IP-адрес
если реципиент в онлайне и на его публичный ключ (хэш публичного ключа) если он в оффе?
Ну так сразу потом была всеми признана и понята ошибка, что этих двух способов не нужно.
Бо отправка на IP-адрес небезопасна с точки зрения MitM
И с тех пор уже 10 лет мы отправляем биткойны типа вариантом, когда не беспокоимся
о том, находится ли получатель в онлайне или оффлайне. А так называемый онлайн-вариант
давно выпилили на ненадобностью.

И к сетевом протоколу взаимодействия нод это не имеет никакого отношения

Quote
Нужны и вы это знаете не хуже меня.
Без комиссий сеть заспамят как это уже было... Кстати, а не вы ли лично проэксплуатировали это? Или я что-то путаю?
Специально сеть транзакциями не спамил.
Бывало, посылал без комиссии майнерам, но в весьма скромных количествах.
Вообще, отправка без комиссий не создавала каких-то серьёзных спам-эффектов.
Другое дело, что это несправедливо, что богатые платят за отправку меньше, чем
бедные. Да и просто количество транзакций выросло - решили что пора платить всем
в зависимости от объема транзакции в байтах.

Quote
Для децентрализации?
А она нахер нам спеклась сама по себе?
kzv
legendary
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
В протоколе биткоина нет TTL потому что нужно уметь отдавать транзакции даже тем
клиентам которые в оффлайне и даже тем которых нет в природе.
Щито?  Grin
Вы вслушайтесь в то что говорите! Ну прочитайте фразу, которую вы написали.
По словам прочитайте! Какие впезду (простите за мой плохой французский)
транзакции для клиентов в оффлайне? Кому вы хотите послать транзакции когда
говорите про клиентов, отсутствующих в природе? Неандертальцам, динозаврам,
селеноидам (жителям Луны)? Их нет в природе. Может в мир сказочных эльфов?
Карлсону на крышу?

Мда, с французким у вас не очень ))
Как с английским?


Quote
TTL протоколу битка не нужен, но вот комиссии нужны как показала практика.
Комиссии не нужны.

Нужны и вы это знаете не хуже меня.
Без комиссий сеть заспамят как это уже было... Кстати, а не вы ли лично проэксплуатировали это? Или я что-то путаю?

Quote
У остальных нод нет экономического стимула находиться в сети.
Если такой стимул появится, то нод в сети будет на порядки больше.
Нахуй они нужны?

Для децентрализации?
sr. member
Activity: 770
Merit: 305
В протоколе биткоина нет TTL потому что нужно уметь отдавать транзакции даже тем
клиентам которые в оффлайне и даже тем которых нет в природе.
Щито?  Grin
Вы вслушайтесь в то что говорите! Ну прочитайте фразу, которую вы написали.
По словам прочитайте! Какие впезду (простите за мой плохой французский)
транзакции для клиентов в оффлайне? Кому вы хотите послать транзакции когда
говорите про клиентов, отсутствующих в природе? Неандертальцам, динозаврам,
селеноидам (жителям Луны)? Их нет в природе. Может в мир сказочных эльфов?
Карлсону на крышу?

Quote
TTL протоколу битка не нужен, но вот комиссии нужны как показала практика.
Комиссии не нужны. Но всем хочется бабла на халяву. Будет ли бабло
за биткойн или изобретут передачу пива по интернету - это неважно.

Quote
У остальных нод нет экономического стимула находиться в сети.
Если такой стимул появится, то нод в сети будет на порядки больше.
Нахуй они нужны?
Если экономический стимул появится для меня постоять на улице у светофора
(допустим, за стояние там в краснобелом шарфике вы мне заплатите сотку грина)
я так и быть постою полчасика. Но вы стараетесь подвести экономическую основу
под простое стояние на улице? На хуя это всем остальным? Кто за это захочет
платить, если на улице и так куча народу стоит бесплатно?
kzv
legendary
Activity: 1722
Merit: 1285
OpenTrade - Open Source Cryptocurrency Exchange
Разница в том, что TCP/IP-пакет идет по маршруту. Я часть этого маршрута, принимаю с одной стороны,
отправляю в другую сторону. Биткойн-пакеты идут броадкастом всем пирам (по запросу).
И сохраняются на узлах как неподтвержденные транзакции.

В некоторых P2P протоколах тоже есть TTL. Не важно броадкастом или нет посылается сообщение, TTL нужен чтобы не захламлять сеть невостребованными пакетами. В протоколе биткоина нет TTL потому что нужно уметь отдавать транзакции даже тем клиентам которые в оффлайне и даже тем которых нет в природе.

TTL протоколу битка не нужен, но вот комиссии нужны как показала практика. Но сейчас комиссии достаются только майнерам. У остальных нод нет экономического стимула находиться в сети. Если такой стимул появится, то нод в сети будет на порядки больше.
sr. member
Activity: 770
Merit: 305
А есть где почитать, где ты развенчиваешь миф о новой экономической парадигме?

Давай не в этом топике. Это все-таки суб-форум "кодеры" и тема про биткойновский скрипт-язык.


Я думал, что уже ответил... Попробую еще раз: с транзакцией произойдет ровно то же самое, что происходит со всеми IP пакетами которые я посылаю одновременно 100500 узлам биткоина. Каждый узел уменьшает TTL на единицу добавляет к транзакции свой

Бред какой-то. ТТL используется для того, чтобы предотвратить циклы в маршрутизации.
Сеть же не без глюков работает. Где-то новые каналы появляются, где-то исчезают.
Чтобы предотвратить хождение по кругу - я при релее пакетов уменьшаю на 1 TTL
И не релею пакеты с TTL=0

Разница в том, что TCP/IP-пакет идет по маршруту. Я часть этого маршрута, принимаю с одной стороны,
отправляю в другую сторону. Биткойн-пакеты идут броадкастом всем пирам (по запросу).
И сохраняются на узлах как неподтвержденные транзакции.
Pages:
Jump to: