Сколько листьев узлы есть в дереве Merkle, который имеет общие узлы N?
Может кто-нибудь помочь мне с этим? Предположим, что дерево Merkle осуществляется так же, как это для Bitcoin сделок.
Любая помощь очень ценится
|
![]() |
# 1 |
Сообщений: 71
цитировать ответ |
![]()
Взлом Биткоин адресов.
500 Биткоинов взломаны в "мозговом кошельке" с паролем "bitcoin is awesome" Адрес кошелька: 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE Приватный ключ: 5J64pq77XjeacCezwmAr2V1s7snvvJkuAz8sENxw7xCkikceV6e подробнее... Всем кто хочет заработать Биткоины без вложений - рекомендую сайт http://bitcoin-zarabotat.ru Сколько листьев узлы есть в дереве Merkle, который имеет общие узлы N?
Может кто-нибудь помочь мне с этим? Предположим, что дерево Merkle осуществляется так же, как это для Bitcoin сделок. Любая помощь очень ценится |
![]() ![]() |
![]() ![]() ![]() |
![]() |
# 2 |
Сообщений: 71
цитировать ответ |
![]()
Получил 1806 Биткоинов
Реальная история. Примеры:
6 4 5 1 2 3 {3} Всего узлы = 6 узлы Листовые = 3 7 5 6 1 2 3 4 Всего узлы = 7 узлы листьев 4 = 11 -10 6 7 8 {8} 1 2 3 4 5 {5} Всего узлы = 11 узлы Leaf = 5 15 13 14 9 10 11 12 1 2 3 4 5 6 7 8 Всего узлы = 15 узлы Листовые = 8 |
![]() ![]() |
![]() ![]() ![]() |
![]() |
# 3 |
Сообщений: 71
цитировать ответ |
![]() Если дерево завершено (. IE 1/2/4/8/16 / ... листовые узлы), то формула:
Лист Count = (N + 1) / 2 |
![]() ![]() |
![]() ![]() ![]() |
![]() |
# 4 |
Сообщений: 71
цитировать ответ |
![]() Я уверен, что это элегантный способ сделать это, но я потратил слишком много времени, и я могу управлять в коде (грязный). Только в случае, если кто-то на этот вызов, вот некоторые дополнительные данные:
Лист Вершины, Всего Вершины 1,1 2,3 3,6 4,7 5,11 6,12 7,14 8,15 9,20 10,21 11,23 12,24 13,27 14,28 15,30 16,31 17,37 18,38 19,40 20,41 21,44 22,45 23,47 24,48 25,52 26,53 27,55 28,56 29,59 30,60 31,62 32,63 33,70 ... 63126 64127 65135 66136 67138 |
![]() ![]() |
![]() ![]() ![]() |
![]() |
# 5 |
Сообщений: 71
цитировать ответ |
![]() Подойдя ближе. Это получает общее количество узлов из подсчета листьев (напротив того, что я пытаюсь сделать)
Код: INT GetNodeCount (интермедиат leafCount) { INT nodeCount = 1; для (INT I = leafCount; я > 1; я = (I + 1) >> 1) nodeCount + = я; вернуться nodeCount; } |
![]() ![]() |
![]() ![]() ![]() |
![]() |
# 6 |
Сообщения: 406
цитировать ответ |
![]() Я уверен, что это элегантный способ сделать это, но я потратил слишком много времени, и я могу управлять в коде (грязный). Только в случае, если кто-то на этот вызов, вот некоторые дополнительные данные: Лист Вершины, Всего Вершины 1,1 2,3 3,6 4,7 5,11 6,12 7,14 8,15 9,20 10,21 11,23 12,24 13,27 14,28 15,30 16,31 17,37 18,38 19,40 20,41 21,44 22,45 23,47 24,48 25,52 26,53 27,55 28,56 29,59 30,60 31,62 32,63 33,70 ... 63126 64127 65135 66136 67138 Является ли это биекция? Эквивалентный есть только один способ нарисовать дерево с к общим узлам? |
![]() ![]() |
![]() ![]() ![]() |
![]() |
# 7 |
Сообщений: 71
цитировать ответ |
![]() AKAIK это в основном 1-к-1 (он же биекция). Я решил все эти проблемы, и я буду публиковать статью в ближайшее время на Merkle деревьев, включая бинарного Merkle синтаксического дерева, используемого в Cryptonite.
|
![]() ![]() |
![]() ![]() ![]() |
![]() |
# 8 |
Сообщения: 464
цитировать ответ |
![]() Вы ищете точное число? Если приближение хорошо, это просто половина. Мы можем доказать это следующим образом:
Merkle дерево представляет собой бинарное дерево, которое является по существу прямым турниром ликвидации. Когда два хешей объединяются, один хэш производится. Так что если вы начинаете с N листьев и держать на сочетающих узлов, каждый раз, когда вы уменьшаете число на 1. Для того, чтобы добраться до одного узла, поэтому мы имеем сделать N-1 комбинации и общее количество узлов, то примерно 2н. Это справедливо, независимо, где вы объедините узлы в дереве. Тем не менее, Мерка дерево также добавляет узлы, когда существует нечетное число узлов в заданном уровне. Вы имеете в большинстве log_2 (N) дополнительные узлы добавляют, т.е. уровень один за ваше дерево. Таким образом, число между 2N и 2N + log2 (N). По мере роста Н, этот термин журнал negligeable. Постараюсь найти точную формулу. |
![]() ![]() |
![]() ![]() ![]() |
![]() |
# 9 |
Сообщения: 2016
цитировать ответ |
![]() Если я не ошибаюсь, чтобы найти общее число узлов N из листьев узлов М, у вас есть
N = 2M + число не-конечные 0 'в двоичном представлении M в. С единственным исключением является М является степенью 2, в этом случае N = 2М-1. Например, если М = 66, то двоичное разложение 1000010. Это 1 задней ноль и 4, не отставая 0, так что вы имеете N = 2M + 4 = 136. Для того, чтобы сделать наоборот, вы могли бы просто начать с N / 2 и посчитайте вниз (если степень 2). |
![]() ![]() |
![]() ![]() ![]() |
![]() |
# 10 |
Сообщений: 71
цитировать ответ |
![]() Если я не ошибаюсь, чтобы найти общее число узлов N из листьев узлов М, у вас есть N = 2M + число не-конечные 0 'в двоичном представлении M в. С единственным исключением является М является степенью 2, в этом случае N = 2М-1. Например, если М = 66, то двоичное разложение 1000010. Это 1 задней ноль и 4, не отставая 0, так что вы имеете N = 2M + 4 = 136. Для того, чтобы сделать наоборот, вы могли бы просто начать с N / 2 и посчитайте вниз (если степень 2). Это очень здорово спасибо. Я все еще думаю об этом могли бы вы объяснить немного больше о подсчете вниз? Я имею в виду, мы знаем, N, поэтому, начиная с N / 2 мы храним не вычитанием 1 из N до чего? N = 2M + NNTZ (число не-конечные нули) М = (N - NNTZ) / 2 Просто не получить его жаль. Я работал с ним в гораздо более сложным образом, используя то, что я называю серии вальса (Ссылка WolframAlpha) Граф в основном представляет собой бинарное дерево. Если вы сквош графика сверху вниз это эффективный способ хранения узлов линейно для структуры чтения / записи. А затем, чтобы получить линейный индекс вальса любого узла: C # Код: общественности статической ULONG ToWaltzIndex (интермедиат уровень, ULONG смещение) { возврата (смещение * (1u << (Уровень + 1))) + (1u << 1-й уровень; } И, чтобы получить количество листьев: Код: /// <резюме> /// Мы знаем это: /// * Все положительные целые числа являются действительным leafCounts /// * Только определенные значения являются допустимым nodeCounts. /// * Существует 1: отображение 1 между leafCount: nodeCount /// * Когда перечислено в порядке, различие между допустимыми значениями nodeCount следует ряду вальса /// * Когда дерево завершено (так называемый symetric), то: leafCount = (nodeCount + 1) / 2 /// Следовательно: /// * Разница между любым nodeCount и nodeCount полного дерева с одной и той же высотой /// должна быть сумма K элементов серии вальса. /// * nodeDiff = сумма (вальс [0], ..., вальс [K-1]) /// * Х = GetWaltzSumCount (nodeDiff) /// * leafCount = maxLeafCount - X /// резюме> общественности статической ULONG GetLeafCount (ULONG nodeCount) { // максимально допустимое кол-лист на текущей высоте ULONG maxLeafCount = Pow2Prev (nodeCount); // максимально допустимое общее количество узлов на текущей высоте ULONG maxNodeCount = (maxLeafCount * 2) - 1; // Получить разницу между текущим узлом подсчетом и подсчетом максимального узла ULONG nodeDiff = maxNodeCount - nodeCount; // если numNodes равно maxNodes тогда leafCount должна равняться maxLeafCount если (nodeDiff == 0) вернуться maxLeafCount; // Вычесть количество суммируемых вальсовых элементов (шагов), которые необходимы, чтобы равняться nodeDiff, от maxLeafCount вернуться maxLeafCount - GetWaltzSumCount (nodeDiff); } И для полноты картины. поддерживающие функции (GetWaltzSumCount): Код: /// Возвращает число элементов, которые должны быть добавлены для того, чтобы достичь целевого значения. /// резюме> /// <Имя параметра ="цель">Целевой результат для эмуляции пары> /// <возвращается>Количество последовательных элементов, которые должны быть добавлены вместе до достижения цели возврат> общественности статической ULONG GetWaltzSumCount (ULONG мишень) { ULONG Счетчик = 0; ULONG сумма = 0; в то время как (сумма < мишень) сумма + = GetWaltzValue (++ счетчик) + 1; если (сумма > мишень) counter--; возврат счетчика; } /// <резюме> /// Значение вальса это количество раз число можно сократить вдвое, не оставляя остаток. Эти /// значение (серия) полезно для навигации и хранения бинарных древовидных структур. /// резюме> /// <Имя параметра ="номер">Положительная INT больше- пары> общественности статической UINT GetWaltzValue (ULONG номер) { // Охватывает все неподписанные значения 64bit константный UINT maxDivisions = 64; ULONG Num = число; для (UINT = 0; я <= maxDivisions; я ++) { если ((NUM% 2) == 1) Взамен я; Num = Num / 2; } певд IndexOutOfRangeException ("Не удалось найти значение Waltz для номера: " + Номер); } |
![]() ![]() |
![]() ![]() ![]() |
![]() |
# 11 |
Сообщения: 2016
цитировать ответ |
![]() То, что я имел в виду с подсчетом вниз:
Скажем, N = 135. Вы начинаете с 135/2 = 67. Вы попробуйте сначала М = 67, используя метод, который вы получаете N = 138, который является неправильным. Тогда вы пытаетесь M = 66, что дает N = 136. Тогда вы пытаетесь M = 65, это дает N = 135, так что правильный результат. Чтобы уточнить, я не уверен, что мой метод работает, если вы размещаете больше значения, используя реализацию, я могу проверить мой. |
![]() ![]() |
![]() ![]() ![]() |
![]() |
# 12 |
Сообщений: 71
цитировать ответ |
![]() Но M неизвестно, так как вы можете сказать, что N является правильным?
Я изо всех сил думать сегодня Edit: О, я вижу. Я получаю сейчас Это большое упрощение. Я проверю, который быстрее, так как я не декрементируете столько раз с моим методом. Ваш является бесконечно более объяснимым, хотя (скорее всего, быстрее тоже). Когда (если) я заканчиваю свою статью я ссылочку вам |
![]() ![]() |
![]() ![]() ![]() |
![]() |
# 13 |
Сообщения: 2016
цитировать ответ |
![]() Но M неизвестно, так как вы можете сказать, что N является правильным? Спасибо Но нам еще нужно проверить метод работы NNTZ.Я изо всех сил думать сегодня Edit: О, я вижу. Я получаю сейчас Это большое упрощение. Я проверю, который быстрее, так как я не декрементируете столько раз с моим методом. Ваш является бесконечно более объяснимым, хотя. Когда (если) я заканчиваю свою статью я ссылочку вам |
![]() ![]() |
![]() ![]() ![]() |
![]() |
# 14 |
Сообщений: 71
цитировать ответ |
![]() Это довольно прямо вперед, чтобы вычислить N из M так (Bitcoin делает это), так что не должно быть проблемой.
Метод Биткойн (приблизительно): Код: INT GetNodeCount (интермедиат leafCount) { INT nodeCount = 1; для (INT I = leafCount; я > 1; я = (I + 1) >> 1) nodeCount + = я; вернуться nodeCount; } |
![]() ![]() |
![]() ![]() ![]() |
![]() |
# 15 |
Сообщения: 464
цитировать ответ |
![]() Если количество листьев является степенью 2, то общее число узлов равно 2n - 1.
Если это не так, есть дополнительные узлы, введенные для заполнения отверстий. Пусть т число этих дополнительных узлов. Общее число узлов становится 2n -1 + т. При п записываются в двоичной форме, деление на два эквивалентно битовый сдвиг вправо. Пока последняя цифра является 0, число четное. Поэтому все нули являются уровни, которые даже и не ввести новые узлы. Когда мы достигаем 1, добавляется дополнительный узел. Она осуществляется на следующий уровень. Пример: 101. Без дополнительных узлов, мы имеем 1 в корне. 10 на втором уровне и 101 на третьем. но дополнительный узел сделал 3-го уровня 110. И второй уровень теперь 11. Это опять странно, так что дополнительный узел еще раз добавил. И это становится 100. Мы можем видеть, что процесс добавления узлов продолжается для каждого 0, которое появляется после того, как первый 1. Поскольку перенос сделал число нечетным. Когда мы достигаем 1. Перенос оказывается, что в 0 и нести 1 дальше. Поэтому 1 не оказывает никакого влияния количества дополнительных узлов. В заключение отметим, что количество дополнительных узлов 1 + число нулей, которые находятся слева от первого 1, что является не самым значащим битом. Конечный результат 2n + число нулей, не являющихся хвостовых. Кредиты идут к Меням для формулы. |
![]() ![]() |
![]() ![]() ![]() |
![]() |
# 16 |
Сообщений: 71
цитировать ответ |
![]() Если количество листьев является степенью 2, то общее число узлов равно 2n - 1. Если это не так, есть дополнительные узлы, введенные для заполнения отверстий. Пусть т число этих дополнительных узлов. Общее число узлов становится 2n -1 + т. При п записываются в двоичной форме, деление на два эквивалентно битовый сдвиг вправо. Пока последняя цифра является 0, число четное. Поэтому все нули являются уровни, которые даже и не ввести новые узлы. Когда мы достигаем 1, добавляется дополнительный узел. Она осуществляется на следующий уровень. Пример: 101. Без дополнительных узлов, мы имеем 1 в корне. 10 на втором уровне и 101 на третьем. но дополнительный узел сделал 3-го уровня 110. И второй уровень теперь 11. Это опять странно, так что дополнительный узел еще раз добавил. И это становится 100. Мы можем видеть, что процесс добавления узлов продолжается для каждого 0, которое появляется после того, как первый 1. Поскольку перенос сделал число нечетным. Когда мы достигаем 1. Перенос оказывается, что в 0 и нести 1 дальше. Поэтому 1 не оказывает никакого влияния количества дополнительных узлов. В заключение отметим, что количество дополнительных узлов 1 + число нулей, которые находятся слева от первого 1, что является не самым значащим битом. Конечный результат 2n + число нулей, не являющихся хвостовых. Кредиты идут к Меням для формулы. Спасибо, что является отличным объяснением того, как она работает. Если вы не возражаете, я хотел бы использовать его (или, возможно, отредактированную версию) в своей статье с кредитом вам. Статья о бинарных Merkle деревьев в целом, включая способ для хранения / извлечения их в порядке вставки, а также сбалансированный дизайн Merkle Trie (кредит CATIA / Cryptonite). Он будет опубликован открыто (если я надеюсь, обойти его окончания). |
![]() ![]() |
![]() ![]() ![]() |
![]() |
# 17 |
Сообщения: 464
цитировать ответ |
![]() Конечно, без проблем. благодаря
|
![]() ![]() |
![]() ![]() ![]() |
![]() |
# 18 |
Сообщения: 111
цитировать ответ |
![]() Примеры: 6 4 5 1 2 3 {3} Всего узлы = 6 узлы Листовые = 3 7 5 6 1 2 3 4 Всего узлы = 7 узлы листьев 4 = 11 -10 6 7 8 {8} 1 2 3 4 5 {5} Всего узлы = 11 узлы Leaf = 5 15 13 14 9 10 11 12 1 2 3 4 5 6 7 8 Всего узлы = 15 узлы Листовые = 8 Будет ли возможность оптимизировать таким образом, что эти деревья построены? Это, кажется, не совсем правильно хэшировании конечных узлов листа с собой, когда вы сталкиваетесь с нечетными номерами. Как насчет этого: Для каждого 1 в двоичном представлении числа элементов в наборе (количество листовых узлов) вы построить полный Merkle дерево. (Если имеются нечетное число, то конечное дерево будет просто один элемент). Тогда хэш корень наименьшего дерева с корнем второй по размеру. Hash результат этого с корнем третьей наименьшему и т.д., пока не будет достигнут корень самого большого дерева, и это ваш блок хэш. В качестве примера, чтобы представить набор 5 конечных узлов, представленных в двоичной системе на 101 я бы построить два дерева (на самом деле конечный я не дерево, но только один элемент) Так это будет выглядеть следующим образом. H1234.5 H12.34 H1.2 H3.4 1 2 3 4 5 Только 4 хешей по сравнению с 6 выше. Таким образом, для числа 7 (111) мы строим три дерева (один единственный элемент) H1234.567 H12.34 H56.7 H1.2 H3.4 H5.6 1 2 3 4 5 6 7 Один хэш меньше. Я на самом деле не исследовали эту идею, но на первый взгляд, кажется более эффективным в ряде хэшей, а в некоторых случаях более эффективным для проверки элементов. Однако это также кажется слишком простым, так что не так с ним? |
![]() ![]() |
![]() ![]() ![]() |