Вернуться   Биткоин Форум > Разработка и Техническое Обсуждение
4 мая 2015, 1:37:48 PM   # 1
 
 
Сообщения: 1148
Цитировать по имени
цитировать ответ
по умолчанию Re: Локально проверяемых выходных обязательства неизрасходованных сделок

Взлом Биткоин адресов.
500 Биткоинов взломаны в "мозговом кошельке" с паролем "bitcoin is awesome"
Адрес кошелька: 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE
Приватный ключ: 5J64pq77XjeacCezwmAr2V1s7snvvJkuAz8sENxw7xCkikceV6e
подробнее...


Всем кто хочет заработать Биткоины без вложений - рекомендую сайт http://bitcoin-zarabotat.ru
предложение чтобы помочь SPV узлов проверки блоков, чтобы совершить корень из (несбалансированного) Merkle дерева, содержащего все неизрасходованных (и расходуемые) выходы транзакций.

Можно создать доказательства валидности для каждой модификации набора. Доказательство будет доказать, что вставка записи в дерево с корнем X даст новое дерево с корнем Y. Там также будут доказательства для удаления записей.

Это означает, что каждая модификация набора UTXO может иметь доказательства, связанные с ним. Блок может содержать операции и доказательство. Каждое доказательство будет связан с входом или выходом сделок. Для каждого входа, было бы доказательство удаления из набора, и для каждого выхода, было бы доказательство вставки в набор. Unspendable выходы не будут вставлены в набор. (Для этого потребуется формальное определение unspendable, вероятно, выводит которые тратят на "OP_RETURN ...").

Мысли вслух о доказательствах, это то, что я имел в виду.

Проверяемость Merkle Set

Есть 2 вида узлов, листьев и узлов ветвления. Каждый узел имеет дайджест, связанный с узлом.

Вершины Отрасль

Эти узлы имеют ровно 2 детей. Хранения данных для этих узлов состоит в следующем.

Код:
int256 дайджест;
MerkleNode * родитель;
MerkleNode * влево;
MerkleNode * справа;
uint16 высота;

Предполагая, что 4 байта указателей, каждый узел требует 46 байт (или 58 для 8 байт указателей).

Дайджест для узлов ветвления является хэш (0x00 | лево->дайджест | правильно->дайджест | узел->высота ).

Значение высоты считается от уровня листьев. 2 листов, которые различались только в LSB их entry_digest будут иметь высоту 1 родитель. Самая высокая высота 256. Это для листьев, которые различаются по MSB их entry_digest.

Ведущий 0x00 в массиве передается хэш-функции является указание узла ветвления.

листовые Вершины

Эти узлы являются листья дерева. У них нет детей. Хранения данных для этих узлов состоит в следующем.

Код:
MerkleNode * родитель;
int256 entry_digest;

Дайджест для узла является хэш (0x01 | хэш (entry_value)), но только хеш (entry_value), т.е. entry_digest, хранятся в дереве. переваривать узел может быть пересчитано, по мере необходимости, экономя оперативную память.

Ведущий 0x01 указывает узел листа. Листовые и узлы ветвления можно отличить друг от друга из-за префикс.

Корневая Digest

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

Доказательство существования

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

Код:
Длина uint16;
UInt16 [длина] высота;
int256 [длина] path_digests;

Доказательство является филиалом Merkle, который начинается с листа и идет по пути к корню. Она включает в себя значение высоты для пути. 

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

Поскольку значение высоты входят в качестве входных данных в хэш в узле ветвления, он является хэш герметизирует.

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

Код:
если (root_digest == 0) {
    вернуться ложным;
}
дайджест = хеш (0x1 | entry_digest);
для (я = 0; я < длина; я ++) {
    булево right_child = entry_digest & (((Uint256) 1) << высота [I]) = 0!;
    если (right_child) переварить еще
        дайджест = хеш (0x01
}
возвращение переваривать == root_digest;

Доказательства удаления

Можно вычислить новый корневой дайджест из доказательства существования узла листа должны быть удалены. Эффект удаления узла является то, что листовой узел и (узел ветвления) родительский узел будут удалены из дерева. родственный узел можно заменить родитель узла в дереве.

Если длина пути равна нулю, то узел является единственным узлом в дереве.

Код:
< проверить доказательство существования >

если (длина == 0) {
    вернуться new_root_digest == 0; // дерево должно быть пустым после удаления
}
дайджест = path_digests [0]; // дайджеста братьев и сестер
для (я = 1; я < длина; я ++) {
    булево right_child = entry_digest & (((Uint256) 1) << высота [I]) = 0!;
    если (right_child) высота);
    еще высота);
   
}
вернуть new_root_digest == переварить;

Вставка Доказательств

Как и с доказательствами удаления, можно вычислить новый корневой дайджест из доказательства существования. В каждой отрасли, доказательство следует выбрать его путь на основе entry_digest вступления вставляется. Расщепление этого листа называется leaf_entry_digest.

Так как entry_digest используется для выбора пути, то leaf_entry_digest должны иметь один и тот же бит в качестве entry_digest для высоты каждого узла ветви вдоль пути.

Все entry_digests листовых узлов, которые decendants узла ветви имеют те же самые старшие биты, День на высоте один больше, чем высота филиальной узла. Это заложено в связи с деревом является бинарным деревом.

Это означает, что наиболее значимые биты leaf_entry_digest могут быть использованы для определения префикса для каждого узла ветви. Биты, начиная с одного выше, чем высота узла ветви указывают префикс для этого узла ветви.

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

Рассмотрим вставку узла с entry_digest из 01011010b (предполагается, что хэш-функции производится один байт дайджесты). Верхний узел ветви в дереве имеет высоту 7. Так как бит 7 является одним (LSB это бит 1) в entry_digest, используется правильный путь. Это приводит к узлу ветви с высотой 3. Так как бит 3 равен 0, то используется путь влево. Следующий узел является листом. Он имеет leaf_entry_digest из 01110000. Это гарантировано соответствует записи переваривать для бит 7 и 3, но может быть что-нибудь еще для других бит.

Префикс для узла ветви высоты 7 равно 0 (все биты в leaf_entry_digest выше бит 7). Это соответствует entry_digest, так что новый узел будет потомком этого узла ветви.

Приставка для узла ветви высоты 3 составляет 01110. Это не соответствует старшим битого entry_digest. Это означает, что entry_digest не является потомком этого узла ветви.

Новый узел ветви должен быть вставлен в качестве дочернего узла ветви высоты 7 вместо узла ветви высоты 3.

Сравнивая 2 дайджестов:
01011010 (entry_digest)
01110000 (leaf_entry_digest)

Старший бит, который отличается тем, бит с высотой 6. Это означает, что новый узел ветвь имеет высоту 6 (который находится между высотой 3 и 7).

Новый узел листа производится для новой записи. Это левый потомок нового узла ветви. Узел ветвления высоты 3 является правильным ребенком.

Указатель от узла ветви высота 7, указывает на ветви узла высота 3 перенаправляется на новую ветку узла.

Код:
< проверить доказательство существования первым >

если (old_root_digest == 0) {
    если (длина! = 0) {
        вернуться ложным; // доказательство должна быть нулевой длиной при вставке в пустое дерево
    }
    вернуться new_root_digest == entry_digest;
}

// Находим старший бит, который отличается между leaf_entry_digest и в entry_digest
uint16 insertion_height = find_highest_bit_difference (leaf_entry_digest, entry_digest);

// Вычислить ветвь от листа до температуры ниже точки вставки
int256 переваривать = хеш (0x01 | leaf_entry_digest);
Int я;
для (я = 0; я < длина; я ++) {
    если (высота [I] > insertion_height) {
        ломать;
    }
    булево right_child = entry_digest & (((Uint256) 1) << высота [I]) = 0!;
    если (right_child)
        дайджест = хеш (0x01 остального переварить
}

int256 new_digest = хэш (0x01 | entry_digest);

булево right_child = entry_digest & (((Uint256) 1) << insertion_height) = 0!;
если высота) (right_child!);
еще new_digest

// Завершить путь от после точки вставки в корень
для (; я < длина; я ++) {
    булево right_child = entry_digest & (((Uint256) 1) << высота [I]) = 0!;
    если (right_child) высота);
    еще переваривать
}
вернуть new_root_digest == переварить;

замена

Сменные доказательства содержат удаления и вставки доказательство, так как новый листовой узел не может быть помещен в том же месте. Это удваивает доказательства размера.

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

Это торгует от RAM стихов пространства на жестком диске. Доказательства, связанные с блоком должны быть сохранены, но не должны быть сохранены в памяти. Если замена, то дисковое пространство удваивается, но использование оперативной памяти уменьшается.

Количество узла ветви в дереве равно числу листьев (минус 1). Это означает, что объем оперативной памяти будет примерно в два раза (при условии, данные, связанные с каждым листом вокруг такой же, как размер дайджеста).

В эталонном клиента, набор UTXO хранится в хэш-карте, которая отображает 32 байт TXID в компактное представление выходных транзакций. Жесткое кодирование, что компактный represenation, как правило, сети может быть слишком ограничительным. Если новый тип вывода стал популярным, он не будет уплотнять его много.
TierNolan сейчас офлайн Пожаловаться на TierNolan   Ответить с цитированием Мультицитирование сообщения от TierNolan Быстрый ответ на сообщение TierNolan


Как заработать Биткоины?
Без вложений. Не майнинг.


5 мая 2015, 1:49:32 PM   # 2
 
 
Сообщения: 1148
Цитировать по имени
цитировать ответ
по умолчанию Re: Локально проверяемых выходных обязательства неизрасходованных сделок

Получил 1806 Биткоинов
Реальная история.





Использование оперативной памяти этой системы может быть значительно снижено путем компромисса процессорного времени от ОЗУ.

Отрасль узлы с меньшим, чем N (скажем, 16) дети могут избегать хранения их дайджестов.

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

Сводки должны быть восстановлены на лету.
TierNolan сейчас офлайн Пожаловаться на TierNolan   Ответить с цитированием Мультицитирование сообщения от TierNolan Быстрый ответ на сообщение TierNolan

16 сентября 2015, 10:56:47 AM   # 3
 
 
Сообщения: 1750
Цитировать по имени
цитировать ответ
по умолчанию Re: Локально проверяемых выходных обязательства неизрасходованных сделок

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

Я считаю, что это математически правильно, но не уверены в ее эффективности вычислений

Для каждого блока, будет сумма дерево Merkle по количеству отработанного UTXO и нового UTXO. Например, если мы имеем 4 Txs:

Прд1 (coinbase): 0 провел UTXO, 2 новых UTXO
Tx2: 1 провел UTXO, 4 новых UTXO
Tx3: 5 провел UTXO, 1 новый UTXO
TX4: 6 провел UTXO, 8 новых UTXO

sum_hash_1 = хэш (tx1_hash | 0 | 2)
sum_hash_2 = хэш (tx2_hash | 1 | 4)
sum_hash_3 = хэш (tx3_hash | 5 | 1)
sum_hash_4 = хеш (tx4_hash | 6 | 8)
sum_hash_5 = хэш (hash_1 | hash_2 | 1 | 6)
sum_hash_6 = хэш (hash_3 | hash_4 | 11 | 9)
root_merkle_sum_tree = хэш (hash_5 | hash_6 | 12 | 15)


UTXO представлен как (TXID | txoutindex | scriptPubkey | значение | minimum_height_to_spend)

(Для нормальной ТХ, minimum_height_to_spend высота блока. Для coinbase ТХ, то блок высота + 100)

Два UTXO Меркл корней вычисляются:
1. Все UTXO сортируются в алфавитном (root_all_utxo)
2. UTXO нахождения в этом блоке, сортируются в алфавитном (root_spent_utxo)

Любые один из следующих доказательств достаточно, чтобы аннулировать незаконное обязательство UTXO и незаконное UTXO обязательства обязательно производить по меньшей мере, одно из следующих доказательств. (Другими словами, эти условия в совокупности исчерпывающими для незаконной UTXO обязательств)

---------------
Доказательство неправильного порядка UTXO: Merkle путь 2 неуместных UTXO записей.

---------------
Доказательство некорректных # из UTXO в root_all_utxo: # из UTXO в последнем блоке + # нового UTXO - # отработанной UTXO = # из UTXO в этом блоке!

---------------
Доказательство некорректной # из UTXO в root_spent_utxo: # из UTXO в root_spent_utxo = запись в root_merkle_sum_tree

---------------
Расходование в UTXO не документированной в root_spent_utxo:
  • Сделка с Merkle пути к root_merkle_sum_tree
  • Merkle путь из 2-х смежных UTXOs в root_spent_utxo, доказывая отсутствие записи

---------------
Новый UTXO не документированы в root_all_utxo:
  • Сделка с Merkle пути к root_merkle_sum_tree
  • Merkle путь из 2-х смежных UTXOs в root_all_utxo, доказывая отсутствие записи

---------------
Доказательство незаконного удаления существующего UTXO в root_all_utxo:
  • Merkle путь удаляемого UTXO в последнем блоке
  • Меркл путь 2 смежных UTXOs в root_all_utxo этого блока, доказательства UTXO удаляется
  • Merkle путь из 2-х смежных UTXOs в root_spent_utxo этого блока, доказывая отсутствие расходов записи этого UTXO


Объяснение:

К 1, мы покажем, что UTXO существует в последнем блоке
К 2, мы покажем, что UTXO снимается в этом блоке
К 3, мы покажем, что удаление этого UTXO не документированы в root_spent_utxo

Если удаление действительно документированы в root_spent_utxo, некоторые другие провели UTXO не должны быть документально подтверждены, учитывая, что число UTXO в root_spent_utxo соответствует запись в root_merkle_sum_tree. В этом случае, мы могли бы просто доказать с "Удаление UTXO не документированы в root_spent_utxo"

---------------
Доказательство незаконного добавления UTXO в root_all_utxo / отработавший UTXO не удаляется из root_all_utxo:

Это может быть косвенно подтверждается доказательствами упомянутых. Там будет либо слишком много UTXO в root_all_utxo, или некоторые из существующих UTXOs был незаконно удален, или некоторые новые UTXOs не документированы
jl2012 сейчас офлайн Пожаловаться на jl2012   Ответить с цитированием Мультицитирование сообщения от jl2012 Быстрый ответ на сообщение jl2012

29 сентября 2015, 3:58:55 PM   # 4
 
 
Сообщения: 1148
Цитировать по имени
цитировать ответ
по умолчанию Re: Локально проверяемых выходных обязательства неизрасходованных сделок

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

Идея заключается в том, что вы предоставляете + Изменение + доказательство + и можно утверждать, что все установленные обновления действительны. Множество UTXO является действительным, если каждый отдельный шаг является действительным.

Это может иметь разрешение вплоть до одной транзакции (или даже один выходной или входной). В этом случае UTXO установлено обязательство на самом деле корень Merkle корень всех UTXO набор корней для каждого блока.

котировка
root_merkle_sum_tree = хэш (hash_5 | hash_6 | 12 | 15)

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

котировка
UTXO представлен как (TXID | txoutindex | scriptPubkey | значение | minimum_height_to_spend)

Я хотел бы использовать хэш (scriptPubKey) вместо scriptPubKey. Это держит записи, постоянную ширину без потери безопасности.

котировка
Два UTXO Меркл корней вычисляются:
1. Все UTXO сортируются в алфавитном (root_all_utxo)
2. UTXO нахождения в этом блоке, сортируются в алфавитном (root_spent_utxo)

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

Атака требует экспоненциального усилия, чтобы разбалансировать дерево. Это означает, что было бы небольшие дисбалансы, но проще просто принять.

котировка
Любые один из следующих доказательств достаточно, чтобы аннулировать незаконное обязательство UTXO и незаконное UTXO обязательства обязательно производить по меньшей мере, одно из следующих доказательств. (Другими словами, эти условия в совокупности исчерпывающими для незаконной UTXO обязательств)

---------------
Доказательство неправильного порядка UTXO: Merkle путь 2 неуместных UTXO записей.

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

котировка
---------------
Доказательство незаконного удаления существующего UTXO в root_all_utxo:
  • Merkle путь удаляемого UTXO в последнем блоке
  • Меркл путь 2 смежных UTXOs в root_all_utxo этого блока, доказательства UTXO удаляется
  • Merkle путь из 2-х смежных UTXOs в root_spent_utxo этого блока, доказывая отсутствие расходов записи этого UTXO

Root_all_utxo полностью пересчитывается для каждого блока?

Преимущество предложения в OP средств является то, что вам нужно всего лишь включить те части, которые изменяются.

"расширенный" блоки могут заменить операции с:

Код:

<заголовок транзакции>
<Входное доказательство 1 удаление>

<Входное доказательство 2 удаления>

...
<Ввод п удаление доказательство>
<Входные п>
<Выход 1 вставки доказательство>
<Выход 1>
<Выход 2 вставки доказательство>
<Выход 2>
...
<Выход вставки м доказательство>
<Выходные м>
<новый хэш>

Транзакция 250 байт с 2 входами и 2 выходами составляет около 250 байт. С 1 миллиона UTXOs, это означает, что доказательства около 20 хэшей. Это означает, что 160 байтов на вход или выход. Это увеличивает размер сделки до 890.

С началом каждого доказательства будет общим, то можно было бы уменьшить, что 80-100 байт накладных расходов.
TierNolan сейчас офлайн Пожаловаться на TierNolan   Ответить с цитированием Мультицитирование сообщения от TierNolan Быстрый ответ на сообщение TierNolan



Как заработать Биткоины?

Bitcoin Wallet * Portefeuille Bitcoin * Monedero Bitcoin * Carteira Bitcoin * Portafoglio Bitcoin * Bitcoin Cüzdan * 比特币钱包

bitcoin-zarabotat.ru
Почта для связи: bitcoin-zarabotat.ru@yandex.ru

3HmAQ9FkRFk6HZGuwExYxL62y7C1B9MwPW