Nolix (OP)
Newbie
Offline
Activity: 5
Merit: 0
|
|
July 21, 2017, 09:48:24 PM |
|
Ребята, вкатываюсь в тему блокчейна, возник ряд вопросов, гугление не очень помогло (либо не очень много времени этому уделил).
1) tx в блоке - это хэш транзакции, а где хранятся транзакции реально (tx-raw где записан)? 2) адрес кошелька - это условно говоря некий хэш от публичного ключа? так понял, что при занесении транзакции в блок, адреса проверяются на валидность, т.е. передается и публичный ключ? 3) пул транзакций - туда попадают неподтвержденные транзакции и выбираются оттуда майнерами/пулами или вообще все? неподтвержденные транзакции как-то удаляются со временем? 4) если в блоке есть хэш предыдущего блока, для какой цели существует еще и дерево Меркла? Читаю в вики Преимущества использования таких деревьев, по сравнению с простыми списками хэшей: возможность скачать любую часть дерева и моментально проверить целостность какой-то части данных. Как правило, такие деревья занимают значительно меньше места чем любые другие структуры хэшей. Как это работает, можно самый простой пример?
Буду очень благодарен, если уделите немного времени и внимания, ответив на эти вопросы.
|
|
|
|
kcaterpillar
|
|
July 22, 2017, 12:25:27 PM |
|
Ребята, вкатываюсь в тему блокчейна, возник ряд вопросов, гугление не очень помогло (либо не очень много времени этому уделил). ...
1) Нет, tx в блоке - это не хэш транзакции, а собственно сама транзакция. Вот пример транзакции в формате JSON, это фрагмент блока, хэш в ней прописан отдельно: "tx":[ { "hash":"71265d34dd2c20bb77a2dd336966573c0b127de18d777ada49061b185ea57914", "ver":1, "vin_sz":1, "vout_sz":1, "lock_time":0, "size":144, "in":[ { "prev_out":{ "hash":"0000000000000000000000000000000000000000000000000000000000000000", "n":4294967295 }, "coinbase":"030fea0300049c6731190400000000522cfabe6d6d000000000000165f00000450000048692066726f6d2035304254432e636f6d2039ac1eeeed88" } ], "out":[ { "value":"25.08660007", "scriptPubKey":"OP_DUP OP_HASH160 bfd9c318852ca57a563786e67bb4d0a20b1d8f67 OP_EQUALVERIFY OP_CHECKSIG" } ] }, 2) В самой транзакции публичного ключа нет, только адрес. Проверка на валидность адреса майнерами при занесении в блок упрощённая. При создании транзакции её отправителем, если он знает публичный ключ, проверка может быть более полная. Всё зависит каким софтом вы пользуетесь при создании транзакции и по каким правилам её создаёте. Если вы, допустим, пересылаете данные самому себе и знаете даже закрытый ключ - вы можете сделать самую полную проверку. 3) Пул транзакций - условное понятие, собственно это некая "память" в сети узла IRC. Узел может удалить эту транзакцию, но она, к примеру, может опять туда прийти. В зависимости от настроек, конфигурации, время может различаться. Очень старые неподтверждённые транзакции в конце концов полностью "исчезают". 4) Хэш предыдущего блока - это ссылка на предыдущий блок. Собственно, с помощью хэшей на предыдущие блоки и создаётся цепочка блоков - блокчейн. По сути блокчейн - это односвязный список объектов данных (в биткойне такие объекты и называются блоками). А хэш дерева Меркля - это контроль целостности данных внутри текущего блока. Дерево Меркля включает в себя хэши всех транзакций в текущем блоке, а также хэши всех промежуточных узлов дерева и хэш итогового узела, вершины дерева, его и называют hashMerkleRoot. Дерево Меркля используется только для контроля целостности транзакций (и только транзакций) внутри текущего блока.
|
|
|
|
Nolix (OP)
Newbie
Offline
Activity: 5
Merit: 0
|
|
July 22, 2017, 08:02:54 PM |
|
Спасибо за ответы. 1) Нет, tx в блоке - это не хэш транзакции, а собственно сама транзакция. Вот пример транзакции в формате JSON, это фрагмент блока, хэш в ней прописан отдельно:
т.е. берем к примеру tx: 36cf28c4a2729c4826221949f10b36283019b758e431d1769c3265ab30022866 и это как-то можно развернуть до json-представления? А где можно с механизмом преобразования ознакомиться ? 2) В самой транзакции публичного ключа нет, только адрес. Проверка на валидность адреса майнерами при занесении в блок упрощённая. При создании транзакции её отправителем, если он знает публичный ключ, проверка может быть более полная. Всё зависит каким софтом вы пользуетесь при создании транзакции и по каким правилам её создаёте. Если вы, допустим, пересылаете данные самому себе и знаете даже закрытый ключ - вы можете сделать самую полную проверку.
т.е. на валидный адрес, но никому еще не принадлежащий транзакция может уйти? Получается, что в будущем кто-то может получить приватный ключ и адрес, на котором уже будут входы (положительный баланс)? 3) Пул транзакций - условное понятие, собственно это некая "память" в сети узла IRC. Узел может удалить эту транзакцию, но она, к примеру, может опять туда прийти. В зависимости от настроек, конфигурации, время может различаться. Очень старые неподтверждённые транзакции в конце концов полностью "исчезают".
"Узел может удалить эту транзакцию" что под узлом имеется ввиду? Разве транзакции (в том числе неподтвержденные) не синхронизируются между всеми узлами? А хэш дерева Меркля - это контроль целостности данных внутри текущего блока. Дерево Меркля включает в себя хэши всех транзакций в текущем блоке, а также хэши всех промежуточных узлов дерева и хэш итогового узела, вершины дерева, его и называют hashMerkleRoot. Дерево Меркля используется только для контроля целостности транзакций (и только транзакций) внутри текущего блока.
выходит, что по этому Мерклю нельзя отследить нахождение той или иной транзакции в блоке? Он только как итоговый такой хэш от всех tx-ов? Почему тогда именно "дерево Меркля" а не обычный двойной sha256?
|
|
|
|
kcaterpillar
|
|
July 22, 2017, 11:00:22 PM |
|
т.е. берем к примеру tx: 36cf28c4a2729c4826221949f10b36283019b758e431d1769c3265ab30022866 и это как-то можно развернуть до json-представления? А где можно с механизмом преобразования ознакомиться ?
Да, всё упаковывается согласно спецификации протокола. Транзакции в сеть передаются в двух случаях - при создании отдельной транзакции и при создании блока (submitblock), в этом случае они передаются в составе блока. Ознакомиться можно в спецификации: https://en.bitcoin.it/wiki/Protocol_rules#.22tx.22_messageshttps://en.bitcoin.it/wiki/Transactionhttps://en.bitcoin.it/wiki/Protocol_documentation#Transaction_Verificationи так далее, всё есть в документации. т.е. на валидный адрес, но никому еще не принадлежащий транзакция может уйти? Получается, что в будущем кто-то может получить приватный ключ и адрес, на котором уже будут входы (положительный баланс)?
Да, в биткойне монеты запросто могут уйти "в никуда". Получить в будущем их теоретически кто-то может, но такая вероятность очень мала, поэтому скорей всего их никто никогда не получит. 3) Пул транзакций - условное понятие, собственно это некая "память" в сети узла IRC. Узел может удалить эту транзакцию, но она, к примеру, может опять туда прийти. В зависимости от настроек, конфигурации, время может различаться. Очень старые неподтверждённые транзакции в конце концов полностью "исчезают".
"Узел может удалить эту транзакцию" что под узлом имеется ввиду? Разве транзакции (в том числе неподтвержденные) не синхронизируются между всеми узлами? Под узлом тут имеется ввиду узел сети IRC, обычно это один из серверов, с которым связаны клиенты. Синхронизируются, да, но система хоть и распределённая, но работает в итоге по правилам, которые определили для себя участники сети. По поводу неподтверждённых транзакций было много бурных обсуждений, и тут важно по какой причине она не была подтверждена, например, из-за недостаточной комиссии - в системе биткойн были введены правила, по которым транзакция может быть не включена майнерами в блок. И каждый узел сети имеет администратора, который рано или поздно удалит эту транзакцию. Всё делается конечно автоматически, но определяется правилами и настройками мемпула участниками сети. Вечно такие транзакции никто "хранить" не будет. выходит, что по этому Мерклю нельзя отследить нахождение той или иной транзакции в блоке? Он только как итоговый такой хэш от всех tx-ов? Почему тогда именно "дерево Меркля" а не обычный двойной sha256?
Нет, по дереву Меркля как раз можно отследить расположение транзакции в блоке, и даже можно быстро найти некорректные данные, не перебирая все транзакции подряд. Потому что в блоке в составе этого дерева, как я уже написал, указывается хэш каждой транзакции, хэши промежуточных узлов дерева, и итоговый хэш, он же вершина дерева - hashMerkleRoot, который попадает в заголовок бока. Дерево Меркля для того и придумали, чтобы быстро контролировать целостность данных сложных структурированных древовидных объектов, например каталогов с файлами. И в системе биткойн такая возможность быстрого поиска некорректной транзакции изначально предусматривалась. Для этого и использовали дерево Меркля.
|
|
|
|
amaclin1
|
|
July 23, 2017, 08:14:38 AM |
|
т.е. берем к примеру tx: 36cf28c4a2729c4826221949f10b36283019b758e431d1769c3265ab30022866 и это как-то можно развернуть до json-представления? А где можно с механизмом преобразования ознакомиться ? Нет, развернуть, то есть воссоздать саму транзакцию по её хэшу невозможно. (Если не считать обращения к сервису, который предоставит эту возможность по своей базе данных) т.е. на валидный адрес, но никому еще не принадлежащий транзакция может уйти? Получается, что в будущем кто-то может получить приватный ключ и адрес, на котором уже будут входы (положительный баланс)? Может. Но вероятность этого меньше чем вероятность падения десятикилограммового метеорита из чистого золота на голову вашей тёщи "Узел может удалить эту транзакцию" что под узлом имеется ввиду? Разве транзакции (в том числе неподтвержденные) не синхронизируются между всеми узлами? Вообще говоря нет. Ну то есть само понятие "синхронизируются" подразумевает, что в какой-то момент времени мы имеем несинхронизированное состояние. Так как нет никакого надсмотрщика, который будет с кнутом стоять над каждой нодой и проверять наличие в мемпуле каждой транзакции, то вообще говоря, ситуация очень далека от синхронизации. Скорее это в стиле "каждый дрочит как он хочет" 2) адрес кошелька - это условно говоря некий хэш от публичного ключа? так понял, что при занесении транзакции в блок, адреса проверяются на валидность, т.е. передается и публичный ключ? Есть разные виды выходов у транзакций. Наиболее популярный вариант это p2pkh Но в блокчейне есть выходы тира p2pk (я один из немногих в мире, кто их использует) В таких выходах есть именно публичный ключ адресата (Если вы что-то поняли из моих объяснений - поздравляю)
|
|
|
|
Nolix (OP)
Newbie
Offline
Activity: 5
Merit: 0
|
|
July 23, 2017, 04:30:49 PM |
|
Нет, развернуть, то есть воссоздать саму транзакцию по её хэшу невозможно. (Если не считать обращения к сервису, который предоставит эту возможность по своей базе данных)
Т.е. это все-таки хэши транзакций и они не содержат инфу о входах и выходах. Есть же tx-raw и там эта инфа есть. А где он хранится? Непонятен именно момент перехода от отправки транзакции до попадания в блок с технической части (пользователь через клиент кошелька/сервис отправляет инфу, что хочет сделать перевод. формируется транзакция и отправляется в каком-то виде в мемпул). Майнеры проверяют входы-выходы или кто? Т.е. у них блокчейн какой-то более полной версии? )) Вы говорите к сервису, у которого есть своя база данных (как я понимаю полная)? Что это еще за сервис в децентрализованной системе? Может. Но вероятность этого меньше чем вероятность падения десятикилограммового метеорита из чистого золота на голову вашей тёщи Это понятно как раз, тут чисто теоретически (в соседних темах кто-то как раз собирался сгенерировать пару сотен миллионов приватных ключей) Ну то есть само понятие "синхронизируются" подразумевает, что в какой-то момент времени мы имеем несинхронизированное состояние. Так как нет никакого надсмотрщика, который будет с кнутом стоять над каждой нодой и проверять наличие в мемпуле каждой транзакции, то вообще говоря, ситуация очень далека от синхронизации. Скорее это в стиле "каждый дрочит как он хочет" А что собой мемпул тогда представляет? Спасибо за ответы, буду очень признателен, если подскажите еще по первому пункту, с Мерклем разберусь после, сейчас же хочется полностью понять механизм генерации, отправки и проверки транзакции перед занесением в блок (кто как и в каком виде)
|
|
|
|
kcaterpillar
|
|
July 23, 2017, 05:43:03 PM |
|
Т.е. это все-таки хэши транзакций и они не содержат инфу о входах и выходах. Есть же tx-raw и там эта инфа есть. А где он хранится? Непонятен именно момент перехода от отправки транзакции до попадания в блок с технической части (пользователь через клиент кошелька/сервис отправляет инфу, что хочет сделать перевод. формируется транзакция и отправляется в каком-то виде в мемпул). Майнеры проверяют входы-выходы или кто? ...
Если указан идентификатор tx - то это транзакция, а не хэш, так, по крайне мере, в официальной документации, и в любом качественном софте и статьях о биткойне. Поэтому, если у вас сомнения, укажите откуда вы этот "tx" скопировали, а иначе разговор очень абстрактный. Но если вдруг кто-то назовёт свой хэш идентификатором "tx", то это будет хэш (непонятно от чего конечно), но это также и не будет общепринятым в биткойне наименованием хэша транзакции. Ещё раз вам выложу линки на документацию, там все ответы на ваши вопросы есть, причём они все на одной странице вики почти: Это структура транзакций в блоке - в таком виде её отправляют майнеры в составе блока: https://en.bitcoin.it/wiki/Protocol_documentation#BlockTransactions Вот это сама таинственная структура "tx", указано как она упакована в двоичном виде при ответе на запрос getdata (то есть при отправке вашей транзакции после создания в мемпул): https://en.bitcoin.it/wiki/Protocol_documentation#txТам же чуть ниже описано всё и про входы, и про выходы, а еще чуть ниже даже пример tx в виде hex-дампа - см. заголовок Example tx message Здесь всё про getdata: https://en.bitcoin.it/wiki/Protocol_documentation#getdata
|
|
|
|
amaclin1
|
|
July 23, 2017, 05:53:35 PM |
|
Если указан идентификатор tx - то это транзакция, а не хэш Всё. Пиздец. Сгубил ты парня. Ты его так запутал, что он теперь неделю будет в твоей абракадабре разбираться.
|
|
|
|
kcaterpillar
|
|
July 23, 2017, 06:04:05 PM |
|
Если указан идентификатор tx - то это транзакция, а не хэш Всё. Пиздец. Сгубил ты парня. Ты его так запутал, что он теперь неделю будет в твоей абракадабре разбираться. Чем запутал то? Наоборот, подробно указал линки на официальные доки, снабдил комментариями где что, почему абракадабра? По крайней мере нет демагогии с понтами, как, не будем показывать пальцем, у кого
|
|
|
|
Nolix (OP)
Newbie
Offline
Activity: 5
Merit: 0
|
|
July 26, 2017, 02:29:46 PM |
|
Не, со структурой разобрался (cебе из будущего порекомендовал бы просто найти хороший эксплорер (вроде этого: https://webbtc.com/block/000000000000000001806a922d4d35a37ad9324c690f72d556c6445cb7a9c214.json), с полной структурой данных блока), теперь осталось про корень Меркла понять и проверку транзакций (как по быстрому проверить, что входы еще не были использованы?) mrkl_root - это хэш из всех корней mrkl_tree? Зачем тогда пишут, что из него можно как-то обратно получить данные, чтобы с чем-то их сверить?
|
|
|
|
amaclin1
|
|
July 26, 2017, 02:50:08 PM |
|
Не, со структурой разобрался (cебе из будущего порекомендовал бы просто найти хороший эксплорер (вроде этого) К сожалению webbtc.com умер. Старые данные на нем есть, а новых нет теперь осталось про корень Меркла понять Это на потом оставить можно. и проверку транзакций (как по быстрому проверить, что входы еще не были использованы?) По быстрому никак. Каждая фулл-нода просто строит и поддерживает в актуальном состоянии базу начиная с генезиз-блока. Когда приезжает новый блок - то использованные выходы из базы выбрасываем, а новые добавляем.
|
|
|
|
|