Перейти к публикации
polym0rph

Обсуждение статьи: Транзакции Bitcoin

Рекомендованные сообщения

,

У меня все открывается. Какой браузер, какая ошибка возникает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Такой вопрос по статье - где именно исполняется описанный в конце скрипт биткоин?
 

Отправитель получает открытый ключ получателя (pubKey) общаясь с ним. Когда сумма монет была отправлена на IP-адрес, получатель должен предоставить только подпись (sig). Подпись сверяется с открытым ключом в scriptPubKey.

Например, кто может объяснить чем именно выполняются действия "получатель должен предоставить только подпись" и какой именно софт производит "сверку с открытым ключем в scriptPubKey"?

Изменено пользователем uncleandy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

где именно исполняется описанный в конце скрипт биткоин?

Тот тип транзакций, про который вы цитируете, используется крайне редко, так как отправка по IP - штука ненадежная. В over 99.999...% случаев транзакции отправляются на адреса Bitcoin.

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

 

 

 

какой именно софт производит "сверку с открытым ключем в scriptPubKey"?

Это может быть любой софт, поддерживающий общепринятую реализацию протокола Bitcoin. В идеале официальный кошелек, но вы можете на коленке написать свой собственный клиент сети.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

валидность транзакции проверяется всей цепочкой узлов, через которую она проходит.

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Т.е. валидность транзакции проверяется не только при ее подтверждении (при формировании блока в процессе майнинга), но и при распространении?

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

 

 

 

Но как на этих промежуточных узлах можно проверить какие-то внешние условия?

Что за внешние условия?

 

 

 

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

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

 

 

 

Соответственно, тогда и второй вопрос - а как такие внешние условия в транзакции можно проверить при ее подтверждении у майнера?

Не пойму, о каких внешних условиях вы твердите. В транзакции нет ничего лишнего. Хотя протокол сейчас допускает включение произвольного текста.

 

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

Все остальные узлы проверяют только ее техническое соответствие протоколу (то есть, например, что в качестве хэшей не вбит какой-то левый набор символов).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не пойму, о каких внешних условиях вы твердите. В транзакции нет ничего лишнего. Хотя протокол сейчас допускает включение произвольного текста.

Возможно я не очень хорошо понимаю суть скриптовых возможностей транзакций биткоина.

 

Скриптовый язык в транзакции может работать только с данными которые уже включены в транзакцию? Или он может использовать какие-то внешние по отношению к своей транзакции данные?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В транзакциях нет никакого скриптового языка, там только адреса, хэши и сумма. У самого клиента есть набор команд API, с помощью которых можно более гибко создавать транзакции.

http://bits.media/raw_transactions/

 

Статья немного устарела, сейчас набор команд расширился, но в целом соответствует.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В транзакциях нет никакого скриптового языка, там только адреса, хэши и сумма. У самого клиента есть набор команд API, с помощью которых можно более гибко создавать транзакции.

http://bits.media/raw_transactions/

А вот это что такое - https://en.bitcoin.it/wiki/Script?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

А вот это что такое

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

Единственный известный мне способ задавать эти параметры - как раз команды кошелька, но там используется только часть, остальное оставлено для тех кто пишет свои клиенты или для будущих поколений. Хотя теоретически транзакцию можно самому в текстовом редакторе набить:)) Также как и майнить карандашом...

Если вы программист, там вроде бы ничего сложного нет :rolleyes: А гуевые инструменты не видел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Собственно, при получении транзакции клиент их и обрабатывает - если видит свой адрес, то расшифровывает, если не свой но все правильно - распинывает дальше по сети, если считает что неправильно - дропает.

Смутно вроде начинаю понимать. А есть где-нибудь описание данного процесса на реальном примере?

 

 

Если вы программист, там вроде бы ничего сложного нет

Да - программист. Поэтому и хочу досконально разобраться.

Изменено пользователем uncleandy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

.

 

А есть где-нибудь описание данного процесса на реальном примере?

На русском вряд ли найдется, подозреваю что тему у нас мало кто жевал. Большинству достаточно того, что умеет кошелек.

На всякий случай гляньте в ветке разработки

https://forum.bits.media/index.php?/forum/55-razrabotka/

А так и в той же вики должно быть описание процесса.

 

 

 

Да - программист.

Я к сожалению не программист. Если у вас хороший английский, лучше потолкаться в девелоперских ветках на толке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Еще один вопрос всплыл. Вроде-бы по теме...
 

В тех случаях когда на выходах транзакции обрабатывается не вся сумма BTC указанная на входе, любой необработанный остаток BTC признаётся комиссией за транзакцию: майнер, сгенерировавший блок в который включена запись о данной транзакции — получит эти BTC.

 

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

Изменено пользователем uncleandy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

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

 

Тут предельно понятно, что тот майнер(или пул) который и вставил(нашел) блок в цепь, тот и получит комиссию, которая и образовалась от разности выходных и входных транзакций  + награду за блок. И не тот получает этот остаток кто первым подтвердил транзакцию, а только тот кто нашел блок

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

И не тот получает этот остаток кто первым подтвердил транзакцию, а только тот кто нашел блок

Стоп-стоп-стоп! А разве подтверждением транзакции является не факт майнинга блока с этой транзакцией в нем?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

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

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

 

 

 

Ведь подтверждений транзакции будет множество - т.е. ее в свой блок включит не один майнер (в моем кошельке для некоторых транзакций есть более 100000 подтверждений).

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

 

 

 

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

Да, только первый и один раз.

 

 

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

А можете об этом рассказать подробнее? Насколько я понимаю "подтверждение транзакции" подразумевает ее проверку на корректность всех входов и подписей. Как-же тогда второй блок может "подтверждать" эту транзакцию если при его майнинге не происходит ее проверки?

 

Хотя, у меня есть вариант ответа... Когда майнер получает очередной блок из сети, он его проверяет на корректность, в том числе, проверяет на корректность все транзакции в нем. И сохраняет у себя с пометкой "проверен". Таким образом получается, что майнер в конечном итоге, производит проверку всех предыдущих транзакций до того, как приступит к майнингу очередного блока. Я правильно понял?

Изменено пользователем uncleandy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

А можете об этом рассказать подробнее? Насколько я понимаю "подтверждение транзакции" подразумевает ее проверку на корректность всех входов и подписей. Как-же тогда второй блок может "подтверждать" эту транзакцию если при его майнинге не происходит ее проверки?

 

Вы задаете совсем уж очевидные вопросы, которые расписаны в большинстве теоретических статей, если их читать вминательно. Количество блоков в цепочке после блока с транзакцией (подтверждений) - это основа надежности блокчейна.

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

 

 

 

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

Примерно так. Не только майнер, а любой "полный" клиент сети, возможности у них одинаковые. Майнер может набирать транзакции в блок произвольно, по умолчанию - с приоритетом по комиссии, но можно настроить и другие параметры отбора. Например, некоторые пулы были неоднократно замечены в приоритетном пропихивании "своих" транзакций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Всем спасибо за пояснения!

Теперь возник вопрос, ответ на который очевиден, если не разбираться в сути...

Во входах и выходах транзакции используются скрипты bitcoin (scriptSig и scriptPubKey). Насколько я понимаю, они могут быть произвольными. Но тогда я не понимаю каким образом можно определить на какой именно адрес производиться вывод биткоинов? В статье еще описан перевод на IP-адрес. Вот это вообще не понятно. Кто может пояснить каким образом по script в транзакции можно понять куда именно переводятся биткоины?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я так понимаю, вопрос сводиться именно к тому, откуда взять адрес назначения выхода, т.к. вход - это всего-лишь ссылка на выход другой транзакции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

откуда взять адрес назначения выхода

В классическом случае товарищ пользователь вводит его руками. Про API сами ищите:)

В чем вообще вопрос?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В классическом случае товарищ пользователь вводит его руками. Про API сами ищите :)

В чем вообще вопрос?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

Давай разбираться. Начнем с простого. У транзакции есть один вход и один выход. Здесь все просто, видно с какого адреса на какой идут средства. Далее имеет два адреса входом и два выходом.  Возьмем круглые цифры на вход 1+1, выход 1.5+0.5 (комиссию не трогаем, допустим мы ее не платим). Чуток сложнее, но тоже понятно. А теперь возьмем пять входов 1+1+1+1+1, и пять выходов 2+0.5+0.5+1.5+0.5. Вот тут уже проблема... С каких адресов(входов) пошла сумма в 2 биткойна на этот первый выход? Да, с любых  двух, берем два любых входа, складываем, и вот они и могут быть этой суммой. О других выходах, с более мелкими значениями еще сложнее судить. Здесь главное, чтоб адреса участвующие в транзакциях использовались единожды. Тогда невозможно, при наличии большого количества входов и выходов, связать что либо. Или, точнее, 100% утверждать, что, вот с этого адреса, биткойн пошел на этот.

Изменено пользователем Sorr0s

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Изменено пользователем Sorr0s

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×