Академический Документы
Профессиональный Документы
Культура Документы
Прежде чем говорить о биткоинах, необходимо разобраться с понятием хэш-функция (или, другое
название, функция свертки). В этой лекции будет рассмотрено, что такое хэш-функция, каковы ее
основные свойства и как ее можно применять на практике.
В данной лекции также будут рассмотрены три основные криптографические свойства хэш-функции,
делающие ее защищенной: устойчивость к коллизиям, свойство скрытия (необратимость) и
открытость к вычислению.
Хеш-функция:
устойчивость к коллизиям
необратимость
открытость к вычислению
х!= y и H(x)=H(y).
То есть невозможно подобрать различные значения x и y, для которых значения хэш-функции
совпадают.
На рис. 1.1 красные стрелки показывают значение x и его свертку — H(x), и y с сверткой H(y).
Обратите внимание, что на рисунке сказано:"Никто не может найти". Но этот не значит, что
коллизии не существуют. Коллизии существуют, и чтобы понять почему, необходимо обратиться к
рис. 1.2.
Слева на рис. 1.2 изображены все возможные значения на входе хэш-функции. Значение может быть
строкой любого размера. А справа — все возможные результаты, которые должны быть размером
256 бит. Итак, справа - результаты, и их всего 2256 возможных значений. Слева же значений больше.
Вопрос в том, сможет ли кто-либо обнаружить коллизию ( рис. 1.3).
Рис. 1.3. Можно ли найти коллизию?
Определенная точка слева всегда соответствует определенной точке справа. Значения справа
сжимаются (сворачиваются). В действительности должны быть значения слева, которые будут
указывать на одно и то же значение справа. Такие значения называют коллизиями.
Нужно взять 2130 случайных значений на вход (левое облако на рис. 1.3). Проверив все эти 2130
значения, можно сказать, что есть вероятность, равная 99,8%, что, по крайней мере, два из них будут
образовывать коллизию.
Таков простой метод поиска коллизий. Он работает независимо от того, какова хэш-функция. Но
проблема состоит в том, что процесс занимает очень много времени. Необходимо вычислить хэш-
функцию 2130 раз. И это, несомненно, огромное число.
Для того чтобы понять сколько это займет времени, можно представить, что если каждый
компьютер, когда-либо созданный человеком, вычислял коллизии с самого начала появления
Вселенной и до наших дней, то вероятность того, что коллизия будет обнаружена все еще
бесконечно мала. Настолько мала, что значительно меньше, чем вероятность того, что Земля будет
уничтожена гигантским метеором в течение следующих двух секунд.
Рассмотренный метод занимает слишком много времени, чтобы принимать его во внимание. Вопрос
в том, есть ли какой-нибудь другой метод, который можно было бы использовать для конкретной
хэш-функции, чтобы найти коллизию? Есть ли более быстрый способ поиска коллизий? На этот
вопрос сложнее ответить.
Для некоторых хэш-функций, конечно, есть. Например, если хэш-функция принимает на вход любое
число, а на выходе выдает число по модулю 2256, то есть оставляет последние 256 бит значения.
Тогда можно легко найти коллизию. Одной из коллизий будет значение 3 и 3 плюс 2256. Таким
образом, для некоторых возможных хэш-функций очень легко найти коллизию, для других - нет.
Следует также отметить, что нет такой хэш-функции, для которой доказано, что у нее нет коллизий.
Есть только некоторые функции, для которых пытались найти коллизии, но так и не смогли. И
поэтому решили, что они не имеют коллизий.
Предположим, есть большой файл. И нужно иметь возможность проверить позже, является ли
другой файл тем же файлом, который был изначально, не были ли внесены изменения. Можно
сохранить у себя копию, и при необходимости сравнить ее с оригиналом. Но можно поступить
проще и эффективнее - просто запомнить хэш исходного файла. Затем, если кто-то показывает новый
файл и утверждает, что это тот же самый, можно вычислить хэш этого нового файла и сравнить с
имеющимся. Если значения хэш одинаковы, можно сделать вывод, что файлы одинаковые.
Это очень эффективный способ запомнить то, что было раньше, и проверить достоверность позже. И
это, безусловно, полезно, потому что размер значения хэш небольшой — всего лишь 256 бит.
Исходный файл может быть очень большим.
Второе свойство хэш-функций состоит в том, что они необратимы. Это свойство можно описать
следующим образом. Если известен результат хэш-функции, то нет никакого способа определить,
какое значение x было на входе. Проблема в том, что это свойство не всегда выполняется точно. И
чтобы понять, почему это так, рассмотрим пример.
Допустим, кто-то подбрасывает монетку. И если выпадает "орел", то на выходе возвращается хэш
строки "орел". А если — "решка", то — хэш строки "решка".
Человек, который не видел, как подбрасывают монетку, а видел только хэш на выходе, легко может
узнать, какая строка была хэширована. Ему необходимо будет вычислить два хэша (для "орла" и
"решки"), сравнить их с хэшем на выходе и сразу станет понятно, каков был результат
подбрасывания монетки.
Если хэш-функция необратима, то не должно быть случая, когда значение х можно легко вычислить,
зная H(x). То есть, х должен выбираться из ряда, который до некоторой степени не определён и
широк. Так что попытка подобрать возможные значения х или выбрать из нескольких похожих
значений не сработает.
Свойство необратимости, которое рассматривается в этой лекции, немного сложнее. И вот способ, с
помощью которого можно исправить проблемы с простым значением х, таким как в примере с
подбрасыванием монетки ("орел" и "решка"). Необходимо взять значение х и объединить его со
значением r, которое выбрано случайным образом.
Высокая min-энтропия (см. энтропия Реньи) означает, что распределение настолько широкое, что ни
одно значение не может быть выбрано с какой-либо более-менее определенной вероятностью.
H (r|x) означает, что берутся все биты значения r и за ними помещаются все биты значения x. То есть,
если берется хэш значения r с хэшем значения х, из этого объединения невозможно вернуть х. И это
будет истинно для формально определенного свойства, что если r — случайное значение, выбранное
из распределения вероятностей с высокой min-энтропией, то для данного H (r|x), невозможно найти
x. Что значит высокая min-энтропия? Это можно описать так, что r выбирается случайно из
огромного количества различных значений. Так, например, если r выбирается равномерно из всех
строк длиной 256 бит, то любая конкретная строка выбиралась с вероятностью 1 из 2256, то есть 2-256, а
это действительно очень малое число. Итак, до тех пор, пока r выбирается таким образом, хэш r,
объединенный с x, будет скрывать x.
Теперь давайте рассмотрим применение этого свойства – обязательство (commitment). Это своего
рода цифровая аналогия, когда берется значение и запечатывается в конверте. Конверт кладется на
стол, где всякий может его увидеть. То есть фиксируется то, что находится в конверте.
Конверт остается закрытым, и его значение никому не известно. Позже его можно открыть и извлечь
содержимое, но до этого оно запечатано.
API обязательства
2 свойство - невозможно найти msg1!= msg2 такое, чтобы verify(commit(msg1), msg2) == true
Второе свойство доказывает неизменность сообщения в конверте. То есть, невозможно найти два
разных сообщения, чтобы создать обязательство одного сообщения, а позже сказать, что передали
другое, и все это будет верифицировано.
Откуда известно, что эти два свойства неизменны? Для начала нужно рассмотреть, как можно их
использовать.
Свойства безопасности:
Необратимость: для данного (H(key|msg), невозможно найти msg.
(H(key|msg1) == (H(key|msg2)
То есть для данного обязательства (com= H(key|msg)) невозможно найти сообщение (msg).
Это свойство необратимости, которое было рассмотрено ранее. Ключ — это случайное 256-битное
значение. Свойство необратимости гласит, что если будет взято сообщение, и перед ним поставлено
значение, которое было выбрано случайным образом и размером 256 бит, тогда невозможно найти
значение сообщения.
Схема обязательств будет работать только благодаря двум рассмотренным свойствам безопасности.
Для любого возможного значения на выходе y, если k берется из распределения с высокой min
энтропией, невозможно найти такой x, чтобы H(k | x) = y.
Для любого возможного значения на выходе — y, которое можно получить из хэш-функции, если k
выбрано случайным образом из распределения с высокой min-энтропией, нет возможности найти x,
так чтобы хэш конкатенации k и x был равен y.
Это исключает возможность того, что кто-то из хэш-функции получит определенное выходное
значение y. Если взять в качестве ввода значение, выбранное в удобном рандомизированном виде, то
очень сложно найти другое значение, которое попадает именно в эту цель.
Чтобы понять, как это можно использовать, рассмотрим сложную поисковую задачу. Сложность
задачи заключается в том, что решение можно найти только обойдя очень большое пространство и
нет других путей решения, кроме перебора этого пространства.
Свойство открытости для сложного вычисления подразумевает, что нет лучшей стратегии решения,
чем попытка случайного поиска значения x.
Идея состоит в том, имеется идентификатор задачи (id), который выбирается из некоторой высокой
распределенной случайной последовательности с высокой min-энтропией. И задана цель — Y,
которая должна быть равна хэш-функции. Необходимо попытаться найти решение - x. Таким
образом, если хэшировать идентификатор задачи (ID) вместе с решением X, будет получен
результат, который находится в заданном Y. Y — это целевой диапазон или набор желаемых
результатов хэширования. ID определяет конкретную задачу, а x — ее решение.
Свойство открытости для сложного вычисления подразумевает, что для этой задачи не существует
лучшей стратегии решения, чем простой подбор случайных значений x. И поэтому, если нужно
сформулировать сложную задачу, необходимо генерировать идентификаторы задачи (ID) в
подходящем случайном порядке. Эта вычислительная задача будет рассмотрена в следующих
лекциях в контексте биткоин майнинга. Обратимся к хэш-функции, которую использует биткоин
рис. 1.4.
Она называется SHA-256 и работает следующим образом. Берется сообщение, которое необходимо
хэшировать, и разбивается на блоки размером 512 бит (синие блоки на рис. 1.4). Сообщение не
должно быть кратно размеру блока, поэтому в конце будет добавляться дополнение (padding ). В
конце дополнения будет поле длиной 64 бит, которое обозначает длину сообщения в битах. А перед
дополнением будет стоять один бит, за которым следует некоторое количество нулевых бит, чтобы
заполнить блок до конца. Когда длина сообщения станет кратной блоку размером 512 бит, оно
разбивается на эти блоки. Потом выполняется вычисление. Оно начинается с 256-битного значения,
называемого IV. Это номер, который можно просмотреть в стандартном документе. Берется IV и
первый блок сообщения, получается 768 бит, и пропускается через функцию сжатия. На выходе
получается 256 бит. То же самое делается со следующими 512 битами сообщения – этот цикл
продолжается до конца. Каждая итерация сжимает последующий 512-битный блок сообщения и
включает его в логический результат. Результатом вычисления станет хэш, размером 256 бит. При
этом нет проблемы доказать, что если функция обладает свойством стойкости к коллизиям, то вся
хэш-функция также будет обладать стойкостью к коллизиям. В этой части лекции были рассмотрены
хэш-функции, их свойства и использование этих свойств. Описана хэш-функция, которая
используется в биткоине. В следующем разделе лекции будут рассмотрены способы использования
хэш-функций для создания более сложных структур данных, которые используются в
распределенных системах, таких как биткоин.
Терминологический словарь
Коллизия хэш-функции — это равенство значений хэш-функции на двух различных блоках данных.
На рис. 1.5 показано, как в лекциях будет изображаться хэш-указатель. H( ) – хэш информации и
стрелка, указывающая на эту информацию.
Использовать хэш-указатели можно для построения всех видов структур данных. Ключевая идея
состоит в том, чтобы взять любую структуру данных — связные списки, дерево двоичного поиска
или что-то подобное, — и реализовать его с помощью хэш-указателей вместо обычных указателей.
Для примера рассмотрим связный список, построенный с хэш-указателями( рис. 1.6). Эта структура
данных называется цепочкой блоков (блокчейн).
Структура, похожая на обычный связанный список, в котором есть серия блоков и каждый блок
содержит данные и указатель на предыдущий блок в списке. Здесь же предыдущий указатель блока
будет заменен на хэш-указатель. Таким образом, он показывает, где он расположен и какое значение
было у всего предыдущего блока. Начало списка сохраняется как обычный хэш-указатель.
Примером использования подобной цепочки блоков является журнал контроля изменений. Создается
журнал из структуры данных, в котором хранится большое их количество. Данные добавляются в
конец журнала. Если кто-то решит подделать данные в журнале, это можно обнаружить, то есть
осуществить контроль изменений. И чтобы понять, почему цепочка блоков имеет такое свойство,
необходимо задаться вопросом, что произойдет, если злоумышленник захочет подделать данные,
находящиеся в середине цепочки.
Рис. 1.7. Определение искажений
Предположим, злоумышленник хочет изменить блок данных ( рис. 1.7) так, чтобы владельцы хэш-
указателя в заголовке не смогли обнаружить вмешательство.
Злоумышленник изменил содержимое блока, как показано на рис. 1.7. Изменится хэш всего этого
блока и не будет совпадать с сохраненным ранее. И так как хэш-функция обладает свойством
стойкости к коллизиям, то значение хэша этого блока будет отличаться, то есть изменения будут
обнаружены
Если, конечно, злоумышленник также не подделает блок справа как показано на рис. 1.9. Но если он
это делает, хэш этого блока не будет соответствовать хэшу, показанному как крайнее правое
значение H(). А это значение злоумышленник не может изменить, потому что сохраненное значение
является заголовком всего списка. И если злоумышленник хочет подделать данные в какой-либо
точке данной цепочки, то, чтобы сохранить согласованность, ему придется изменять хэш-указатели
вплоть до начала. В итоге он столкнется с серьезной проблемой, потому что не сможет подделать
заголовок списка. Все это означает, что сохранение данного хэш-указателя является средством
контроля изменений всего списка от начала до конца. Поэтому можно построить цепочку блоков
похожую на эту, содержащую столько угодно блоков, но в начале имеющую особый блок, который
можно назвать генезис-блоком. Все это представляет собой журнал контроля изменений,
построенный из последовательности блоков.
Рис. 1.10. Определение искажений
Есть ряд блоков данных, которые располагаются внизу дерева ( рис. 1.10). Для каждой
последовательной пары этих блоков строится структура данных, которая имеет два хэш-указателя,
по одному для каждого из этих блоков. На уровне выше каждый блок будет содержать хэш-указатель
этих двух дочерних элементов. И так далее, вплоть до корня дерева. И здесь в начале дерева, как и в
предыдущем примере, сохраняется только хэш-указатель. По хэш-указателям можно перейти к
любой точке списка. И можно убедиться, что данные не были изменены. Подобно ранее
рассмотренной цепочке блоков, если злоумышленник исказит какой-то блок с данными внизу, это
приведет к тому, что хэш-указатель на уровне выше будет другим. Поэтому он должен будет
изменить и его. Затем ему придется изменить хэш-указатель, находящийся на уровень выше. И в
конце концов он дойдет до вершины, где он не сможет изменить сохраненный хэш-указатель. Таким
образом, любая попытка изменить любую часть данных внизу будет вскоре замечена только
благодаря сохраненному хэш-указателю наверху.
Еще одна приятная особенность деревьев Меркла заключается в том, что в отличие от ранее
созданной цепочки блоков, если кто-то хочет доказать, что конкретный блок данных является
членом этого дерева Меркла, все, что им нужно, это предоставить данные, представленные на рис.
1.11.
Рис. 1.11. Доказательство вхождения в дерево Меркла
Поэтому, если сохранен только корень, и кто-то хочет доказать, что блок находится в дереве Меркла,
он должен показать блок с рисунка рис. 1.11. Можно пройти по всему до блока данных, проверяя на
соответствие сохраненные хэши. И только проверив хэши до корня, можно убедиться, что этот блок
данных находится в дереве Меркла. Таким образом, если будет O(log n) элементов, которые нужно
отобразить, то требуется O(log n) времени, чтобы их проверить. И поэтому даже при очень большом
числе блоков данных в дереве Меркла, можно проверить достоверность их принадлежности за
относительно короткое время.
Таким образом, деревья Меркла имеют различные преимущества. Одно из них состоит в том, что
дерево содержит много элементов, но нужно помнить только корневой хэш, который составляет
всего лишь 256 бит. Можно проверить принадлежность к дереву Меркла в логарифмическом
времени и логарифмическом пространстве. Есть разновидность дерева Меркла — сортированное
дерево Меркла. Это то же самое дерево, но здесь блоки, расположенные внизу, сортируются в
определённом порядке. Скажем, алфавитном, лексикографическом или числовом, или каком-либо
другом. Как только дерево отсортировано, можно проверить достоверность данных в нем. То есть
можно доказать, что конкретный блок не находится в дереве Меркла. Для этого нужно указать путь к
элементу, который находится непосредственно перед тем, где будет этот элемент, и сразу после того
места, где он должен быть. И тогда можно сказать, что оба эти элемента находятся в дереве Меркла,
они последовательны. И поэтому между ними нет места. Между ними нет ничего, поэтому не может
быть доказательства, что они не являются членами дерева. Итак, дерево Меркла — это дерево
двоичного поиска, построенное с помощью хэш-указателей, в котором можно осуществить проверку
членства логарифмическим временем, либо сортировкой, и это очень эффективно.
В более общем плане, получается, что можно использовать хэш-указатели в любой структуре
данных, основанной на указателях, пока структура данных не имеет циклов. Если в структуре
данных есть циклы, невозможно сделать все хэши соответствующими последовательности. Если
представить ациклическую структуру данных, то в ней можно начать с любого элемента, у которого
нет выходящих из него указателей, вычислять хэши этих объектов, а затем вернуться назад, в начало.
Но в структуре с циклами нет конца, с которого можно начать и вычислить в обратную сторону к
началу. Так например принадлежность к ориентированному ациклическому графу, состоящему из
хэш-указателей, можно проверить довольно эффективно.
Это хорошо известный способ, который постоянно встречается во всех распределенных структурах
данных и во всех алгоритмах, о которых будет рассказано в этом курсе.
Терминологический словарь
Двоичное (бинарное) дерево — иерархическая структура данных, в которой каждый узел имеет не
более двух потомков (детей). Как правило, первый называется родительским узлом, а дети
называются левым и правым наследниками.
Дерево Меркла — тип хэш-функции. Используется для того, чтобы проверять целостность данных
(файлов), получить уникальный идентификатор файла, а также дает возможность восстановить файл.
Цифровые подписи
Требования к подписям:
Подписать может только один человек, но все могут проверить. Точно так же, как с подписью
на бумаге.
Подпись связана с определенным документом, ее нельзя вырезать и вставить в другой
документ. Потому что подпись не просто подпись, она означает согласие или одобрение
конкретного документа.
Вопрос в том, как это можно реализовать в цифровой форме с использованием криптографии?
Рис. 1.12. API цифровых подписей
Есть три операции, которые необходимо сделать. Первая – генерация ключей с помощью операции
generateKeys. Входным параметром служит значение размера ключа (keysize) в битах. Эта процедура
генерирует два ключа — sk и pk. sk — закрытый, секретный ключ подписи. Это информация,
которую необходимо держать в секрете и использовать для создания своей подписи. А pk - это
открытый, общедоступный ключ проверки, который можно дать любому, чтобы он мог проверить
достоверность подписи.
Вторая операция — это операция подписи. Здесь используется закрытый ключ подписи и сообщение,
на котором необходимо поставить подпись. Это действие возвращает sig (комбинацию битов),
которая является подписью. И затем, третья операция — это проверка, которая берет то, что
считается истинной подписью и проверяет ее достоверность. Для ее выполнения берется открытый
ключ подписывающего лица, подписанное сообщение и подпись. Эта операция отвечает на вопрос,
настоящая ли это подпись, возвращая значение "да" или "нет".
Итак, эти три операции составляют схему подписи. Необходимо отметить, что первые две операции
могут использовать рандомизированные алгоритмы. generateKeys должно быть рандомизированным,
потому что эта операция должна генерировать разные ключи для разных людей.
Требования к подписям:
Первое требование - валидная подпись подтверждается. Это значит, что если подпись поставлена
человеком A с использованием закрытого ключа A, другой человек B с использованием открытого
ключа A может проверить эту подпись, и она будет корректна. Второе требование состоит в том, что
подпись невозможно подделать. То есть злоумышленник, который знает чей-то открытый ключ
(ключ для верификации) и видит подписи на других сообщениях, не может подделать подпись на
каком-то конкретном сообщении.
Это свойство обычно объясняют с помощью импровизированной игры со злоумышленником ( рис.
1.13).
На рис. 1.13 слева находится бросающий вызов телевизионный судья, который собирается проверить
заявление взломщика. Взломщик утверждает, что он может подделывать подписи. Необходимо
проверить это заявление. Первое, что нужно сделать, - с помощью функции generateKeys
сгенерировать закрытый и открытый ключи, которые соответствуют друг другу. Закрытый ключ
остается у судьи, открытый предоставляется и судье и взломщику ( рис. 1.14).
Таким образом, взломщик знает только открытый ключ. И его задача — попытаться подделать
сообщение. Судья знает секретный ключ, поэтому он может ставить подписи.
Взломщик собирается отправить сообщение (m0) судье ( рис. 1.15). Судья подписывает это
сообщение и отправляет подписанное обратно. Взломщик может посмотреть на это, почесать голову,
и отправить другое сообщение (m1).
Судья подпишет и его ( рис. 1.16). Взломщик может отправить любое количество сообщений и
получить на них подписи.
Как только взломщик удостоверится, что увидел достаточно подписей, он выберет сообщение m, на
котором хочет подделать подпись, и попытается это сделать ( рис. 1.17).
Рис. 1.17. Подделка подписи под сообщением
И, конечно, есть правило, что сообщение m, на котором он пытается подделать подпись, не из тех
сообщений, которое он уже видел. Потому что ему будет несложно отправить действительную
подпись на сообщении m0, потому что судья отправил действительную подпись на m0 раньше.
Поэтому он выбирает другое сообщение, на котором не видел подпись.
После получения бросающий вызов запустит алгоритм проверки, с помощью открытого ключа ( рис.
1.18).
И если алгоритм возвращает значение true, то взломщик победил, так как он смог подделать подпись.
Необходимо отметить, что вероятность выигрыша у взломщика ничтожно мала. Цифровая подпись
не может быть подделана, если у взломщика есть ничтожно малый шанс подделать сообщение, вне
зависимости от используемого им алгоритма. Если говорить о практических аспектах применения
цифровой подписи, необходимо отметить, что рассматриваемые алгоритмы рандомизированы (по
крайней мере, некоторые из них). Поэтому для их реализации необходим хороший источник
случайности. Недостаточная степень случайности сделает алгоритм небезопасным. Также на
практике есть ограничение на размер сообщения, которое можно подписать, потому что реальные
схемы будут работать с битовыми строками ограниченной длины. Решением этой проблемы будет
использование хэша сообщения, а не его всего. В этом случае сообщение может быть очень
большим, а хэш содержать всего 256 бит.
А так как хэш-функции свободны от коллизий, то использовать хэш сообщения в качестве ввода в
схему цифровой подписи безопасно. Помимо этого позже будет рассмотрено подписание хэш-
указателя, который находится в конце цепочки блоков, то есть подпись всей цепочки блоков.
Биткоин использует определенную схему цифровой подписи, которая называется ECDSA. Это
алгоритм цифровой подписи с эллиптической кривой, стандарт правительства США. В рамках
данного курса не будут рассматриваться детали его работы, которые основываются на достаточно
сложной математике. Заострим внимание только на том, что для ECDSA важна высокая степень
случайности. При этом особенностью ECDSA является то, что даже если недостаточная степень
случайности используется только в процессе подписи, а сам ключ совершенен, это всё равно
приведет к его потере.
Терминологический словарь
если sig такой, что verify(pk, msg, sig) == true, считается, что pk произносит: "[msg]" и чтобы
"говорить от имени" pk, нужно знать соответствующий закрытый ключ sk.
Иными словами, открытый проверочный ключ из схемы цифровой подписи можно приравнять к
идентификатору человека, действия или системы.
pk – публичное "имя", которое можно использовать (обычно лучше использовать хэш от pk)
sk позволяет "говорить от имени" идентификатора
Открытые ключи представляют собой своего рода идентификаторы личности. Отсюда следует, что
можно создавать новый идентификатор в любое время. Для этого нужно создать новую пару
случайных ключей sk и pk, выполнив операцию генерации ключей в рассмотренной ранее схеме
цифровой подписи. pk — это публичное имя, то есть имя личности-идентификатора. На практике
чаще всего используется хэш ключа, потому что размер открытого ключа достаточно велик. Таким
образом, pk или его хэш является публичным именем, которое используется, чтобы говорить о
личности, а sk — секретный ключ — это информация, которая позволяет человеку, создавшему эту
личность-идентификатор, говорить от имени этой личности и подтверждать ее. При этом создатель
ключей контролирует личность, потому что только он знает секретный ключ, и если ключ
сгенерирован случайным образом, то и открытый ключ pk будет случайным. Тогда никто не сможет
узнать, кто является владельцем ключа. Можно создать новую личность, которая выглядит
случайной, и которую может контролировать только владелец закрытого ключа ее идентификатора.
Рассмотрим подробнее, что такое децентрализованная идентификация. Это значит, что отсутствует
необходимость иметь одно место для регистрации пользователей в системе, получения имени
пользователя (user name). Не нужно сообщать кому-то о намерении использовать определенное имя.
Если нужен новый идентификатор, его нужно просто создать. Любой может создать новый
идентификатор в любое время и в любом количестве. Если есть необходимость иметь 5 разных имен,
нужно создать пять идентификаторов.
Если нужна анонимность на какое-то время, можно создать новый идентификатор, попользоваться
им, а затем выбросить. Все это возможно при децентрализованном управлении идентификацией. И
нет центральной точки контроля, так что не нужно иметь ответственного за этот процесс. Система
функционирует полностью децентрализованным образом. Таким образом, в реальности биткоин
работает с идентификаторами. Эти идентификаторы называются адресами. Поэтому в разговорах о
биткоине и криптовалютах часто можно услышать термин "адрес". На самом деле это всего лишь
открытый ключ или хэш открытого ключа. Это идентификатор, который кто-то создал из пустоты в
рамках децентрализованной схемы управления идентификацией.
Конфиденциальность:
Простая криптовалюта
Гуфи может создавать новые монеты в любое время. Новая монета после создания принадлежит
Гуфи. Монету можно представить следующей структурой данных. Есть операция CreateCoin (создать
монету) и есть уникальный CoinID (ID монеты), который сгенерировал Гуфи. Также есть цифровая
подпись Гуфи, которую любой может проверить. Поэтому всякий, получающий монету, может
проверить, что подпись действительна и что это подпись этого заявления.
Второе правило Гуфикойн состоит в том, что владелец монеты может ее передать кому-то другому.
Он может ее потратить ( рис. 1.20). Так, например, у Гуфи есть монета, которую он создал. Гуфи
делает заявление, в котором говорится: заплатить монету Элис. Элис представлена здесь своим
отрытым ключом. Заплатить открытому ключу Элис монету, представленную хэш-указателем, и это
все также подписано Гуфи. Так как Гуфи – владелец монеты, то ему следует подписывать всякую
транзакцию, которая связана с передачей монеты.
После этого монета станет принадлежать Элис. И она может это доказать, предоставив структуру
данных, действительно подписанную Гуфи и указывающую на монету, которая принадлежит Гуфи.
Теперь Элис может потратить эту монету. На рис. 1.21 в самом низу монета, созданная и
подписанная Гуфи. Затем Гуфи передал монету Элис через хэш-указатель с помощью подписанной
операции. Элис стала владельцем монеты. Затем она может создать заявление, говорящее: передать
эту монету открытому ключу Боба. Вот хэш-указатель на монету. И теперь Элис подписывает
данную операцию. То, что Элис была настоящим владельцем этой монеты, можно проверить, пройдя
по этой цепочке. Теперь известно, что монета действительна и принадлежит Бобу. Боб является
владельцем этой монеты.
Итак, правила Гуфикойн: Гуфи может создавать новые монеты, просто подписывая заявление, что он
создает новую монету с уникальным идентификатором.
И тогда тот, кто владеет монетой, может передать ее кому-то другому, подписав заявление о
передаче этой монеты человеку X. Достоверность монеты можно проверить, просто пройдя по
цепочке и проверяя в ней все подписи. Это Гуфикойн.
Еще раз вернемся к монете Гуфи. Гуфи создал монету, затем передал ее Элис. Элис какое-то время
владела монетой.Затем Элис передала эту монету Бобу. А потом она создает такую же структуру
данных, но в ней она передает эту же самую монету Чаку и подписывает данную операцию. Чак
может не знать о том, что находится в левом верхнем углу этой структуры данных. Например, если
Элис просто отдала монету Бобу и не рассказала Чаку. Теперь Чак, смотря на представленную
структуру, совершенно справедливо считает, что он — владелец монеты. У Чака есть все основания
быть владельцем этой монеты, как и у Боба есть такие же основания быть владельцем этой монеты
( рис. 1.22). В этом заключается проблема — монеты нельзя так передавать.
Проведение операции с одной и той же монетой дважды называется атакой двойного расходования.
Атаки двойного расходования — одна из ключевых проблем, которую следует решить в
криптовалюте. Гуфикойн не защищен от этой атаки. Хотя криптовалюта Гуфикойн проста для
понимания, она не подойдет для построения криптовалюты, потому что в ее структуре может
присутствовать двойное расходование. Чтобы криптовалюта была работоспособной, необходимо
решить эту проблему. Для этого рассмотрим еще одну криптовалюту – Скруджкойн.
С точки зрения структуры данных Скруджкойн ( рис. 1.23) выглядит несколько сложнее, но одна из
ключевых особенностей заключается в том, что Скрудж будет публиковать историю всех
прошедших транзакций в виде цепочки блоков (блокчейн). И она будет подписана цифровой
подписью Скруджа.
Каждый блок содержит одну транзакцию. В нем находится содержание этой транзакции и хэш-
указатель на предыдущий блок в истории.
Срудж берет хэш-указатель, который представляет всю эту структуру, подписывает его и публикует.
Теперь любой может проверить, что Скрудж действительно подписал этот хэш-указатель. Можно
проследовать по всей этой цепочке назад и посмотреть историю всех транзакций Скруджкойн,
подписанных Скруджем.
На практике (в биткоине) для оптимизации в один блок помещается сразу несколько транзакций.
Чарли заметит, что что-то не так, потому что он сможет просмотреть историю и увидеть, что Элис
уже передала эту монету Бобу. Фактически, каждый сможет увидеть, что Элис заплатила эту монету
Бобу. Итак, если она попытается заплатить эту же монету Чаку, тогда все увидят, что это двойное
расходование, и они смогут отметить эту транзакцию. Скрудж отменит ее, как и все остальные. И
еще они поймут, что им не следует доверять Элис.
В Скруджкойн есть два вида транзакций. Первая транзакция — создание новых монет CreateCoins.
Это похоже на операцию, которую Гуфи делал в Гуфикойн. Но здесь в одной транзакции можно
создавать нескольких монет.
Рис. 1.24. Создание монет Скруджкойн
ID номер транзакции — 73. Тип транзакции — это создание монет. Ниже расположен список
созданных монет. Каждая монета будет иметь серийный номер в этой транзакции: ноль, один, два и
т. д. Каждая монета имеет ценность, определенную в Скруджкойн. И каждая монета имеет
получателя, который указан в виде открытого ключа. Таким образом, этот тип транзакции создает
множество новых монет и присваивает их людям как первоначальным владельцам.
Рис. 1.25. Добавление идентификаторов монет
Операция CreateCoins всегда корректна. Если Скрудж помещает это в историю, которую он
подписывает, то это корректно по определению. Не имеет значение, имеет ли Скрудж право
создавать монеты. Так же как не имело значение, имеет ли Гуфи право создавать монеты. Правила
системы, созданной Скруджем, говорят, что если Скрудж хочет создать монеты, то эта операция
корректна. Поэтому все, что он выкладывает в историю, корректно.
Рис. 1.26. Транзакция PayCoins потребляет (и уничтожает) некоторые монеты, создавая новые с той
же общей ценностью
Второй вид транзакции— транзакция передачи монет PayCoins( рис. 1.26). Транзакция, которая
некоторые монеты потребляет, уничтожая, а из них создает новые монеты той же общей ценности,
но которые могут принадлежать разным людям. На рис.1.26 показана транзакция 73, ее тип —
PayCoins. Перечислен список потребляемых монет. Все эти монеты потребляются и уничтожаются
транзакцией PayCoins. Стоимость всех этих монет объединяется и создается ряд новых монет. Как и
раньше, в транзакции CreationCoins каждая из них имеет свою ценность и принадлежит
определенному получателю.
И новые монеты имеют ровно такую же общую стоимость, как и те, которые были уничтожены.
Внизу расположен набор цифровых подписей. Эта сделка должна быть подписана всеми, кто платит
монету. Поэтому, владельцу каждой из монет, которая будет уничтожена в этой транзакции, будет
необходимо поставить цифровую подпись, чтобы подтвердить, что он действительно согласен
потратить эту монету. Правила Скруджкойн гласят: транзакция PayCoin действительна, если верны
все четыре составляющих.
Во-первых, если потребленные монеты действительны, то есть они действительно были созданы в
предыдущих транзакциях.
Во-вторых, потребляемые монеты еще не были использованы в предыдущих транзакциях, то есть это
не двойное расходование.
В-третьих, общая стоимость монет, которые получаются в результате транзакции, равна общей
стоимости монет, которые были потреблены.
В-четвертых, сделка подписана владельцами всех потребляемых монет. Если все эти составляющие
верны, то транзакция PayCoins корректна. Скрудж ее признает и запишет в историю, в цепочку
блоков. Тогда каждый увидит, что эта транзакция произошла. В рассмотренной схеме монеты
неизменяемы, они никогда не разделяются, никогда не объединяются. Они создаются в одной
транзакции, а затем уничтожаются в других транзакциях. Для того чтобы разделить, объединить или
заплатить монету, нужно произвести транзакцию.
Если необходимо разделить монету, нужно создать новую транзакцию, которая уничтожает эту одну
монету, а затем создаст две новые монеты с одинаковой общей ценностью. При этом можно не
менять владельца монет. Так можно разделять монеты. Точно таким же образом их можно
объединять или платить, создавая цепочку транзакций, в каждой из которых определенная ценность
монеты передается в новой форме кому-то другому.
Итак, в системе Скруджкойн можно увидеть, какие монеты действительны. Двойное расходование
исключено, так как каждый может посмотреть блокчейн и увидеть, что все транзакции
действительны и каждая монета была использована 1 раз. Остается главная проблема, и эта проблема
сам Скрудж.
Изначально предполагается, что Скрудж честный, то есть ведет себя корректно и в соответствии с
правилами. Проблема появляется тогда, когда он перестает быть честным или перестает делать то,
что должен. То есть проблема этой системы в ее централизации на Скрудже.
Главная техническая задача, которую необходимо решить, чтобы улучшить Скруджкойн, это свести
централизацию к минимуму. Для этого нужно выяснить, как предоставлять услуги, которые
предоставляет Скрудж, но делать это децентрализованным способом так, чтобы никакая сторона не
брала на себя доверительных функций. Для этого нужен механизм, благодаря которому каждый
сможет одобрять единичный опубликованный блок цепочки, в которой произошли транзакции.
Механизм должен позволять признавать транзакции валидными и не признавать уже произошедшие
транзакции в случае, если они некорректны.
Терминологический словарь
В конце первой лекции была рассмотрена простая криптовалюта - Скруджкойн. Было показано, как
можно избежать двойного расходования с помощью ведения учета транзакций в виде блокчейна.
Осталась одна проблема, связанная с централизованным управлением Скруджа Решением этой
проблемы является децентрализация, которой будет посвящена эта лекция.
Во-первых, существует одноранговая сеть, и этот компонент Биткоина наиболее близок к полной
децентрализации. Любой может подключиться к сети самостоятельно. На данный момент
существует несколько тысяч узлов Биткоин.
Существует также биткоин-майнинг, который будет рассмотрен позже в этой лекции. Биткоин-
майнинг также технически открыт для всех. Но для него требуются большие капитальные вложения.
Это следствие эволюции системы. Из-за высокой стоимости вхождения в экосистеме добычи
биткоинов появилась высокая централизация или концентрация энергии, и сообщество участников
сети Биткоин часто рассматривает это явление как нежелательное. Таким образом, этот аспект
Биткоина не столь децентрализован, как хотелось бы.
Терминологический словарь
Биткоин - новое поколение децентрализованной цифровой валюты, созданной и работающей только
в сети интернет
Криптовалюта – это цифровая валюта, единица которой – цифровая монета. Цифровая монета
защищена от подделки, так как представляет собой зашифрованную информацию, скопировать
которую невозможно.
Узел Биткоина - концептуальная единица хранения данных, несущая в себе также ссылки на
связанные с ней элементы.
Децентрализация — создание таких условий, чтобы надобность в сервере отпала, и участники сети
обладали одним рангом.
Распределенный консенсус
Таким образом, когда появляется новый комментарий, в этом массивном серверном пространстве
может быть 10 или 15 различных узлов, которые содержат его копии.
Сервер должен убедиться, что этот комментарий либо записывается во все копии базы данных, либо
ни в одну из них.
Если некоторые из этих узлов неисправны, то действие не записывается ни в одну из баз данных.
Администратор может вернуться к пользователю и сказать, что возникла проблема сохранения поста
и предложить попробовать еще раз. С другой стороны, если бы некоторые копии базы данных
сохранили действие, а другие нет, база данных стала бы нецелостной. Эта ключевая проблема,
которая мотивировала традиционные исследования по распределенному консенсусу.
Если представить, что протокол распределенного консенсуса достигнут, его можно было бы
использовать для создания массового, глобального распределенного хранилища, которое
сопоставляет произвольные ключи или имена с произвольными значениями. Это имеет множество
практических применений. Например, распределенная система доменных значений, которая является
простым сопоставлением понятных для человека доменных имен с IP-адресами. Или каталог
открытых ключей, который представляет собой сопоставление адресов электронной почты
пользователей с их открытыми ключами. Или даже такие вещи, как биржевые торги. В результате
эта распределенная база данных, вместо того, чтобы отслеживать, кто, кому и сколько заплатил,
будет отслеживать, кто кому передал какие единицы из какого хранилища.
И самое интересное заключается в том, что Биткоин решил проблему распределенного консенсуса.
Но есть другие, сопутствующие, проблемы. И в самом деле, существует много Альткойнов (они
будут рассмотрены в следующих лекциях). Альткойны построены на основных принципах
Биткоинов, но с несколько иными целями. Иногда это валютные системы, иногда нет. Итак,
распределенный консенсус можно обеспечить. И учитывая это, можно создать глобальное
распределенное хранилище ключевых значений.
И тут действует протокол консенсуса. Два требования к этому протоколу заключаются в том, что он
должен прекратить поиск консенсуса , когда все правильные узлы принимают решение о некотором
согласованном значении. Именно все правильные узлы, поскольку некоторые узлы могут быть
неисправны или даже вредоносны.
Второе требование состоит в том, что значение, которое они согласуют, не может быть
произвольным значением. Это должно быть именно то значение, которое было предложено в
качестве входных данных, по меньшей мере, одного из правильных узлов. Разберемся, что это может
значить в контексте Биткоина.
Чтобы понять, как распределенный консенсус работает с Биткоин, необходимо вспомнить, что
Биткоин - это одноранговая система. Когда Алиса хочет заплатить Бобу, она должна транслировать
эту операцию для всех Биткоин-узлов, входящих в одноранговую сеть (оповестить эти узлы). Это
похоже на операции с Гуфикойн из первой лекции. Транзакция состоится, если будет получена
подпись Алисы. Другие узлы нужны для того, чтобы знать, что действие на самом деле идет от
Алисы. В транзакции так же нужен открытый ключ Боба, обращающийся к адресу, по которому он
хочет получить Биткоины ( рис. 2.1).
Теперь Боб, если он хочет быть уведомленным, что данная сделка действительно произошла, и что
ему заплатили, может захотеть запустить Биткоин-узел. Это действие не является необходимым для
того, чтобы он получил средства. Биткоины будут его, независимо от того, запустил он узел в сети
или нет. В чем именно узлы могут захотеть достичь консенсуса? Различные пользователи
транслируют транзакции в сеть. Все хотят достичь консенсуса по вопросу о том, какие именно
сделки транслировались и в каком порядке эти сделки совершались.
Консенсус может работать в Биткоин, так как в любой момент времени все узлы одноранговой сети
будут иметь последовательность блоков транзакций, по которым они достигли консенсуса. В
Скруджкойн для оптимизации и для эффективности транзакции помещаются в блоки и затем
соединяются в цепочку блоков. Здесь используется аналогичный принцип. Можно достичь
консенсуса по транзакциям одна за другой, и это было бы правильно. Но неэффективно. Поэтому
консенсус достигается по блоку за блоком. Таким образом, в любой момент все эти узлы в
одноранговой сети будут иметь последовательность блоков, о которой они уже договорились. И
каждый узел будет иметь набор незавершенных транзакций, о которых он получал информацию. По
этим транзакциям консенсуса пока не произошло. Одноранговая сеть несовершенна, так что какой-то
узел, возможно, слышал о сделке, а другие узлы нет. Может случиться, что есть последовательность
блоков, с которой все согласились.
Допустим, в системе есть три узла, связанные каким-то протоколом конценсуса, каждый из которых
имеет свой вход, набор незавершенных транзакций, о которых он получил информацию ( рис. 2.2).
Для успешного выполнения протокола консенсуса можно выбрать любой допустимый блок, даже
если это блок, предложенный только одним узлом. Для того чтобы блок был действительным, все
транзакции в нем должны иметь правильные криптографические подписи.
Если какая-то транзакция не вошла в блок, который выбирается в результате протокола консенсуса,
то она может просто подождать и попасть в следующий блок.
Еще одна особенность Биткоин заключается в том, что понятия конкретной отправной точки и
конечной точки для консенсуса не используются. Вместо этого консенсус происходит в течение
длительного периода времени, примерно часа на практике. Но даже в конце этого времени, нельзя со
100% уверенностью сказать, что конкретная транзакция или блок был встроен в цепочку блока
консенсуса. Чем больше времени проходит, тем больше вероятность того, что блок попадет в
цепочку консенсуса. И вероятность ошибки в предположении о выполнении транзакции падает в
геометрической прогрессии.
Это вероятностная гарантия, которую дает Биткоин. Именно она способна полностью обойти
традиционные доказательства невозможности результатов по распределенным протоколам
консенсуса.
Терминологический словарь
Блоки - это файлы, в которых постоянно записываются данные, относящиеся к сети Биткоин. Блок
записывает некоторые или все последние транзакции Биткоин, которые еще не введены в
предыдущие блоки. Каждый раз, когда блок "завершен", он уступает место следующему блоку.
Таким образом, блок является постоянным хранилищем данных, которые после написания не могут
быть изменены или удалены.
Открытый ключ - ключ, используемый в асимметричном криптографическом алгоритме, который
может быть сделан общедоступным.
Паксос - семейство протоколов для решения задачи консенсуса в сети ненадёжных вычислителей.
Консенсус — процесс получения согласованного результата группой участников, основная проблема
— наличие помех в среде передачи данных.
Распределенный консенсус означает, что разные компьютеры, создающие сеть узлов, пришли к
соглашению, в которое каждый участник вложил свой вклад, и в целом получилось общее решение.
Рассмотрим технические детали алгоритма консенсуса Биткоина. Биткоин действует без узлов,
имеющих какие-либо постоянные долгосрочные идентификаторы. В этом отличие от работы
традиционных алгоритмов распределенного консенсуса. Если узлы имеют идентификационные
данные, то это значительно облегчает работу по нескольким причинам. Во-первых, это позволяет,
например, указать в протоколе, что узел с самым низким числовым идентификатором должен
сделать такой-то шаг. Если узлы являются полностью анонимными, это становится труднее сделать.
Идентификация могла бы помочь с обеспечением безопасности.Если узлы были идентифицированы,
и они не были причастны к созданию новых идентификационных узлов, то можно сделать
предположение, что менее 50% узлов являются вредоносными. Но почему узлы Биткоин не имеют
идентификаторов? По нескольким причинам. Одна из них состоит в том, что в децентрализованной
модели в одноранговой системе нет центрального органа власти, чтобы предоставить удостоверения
узлам и убедиться, что они не создают новые узлы по своему желанию. Технический термин для
атаки с созданием узлов -атака Сибиллы. При атаке Сибиллы злоумышленник создает копии узлов,
чтобы возникло ощущение, будто в сети есть много разных участников, когда на самом деле все эти
псевдоучастники действительно контролируются одним человеком.
Другая причина заключается в том, что анонимность является целью Биткоин. Даже если бы можно
было установить идентификационные данные для всех узлов или всех участников, никто не захотел
бы этого делать.
Биткоин не гарантирует полную анонимность в том, что касается различных сделок, которые
совершаются и вероятнее всего связаны вместе. Но в то же время никто не заставляет оставлять
личные данные, такие как имя или IP-адрес для того, чтобы участвовать в одноранговой сети и в
цепочке блоков. Чем можно заменить постоянную идентификацию узлов? Предположим, есть
возможность каким-то образом выбрать случайный узел в системе. То, что получается при таком
выборе называется неявным консенсусом.
Есть несколько раундов. Каждый раунд соответствует различным блокам в цепочке блоков. В
каждом раунде случайный узел выбирается случайным, "волшебным" образом. И этот узел получает
возможность предложить следующий блок в цепочке. Алгоритм консенсуса отсутствует. Нет
голосования. Этот узел просто в одностороннем порядке предлагает, каким будет следующий блок в
цепочке блоков.
Но что, если этот узел является вредоносным? Для этого есть неявный процесс. Другие узлы будут
неявно принимать или отклонять этот блок. Как они это сделают? Если они принимают этот блок,
они расширяют цепочку блоков этим блоком. Если же они отвергают этот блок, они будут расширять
цепочку, игнорируя его и начиная с последнего блока в существующей цепочке блоков.
Каждый блок содержит хэш, который его расширяет, и этот технический механизм позволяет узлам
сигнализировать, какой именно блок они расширяют.
Описание алгоритма сильно упрощено, так как процесс выбора случайного узла назван
"волшебным". Тем не менее оно близко к тому, как работает Биткоин на самом деле. Поэтому всякий
раз, когда Алиса захочет заплатить Бобу, она создаст транзакцию и транслирует ее на все узлы. И
любой из этих узлов постоянно будет проверять сеть и собирать список непогашенных транзакций,
которые еще не вошли в блокчейн.
В какой-то момент один из узлов будет случайно выбран, чтобы предложить следующий блок. Он
соберет все непогашенные сделки, о которых он оповещен, и предложит этот блок.
Предположительно, узел был правильным. Но это также мог быть вредоносный узел или
неисправный узел, предлагающий блок, который содержит некоторые недопустимые транзакции.
Недопустимыми являются те транзакции, которые не имеют правильной криптографической
подписи или где транзакция уже совершена, другими словами, попытка двойного расхода. Если это
произойдет, другие узлы будут сигнализировать о принятии или отклонении блока, как видно на
рисунке: либо включая хэш последнего блока в следующий блок, либо игнорируя этот блок и
включая хэш от любого предыдущего блока, который они считают действительным. Почему
работает этот алгоритм консенсуса? Чтобы это понять, необходимо рассмотреть, как злоумышленник
может попытаться подорвать процесс.
Допустим, есть пара блоков в цепочке блоков ( рис. 2.3). Предположим, что она простирается далеко
влево и этот путь называется блоком генезиса (создания блокчейна). Указатель представляет собой
блок, ссылающийся на предыдущий блок, расширяющий его, используя хэш этого предыдущего
блока и своё собственное содержание.
Предположим, есть злоумышленник, назовем его Алиса. Что она может сделать?
Может ли она просто украсть Биткоины, принадлежащие другому пользователю с другим адресом,
который она не контролирует?
Даже если сейчас очередь Алисы предложить следующий блок в блокчейн, она не может украсть
Биткоины другого пользователя. Почему? Она не может подделать его подписи.
Другая вещь, которую она может попытаться сделать, чтобы навредить Бобу, - подсмотреть его адрес
и не включать транзакции с его адреса в любой блок, который она предлагает включить в блокчейн.
Другими словами, ее узел отказывается подчиняться Бобу. Это реальная атака, которую она может
попытаться предпринять, но она вызовет только небольшую задержку. Если блок Боба не попадет в
следующий блок, который предлагает Алиса, он просто, пока правильный узел не получит шанс
предложить его блок, и тогда его транзакция попадет в этот блок.
Таким образом, единственное, что вредоносный узел может попытаться сделать, называется атакой
двойного расхода (double-spend). Чтобы разобраться, предположим, что Алиса является клиентом
какого-то интернет-магазина или веб-сайта под управлением Боба, который предоставляет
некоторый онлайн-сервис в обмен на оплату в Биткоин. Допустим, он позволяет скачать какое-то
программное обеспечение. Как может сработать двойной расход? Алиса заходит на сайт Боба и
решает купить товар, платит Биткоинами, в техническом плане, это значит, что она собирается
перевести Биткоин со своего адреса на адрес Боба. Она транслирует это в сеть. И какой-то
правильный узел создает следующий блок, принимает транзакцию и включает ее в блок ( рис. 2.4).
Рис. 2.4. Что может сделать вредоносный узел? Алиса заплатила Бобу.
Итак, есть блок, созданный правильным узлом, который содержит транзакцию, представляющую
платеж от Алисы продавцу Бобу. Под "С" имеется в виду монета, принадлежащая Алисе, и она
сейчас отправляется на адрес Боба.
Сделка - это структура данных, которая содержит подпись Алисы, инструкцию для оплаты с
помощью открытого ключа Боба, а также хэш. Хэш представляет собой указатель на транзакцию, где
Алиса, по сути, получила эту монету от кого-то другого. И это должно быть указателем на
транзакцию, которая была включена в какой-то предыдущий блок в цепочке консенсуса ( рис. 2.5).
Рис. 2.5. Что может сделать вредоносный узел? Алиса заплатила Бобу.
Есть, по крайней мере, два различных типа указателей. Они являются блоками, которые включают
хэш предыдущего блока, расширяя его, и транзакциями, которые включают указатель на все
предыдущие транзакции, откуда пришла монета.
Рис. 2.6. Что может сделать вредоносный узел? Указатель на предшествующий блок.
Предположим, что при следующем вызове случайного узла этот узел будет вредоносным узлом,
контролируемым Алисой.
Боб уже посмотрел на этот Блокчейн, решил, что Алиса заплатила ему, и позволил Алисе скачать
программное обеспечение (то, что она покупала на своем сайте).
Боб доволен, сделка завершена, Алиса теперь получила свой товар в обмен на оплату.
Это классический случай двойного расхода. Алиса создает новую транзакцию, которая переводит
монету, вместо адреса Боба, на другой адрес, принадлежащий ей ( рис. 2.8).
Рис. 2.8. Что может сделать вредоносный узел? Атака двойного расхода
Вот так выглядит попытка двойных расходов. Как узнать, будет ли эта попытка успешной? Это
зависит от того, чем закончится эта зеленая транзакция или эта красная транзакция в долгосрочной
цепи консенсуса. Это определяется фактом, что правильные узлы всегда следуют политике
расширения наиболее длинной действующей ветви. Итак, какая из этих ветвей является самой
длинной? На первый взгляд можно сделать вывод, что первая ветвь длиннее второй, так как она
содержит двойную попытку. Но здесь очень тонкий момент, с моральной точки зрения, эта зеленая
транзакция и красная транзакция выглядят по-разному, потому что, как ранее было сказано, первая
попытка Алисы – заплатить Бобу, а вторая - обмануть Боба и получить монеты обратно себе. Но с
технологической точки зрения, эти две операции полностью идентичны. Узлы, которые смотрят на
это, не имеют возможности определить, какая из них является законной транзакцией. Это моральное
суждение, а не техническое различие, по сравнению с которым кто-то попытался платить одной
монетой два раза.
Сейчас узлы часто следуют эвристике расширения блока, о котором они впервые получили
информацию в одноранговой сети, но это ненадежное правило. И в любом случае, из-за задержки в
сети, все легко может быть наоборот.
Рис. 2.9. Что может сделать вредоносный узел? Атака двойного расхода: правильные (честные) узлы
будут расширять наиболее длинную действующую ветвь.
Другими словами есть шанс, что следующий узел, который может предложить блок, будет
расширять красный блок вместо зеленого. Или, даже если это правильный узел, Алиса может
попытаться подкупить его или подорвать процесс различными способами.
Следует иметь в виду, что следующий правильный узел гораздо более вероятно расширит
правильный блок вместо других, потому что теперь рассматриваемый блокчейн стал самой длинной
правильной, проверенной цепью.
Итак, после еще одного блока ситуация выглядит как на рисунке 2.9. Теперь начинает казаться
довольно вероятным, что двойной расход преуспел. Фактически же цепь консенсуса заканчивается, и
в дальнейшем этот блок полностью игнорируется сетью. Такой блок называется сиротским блоком.
Рассмотрим эту ситуацию с точки зрения торговца Боба. То, как Боб может защитить себя от этой
атаки двойного расхода, будет ключевой частью понимания безопасности Биткоин ( рис. 2.10).
Рис. 2.11. Ситуация с точки зрения предпринимателя Боба. Услышана информация о сделке. Ноль
подтверждений.
Боб как только узнает о транзакции, может завершить транзакцию на веб-сайте и разрешить Алисе
загрузить все, что она хотела. Это называется транзакцией с нулевым подтверждением.
Или он может дождаться, пока транзакция не получит одно подтверждение в Блокчейн, а это
означает, что хотя бы какой-то узел создал блок и предложил эту транзакцию. Но, как было показано
ранее, даже после одного подтверждения, это может быть попыткой двойного расхода ( рис. 2.12).
Рис. 2.13. Ситуация с точки зрения предпринимателя Боба. Попытка двойного расхода.
Теперь он видит, что его транзакция имеет уже два подтверждения в цепочке блоков.
Он получает немного больше уверенности в том, что его транзакция закончится долгосрочной
консенсусной цепью.
Допустим, есть еще одно подтверждение и теперь их три. Чем больше подтверждений транзакции,
тем выше вероятность того, что она закончится в долгосрочной консенсусной цепи. Потому что
поведение правильных узлов – то, что они всегда будут расширять самую длинную допустимую
ветвь, которую они видят, вероятность того, что эта попытка догнать эту более длинную ветвь,
теперь очень маловероятна, особенно если меньшая часть узлов являются вредоносными. Как
правило, единственная причина, по которой блок двойного расхода будет расширен в этот момент,
заключается в том, что следующий узел, который будет выбран случайным образом, был
вредоносным узлом, а затем понадобится другой вредоносный узел, а затем другой для этой более
короткой ветви, чтобы затем стать длинной ветвью.
Рис. 2.14. Ситуация с точки зрения предпринимателя Боба. 3 подтверждения.
И, наконец, никогда нельзя иметь 100% уверенности, что интересующая транзакция находится на
консенсусной ветви, но вероятность этого довольно велика. После шести транзакций практически
нет шансов ошибки.
Терминологический словарь
Ранее были сделаны предположения о том, что можно выбрать случайный узел и в процессе
выполнения транзакции правильный узел будет выбираться, по крайней мере, в 50% случаев. Если у
участников есть финансовые мотивы подорвать эти предположения, какой у них стимул вести себя
правильно?
На рис. 2.16 показана долгосрочная консенсусная цепь и блок, который содержит попытку удвоить
расходы. Можно ли как-то наказать узел, создавший этот блок?
Это проблематично по ряду причин, в том числе потому, что узлы не имеют идентификаторов, и
поэтому нет возможности их наказать. Если неправильный узел нельзя наказать, следует задаться
вопросом, как можно наградить узлы, которые создали правильные блоки, оказавшиеся в конечном
итоге в долгосрочной консенсусной цепи?
Рис. 2.17. Достижение честности проблематично
В Биткоин есть два отдельных механизма стимулирования. Первый называется наградой за блок.
Согласно правилам Биткоин, узел, который создает блок, включает специальную транзакцию в этом
блоке. И эта специальная транзакция - это транзакция создания монет.
Этот узел также может выбрать адрес получателя транзакции. Узел, как правило, выбирает и
адресует себя как получателя этой транзакции создания монет, платя себе сам. Это можно
представить как плату в обмен на услугу создания блока, входящего в консенсусную цепь.
Фактически, цена этой транзакции создания монеты имеет интересное свойство. В настоящее время
она зафиксирована на 25 биткоинах, но на самом деле она уменьшается вдвое каждые четыре года.
Сейчас идет второй этап. В первые четыре года существования Биткоинов это стоило 50. Теперь 25,
и уменьшение будет продолжаться. Это имеет некоторые интересные последствия, которые будут
рассмотрены на рис. 2.18. На основании вышесказанного, узел получает награду за блок, независимо
от того, предлагает ли он блок с действительными транзакциями или он вредоносный. Как же тогда
создать стимулы для честного поведения?
Как узел может получить вознаграждение? Это произойдет только в том случае, если этот блок
попадет на долгосрочную консенсусную ветвь, потому что это единственный случай, когда
транзакция создания монеты считается действительной, поскольку транзакция создания монет не
имеет отличительных черт. Она похожа на любую другую транзакцию. Это справедливо только в
том случае, если она заканчивается консенсусной цепью, в этом случае работает механизм
стимулирования. Это стимулирует работу узлов, которые ведут себя правильно или, как минимум,
стимулирует узлы вести себя таким образом, чтобы другие узлы согласились с созданием
следующих блоков этой цепи.
Это первый механизм стимулирования. Рассмотрим механизм уменьшения платы за создание блока,
входящего в консенсусную цепь, с помощью рис. 2.18, на котором изображен график с временем по
оси X и общим количеством биткоинов в обращении по оси Y.
Рис. 2.18. Общее количество биткоинов в обращении
На рис. 2.18 виден первый период, когда каждый блок приводил к созданию 50 новых Биткоинов. И
примерно в конце прошлого года эта награда за блок уменьшилась в два раза с 50 до 25. Можно
увидеть, что каждые четыре года, расширяясь в будущее, наклон этой кривой будет уменьшаться
вдвое. Это геометрическая прогрессия, у которой существует конечная сумма. То есть существует
полная конечная сумма создаваемых Биткоинов. И если сложить члены геометрической прогрессии,
то получится 21 миллион, исходя из скорости создания нового блока в секунду.
Также стоит отметить, что это единственный способ создания новых Биткоин. Нет другого
механизма генерации монет, и именно поэтому это окончательное и общее число, пока, по крайней
мере, не изменятся правила, по которым они создаются.
Получается, что награда за создание нового блока на самом деле закончится. Означает ли это, что
система перестанет работать и станет небезопасной, потому что у узлов больше не будет стимулов
вести себя честно? Не совсем, потому что это только первый из двух механизмов стимулирования.
Существует еще один, называемый транзакционным сбором.
Что же такое сбор за транзакцию? У любой транзакции есть ее создатель. Не создатель блока, а
создатель транзакции, по которой, например, Алиса платит Бобу. Что Алиса может, так это сделать
исходящее значение монеты меньше, чем входящее.
И способ, которым все узлы интерпретируют это различие, согласно правилам Биткоин, заключается
в том, что это и есть плата за транзакцию, и тот, кто создает блок, который первым помещает эту
транзакцию в цепочку блоков, получает это вознаграждение.
Поэтому, если есть узел, который создает блок, содержащий, например, 200 транзакций, тогда сумма
всех этих 200 комиссионных сборов начисляется по адресу, который узел помещает в этот блок.
Транзакционная плата является чисто добровольной, как чаевые. Но по мере того, как
вознаграждение за блок начинает заканчиваться, становится все более и более важным, чтобы узлы
могли вносить транзакционную плату в свои транзакции, чтобы получить разумное качество
обслуживания. Но то, как данная система будет развиваться, в действительности зависит от теории
игр, которая еще не полностью разработана. Таким образом, это интересная область открытых
исследований в Биткоин.
После рассмотрения механизмов стимулирования узлов, рассмотрим еще несколько оставшихся
проблем, чтобы иметь представление о том, как Биткоин достигает децентрализации.
Первая из них, самая сложная, - "волшебный" выбор случайного узла. Вторая заключается в том, что
из-за рассмотренных механизмов вознаграждения можно попасть в пространство, бесплатное для
всех, где каждый хочет запустить узел биткоинов в надежде захватить некоторые награды.
И третья - это еще более сложная версия второй проблемы. Она заключается в том, что противник
может создать совершенно любое количество легальных узлов, чтобы действительно попытаться
подорвать процесс достижения консенсуса.
Все эти проблемы связаны и имеют одно и то же решение. И это решение называется
Доказательством выполнения работы (proof-of-work).
Вместо того чтобы выбирать случайный узел, можно выбирать узлы почти случайно. Выбирать узлы
пропорционально ресурсу, который предположительно никто не сможет монополизировать. Этот
ресурс - вычислительная мощность. Получается, что для гарантии выполнения работы выбираются
узлы пропорционально их вычислительной мощности.
Рис. 2.19. Хэш-головоломка. Чтобы создать блок, найди случайное число. Поскольку хэш-функция секретна,
есть только один путь добиться успеха: пробуй каждый раз, пока не улыбнется удача
Для создания блока узел, который предлагает этот блок, должен найти случайное число. В блок
включаются число, предыдущий хэш и список транзакций, которые составляли этот блок. После
этого вычисляется хеш всей строки. Выведенный хэш должен быть очень маленьким числом,
которое попадает в небольшое целевое пространство (target space) являющейся частью довольно
большого пространства, которое является выходным пространством этой хэш-функции (output
space).
Ранее рассмотренные блоки содержали ряд транзакций и указатель на предыдущий блок в виде
строки. Теперь в состав блока должно входить еще случайное число. Зачем это нужно? Идея в том,
чтобы было умеренно трудно найти случайное число, которое удовлетворяет требуемому критерию.
Критерий состоит в том, что хэширование всего блока целиком, включая случайное число, будет
приводить к выходным данным определенного типа.
Фактически размер этого целевого пространства не превышает 1% от объема вывода. Это намного
меньше, чем можно получить за секунду.
Но в основном это вычислительная задача, которую узел должен решить для создания блока.
Время от времени один из них находит случайное число, которое удовлетворяет этому свойству, и
этот узел затем предлагает следующий блок. Вот как происходит децентрализация. Никто не решает,
какой узел предложит следующий блок.
Есть три существенных свойства функции проверки выполнения работы. Во-первых, ее очень
сложно вычислить. Имеется в виду умеренно сложно на сегодняшний день, но это меняется со
временем. На 1 блок нужно вычислить от 10 до 20 хэшей. Таким образом, размер целевого
пространства составляет всего 1 из количества, равного от 10 до 20 размеров выходного
пространства этой хэш-функции.
Если посмотреть на это с точки зрения вычислений, которые должен сделать компьютер, то
получится огромное число. И из-за этого только некоторые узлы стали конкурировать в процессе
создания блока, - процесс, известный как майнинг, - многократный поиск и решение задач.
Говоря о том, как капитал стимулирует майнинг, вернемся к началу лекции. Даже если технически
кто-то может быть майнером, требуется много концентрации мощности или, по другому,
концентрации доли участия в экосистеме Биткоина. Итак, это первое свойство задач доказательства
выполнения работы.
Так почему эта перестройка происходит? Почему необходимо сохранить этот десятиминутный
интервал постоянным? Причина проста.
Если бы время между созданием блоков было слишком мало, это было бы неэффективно –
потерялось бы преимущество оптимизации, позволяющие делать много транзакций. В настоящий
момент несколько сотен транзакций содержатся в одном блоке. Если бы время создания блока
снизилось с десяти минут до пяти минут, это, вероятно, было бы хорошо, и есть много дискуссий об
оптимальном времени создания блока альткойна. Но все согласны с тем, что время ожидания блока
должно быть фиксированным. Нельзя позволять уменьшать его без ограничений, и именно поэтому
необходимо автоматический пересчет цели. Благодаря тому, что функция стоимости и
доказательство работы настроены, можно заявить, что большинство атак на Биткоин недопустимы,
если большинство майнеров, оцененные по хэш-мощности, следуют протоколу. Это дает, как
минимум, 50% вероятности того, что следующий блок будет предложен от правильного узла, а не от
вредоносного.Зачем нужно, чтобы решение хэш-головоломок носило случайный характер? Никто не
может предсказать, какое из случайных чисел приведет к решению. Единственный способ сделать
это - попробовать варианты один за другим и надеяться, что это удастсяЭтот процесс называется
тестом Бернулли. Как правило, узлы испытывают так много случайных чисел, что дискретный
вероятностный процесс, называемый тестом Бернулли, может быть приближен к непрерывному
процессу вероятности, называемым процессом Пуассона. И конечным результатом всего этого
является то, что функция плотности распределения вероятности времени на то, чтобы найти
следующий блок любым узлом в глобальной сети, выглядит как экспоненциальное распределение.
Благодаря этому существует небольшая вероятность того, что если блок найден сейчас, следующий
блок будет найден очень скоро, в течение нескольких секунд или через минуту. Вероятность того,
что это займет много времени (например, час) также небольшая. В целом сеть автоматически
регулирует сложность, так что время межблочного периода поддерживается в среднем
длительностью в десять минут.
На рис. 2.20 приведен график, который показывает, как часто блоки будут создаваться всей сетью.
Рис. 2.20. Решение хеш-головоломок проблематично
Для конкретного майнера среднее время, чтобы найти блок, учитывая, что он только что нашел блок,
будет 10 минут, деленные на долю хэш-мощности, которую он контролирует. Итак, если у майнера
есть 0,1% от общей хэш-мощности сети, он будет искать блоки каждые 10 000 минут, что составляет
несколько дней. Таким образом, не только основное время между блоками будет очень высоким,
дисперсия времени между найденными блоками также будет высока.
Третьим важным свойством функции выполнения работы является проверка того, что новый узел
правильно вычислил доказательство работоспособности. Даже если он тратит в среднем от 10 до 20
попыток найти случайное число, являющееся правильным результатом хеш-функции, это случайное
число должно быть опубликовано как часть блока. Поэтому для любого другого узла нужно смотреть
на содержимое блока, хэшировать их все вместе и проверять, не меньше ли выходные данные, чем
целевые.
Терминологический словарь
Атака двойного расхода – атака, при которой данное количество монет тратится более чем в одной
сделке.
Атака Сибиллы – атака, в компьютерной безопасности, при которой репутация системы подрывается
путем подделки идентификаторов в одноранговых сетях.
Процесс Пуассона - ординарный поток однородных событий, для которого число событий в
интервале А не зависит от чисел событий в любых интервалах, не пересекающихся с А, и
подчиняется распределению Пуассона. В теории случайных процессов описывает количество
наступивших случайных событий, происходящих с постоянной интенсивностью.
Тест Бернулли - Любой тест или ситуация с двумя взаимно исключающими и исчерпывающими
возможными результатами; например, орел/решка при подбрасывании монеты. В серии тестов
Бернулли получается биноминальное распределение.
Функция плотности распределения вероятности - функция, значение которой при любом заданном
образце (или точке) в пространстве выборки (набор возможных значений, принимаемых случайной
величиной) можно интерпретировать как предоставление относительной вероятности того, что
значение случайной величины будет равно этой выборке.
Обобщение
Добывать биткоины очень дорого, так как поиск одного блока требует вычисления от 10 до 20
хэшей. Вознаграждение за блок составляет около 25 биткоинов. Экономика майнинга сводится к
тому, выгодно ли майнеру добывать биткоины.
Можно записать простое уравнение ( рис. 2.21 ), которое представит исходные данные для ответа на
этот вопрос. По сути, награда за майнинг это вознаграждение за блоки и транзакционные сборы.
Майнер спрашивает себя, во сколько обойдется стоимость оборудования и электроэнергии.
Фактически, добыча Биткоин настолько дорога с точки зрения электроэнергии, что становится
значительной частью общей стоимости, кроме начальной стоимости аппаратного обеспечения.
Если вознаграждение больше, чем стоимость, майнер имеет прибыль. Если же нет – теряет.
Еще одно осложнение заключается в том, что вознаграждение, которое получает майнер, зависит от
скорости, с которой он находит блоки, которая в свою очередь зависит не только от мощности его
аппаратного обеспечения, но и от его доли от мощности оборудования всех майнеров. Можно
назвать её долей от общей хэш-ставки.
Затраты майнеры несут в долларах или в любой другой валюте, которую они используют.
Вознаграждаются майнеры биткоинами, которые являются комиссионными за транзакции. Таким
образом, уравнение будет существенно зависеть от обменного курса биткоина в заданное время
И, наконец, до сих пор предполагалось, что майнер заинтересован в честном соблюдении протокола.
Но майнер так же может применить другую стратегию добычи биткоинов, вместо того, чтобы всегда
находить следующий блок, который расширяет самую длинную действующую ветвь.
Поэтому это уравнение не отражает все нюансы различных стратегий, которые может использовать
майнер. Хотя можно составить простое уравнение, на самом деле анализ того, что имеет смысл для
майнеров, - сложный вопрос теории игр, и на него нет простых ответов.
То есть когда Алиса и Боб хотят совершить сделку, и Алиса хочет знать, на какой адрес Боб
собирается получить деньги, это не является частью протокола биткоинов. Она должна узнать адрес
через какой-то другой процесс, например, через сайт продавца Боба.
Цель одноранговой сети состоит в том, чтобы распространять все новые транзакции, а также новые
блоки на одноранговые узлы Биткоин. Безопасность обеспечивает цепь блоков и протокол
консенсуса.
Это значит, что транзакция будет в цепи блоков, если она получит много подтверждений. Это не
фиксированное число, 6 - обычно используемое значение. Но чем больше подтверждений
полученной транзакции, тем больше обнаружено блоков, которые расширяют блок, содержащий
транзакцию и тем больше уверенность, что транзакция была частью цепи консенсуса.
Сегодня часто бывает множество "сиротских" блоков. Это блоки, которые не входят в консенсусную
цепь. Это может означать недействительную транзакцию или попытку "двойного расхода".
Это так же может означать, что в сети есть задержка, а два майнера конкурируют за решение задачи
доказательства выполнения работы. Они просто закончили поиск новых блоков всего за несколько
секунд друг от друга. И поэтому оба этих блока были транслированы в сеть почти одновременно.
Рассмотрим еще один тонкий момент. Представим, что Алиса и Боб – два разных майнера, и у Алисы
в 100 раз больше вычислительной мощности, чем у Боба. Это означает не то, что Алиса всегда будет
выигрывать гонку против Боба, чтобы найти следующий блок. Вместо этого Алиса и Боб имеют
соотношение, коэффициент вероятности, чтобы найти следующий блок в пропорции 100 к 1. Таким
образом, в долгосрочной перспективе Боб найдет в среднем 1% блоков, которые делает Алиса.
Таким образом, существуют некоторые из основ блочной цепи и консенсуса, и то, что на самом деле
обеспечивает безопасность. Майнеры - это особый тип узлов, которые пытаются конкурировать в
игре по созданию новых блоков, и они вознаграждаются за свои усилия биткоинами. Ожидается, что
узлы будут близки в смысле экономического равновесия расходов, которые они понесут,
относительно оборудования и электричества, и то, что они будут примерно равны по
вознаграждению, которое они получат за создание нового блока и комиссию за транзакцию,
основанную на вознаграждении.
Значение
Положение
Правила
Таким образом, даже то, сколько у конкретного узла биткоинов является субъективным консенсусом.
Когда кто-то говорит, что владеет определенной суммой биткоинов, имеется в виду, что
одноранговая сеть биткоин, путем записи в блочной цепочке всех сумм, относящейся к его адресам,
считает его владельцем определенного количества биткоинов.
Наконец, нужен консенсус относительно правил системы, потому что иногда правила системы
должны меняться.
Предпосылкой для этого является наличие жизнеспособной экосистемы майнинга - это является
обязательным условием безопасности цепи блоков. Когда можно быть уверенными в том, что многие
майнеры будут вкладывать много вычислительной мощности в участие в решении задач? Они
сделают это, только если обменный курс биткоина довольно высок.
Они получают вознаграждение, выраженное в биткоинах, тогда как их расходы рассчитываются
обычно в долларах. Поэтому чем больше будет повышаться ценность валюты биткоин, тем более
стимулируемыми будут майнеры.
Поэтому можно представить себе, что во время создания Биткоина, ни одна из этих трех вещей не
существовала. Когда не было никаких майнеров, кроме самого Накамото или того, кто создал
программное обеспечение для добычи биткоинов. Тогда биткоин не имел большой ценности в
качестве валюты, и блок-цепь была небезопасной, потому что не было много майнинга, и атакующий
мог легко подавить процесс совершения сделки. Как же система пришла к текущему виду? Это
произошло в результате самонастройки – очень сложного процесса взаимодействия всех трех
характеристик, которые необходимы системе биткоинов. Процесс пользовался большим вниманием
со стороны средств массовой информации. И чем больше людей слышат о Биткоине, тем больше они
будут заинтересованы в майнинге. И тем больше уверенности у людей будет в блоковой
безопасности. Поэтому в настоящее время продолжается рост добычи Биткоинов.
И последнее. Для понимания консенсуса и того, за что он несет ответственность и за что не несет,
хороший способ - спросить, что произойдет, если консенсус потерпит неудачу и на самом деле
появится 51% злоумышленников, которые так или иначе, контролируют 51% или более от мощности
добычи в сети Биткоин.
Теперь злоумышленник может притвориться, что это действительная транзакция, и что это -
допустимый блок и продолжать строить этот блок.
Он может даже преуспеть в том, и создать наиболее длинную ветвь. Но другие правильные (честные)
узлы просто не будут принимать этот недопустимый блок и продолжат майнинг на основе
последнего действительного блока, который они обнаружили в сети. Итак, произойдет "вилка" в
цепочке. Теперь пример с точки зрения злоумышленника, пытающегося потратить эти
недействительные монеты и отправить их некоторому купцу, Бобу, и купить что-то взамен. Боб
предположительно будет запускать свой биткоин-узел, и это будет честный узел. И этот узел поймет,
что, хотя это, возможно, самая длинная ветка, но это не допустимая ветка, потому что она содержит
недопустимую транзакцию, так как криптография (подпись) не была проверена.
И поэтому он просто игнорирует эту самую длинную ветку, ведь это недействительная ветка. То есть
неполного консенсуса недостаточно. Необходимо подорвать криптографию, чтобы украсть монеты
из существующего адреса. Таким образом, мы делаем вывод, что это нападение невозможно для
злоумышленников, составляющих 51%.
Также необходимо отметить, что наличие в сети 51% вредоносных узлов было бы замечено
разработчиками. Это вызвало бы изменение правил системы и обновление программного
обеспечения, чтобы нейтрализовать угрозу.
Злоумышленник, который контролирует процесс блочной цепи, может просто отказаться от создания
любых новых блоков, содержащих транзакции с одного из адресов Кэрол, а также отказаться от
использования блоков, содержащих такие транзакции. Однако злоумышленник не может
предотвратить передачу этих транзакций в одноранговую сеть. Поскольку одноранговая сеть не
зависит от цепочки блоков, она не зависит от консенсуса, и злоумышленник не может полностью
контролировать сеть, поэтому транзакции по-прежнему будут искать способ достичь большинства
узлов.
На самом деле, если известно, что существует 51% злоумышленников, даже если злоумышленники
не попытаются запустить какую-либо атаку, потеря доверия может произойти. Таким образом,
можно классифицировать как вероятное, что любой 51%-ный злоумышленник уничтожит доверие к
валюте. И эта последняя угроза на самом деле является основной, если атака 51% злоумышленников
когда-либо материализуется.
Транзакции Биткоина
В первых двух лекциях были рассмотрены основные механизмы, используемые в Биткоине. В этой
лекции будут показаны реальные структуры данных, скрипты и другие подробности реализации этих
механизмов.
Журнал (реестр) в режиме Append-Only предполагает ведение журнала транзакций только в режиме
добавления записи. При этом как только запись сделана, она остается в журнале навсегда. Для
достижения согласованности по поводу истинности журнала используется децентрализованный
протокол и майнеры, которые следуют этому протоколу и утверждают транзакции. Они
подтверждают то, что транзакции правильно сформированы, что нет двойных расходов, и что
Биткоин исправно функционирует, как валюта.
Рис. 3.1. Журнал, основанный на банковском счете (не Биткоин)
Биткоин существует, чтобы мотивировать майнеров добывать биткоин. И чтобы понять этот
механизм, рассмотрим, как происходит транзакция Биткоина.
Возьмем упрощенную модель, где вместо блоков транзакций будут индивидуальные транзакции,
выполненные по одному разу в каждый момент времени. Можно провести аналогию с банковским
счетом ( рис. 3.1). Чтобы переслать Бобу 17 монет, Алиса создает транзакцию и ставит под ней свою
подпись. Информация о сделке сохраняется в журнале.
В качестве подтверждения наличия у Алисы монет, приведена информация о том, что в ходе первой
транзакции Алиса получила 25 монет. После передачи 17 монет Бобу у нее осталось 8 монет.
После того, как Боб получил монеты, он может передать какое-то количество монет Чаку, тот в свою
очередь Алисе и т.д. В результате у Алисы, Боба и Чака будут разные состояния счета.
На рис. 3.1 самая нижняя транзакция – передача Алисой 15 монет Дэвиду. Как можно убедиться, что
у нее есть 15 монет для передачи их Дэвиду?
Чтобы это выяснить, нужно проверить всю цепочку транзакций, связанных с Алисой. Всякий раз,
когда Алиса отправляла или получала монеты, все эти действия нужно обнаружить и затем
выяснить, хватит ли ей тех 15 монет, которые она хочет переслать. Конечно, это можно сделать
несколько эффективнее, например, со структурой данных, которая бы отслеживала каждую
транзакцию Алисы, но это потребует огромных дополнительных расходов памяти, помимо ведения
самого блокчейна.Именно поэтому Биткоин не работает по принципу банковского счета. Вместо
этого, у Биткоина есть журнал с историей транзакций. На рисунке 3.2 изображен журнал транзакций,
похожий на биткоиновский.
Рис. 3.2. Журнал, основанный на транзакциях (Биткоин)
В транзакциях указаны количество вводов и количество выводов. У транзакций также есть свой
уникальный индекс. Начнем с транзакции №1, где ничего не вводится, так как здесь формируется
валюта, и есть один вывод в размере 25 монет, которые переходят к Алисе.
Чтобы передать 17 монет Бобу Алиса должна сослаться на транзакцию, в рамках которой она
получила эти монеты. Таким образом, в качестве ввода для этой транзакции будет транзакция с
индексом 0, которая была предыдущей, где говорится, что Алиса получила 25 монет. У транзакции
будет 2 вывода. Один, в котором пересылается 17 монет Бобу, и второй, где Алиса получает 8 монет.
Для подтверждения транзакции ее подписывает Алиса.
Рассмотрим, зачем Алисе переводить деньги самой себе. Вот она получает 25 монет, которые были
предназначены для неё в первой транзакции, из них лишь 17 штук она пересылает Бобу, и теперь ей
нужно сделать еще один вывод в размере 8 монет самой себе, пусть и под другим индексом, но все-
таки себе.
Эта называется переадресацией. Идея в том, что всегда нужно вывести остаток с предыдущей
транзакции. Нельзя сделать так, что со счета потратилось только 17 монет. Можно сделать лишь так,
что с одного вывода потратятся все 25 монет. Но так как Алиса хочет потратить только 17 монет, она
сделает второй вывод (8 монет) на себя
Помимо этого применяются хеш-указатели. У каждой транзакции есть свой уникальный индекс. Это
просто номер (хеш) блока. И каждая транзакция, по сути, тоже получает свой уникальный индекс,
который является хешем транзакции.
То есть нужно просто пройти на один хеш-указатель вверх и выяснить, достаточно ли денег, чтобы
совершить желаемые выводы в следующей транзакции.
Рис. 3.3. Две подписи
Еще одна вещь, которую можно сделать - слияние значений. Допустим, есть две разные транзакции,
которые переводят деньги Бобу - 17 монет в одной и еще 2 в другой. Боб может сказать: я бы хотел,
чтобы у меня была одна транзакция, которую я мог бы потом израсходовать.
Чтобы это сделать, нужно создать новую транзакцию с двумя вводами и одним выводом, чтобы все
эти деньги ушли Бобу. Аналогичным образом можно выполнять слияние оплат.
Допустим, Кэрол и Боб хотят переслать деньги Дэвиду. Можно создать транзакцию с двумя вводами,
которые совершаются двумя разными людьми и сложить эти значения, тем самым передав Дэвиду
все 8 монет.
Единственная особенность здесь в том, что поскольку эти два вывода производятся двумя разными
людьми, то нам нужны две подписи: одна от Кэрол, вторая - от Боба ( рис. 3.3).
Транзакция состоит из трех частей. Во-первых, это метаданные, затем это серия вводов, и серия
выводов. Начнем с метаданных.
Также имеется подпись scriptSig ( рис. 3.6). Подпись подтверждает вывод из предыдущей
транзакции.
У каждого вывода есть свое значение. Сумма всех выводов должна быть меньше, чем сумма всех
вводов.
В этой структуре есть еще что-то похожее на хеш открытого ключа. Это адрес получателя
конкретного вывода. Структура данных похожа на скрипт и об этом будет рассказано в следующих
лекциях.
Скрипты Биткоина
Каждый вывод в транзакции не только описывает простой открытый ключ, но и объявляет скрипт.
Для чего этот скрипт используется? Рассмотрим, что из себя представляет скриптовый язык
Биткоина, и почему он используется вместо того, чтобы обозначить открытый ключ.
Рис. 3.8. Скрипт в качестве адреса выхода
У скрипта будут 4 инструкции, и что же происходит со скриптом? Кто его запускает? Как скрипт
понимает, кто имеет право на расходование монет? Секрет в том, что адрес ввода - это тоже скрипт.
Это такой вид скрипта, который соединяется со скриптом вывода, они сцеплены вместе и образуют
единый скрипт, который должен успешно запуститься, чтобы получить Биткоины.
Как правило, эти два скрипта называются scriptSig и scriptPublicKey, потому что, в самом простом
случае, скрипт вывода объявляет открытый ключ, а скрипт ввода создает подпись с тем же самым
открытым ключом.
Когда транзакция проходит верификацию, два скрипта соединяют вместе и запускают, и если
получившийся скрипт запускается без ошибок, то транзакция признается действительной.
Рис. 3.10. Скриптовый язык Биткоина («Скрипт»)
У языка, используемого в Биткойн нет точного названия. Его называют просто "Скрипт" или
"скриптовый язык Биткоина", так как он был создан специально для него. Наибольшее влияние на
него оказал язык Forth, это старый и простой язык программирования, основанный на работе стеков,
однако совсем не обязательно знать Forth, чтобы понимать скриптовый язык Биткоина.
Ключи создавались таким образом, чтобы это было что-то простое и компактное, но в то же время,
чтобы его было сложно расшифровать. Поэтому существуют специальные инструкции, чтобы
проводить вычисления хеш-функций и верифицирование подписей.
Также это стековый язык программирования. На следующем рисунке будет показано, почему он так
называется. В языке существует множество ограничений, которые очень важно помнить. В
частности, у скриптового языка Биткоина нет циклов. Каждая инструкция выполняется только один
раз линейным путем. Если посмотреть на скрипт, который состоит из некоторого числа инструкций,
то можно точно сказать, сколько времени потребуется для его запуска и сколько памяти он займет.
Он не способен вычислять бесконечно мощные функции. Это все из-за его внешнего вида, потому
что майнерам нужно запускать скрипты, которые пересылаются рядовыми участниками сети. Само
собой, никто не захочет давать им право переслать скрипт, который будет зациклен или будет
работать бесконечно.
И так как это неполный язык по Тьюрингу, он также не подвержен проблеме остановкиМожно
посмотреть на любой скрипт языка Биткоина и убедиться, что он уничтожится после конечного
числа шагов, которые являются количеством инструкций, содержащихся в скрипте. Рассмотрим
конкретный скрипт Биткоина и то, как именно он выполняется.
Рис. 3.11. Пример исполнения скрипта Биткоина
На рис. 3.11 изображен скрипт, в котором отправитель просто задает открытый ключ получателя, а
получатель монет, чтобы их получить, должен объявить подпись, используя тот же самый открытый
ключ.
Итак, первые две инструкции в скрипте ввода – это просто инструкции для ввода данных в стек. В
стек записывается подпись транзакции и открытый ключ получателя, который может ее проверить.
Исполнение инструкций для данных в стековых языках проводится очень легко. Если есть данные,
то они последовательно заносятся в стек.
Теперь, когда два значения внесены в стек, запускается вторая часть скрипта. Эта часть называется
scriptPubKey.
Дублирущая инструкция OP_DUP гласит: "Возьми значение из верхушки стека, выкинь его, а затем
впиши две его копии обратно в стек." Таким образом открытый ключ получателя продублирован.
Следующая инструкция HASH160 говорит: "Возьми верхнее значение в стеке и вычисли из него
криптографический хеш."
На следующем шаге в стек вносится значение хэша открытого ключа получателя, которое было
рассчитано отправителем.
Теперь на верху стека два значения: хеш открытого ключа, объявленного отправителем, и хеш того
ключа, который использовал получатель, чтобы получить монеты.
Инструкция сравнения поглотит те два элемента данных, которые находились на верху стека. В стеке
остались еще два элемента – подпись и открытый ключ.
На этом этапе уже есть уверенность в том, что ключ, который предоставил получатель, правильный.
Теперь необходимо проверить действительность подписи. Именно здесь проявляется вся мощь
скриптового языка Биткоина. Есть такая инструкция, которая позволяет верифицировать подпись.
Так что написать скрипт, подтверждающий действительность подписи, не подключая при этом ни
одной специальной библиотеки, очень просто. Все эти возможности уже встроены в скриптовом
языке Биткоина.
Единственное, что можно подписать в Биткоине - это весь процесс транзакции. Инструкция checkSig
подтверждает, что вся транзакция была успешно подписана.
Всего за один заход инструкция checkSig вынесет из стека два оставшихся элемента, и проверит
действительность подписи. После выполнения всех инструкций в скрипте, в стеке больше нет
данных, и не появилось ни одной ошибки, выводом скрипта будет простое "Да". Итак, у любого
скрипта Биткоина существует два исхода: он может выполниться без ошибок, в таком случае
транзакция будет действительной. Если при выполнении скрипта обнаружится ошибка, вся
транзакция будет признана недействительной, и она не будет включена в блокчейн.
Арифметические
Условные (If/then)
Условные (If/then)
Крипта!
o Хеши
o Проверка подписи
o Проверка множественных подписей
Рассмотрим скриптовый язык Биткоина. Он очень маленький, в нем всего 256 инструкций, потому
что каждой из них выделяется по одному байту памяти. Из них 15 инструкций нерабочие, и
воспользоваться ими никак нельзя. Еще 75 находятся в резерве - в них пока нет особой
необходимости. Но в будущем их могут сделать основными. Из основных же инструкций
присутствуют такие, которые встречаются в любом языке программирования - основы арифметики,
логики, конструкции "If-then". Вбрасывание и не-вбрасывание ошибок, ранние выходы.
Также, как упоминалось выше, в нем присутствуют криптоинструкции. Это и хеш-функции, это и
инструкции для верификации подписей, и одна особая, крайне важная инструкция для верификации
множества подписей. Она называется CHECKMULTISIG. Это более мощная инструкция, чем та, что
проверяет единичную подпись. С помощью нее Биткоин позволяет проверить множество подписей
одной инструкцией.
OP_CHECKMULTISIG
При помощи MULTISIG объявляется N открытых ключей и параметр T (т.н. "порог"). Чтобы эта
инструкция сработала нормально, необходимо, чтобы было T подписей и T из N действительных
открытых ключей.
У функции есть один важный баг. Это недоработка, которая существует уже давно, она заключается
в том, что в первоначальной инструкции, а именно CHECKMULTISIG выкидывается из стека и
игнорируется лишняя единица данных. Это одна из причуд языка Биткоина. С ней можно
справиться, если при программировании добавить в стек дополнительную дамми-переменную. В
данном случае баг было решено признать особенностью Биткоина и не пытаться его удалить.
Исправлять эту ошибку дороже, чем тот ущерб, что она может нанести, так что теперь это просто
забавный баг, с которым старается уживаться каждый член Биткоиновского сообщества.
Как уже отмечалось выше, скриптовый язык был использован для того, чтобы можно было
описывать, в произвольные условия, которые должны были сцепляться, чтобы получить право на
расходование монет.
Первый - для того, чтобы вписать произвольные данные в блокчейн. Кто-то может захотеть вписать в
блокчейн свое имя, или момент времени, чтобы доказать, что он знал что-то в определенный момент.
Для этого нужно создать маленькую сжигаемую Биткоин-транзакцию. То есть, можно уничтожить
небольшое количество валюты в обмен на то, чтобы написать что-то в блокчейн навсегда.
Например, покупатель хочет заказать что-то в интернет-магазине. Он оформил заказ, готов его
оплатить и спрашивает у продавца адрес, куда ему следует направить монеты. Продавец в ответ
говорит: " Мы используем MULTISIG, поэтому мы хотим, что вы добавили скрипт,
подтверждающий оплату от 2 из 3 бухгалтеров. Не ошибитесь в деталях. "
Покупатель может сказать, что не знает, как это сделать. Он просто хочет переслать монеты на
конкретный адрес. Для этого в Биткоине существует особая хитрость, которая позволяет вместо
описания целого скрипта указать хеш скрипта, который понадобится для пересылки денег.
Рис. 3.13. Использование хеша скрипта
На рис. 3.13 отправитель описывает очень простой скрипт, который хеширует верхнее значение в
стеке и проверяет, соответствует ли он требуемому скрипту оплаты.
Это и называется оплата по хэшу скрипта (P2SH) в Биткоине , который выступает как альтернатива
обычному режиму оплаты через открытый ключ. Механизм оплаты по хешу достаточно сложен и не
был указан в оригинальной спецификации. Он был добавлен в биткоин позднее.
Схема P2SH избавляет отправителя от лишних хлопот, и получателю нужно будет всего лишь
указать хеш отправки монет отправителем. Это повышает эффективность системы, поскольку
майнерам важно отслеживать те выводные скрипты, которые еще не были исполнены. Сейчас,
благодаря P2SH, скрипты вывода стали крайне малы. Это все потому, что они только указывают хеш,
а вся сложность смещена в скрипты ввода.
Замена простого указания открытых ключей скриптами имеет множество практических применений,
о которых будет рассказано далее. Одно из них - это транзакция под условия.
Рассмотрим классическую ситуацию с онлайн-оплатой. Алиса и Боб хотят заключить между собой
сделку, скорее всего, Алиса выиграла какой-нибудь онлайн-аукцион и теперь хочет что-то купить у
Боба.
Рис. 3.14. Условные транзакции (залог)
И вот Алиса хочет заплатить Бобу биткионами, а Боб в обмен отправил бы Алисе какой-то
материальный товар. Но проблема в том, что Алиса не хочет платить, пока не получит товар, а Боб
не хочет посылать товар, пока он не будет оплачен.
У Биткоина на этот случай есть отличное решение, которое очень часто используется на практике.
Это - привлечь третью сторону и совершить условную транзакцию.
Пусть этими тремя людьми будут Алиса, Боб и Джуди, которая будет в роли судьи и вступит в
переговоры в случае спора. Итак, Алиса создаст транзакцию с нужной суммой. Причем с двумя из
трех действительных подписей между Алисой, Бобом и Джуди. Элис подписывает транзакцию для
пересылки Биткоинов, которыми она владеет, и это опубликуется в блокчейне. В этот момент эти
деньги для Алисы, Боба и Джуди будут находиться в состоянии залога. И любой из двоих
подписавших могут указать, куда эти деньги нужно переслать.
Боб будет убежден, что он может со спокойной душой отправлять товар Алисе. И тогда он отправит
их в материальном виде по почте или посылкой.
Теперь останется надеяться на то, что в реальной жизни Алиса и Боб - честные люди.
В таком случае товар придет вовремя и он будет удовлетворять потребностям Алисы, и тогда она
перешлет заложенные деньги Бобу, и он получит право на их личное расходование.
Если это произойдет, Алиса и Боб смогут подписать транзакцию, выпускающую деньги из-под
залога и пересылающую их Бобу. И самое приятное в этом то, что Джуди не пришлось вмешиваться.
Спора не случилось. И таким образом, Алиса и Боб сработались, и подтверждение тому - два
ключевых человека, подписавших MULTISIG-транзакцию, вместо трех.
Что бы случилось, если бы Боб не отправил товар? Или если бы он его отправил, но он потерялся на
почте? Или если бы он отправил не тот размер?
Алиса не захочет платить Бобу, потому что она решит, что он ее обманул, и она захочет вернуть
деньги назад.
В таком случае, они не подпишут совместную транзакцию, которая бы отправила деньги Бобу. Но
также Боб не подпишет транзакцию, которая отправляет деньги назад к Алисе, поскольку будет
отрицать обвинения Алисы о своем мошенничестве.
На этом этапе привлекается Джуди. Именно Джуди предстоит рассудить, кто из этих двоих честный,
а кто не заслуживает получить деньги.
И если Джуди решит, что обманщик - Боб, то она решит подписать транзакцию совместно с Алисой,
чтобы вернуть ей её деньги. То есть Алиса и Джуди сработаются, будут подписаны две ключевые
подписи, и Алиса получит деньги назад.
Конечно же, у Джуди есть право пойти по другому пути. Если она решит, что виновата Алиса, что
она отказывается платить положенную ей сумму, Джуди подпишет транзакцию, пересылающую
деньги Бобу.
То есть, у Джуди появляется полное право действий, но самое хорошее здесь в том, что пока не
откроется спор, ей не придется вступать в него.
Проблема: Элис хочет заплатить Бобу. Боб не хочет ждать 6 подтверждений об отсутствии двойных
затрат, или не находится в сети.–Еще один способ использования скриптов - "зеленые адреса".
Допустим, Алиса хочет отправить Бобу деньги, а его нет в сети. То есть, Боб не сможет войти в
блокчейн и проверить, не приходили ли от Алисы какие-либо транзакции. Может быть, у Боба
просто нет времени зайти в блокчейн и подождать подтверждения транзакции ( рис. 3.15).
Чтобы транзакция была прикреплена шестью блоками в блокчейне, потребуется примерно час.
Или у Боба просто нет возможности подключиться к Интернету и проверить блокчейн. В качестве
примера может выступить такой случай, что Боб - это простой уличный торговец. Чтобы можно
было переслать Биткоины, несмотря на неспособность получателя проверить блокчейн, нужно снова
привлекать третью сторону, коей в данном случае окажется банк.
Алиса соединяется со своим Банком и говорит: "Здравствуйте, это Алиса, я ваш постоянный клиент.
Вот мое удостоверение личности. Мне нужно переслать деньги Бобу, вы можете мне помочь?"
И в Банке ей говорят: "Конечно, сейчас мы снимем часть денег с вашего счета и выполним
транзакцию через один из наших зеленых адресов напрямую к Бобу."
Обратите внимание, что деньги пришли из Банка прямо к Бобу. Часть этих денег в виде
переадресации, возможно, перейдет обратно в Банк.
По сути, Банк пересылает Бобу деньги через адрес, подконтрольный Банку. Такие адреса дают
гарантию того, что не случится двойной переплаты. Так что, как только Боб увидит, что транзакция
подписана Банком, и если он поверит гарантии Банка об отсутствии двойной переплаты, он сможет
подтвердить то, что он получил деньги, как только об этом будет сообщено в блокчейне. Заметьте,
что эта гарантия была предоставлена не Биткоином, а реальным объектом, и Бобу нужно будет
поверить в то, что Банк знает свое дело и заботится о своей репутации, и поэтому не будет требовать
двойной переплаты.
Банк также сможет сказать: "Вы можете посмотреть на мою историю и убедиться, что этот зеленый
адрес используется уже давно, и двойных трат не было еще ни разу. Поэтому вряд ли это когда-то
случится в будущем".
Само собой, если Банк хоть раз совершит двойную трату, то доверие к нему обрушится почти
мгновенно.
Проблема: Алиса хочет оплатить Бобу каждую минуту услуги. Она не хочет создавать новые
транзакции ежеминутно.
Третий пример - это способ эффективного проведения микротранзакций. Алиса покупатель, который
хочет оплатить Бобу какую-то недорогостоящую услугу.
Может быть, в данном случае, Боб работает консультантом, и Алиса платит небольшую сумму денег
за каждую минуту разговора по телефону.
Если создавать транзакции за каждую минуту разговора, их будет слишком много. За них будет
запрошено много пошлин, и никто не будет этому рад. И если разговор Алисы с консультантом
займет 2 часа, то потребуется 120 транзакций.
Теперь, после каждой минуты разговора, или при первой же необходимости у Алисы совершить
микротранзакцию, она подписывает транзакцию, которая расходует те монеты, которые были
отправлены на MULTISIG-адрес, посылая одну монету Бобу, и возвращая остаток назад к Алисе.
Алиса будет совершать транзакции каждую минуту, которую она тратит на консультацию с Бобом.
Обратите внимание на то, что транзакции в блокчейне не публикуются. Они просто совершаются
между Алисой и Бобом.
В определенный момент Алиса решит завершить консультацию. Тогда она скажет Бобу: "Все,
завершаем разговор, я не хочу платить еще больше." А Боб скажет: "Хорошо, тогда я отключаюсь. Я
возьму последнюю проведенную вами транзакцию, подпишу ее и опубликую в блокчейне."
Итак, поскольку каждая транзакция пополняла Бобу счет, а Алисе наоборот, понижала, то какой бы
ни была последняя пересылка, Боб все же решит ее подтвердить, таким образом получив свою
оплату за предоставленные услуги, и вернув разницу обратно на счет к Алисе.
Что еще хорошо, так это то, что все транзакции, которые Алиса подписала до нее, не будут вписаны
в блокчейн, Бобу не нужно их подписывать, и поэтому они будут стерты.
Технически все эти транзакции будут считаться двойной тратой, в отличие от случая с зелеными
адресами. Тем не менее, в реальной жизни, если обе стороны взаимодействуют исправно, Боб не
будет подписывать ни одной транзакции, кроме последней, и по этой причине блокчейн не увидит
намерения совершить двойную трату.
Что произойдет, если Боб так и не подпишет последнюю транзакцию (рис.3.18)? Вдруг он скажет:
"Меня устраивает тот факт, что заложенные деньги так и останутся под залогом навсегда." В таком
случае, деньги пересланы ему не будут, но Алиса потеряет все, что она вложила в самом начале. Для
этого был придуман таймер (Lock_Time).
Чтобы избежать подобной проблемы, Элис и Боб предварительно подписывают транзакцию, которая
пересылает все деньги обратно к Элис, но которые остаются недоступными до определенного
момента времени.
То есть, до того, как Элис подпишет первую транзакцию об оплате первой минуты консультации,
возможно, она захочет создать возвратную сделку, чтобы деньги остались у нее. Она захочет быть
уверена, что если в указанный момент времени t Боб не подпишет любую из посланных Элис
транзакций, то она сможет опубликовать свою транзакцию, и она вернет себе обратно все деньги.
Рис. 3.19. Блокирующий индекс, или отметка реального времени, до которого транзакция не может быть
опубликована
Если еще раз посмотреть на метаданные в транзакции Биткоина, то можно понять, что речь идет о
параметре "lock_time".
Если в этом параметре опубликовать отличный от нуля момент времени, майнеры не будут
публиковать транзакцию до наступления этого момента. Транзакция будет считаться
недействительной и не будет публиковаться, пока в блоке будет содержаться особый номер
блокировки или момент времени, подкрепленный конкретной точкой отсчета.
Таким образом можно подготовить транзакцию, которая может быть совершена в будущем лишь в
том случае, если в этом будущем не случится что-то еще. То есть если Боб не подпишет последнюю
транзакцию, деньги вернутся к Алисе.
В этой лекции было рассмотрено три способа применения скриптов. Существуют и другие способы.
Один из них - многопользовательские лотереи, которые содержат в себе очень сложный,
многоступенчатый протокол, с множеством транзакций и кучей сделок с указанными моментами
времени. Все они являются залогами, создаваемыми на случай мошенничества.
С помощью скриптов можно заплатить кому-то, кто знает прообраз хеша и заставить его работать на
себя. Есть еще пара отличных протоколов, которые позволяют разным людям перемешивать между
собой свои биткоины, чтобы в дальнейшем невозможно было определить, кто каким биткоином
владеет. Эти протоколы будут рассмотрены в лекции про анонимность.
Общий термин для подобных контрактов - "смарт-контракты", это означает, что такие контракты
осуществляют технический контроль того, что обычно контролируется законами или арбитражными
судами.
Блоки Биткоина
На это есть несколько причин. Первая причина - благодаря этому для майнеров создается хороший,
одиночный рабочий юнит, который по своему размеру превышает индивидуальные сделки. Если бы
майнерам пришлось обрабатывать, хешировать и добавлять метаданные в каждую сделку системы,
то нагрузка на них была бы чрезмерной. Во-вторых, это делает хеш-цепочку блоков короче, потому
что нужен всего один блок для огромного числа сделок. Все это упрощает верификацию структуры
данных блокчейна.
Каждый блок содержит дерево сделок в виде дерева Меркла. Дерево связывает все транзакции в
блоке довольно эффективным способом. Таким образом, становится легко провести
увеличивающийся логарифмически путь по дереву, и тем самым доказать, что транзакции включены
в особый блок.
Заголовок блока содержит в себе все метаданные о данном блоке. Далее идут сделки,
сформированные по принципу дерева Меркла. В целом, это большой список сделок, чьи хеши
аккуратно разложены в структуре дерева, что дает возможность эффективно показать, какие сделки
включены в данный блок.
В дереве Меркла существует особая транзакция – транзакция монетной базы. Именно она создает
новые биткоины ( рис. 3.22). В предыдущей лекции мы говорили о вознаграждении за создание
блока, которое на текущий момент равно 25 биткоинам (block reward). Это горизонтальная награда
майнинга, которая задается системой и держится в течение 4 лет. В действительности, она всегда
будет чуть больше 25 Биткоинов, поскольку она включает в себя также пошлины за сделки, когда-
либо собранные с каждой сделки, включенной в блок (transaction fees). Указатель на транзакцию
вывода в сделке с монетной базой всегда будет нулевым.. Это как бы говорит, что поскольку здесь
создаются новые Биткоины, то этому процессу ничего не предшествует. Не существует предыдущей
транзакции, которая была совершена, чтобы создать эти монеты. У сделки с монетной базой есть
интересный параметр, в который можно списать всё, что угодно. В самом первом блоке, когда ли
добытом в Биткоине, в этом параметре содержалась цитата из газеты. Эта цитата была из "The Times
of London", и в ней рассказывалась история про канцлера, спасавшего банки, что было с одной
стороны политическим комментарием, объяснявшем мотивацию появления Биткоина, и с другой
стороны, данью уважения Биткоину, так как его самый первый блок был добыт вскоре после выхода
выпуска этой газеты.
Но с тех пор майнеры получили право писать в параметры сделки с базой все, что им хочется.
Произвольный параметр используется, чтобы написать там что-то для себя или чтобы попросить
помощи у других майнеров разобраться в новых особенностях, и ограничений для майнеров здесь
нет.
Лучший способ изучить структуру блока биткоина – увидеть его своими глазами. Существует
множество сайтов, делающих эти данные доступными: можно посмотреть на графы сделок, увидеть,
какие транзакции исполняются за счёт других транзакций. Посмотреть на сделки со сложными
скриптами, на блочную структуру и увидеть, как одни блоки ссылаются на другие. Все это доступно
онлайн, потому что Биткоин - это открытая структура данных.
Сеть Биткоина
Сеть Биткоина - это пиринговая сеть, и, как следствие, она наследует множество идей от других
пиринговых сетей, которые применялись для различных целей. В пиринговой сети все узлы равны
-нет иерархии, централизации, специальных узлов или мастер-узлов. Каждый узел в Биткоине
равноправен по отношению к другому.
Он работает через TCP-протокол, имеет случайную топологию, это значит, что одни случайные узлы
тождественны к другим случайным узлам.
Новые узлы могут появляться в любой момент. Любой человек может загрузить Биткоин-клиент,
представить свой компьютер в роли узла и стать одним из узлов, с теми же правами и
возможностями, что и другие узлы в сети Биткоина.
Сеть очень динамична. Узлы появляются и исчезают постоянно. Хоть и не существует явного
способа покинуть сеть, вместо этого, если от узла не поступает никаких сигналов в течение, как
правило, 3 часов, которые вшиты в каждый клиент, о нем начинают забывать другие участники сети.
Таким элегантным способом узел отключается от сети.
Означает ли все это, что к пиринговой сети Биткоина можно присоединяться в любое время?
На рис. 3.24 изображена сеть в определенный момент времени, немного уменьшенная в масштабах,
всего с семью узлами. У каждого узла есть свои случайные связи. Номера узлов разбросаны, потому
что нет географической топологии. Сеть соединяет другие узлы в случайном порядке по мере их
появления.
Для присоединения нового узла к сети, необходимо обратиться на адрес конкретного узла, который
уже в сети. Такой узел называется сидом. Существует несколько способов посмотреть списки сидов,
к которым можно присоединиться.
После нахождения сида (на рисунке это узел с номером 5), новый узел посылает ему специальное
сообщение с просьбой сообщить адреса узлов сети, которые ему известны ( рис. 3.25).
Далее новый узел пробует соединиться у узлами 1 и 7 и говорит им: "Привет. Сообщите мне о тех
участниках сети, о которых вы знаете". И они также пошлют ему узлы, о которых знают сами, и эти
шаги повторяются столько раз, сколько захочет новый узел, пока не получит список пиров, к
которым можно подсоединиться.
Рис. 3.27. Ответы других узлов сети
Затем новый узел выбирает один из пиров, после чего становится функциональным членом сети
Биткоина.
В рассмотренном процессе много случайных факторов. Набор узлов, к которым в итоге будет
присоединен новый участник, зависит от узла-сидера и от того, с каким из его пиров контактировал
новый узел.
Рассмотрим, как происходит публикация информации о сделке в сети. Для сообщения всей сети об
осуществленной сделке используется простой алгоритм-заливка.
Допустим, узел 4 узнал о новой транзакции, где Алиса хочет прислать Бобу деньги: Алиса создает
Биткоиновую сделку и посылает ее на 4 узел. Может быть так, что ее электронный кошелек или
обменное ПО действует по своему усмотрению, но тем не менее, транзакция каким-то образом
приходит на 4 узел. Теперь этот узел говорит: "Ага, у меня новая сделка: Алиса хочет заплатить
Бобу. Давайте сообщим всем об этом". Это называется gossip-протокол (протокол сплетен). В
протоколе действует принцип человеческих сплетен – если у узла есть информация, которой он
хочет поделиться со всей сетью, он сообщает ее как можно большему числу узлов и те , в свою
очередь, транслируют ее дальше в сеть. В рассматриваемом примере узел 4 обратится к своим
соседям - узлам 2 и 3. Он им сообщит: "Эй, взгляните на эту сделку. Алиса хочет заплатить Бобу".
Эти узлы тоже добавят ее в свой пул ожидающих сделок, так как каждый узел содержит в себе
список сделок, о которых он слышал, но которые еще не были внесены в блокчейн. И потом узлы
могут решить продвинуть свои сделки к следующим узлам. Итак, узел 3 контактирует с соседями и
говорит: "У меня для вас новая сделка. Алиса хочет заплатить Бобу".
Она так же окажется у них в пуле, и так далее. Необходимо, чтобы у этого процесса был конец.
Пусть будет так, что узел 2 активируется и попытается сообщить узлу 7: "Эй, тут новая сделка.
Алиса хочет заплатить Бобу".
И тогда узел 7 ответит: "Все в порядке, узел 2, я уже об этом слышал, она у меня в памяти. Мне уже
не нужно ее продвигать". Итак, в конце концов, этот процесс когда-то остановится, потому что
каждый узел будет знать об этой новой сделке, и им больше не нужно о нем сообщать. Каждая
транзакция помечается уникальным хешем, следовательно, каждый узел сможет сообщить, что уже
видел этот хеш, и что его уже не нужно больше никому не передавать, чтобы он не циклился в сети
бесконечно.
Как же узлы решают, сообщать о поступлении новой сделки или нет? Самое главное, что они делают
- они проверяют, в соответствии с их видением блокчейна, действительна ли это сделка, или нет. То
есть, они выполняют проверку подлинности транзакции. Они запускают скрипт и видят, что он
заработал. Затем они видят, что те деньги, которые планируются к пересылке, еще не были
потрачены. И если все проверки будут пройдены, то сделка будет считаться действительной, и ее, с
незначительными возражениями, будет решено распространить по сети. По умолчанию, узлы не
транслируют сделки, у которых нестандартные скрипты. Если скрипт имеет какие-нибудь странные
особенности, если они хоть немного не совпадают со стандартным списком скриптов, которые
знакомы узлам, и даже если транзакция будет считать действительной, узлы ее передавать не будут.
Они поведут себя так, как будто никогда не слышали об этой транзакции. Это происходит с целью
избежать бесконечного зацикливания. Еще одно причина, по которой сделка не будет
транслироваться - это подозрение на двойную трату.
Получается, если узлы узнают о транзакции, где Алиса пытается переслать некую сумму денег Бобу,
а затем обнаружат еще одну сделку, в которой Алиса попытать переслать ту же сумму Чарли, то
узлы не будут сообщать о второй сделке. Несмотря на то, что сделка может быть подлинной, из-за
того, что эти монеты до сих пор не были потрачены, о них будет сообщено только в первом случае.
Это дополнительная защита от двойных затрат. Но также важно помнить, что эти проверки нацелены
на проверку отсутствия ошибок.
Вообще, все качественные узлы содержат в себе программы проверки с целью сохранить
целостность и сохранность всей сети, однако не существует такого правила, что все узлы обязаны
следовать этим указаниям. Поскольку сеть - пиринговая, и каждый может к ней присоединиться,
всегда остается вероятность того, что узел не последует протоколу. Он будет транслировать двойные
затраты, нестандартные и недействительные транзакции. Поэтому важно, чтобы каждый узел
проверял себя. Возможно и такое, что у узлов будет различное представление об ожидающей
транзакции, все зависит от того, что они обнаружили. Давайте вернемся к примеру, где узел 4
транслировал сделку, в которой Алиса планирует отправить Бобу монеты, и представим, что сделка
не разошлась по всей сети. И перед тем, как она разойдется, узел 1 сообщит о новой сделке и скажет:
"Эй, я только что узнал, что Алиса хочет заплатить деньги Чарли". С точки зрения узла 1 это
действительная транзакция, ведь он не видел другой транзакции, в которой Алиса платит Бобу.
Рис. 3.29. Сделки, содержащиеся в узлах, могут отличаться
Итак, узел 1 совершит протокол нормально, и теперь он сообщит о сделке своим соседям.
Соседи, которые еще не узнали об этих конфликтных сделках, так же добавят их к себе в пул.
В свою очередь, другие соседи, такие как узел 6 из примера, уже знают о сделке между Алисой и
Бобом. Поэтому, узел 6 сообщит: "Я не хочу хранить в себе две конфликтные сделки, я оставлю себе
ту, что у меня уже есть".
Здесь сеть может оказаться в раздвоенном положении, ведь у разных узлов будет разное состояние
пулов сделок. Эти сделки еще не вошли в блокчейн, так что это состояние узлов, когда они не знают,
какую следующую сделку поместить в блок, временно.
Если у узлов различаются списки ожидающих транзакций, или они видят разные блоки, принятые в
блокчейн, - во временном состоянии это нормально. В определенный момент, они все
рассортируются.
В случае с теми сделками, где у разных узлов разные представления отложенных сделок, то в
зависимости от того, кто будет добавлять следующий блок, тот в конечном итоге и разорвет
состояние гонки и решит, которая из двух сделок будет окончательно помещена в блок. И как только
одна из двух транзакций будет помещена в блок, другие узлы заметят, что сделка, которая находится
у них в состоянии ожидания, уже не будет помещена в блок, потому что это будет считаться двойной
тратой, и тогда они ее удалят.
Итак, если та сделка, где Алиса платит Бобу, успешно попадает в блок первой, то те узлы, которые
слышали о сделке между Алисой и Чарли, скажут: "Моя транзакция больше не действительна, я могу
о ней забыть". То есть, стандартное поведение узлов таково, что они воспринимают то, что они
услышали в первую очередь,
Это значит, что положение узла в сети имеет значение. Если две конфликтные сделки будут
объявлены в разных точках сети, они обе начнут транслироваться в разных направлениях. И те узлы,
которые узнают о той или о другой транзакции, будут зависимы от того, какая часть пространства
сети, с которой они начали, находится ближе всего.
Необходимо учитывать, что майнеры могут строить свою логику, определяя, от каких узлов они
хотели бы получать информацию в первую очередь. В лекции про майнинг будет более подробно
описано, зачем майнеры внедряют логику, отличную от стандартной.
Логика, объявляющая о новых блоках, которые находят майнеры, почти аналогична логике
объявления новой транзакции. Используется всё тот же алгоритм-заливка и тот же gossip-процесс. И
в данном случае, вместо того, чтобы подтверждать действительность сделки запуском скрипта, узлы
подтвердят подлинность нового блока вычислением его хеша. Также они убедятся, что хеш блока
начинается с внушительного количества нулей, чтобы оценить сложность цели.
Валидация блока более сложная, так как в этом случае проверяется также и заголовок. И лишь после
проверки хеша заголовка, узлы проверят действительность каждой сделки в этом блоке, чтобы
убедиться, что блок содержит только подлинные сделки.
Это помогает избежать построения вилок. Узлы могут по своему желанию внедрять в себя
различные логики. Они могут транслировать недействительные сделки, или даже те сделки, которые
не дошли до конца самой длинной цепочки блокчейна. То есть, некоторые узлы могут пытаться
продвинуть такой блок, который не дошел до конца цепочки, и из-за этого образуется так
называемая вилка. И в этом нет ничего страшного, протокол способен с этим справиться. Все же, как
долго по времени будет длиться этот плавающий алгоритм? Много ли наложится задержек?
На рис. 3.30 изображен граф, отражающий среднее время продвижения новых блоков в каждом узле
сети Здесь три линии, показывающие 25-ю, 50-ю и 75-ю перцентиль длительности достижения
блоком каждого нового узла. Если посмотреть на 75-ю перцентиль, то можно обнаружить, что для
больших блоков среднее время продвижения составляет примерно 30 секунд.
Причина такой большой задержки в том, то этот протокол не очень эффективный. Он и не создавался
эффективным. Он был создан быть простым и бесструктурным, чтобы каждый узел оставался
равноправным и мог входить и выходить в любое время.
Блоку может потребоваться пройти через множество узлов, прежде чем достигнуть самых дальних
узлов сети. Чтобы сеть была более эффективной, необходимо обеспечить максимально короткие
пути между узлами. Для Биткоина же важнее наличие децентрализованной структуры, где все узлы
равны, невзирая на то, что из-за этого продвижение блока может занимать 30 секунд. Итак,
насколько велика сеть Биткоина? На самом деле, подробной статистики просто нет, потому что нет
централизации и какого-либо органа, который бы вел официальную статистику. Известно лишь то,
что сеть состоит из узлов, количество которых постоянно меняется Тем не менее многие
исследователи попытались сделать приближенную оценку.
Исходя из наиболее благоприятного сценария, исследователи заявили, в месяц свыше 1 миллиона IP-
адресов могут запускать протокол Биткоина и быть, по крайней мере, временно активными в роли
узлов.
Но если оценить количество полных узлов, которые подключены постоянно и полностью проверяют
каждую полученную, их наберется от 5 до 10 тысяч штук, что является крайне маленьким числом.
По факту, это число может быть и меньше. Пока нет доказательств того, что число полностью
проверенных узлов растет. От этого растет и беспокойство по поводу того, что число таких узлов
сокращается.
Чтобы узел стал полностью проверенным, его нужно оставлять всегда подключенным, чтобы
получать информацию обо всех данных. Чем дольше узел будет в оффлайне, тем дольше ему
придется наверстывать, чтобы узнать обо всех пропущенных сделках. И ему придется полностью
заполнять блокчейн.
Узлу также нужно иметь хорошее Интернет-соединение, чтобы он мог вовремя узнавать о новой
сделке и продвигать ее своим пирам.
Для того чтобы стать полностью проверенным узлом достаточно иметь компьютер, которому
несколько лет, с хорошим Интернет-соединением. Полностью проверенные узлы сопровождают весь
набор неизрасходованных выходных транзакций.
В идеале эти транзакции хранить в ОЗУ. Это позволит проверить новую транзакцию очень быстро.
Каждый раз когда полный узел узнает о новой транзакции, он запускает исполняющий скрипт и
убеждается в том, что она действительна. На текущий момент достаточно 1 ГБ ОЗУ для
формирования эффективной структуры данных.
В противовес полностью проверенным узлам, существуют легковесные узлы, которые еще называют
"тонкие клиенты" или "клиенты с простой верификацией оплаты".
Среди всех узлов в сети Биткоина, таких узлов - подавляющее большинство, и отличаются они тем,
что эти узлы не стараются вместить в себя весь блокчейн.
Они хранят только те части, которые им нужны для подтверждения только важных им конкретных
сделок.
Например, есть электронный кошелек, который необходимо использовать как клиента с простой
верификацией оплаты. Тогда, если кто-то перешлет на этот кошелек деньги, необходимо действовать
как простой узел. Загрузить те биты блокчейна, которые будут необходимы, чтобы подтвердить,
конкретную транзакцию и включить ее в блокчейн. При этом простой узел не беспокоится о тысячах
других транзакций, которые не оказывают на него влияния.
Итак, клиенту с простой верификацией оплаты нет необходимости иметь такой же уровень
безопасности, как у полностью проверенного узла.
Все потому, что когда такие узлы узнают о новом блоке, единственное, что они могут проверить -
это его заголовок. Они могут проверить и то, насколько сложно было добыть этот блок, но они не
сумеют проверить подлинность каждой транзакции в этом блоке, так как у этих узлов нет
информации о предыдущих блоках в блокчейне. Они не владеют знаниями обо всех остальных
выходных транзакциях. Они могут проверять только те транзакции, которые непосредственно на них
влияют, поэтому они доверяют подобные сделки полностью проверенным узлам, которые
расположены еще дальше
Таким образом, если у клиента простая верификация оплаты, то происходит значительная экономия
затрат.
Когда хранятся только заголовки блоков вместо всех предыдущих транзакций, то затраты
уменьшаются примерно в 1000 раз, и вместо хранения 20ГБ памяти, хранится всего лишь 20МБ.
Такой объем может хранить почти каждый на своем компьютере, или даже на телефоне, действуя
таким образом, как ограниченный узел сети Биткоина.
Ограничения и улучшения
В качестве примера:
Проблема Биткоина в том, что он не был идеально спроектирован с самого начала. И исправить это
теперь сложно. Ограничение пропускной способности Биткоина исходит от жестко закодированного
предела на размер блоков. Каждый блок ограничен одним миллионом байтов.
И каждая транзакция должна иметь размер, по меньшей мере, в 250 байтов, то есть если разделить
эти значения и принять во внимание, что каждый блок находится в течение 10 минут, то в результате
получится 7 транзакций в секунду - такова пропускная способность сети Биткоина.
Для сравнения приведем платежную систему Visa, которая по оценкам совершает около 2000
транзакций в секунду по всему миру. А в самые загруженные дни, такие как суббота перед
Рождеством, это число может увеличиваться до 10 000 транзакций в секунду. Другие платежные
системы примерно так же продуктивны. Например, PayPal пропускает через себя около 1000
транзакций в секунду, что в разы превышает пропускную способность Биткоина.
Еще одно ограничение - криптография Биткоина не меняется. Она содержит лишь пару хеш-
алгоритмов и только один алгоритм подписи, - отдельный тип эллиптической кривой SecP256.
Фактически для любого алгоритма подписи и хеш-функции всегда есть вероятность взлома.
Рис. 3.31. Твердовилочные изменения в Биткоине
Что будет, если какую-то из указанных проблем исправить в новой версии программного
обеспечения? Тогда всем узлам необходимо будет обновиться. Этот процесс называется
"твердовилочное изменение" ( рис. 3.31).
На практике, ошибочным будет считать, что обновится каждый узел. Некоторые узлы сети не смогут
перейти на новое ПО или сделают это с опозданием. Давайте посмотрим на сеть, где большая часть
узлов обновилась, а малая часть - нет. И вот, один из обновленных блоков говорит: "Смотрите, я
нашел этот большой, изящный новый блок. Может быть, одна из его транзакций содержит новый
ЭЦП-алгоритм, который мы недавно добавили в Биткоин". Пусть его нашел блок 4, и вот он говорит:
"Окей, сейчас я обновлюсь и объявлю, что это самый свежий блок. Индекс блока - 24, остальная сеть
знает лишь о 23-ем. Но я сейчас продвину свой блок остальным пирам, использовав стандартный
алгоритм-заливку".
В свою очередь, узел 2 сообщит: "Это безумие, у вас есть какой-то код операции, который у меня
отключен или зарезервирован, я вынужден отвергнуть этот блок, я его не понимаю, я не могу его
принять".
Аналогично с узлом 6, он так же даст отказ, сообщив, что он тоже не может принять этот блок.
И теперь новые узлы имеют единую картину о состоянии блокчейна (с последним блоком 24), а
старые узлы отказались принять последний блок (у них последний блок 23). В итоге, новые узлы
продолжат работу с новым представлением о блокчейне, включая блок со своей новой
особенностью, а старые узлы застрянут в старой версии блокчейна и, к сожалению, уже не смогут
наверстать упущенное, потому что пока они не обновят свое ПО, они продолжат отвергать все те
блоки, которые будут передавать им обновленные узлы с новыми версиями протоколов.
Причиной тому, почему это называется "твердой вилкой", является то, что блокчейн будет разделен,
и узлы в сети будут находиться по разные стороны, в зависимости от имеющейся у них версии
протокола, и в таком случае, они уже никогда не сработаются. Сообщество посчитало неприемлемым
отключать от сети Биткоина те узлы, которые не обновляют свое ПО.
"Мягкие вилки"
Наблюдение: можно добавить новые возможности, которые только ограничат количество подлинных
транзакций
Для контраста, существует также подход с названием "мягкая вилка". Он позволяет добавлять новые
особенности в протокол Биткоина, но лишь в том случае, если это ограничивает набор валидных
сделок или набор валидных блоков.
При использовании "мягкой вилки" есть вероятность того, что старые узлы будут майнить
недействительный блок, потому что он будет вмещать в себя сделку, которая когда-то считалась
валидной, но теперь, согласно новым, более строгим правилам, она больше таковой не является. В
определенный момент старые узлы поймут, что блок с их сделкой отвергается участниками сети.
Тогда они перейдут на ту версию блокчейна, к которой перешли их пиры и твердая вилка исчезнет.
Поначалу у пиров возникнет временная вилка из-за свойств нового блока, который попытались
смайнить. Блок отвергнется сетью, но пиры его восстановят и вернут обратно в основную цепочку.
Классический пример изменения через мягкую вилку - оплата по хэшу скрипта, которая была
рассмотрена во второй лекции.
Одной из предложенных идей было, чтобы монетная база содержала корень Меркла, состоящий из
полного набора неизрасходованных сделок. Это привело бы к мягкой вилке, потому что старые узлы
могут добыть блок, который не будет иметь нового необходимого параметра монетной базы, и будет
отвергнут сетью. Но они смогут сойтись и присоединиться к основной цепочке, которую майнит
сеть.
"Жесткие вилки"
Другие изменения могут потребовать твердую вилку, например, если возникнет необходимость
добавить новые коды операций для Биткоина, изменить ограничения на блоки или размер
транзакции, или исправить множественные баги. Например, исправление бага, где инструкция
MULTISIG удаляет из стека одно лишнее значение, потребует твердой вилки, и именно поэтому на
первый взгляд раздражающий баг, на текущий момент проще оставить в протоколе, чем
использовать твердую вилку для его исправления.
Таким образом добавление любого изменения, требующего твердой вилки, является крайне
нежелательным в сети Биткоин. Однако уже были проверены и признаны успешными множество
идей и альтернативных валют, которые были созданы с нуля, лишенные этих недостатков. О них
будет рассказано в лекции про альткоины
Хранение биткоинов.
Сформулируем основные моменты, важные для хранения и управления ключами, их всего три. Во-
первых, ключ должен быть легкодоступным, чтобы биткоины можно было потратить в любой
удобный момент. Во-вторых, он должен храниться безопасно, чтобы никто кроме владельца не мог
потратить монеты. В-третьих, использование и хранение должно быть удобным.
Простейший способ сохранить ключ – просто записать файл на любое устройство, ПК, телефон или
флэш-накопитель. По удобству этот способ несомненный лидер. Нет ничего проще чем нажать
кнопку на телефоне для того, чтобы провести оплату в биткоинах, однако, в части доступности и
безопасности все не так радужно. Доступность напрямую зависит от доступности устройства
хранения. Если телефон сломается или будет потерян, если файл на флэш-диске сотрется или будет
поврежден, то ключ будет потерян и все монеты станут недосягаемыми. То же самое касается
безопасности – ключ защищен ровно настолько, насколько защищено устройство хранения. Если
кто-то может взломать или поместить вирус на хранилище, он получит ключ и сможет
распоряжаться средствами его законного владельца.
Давайте подумаем о хранении биткоинов, как о ношении денег в кошельке. Всегда удобно иметь
наличные для повседневных расходов, но никто не станет носить с собой все свои сбережения.
Неплохо применить подобный подход при локальном хранении ключей. Обычно для расчетов
используется программа-кошелек, которая хранит ключи и делает все операции удобными, и чтобы
заплатить за кофе в Starbucks нужно просто нажать на кнопку. Если же в дополнении к программе-
кошельку использовать программу для хранения и управления ключами, можно одновременно иметь
несколько кошельков и платить с разных адресов, используя лишь один мастер-ключ. Кроме
дополнительной безопасности это так же дает дополнительную анонимность. Применяя программу-
кошелек не нужно будет думать о дополнительных адресах и ключах, программа сделает все
необходимое самостоятельно, единственное, что надо знать для оплаты или получения денег – это
адрес для оплаты.
Адрес представляет собой зашифрованный публичный ключ, закодированный в Base58. Передать его
можно 2 основными способами – в виде текстовой строки или в виде QR кода. Строку надо точно
записать или скопировать. Более простой и современный способ – преобразовать строку в QR код,
который можно отобразить на экране или сфотографировать с помощью телефона.
Поговорим о горячем и холодном хранилищах. Ранее был рассмотрен подход к хранению биткоинов,
как реальных денег. Небольшая часть должна быть легкодоступна – в этом случае владелец хранит
ключ либо на своем телефоне или в онлайн хранилище, и монеты, защищенные этим ключом всегда
в его распоряжении. Такое хранилище называется горячим. Использовать его очень удобно, но не
совсем безопасно.
Очевидно, что для пересылки монет каждое из хранилищ должно знать адрес другого. Значит, когда
на горячем хранилище накопится большая сумма, можно отправить монеты на адрес холодного
хранилища. При этом холодное хранилище находится вне сети. Поскольку в блокчейне сохраняется
информации о всех проведенных транзакциях, достаточно будет через какое-то время подключить
холодное хранилище в сеть, чтобы принять все посланные на его адрес деньги.
Дополнительный плюс иерархической генерации ключей – то, что генерация адресов не дает
никакой информации о генерации ключей и можно свободно предоставить сгенерированный инфо-
файл адресов кому-либо. К сожалению не все алгоритмы цифровой подписи поддерживают такой
механизм, однако, ECDSА, используемый в биткоине, ее поддерживает.
Учитывая все вышесказанное, возможно разделить работу между горячим хранилищем и холодным.
На холодном хранилище будет сгенерирована информация об адресах и закрытых ключах. На
горячем хранилище с помощью подстановки различных i можно генерировать адреса. И позже,
подключив горячее хранилище, сгенерировать закрытые ключи.
Первый способ – взять какое-либо устройство хранения и поместить его в сейф. Это может быть
ноутбук, телефон или же отдельный жесткий диск. Любой, кто захочет украсть биткоины, должен
будет сначала взломать сейф и добраться до устройства.
Второй способ можно назвать кошельком в памяти. Пользователь запоминает кодовую фразу или
ключ, которую использует для шифрования ключа. В таком случае защищенность равна сложности
парольной фразы или обстоятельствам при которых пользователя могут заставить ее рассказать.
Кроме того, существует шанс забыть кодовую фразу.
Третий вариант можно назвать бумажным кошельком. Мы можем распечатать информацию о ключе
на бумаге и спрятать этот лист в банковскую ячейку или сейф.
Четвертый способ – использовать для хранения устройство, устойчивое ко взлому. Допустим флешку
со сканером отпечатков пальцев или программу для идентификации по голосу.
Прежде обсуждались только способы хранения ключей в каком-то конкретном месте – сейфе, в
зашифрованном виде или на бумаге. Но единственное хранилище будет и единой точкой отказа, то
есть, если что-то случится, то доступ к ключу будет потерян. Рассмотрим способы, которыми можно
разделить ключ на части и распределить их таким образом, чтобы избежать проблемы единой точки
отказа.
В криптографии подобное называют разделением секрета. При этом какой-либо секрет (в случае
биткоина это закрытый ключ) разделяется на N частей. Необходимо знать K частей из N, чтобы
восстановить изначальный секрет. В случае, кто-то будет знать меньше частей, чем K,
восстановление не удастся.
Так, например, если N=2 и K=2, то секрет делится на 2 части и необходимо знать обе части, чтобы
его восстановить.
Разберем один из способов такого разделения. Сначала надо взять большое простое число P, оно не
должно быть секретным, просто большим. Секрет S должен находится в диапазоне от 0 до P-1.
Генерируется случайное число R, которое должно быть секретным и так же находится в диапазоне от
0 до P-1.
Секрет делится на 2 части X1 и X2. X1 представляет из себя остаток от деления (S+R) на P. X2 будет
получен как остаток от деления (S+2*R) на P. Чтобы восстановить S нужно взять остаток от деления
(2X1-X2) на P. 2X1=2S+2R, X2=S+2R, таким образом, 2X1-X2 равно S, а так как S<P то остаток от
деления S/P будет равен S. Поскольку R выбирается случайно то X1 и X2 по отдельности похожи на
случайные числа. И лишь имея обе части мы можем восстановить S.
Давайте теперь рассмотрим случай, когда N>2 при К=2, то есть для восстановления ключа нужно 2
части, но сам ключ разделен больше чем на 2 части.
Рис. 4.1. Случайный наклон R: по двум точкам можно восстановить прямую, взяв остаток от деления на
большое простое число
Для восстановления S нам нужно будет знать любые 2 точки, поскольку через них можно провести
единственную прямую, которая пересечет ось y в точке S. При этом зная лишь одну точку узнать S
будет невозможно, поскольку через нее можно провести бесконечное множество прямых. Итак, мы
рассмотрели пример, когда при сколько угодно большом N нам достаточно K=2 элементов для
дешифровки секрета.
А что если необходимо использовать K>2? Для K=3 можно использовать квадратичную функцию,
поскольку для восстановления квадратичной кривой достаточно 3 точек. В таком случае уравнение
кривой будет S+R1X+R2X2, где R1 и R2 случайные. Кубическая функция S+R1X+R2X2+R3X3
восстанавливается по 4 точкам. Можно продолжать дальше увеличивая степень функции. В любом
из случаев можно использовать сколь угодно большое N. Соответственно на практике выбираются
необходимые N и K.
Рассмотрим плюсы и минусы. Плюсом является то, что части, необходимые для восстановления
секрета, возможно хранить отдельно и злоумышленнику потребуется получить доступ до K
хранилищ, чтобы разгадать S. Если каждое из хранилищ имеет высокую защиту, то сделать такое
будет очень проблематично. Кроме того, если одна из частей скомпрометирована можно поменять
шифр. Другой плюс описанного подхода, что при достаточной разнице между N и K, даже утратив
несколько опорных точек можно все равно восстановить ключ, если потери меньше, чем N-K.
Именно такой подход является основой алгоритма, называемого Multi-Signature или MultiSig.
Предположим, что есть 4 человека и каждый из них генерирует ключевую пару. Кошелек
подписывается всеми четырьмя ключами, при этом для открытия достаточно трех ключей из
четырех. При таком алгоритме даже если два из четырех ключей скомпрометированы, то этого
недостаточно, чтобы потерять средства в хранилище. Так же возможна утеря одного ключа.
В итоге это позволяет сделать безопасным холодное хранилище для большого количества биткоинов,
ведь требуются действия нескольких людей для проведения любой операции.
Онлайн кошелек - это вид локального кошелька, которым каждый управляет самостоятельно, только
данные хранятся не на локальном устройстве, а в облаке, в качестве интерфейса используется
защищенный веб-сервис. Примером может служить Block Chain. Как правило, кроме сайта,
дополнительно существует приложение для телефона.
Сайт управляет ключами, и предполагается, что он шифрует эти данные паролем, который знает
только владелец ключа. Защищает ключи от несанкционированного доступа и предоставляет доступ
к ним только по логину и паролю. Конечно, использование онлайн-кошелька удобно, ведь
пользователю не приходится устанавливать дополнительное ПО, заботится о хранении ключей,
кроме того один и тот же кошелек доступен и с ПК и с телефона и с любого другого устройства.
Однако, владельцы сервиса решат смошенничать, то они могут получить доступ ко всем средствам,
ключи от которых хранились в сервисе.
Стоит обратить особое внимание на данный пункт. Допустим, у Боба на счете $5000 и 3 биткоина.
Он выставил лот на покупку 2 биткоинов по цене $1000 за единицу, и кто-то согласился эти монеты
продать. После покупки у Боба на счете будет $3000 и 5 биткоинов, но эти биткоины не появятся в
биткоин-кошельке Боба. Потому что сделки осуществляются между биржевыми счетами клиентов.
И, совершив вышеописанную, операцию Боб фактически получает не монеты, а обещание от биржи
выплатить 5 биткоинов по требованию.
Существует множество за и против существования бирж. Несомненный плюс, что биржи соединяют
реальную экономику с биткоином, то есть имея реальные деньги можно свободно купить биткоин
или наоборот.
Довод против – то что биржа функционирует как банк, принимая депозиты в обмен на обещание
возврата средств, делает возможным ситуацию, когда банк, платежеспособный на бумаге, не может
выдать вклад, потому что отдал все деньги в долг какой-нибудь фирме. Особенно это касается
ситуаций, когда начинают распространяться плохие слухи, и люди в панике, стараясь спасти свои
средства, выводят их.
Другой риск состоит в том, что владелец биржи может быть мошенником. И здесь не требуется
дополнительных объяснений.
Третий риск – риск взлома. Биржи, как правило, имеют на счетах значительное количество
биткоинов. И любая небрежность или ошибка в хранении и управлении таким ключом может
обернуться катастрофой.
Все вышеописанные риски уже срабатывали в реальности. Лучшей иллюстрацией этого может стать
статистика, согласно которой 45% бирж закрылись из-за неспособности рассчитаться свкладчиками.
Самый известный пример рухнувшей биржи – Mt. Gox. Сайт, бывший некогда крупнейшим
обменником, в одночасье исчез с рынка, оставив пользователей без денег. Сейчас дело расследуется
судами в Японии и США, но неизвестно будут ли найдены исчезнувшие вложения и когда это
произойдет.
Если посмотреть на банковский сектор, то там нет такого количества банкротств. Причина в том, что
правительства как правило регулируют деятельность банков. Одно из требований – это
достаточность капитала, обычно от 3 до 10% всех срочных депозитов. То есть у банка должно быть
достаточное количество наличной валюты. Кроме того, существуют ограничения на методы
инвестирования и управления активами, что снижает вероятность потери банками инвестируемых
средств. В обмен на согласие подчинятся требованиям, правительства как правило помогают банкам
или, по крайней мере, защищают их вкладчиков. Например, существует страхование депозитов, то
есть государство гарантирует при крахе банка возврат вложенных средств или их части. Так же
государство может выступить кредитором последней инстанции, выделяя банку кредит в случае
острой нехватки собственных средств.
Получается, что основная разница между банками и биткоин-биржами в том, что первые
регулируются, а вторые нет. Вопрос стоит ли регулировать биткоин-биржи и как это делать – тема
отдельной лекции.
Доказательство резерва можно разбить на 2 составляющие. Первая часть делается достаточно легко,
биржа публикует валидную транзакцию самой себе на большую сумму, к примеру 100000
биткоинов. Затем биржа подписывает случайно сгенерированную незаинтересованным лицом строку
своим закрытым ключом, которым так же подписана предыдущая транзакция в 100000 биткоинов.
Это покажет платежеспособность биржи. Обратите внимание, возможно 100000 будет не полной
суммой на счетах, а лишь той суммой, которую биржа захотела подтвердить, то естьтранзакция была
проведена на 100000 биткоинов из двухсот тысяч.
Если каждый пользователь системы сможет сделать запрос на просмотр своей ветки дерева, то они
смогут проверить, что их счет реально включен в общее дерево, что сумма каждого хэша верхнего
уровня равна сумме двух нижних. Это не позволит бирже завышать количество клиентов, показывая
аккаунты, которых реально не существует.
Имея в распоряжении эти две суммы любой сможет оценить насколько его вклад покрывается
резервами и решить для себя стоит ли в нее инвестировать. И таким образом одна из функций
регуляторов будет выполнена.
Платежные сервисы.
Допустим, что есть продавец, который хочет принимать оплату в биткоинах. Стоит заметить, что
продавцы хотят принимать криптовалюту в первую очередь потому, что покупатели желают
использовать такой вариант оплаты. Цель продавца - получить в конце дня вместо биткоинов
доллары или другую местную валюту. Для этого необходим простой инструмент, легкий во
внедрении, ради которого не надо переделывать веб-сайт или создавать отдельный платежный узел.
При этом риск должен быть минимальным.
Можно рассмотреть, как работают такие сервисы на примере Coinbase. Продавец на сайте заполняет
форму, он выбирает название платежной кнопки, ее форму, цвет, размер. Заполняет список товаров и
их цены, указывает счет, куда переводить реальную валюту за оплату. После этого сервис генерирует
HTML-код, который продавец просто может вставить на свой сайт. Покупатели в итоге увидят
кнопку "Оплатить в биткоинах", а продавец получит от платежного сервиса реальные деньги и
информацию о том, за что они уплачены.
Рис. 4.2. Платеж с помощью платежного сервиса
Итогом всего процесса является то, что при оплате заказов биткоинами от клиентов, продавец
получает деньги в реальной местной валюте. Платежный сервис берет небольшую комиссию. При
этом он берет на себя всю работу по обработке платежей в биткоинах, переводу их в реальные
деньги и возвращает продавцу требуемую оплату. Так же платежный сервис несет все риски
связанные с безопасностью управления биткоинами, их хранением, риски курсовых колебаний.
Когда курс биткоина падает - платежный сервис несет убытки, если курс растет – наоборот. При
больших объемах транзакций подобные сервисы являются активными участниками рынка по
покупке и продаже биткоинов, и берут на себя риски поиска необходимых для обмена сумм.
Комиссия, собираемая сервисом, является платой за удобство продавца с учетом всех рисков.
Комиссионные за транзакции.
Комиссия за платежи – одна из основ механики биткоина. Раннее были рассмотрены такие вопросы
как хранение криптовалюты, управление ею, платежные сервисы, которые ее обслуживают. Но
основой всего является комиссия за осуществление каждой операции. Коммисия за операцию равна
разнице между входящей и исходящей суммой и ее получает майнер, зарегистрировавший операцию
в блоке.
Сейчас существует соглашение о комиссионных. За транзакции размером меньше 100 байт комиссия
не взимается. Обычно за каждые 1000 байт комиссия в 1 тысячную биткоина. Приоритет транзакции
прямо пропорционален возрасту транзакции, умноженному на ее величину, и обратно
пропорционален объему транзакции в байтах. Размер транзакции в байтах можно посчитать так:
148*inputs+34*outputs+10. Где inputs - количество входящих платежей, outputs - количество
исходящих платежей и 10 байт на служебную информацию.
Ситуация в экосистеме складывается таким образом, что большинство майнеров требуют комиссию,
то есть они не хотят регистрировать транзакции, в которые не включен платеж за обслуживание.
Однако, есть майнеры, которые регистрируют транзакции вне зависимости от наличия комиссии.
Учитывая то, что с течением времени приоритет транзакции возрастает, все они будут рано или
поздно зарегистрированы.
В итоге практически все ПО, работающее с биткоинами, включает в себя механизм, автоматически
рассчитывающий и прибавляющий транзакции к платежам.
Обмен криптовалют.
Исследуем рынок обмена валюты, определим его размер, то как он работает и обсудим немного его
экономику.
Рынок биткоинов функционирует так же как рынок других валют. То есть цена меняется в
зависимости от того, сколько и какой валюты люди хотят продать или купить.
Существует множество площадок для покупки и продажи биткоинов. Есть сайт bitcoincharts.com на
котором можно посмотреть текущую цену на различных рынках и их объем. Торги показываются в
реальном времени, можно увидеть графики изменения цены. Там можно выбрать онлайн площадку
для торговли. Кроме онлайн площадок для торговли есть сайты, на которых собираются
обмениваются биткоинами в офлайн. Например, localbitcoins.com. Там можно выставить запрос на
покупку или продажу, потом договориться о встрече в кафе или парке и обменять валюту. Так же в
офлайн существуют места, где в определенные дни собираются все желающие обменять
криптовалюту.
Вся инфраструктура обмена по сути финансовый рынок, на котором есть продавцы и покупатели.
Объемы этого рынка составляют миллионы долларов. По объему он далек от фондовых и валютных
рынков, но достаточно большой для существования равновесной цены. Как известно равновесная
цена – цена при которой объем спроса равен объему предложения. И объем предложения биткоинов
стоит рассмотреть подробнее. Сейчас существует около 16.5 миллионов биткоинов и этот объем
будет постепенно увеличиваться до предела в 21 миллион. Но здесь стоит помнить про депозиты.
Если у кого-то есть обязательство от биткоин биржи выплатить определенную сумму в биткоинах,
он может продать это обязательство за любую другую валюту. Так же, как и на обычных
финансовых рынках, в денежную массу включают не только объем реально существующих
бумажных и металлических денег, но и объем депозитов, размещенных в банках. Таким образом
суммарный объем торговли биткоинами может быть больше 21 миллиона монет. И поэтому
утверждение о строгом ограничении эмиссии, о чем любят рассказывать фанаты биткоина, не совсем
верно.
Теперь давайте рассмотрим спрос. Существует 2 главных источника спроса: спрос на биткоин как
средство инвестиции и спрос на биткоин как валюту-посредник при необходимости операции в
реальной валюте. В чем заключается смысл последнего пункта? Давайте представим, что есть 2
человека в разных городах или даже странах, один из которых хочет отправить другому деньги. И
они хотят провести эту операцию в биткоинах (например, из-за того, что комиссия за перевод в
биткоинах намного ниже, чем при использовании обычных систем переводов). Тогда сначала
отправитель должен купить биткоины, отправить их получателю, который в свою очередь должен их
продать. Главная деталь этой операции – то что биткоины изымаются из обращения на время
проведения операции. Если желающих провести аналогичные операции много, то создается спрос на
биткоины.
Второй источник спроса, как мы говорили, это спрос на инвестиции. То есть люди покупают их
сегодня в надежде продать их дороже в будущем.
Давайте с помощью простой математической модели рассмотрим, как спрос на подобные операции
влияет на курс биткоина.
Если принять время операции D неизменной, то при увеличении спроса на проведение операций с
использованием валюты-посредника цена биткоина будет расти, пока предложение не догонит спрос.
Так же при росте инвестиции в биткоин уменьшится доступное количество биткоинов S и
увеличится цена. Конечно, это не полная модель рынка. Полная модель включает спрос от
инвесторов. Однако приведенный пример дает общее понимание о том, как все происходит.
Из всего вышесказанного можно сделать вывод, что существует рынок обмена между реальными
валютами и биткоином. Можно в любой момент продать или купить биткоин, а также построить
математическую модель соотношения между спросом, предложением и ценой.
Задача биткойн-майнеров
В данной лекции будут рассмотрены все аспекты майнинга: кто такие майнеры, что представляет
собой бизнес-модель майнеров, какое влияние они оказывают на окружающую среду. Из
предыдущих лекций известно, что Биткойн находится в достаточно сильной зависимости от
майнеров, которые подтверждают каждую транзакцию и создают все блоки за вознаграждение.
Майнинг - это не схема быстрого обогащения, а очень длинный путь к заработку. Что необходимо
сделать, чтобы стать биткойн-майнером? Для начала присоединиться к сети и стать Биткойн-нодой.
Начать перехватывать и подтверждать все новые транзакции и блоки, поддерживать текущую
цепочку блоков. Чтобы создать новый блок, нужно вычислить случайный одноразовый код (nonce),
который позволит блоку считаться подтвержденным. Эта сложная вычислительная работа, которая
является самой трудной задачей для майнера. Когда майнер путем долгих вычислений находит блок,
он надеется, что все остальные майнеры признают этот блок, что они подтвердят его и начнут
майнить, продолжая цепочку, и что они не признают блок конкурента вместо этого блока. И если все
это совершится, то майнер получит вознаграждение в объеме более 25 биткойнов за блок. Это около
$15,000 US.
Первое, что делает майнер – собирает все транзакции, которые были получены от пула, ожидающего
блоки, в это дерево.
Потом он создает блок с правильным заголовком, который указывает на предыдущий блок ( рис.
5.1). Далее майнеру необходимо решить самую сложную задачу – найти случайный код(nonce),
чтобы хэш заголовка блока начинался с необходимого количества нулей. Майнер может начать со
случайного одноразового кода (nonce), состоящего только из нулей (32-битное целое число) и,
попробовав, получит неверный хэш. Тогда он перейдет следующему коду (nonce) с номером 1, и хэш
также будет неверным. Затем код (nonce) номер 2, хэш также окажется неверным. Майнер будет
пытаться использовать каждое возможное значение для этого 32-битного целого числа, и, возможно,
ни в одном случае хэш не будет верным.
Комиссионная транзакция (coinbase transaction) существует там, где майнеры фактически создают
новые монеты и выдвигают свои права на них. В ней существует дополнительный параметр
одноразового кода (nonce), содержащий только нули. После того, как майнер исчерпал все
возможные одноразовые коды (nonce) в заголовке блока, он использует дополнительный код (extra
nonce) в комиссионной транзакции, который изначально содержит только нули. Он перейдет к
дополнительному коду (extra nonce) в комиссионной транзакции и изменит его на 1, и затем начнет
поиск кодов (nonce) в заголовке блока заново.
При изменении этого параметра в комиссионной транзакции, все дерево транзакций Меркла
меняется. Таким образом, изменения будут распространяться до конца. Изменение дополнительного
кода (extra nonce) в комиссионной транзакции обойдется гораздо дороже, чем изменение
одноразового кода (nonce) в заголовке, по этой причине майнер делает это как внешний цикл. А
внутренний цикл, в котором он действительно трудится, - изменение кода (nonce) в заголовке блока.
Но в очередной раз первая попытка не сработет, так что майнеру придется перебирать возможные
значения дальше. Поиск nonce это действительно сложный вычислительный процесс, так что
подавляющее большинство кодов (nonce), которые проверяет майнер, не срабатывают.
В конечном счете, если майнер посвятит этому достаточно времени, он найдет правильную
комбинацию дополнительного кода (extra nonce) в комиссионной транзакции и одноразового кода
(nonce) в заголовке, и сгенерирует блок с хэшем, который начинается с достаточного количества
нулей, чтобы считаться достоверным. Тогда он захочет объявить об этом так быстро, насколько
может, и будет надеяться, что сможет извлечь из этого выгоду.
Хэш любого подтвержденного блока должен быть менее 256 бит. Мы используем хэш-функцию
(SHA-256), в которой, по крайней мере первые 64 бита хэша любого достоверного блока должны
быть нулями.
В целом сложность на настоящий момент составляет 266 и это огромное число. Если попытаться
написать его десятичным числом, то получится 84 квинтильона. Приближение к этому числу,
которое можно представить, - это население Земли в квадрате. Другими словами, если бы каждый
человек на Земле был бы сам по себе своей планетой Земля с 7 миллиардами человек на ней, то
общее число людей было бы близко к этому числу.
Или другой пример, чтобы представить данное число, если бы все 7 миллиардов человек на Земле
пожали бы друг другу руки. Меньше, чем 266 общих рукопожатий должно было осуществиться.
Как уже упоминалось ранее, сложность майнинга пересчитывается каждые 2 недели на основе
эффективности работы майнеров в течение предыдущих 2 недель. Для этого берется время,
затрачиваемое майнерами на поиск предыдущих 2016 блоков и делится на 2 недели.
С течением времени сложность майнинга увеличивается ( рис. 5.2). И это не обязательно постоянное
линейное или экспоненциальное увеличение. Сложность зависит от многих параметров: активности
на рынке, количества новых майнеров, обменого курса и т.п. На текущий момент основным
фактором является увеличение вычислительных мощностей майнеров в сети. Чем больше людей
занимаются хэшированием, тем быстрее создаются новые блоки, и сложность корректируется. Таким
образом, на создание новых блоков снова затрачивается 10 минут. На рис. 5.2 изображена
скачкообразная функция сложности, даже несмотря на то, что общая скорость хэширования растет
плавно, сложность меняется скачкообразно.
Рис. 5.2. Динамика сложности майнинга
Другой способ доказать скачкообразность функции сложности – это выяснить, сколько времени в
среднем потребуется для создания нового блока. На рис. 5.3 показано, сколько прошло секунд между
последовательно идущими блоками в цепочке блоков.
Можно заметить, что линия затрат времени на создание нового блока постепенно снижается, затем
быстро возрастает, и снова постепенно снижается. Это объясняется тем, что сложность сбрасывается
каждые 2 недели, а средняя скорость создания новых блоков возвращается на уровень 10 минут
(примерно). Затем чем больше мощностей привлекается в сеть, когда сложность остается прежней,
тем быстрее майнеры создают новые блоки. По прошествии 2 недель сложность переустанавливается
на 10 минут, и процесс начинается сначала.
Несмотря на то, что цель заключается в том, чтобы новый блок создавался каждые 10 минут, в
среднем это значение ближе к 9 минутам, а к концу периода в 2 недели это значение снижается
примерно до 8 минут.
Аппаратное обеспечение майнинга
Чтобы понять, какую задачу необходимо решить майнерам, рассмотрим углубленную схему SHA-
256 на рис. 5.4.
Длина внутреннего состояния SHA-256 составляет 256-бит, она разделена на 8 32-битных слова,
поэтому больше оптимизирована для 32-битных платформ.
На каждом этапе берутся некоторые из этих слов, к которым применяются 4 различных параметра
настройки, которые находятся на бит-уровне. Таким образом, с каждого из них перебрасывают или
добавляют 2 или 3 бита - основные логические операции.
Затем берутся несколько слов из внутреннего состояния (к некоторым были применены параметры
настройки), которые составляют 32 по модулю в канале конвейерной передачи данных. Результат
всех этих добавлений привязывается к первому слову внутреннего состояния и все внутреннее
состояние сдвигается. Некоторые из идей архитектуры восходят к классическим линейным
регистрам сдвига с обратной связью, которые считаются одними из первых подходов к
криптографическим архитектурам.
Выше описан 1 этап функции сжатия SHA, а для полного вычисления SHA-256 потребуется
выполнить это 80 раз для 80 циклов. А в каждом цикле существуют разные константы, применяемые
на этом одном шаге, так что каждое повторное выполнение цикла не совсем то же самое.
Перед майнерами стоит задача, вычислить эту функцию как можно быстрее.
Из схемы можно заметить, что для этого им необходимо работать с 32-битными словами, создавать
32-битные дополнения, а также некоторые побитовые логические схемы.
Если настольный ПК высокого класса, то возможно вычислять около 224 хэшей за секунду, что
примерно будет составлять 20 мегагерц.
Хотя герц часто применяется по отношению к скорости процессора, основная идея герца
заключается в обозначении того, что одна операция выполняется много раз в секунду.
Допустим, хэши вычисляются со скоростью 20 мегагерц, но что это дает при текущем уровне
сложности? Создание одного блока займет более ста тысяч лет с такой скоростью.
Если сегодня заняться майнингом на ПК общего назначения, поиск блока займет более 140000 лет.
Большинство видеокарт также могут быть разогнаны. Это значит, что их можно заставить работать
быстрее, чем заявлено разработчиками. Для майнинга биткойнов, возможно, было бы хорошей идеей
запускать микропроцессор намного быстрее, чем та скорость, на которую он был рассчитан при
разработке, даже если это вызовет появление ошибок в процессе вычислений.
Существует так называемая мера успеха в майнинге – полезная пропускная способность (Goodput),
которая заключается в пропускной способности, т.е. как быстро создаются новые блоки и как часто в
вычислениях возникают ошибки. Разгонять микропроцессор имеет смысл в том случае, если это
позволит создавать достоверные блоки быстрее, даже если это приведет к ошибкам в вычислениях.
Таким образом, если можно настроить одну кнопку и запустить видеокарту на 50% быстрее, даже
если ошибки в вычислениях составляют 30% времени, итоговая скорость увеличится в 1,5 раза. Это
значит, что блоки будут создаваться быстрее , чем при нормальной скорости и без ошибок. На
поиски ответов на вопросы насколько следует разгонять микропроцессор и какие ошибки это создаст
было потрачено много времени. Со временем майнеры стали масштабировать это решение. Если
одна видеокарта работает хорошо, то лучший результат можно получить, используя 2 и более карт.
Постепенно появились примитивные установки, одна из которых изображена на рис. 5.5. Эти
установки собирались вручную – стойки, простейшие системы охлаждения и т.д.
Помимо этого у видеокарт отсутствует хорошая система охлаждения, так как они предназначены для
запуска одной видеокарты и монитора для одного компьютера.
Это на порядок выше производительности с использованием ЦП. Тем не менее, даже если прибавить
к этой видеокарте еще 100 видеокарт при текущем уровне сложности уйдет 174 года на поиск блока.
Как и в случае с видеокартами, несколько ППВМ лучше чем одна ППВМ. Поэтому ППВМ стали
объединять в аккуратные стойки, которые не имеют ничего общего со своими предшественниками –
стойками с объединенными видеокартами. Но ППВМ, которые используются для майнинга
биткоинов, постоянно пребывают в активном состоянии и работают на пределе, что вызывает
ошибки и сбои. Также оказалось сложным оптимизировать 32-битный шаг, который имеет
решающее значение для вычисления SHA-256. ППВМ менее доступны для приобретения, чем
видеокарты. Мало кто знает, как программировать ППВМ или как настроить их.
Выяснилось, что стоимость производительности была добавочной, всего лишь предельным доходом
по сравнению с использованием видеокарт, даже несмотря на то, что производительность ППВМ
выше. Поэтому использование видеокарт доминировало в области майнинга довольно недолгое
время, примерно около года. Еще более коротким был период, когда ППВМ считалась популярным
аппаратным обеспечением для майнинга биткойнов. Но если правильно использовать ППВМ, можно
достигнуть производительности около гигагерца. Но даже с такой производительностью и с
условием объединения 100 ППВМ, всё равно потребуется 25 лет для создания блока.
Необходимо отметить, что оборудование устаревает в течение 6 месяцев. Часто в первые 6 недель
зарабатывается половина прибыли, ожидаемой за все время существования оборудования для
майнинга. Тот факт, что такая высокая доля прибыли приходится на первые 6 недель, означает, что
придается большое значение скорости доставки. Если произошла задержка в доставке на 1 неделю,
то покупатель потерял шестую часть самого прибыльного периода жизненного цикла ASIC. По мере
повышения сложности майнинга, цена на оборудование будет падать.
Это объясняет, почему компании требуют совершения предзаказов. Существует большая
конкуренция на то, чтобы получить ASIC первым. Также известно множество историй о том, как
компании, производящие ASIC, пытались пару недель использовать их сами, перед тем как
отправить покупателям.
Таким образом, ситуация на рынке все еще неблагосклонна к начинающим майнерам, которые
желают сделать заказ онлайн на ASIC, чтобы начать зарабатывать деньги. Фактически, почти во всех
случаях люди, разместившие заказы на оборудование для майнинга, должны были потерять деньги
на основе произведенных в то время расчетов. За исключением одного момента, связанного с тем,
что стоимость биткойна росла в течение большей части истории существования сети Биткойн.
Растущие цены выручают майнеров, которые потеряли бы деньги в случае стабильных цен.
Исходя из вышесказанного покупка ASIC была дорогостоящим способом просто поставить на то, что
стоимость биткойнов будет расти. И для большинства майнеров, даже несмотря на то, что они
сделали деньги, занимаясь майнингом биткойнов, было бы куда выгоднее вложить те деньги,
которые они инвестировали в оборудование для майнинга, в приобретение биткойнов, держать их,
пока цены на них не поднимутся, и затем продать их.
1. дешевое электричество
2. хорошее сетевое подключение, чтобы получать информацию о новых созданных блоках
3. прохладный климат, чтобы не выкладывать огромные суммы за охлаждение оборудования.
Такие страны как Грузия и Исландия пользуются популярностью для создания майнинг-центров.
Если взглянуть на эволюцию майнинга в целом, можно заметить существующие параллели между
майнингом биткойнов и добычей золота или с любым другим видом добычи. Но в особенности с
добычей золота, так как появление майнинга привело к разновидности золотой лихорадки, когда в
самом начале многие молодые любители хотели попасть в бизнес.
И в обоих случаях добыча не была благосклонна к отдельным людям, пытающимся заниматься этим.
С течением времени произошла консолидация с крупными компаниями, на которые приходится
большая часть добычи.
Всегда ли отдельные майнеры будут вне игры? Есть ли способ вернуть их в игру? Противоречит ли
это первоначальной идее системы Биткойн? Противоречит ли существование интегральных схем
специального назначения и крупных майнинг центров исходному видению Сатоши Накомото о том,
что каждый человек, который имеет доступ к сети, может заниматься майнингом на своем
компьютере?
Те, кто считает, что это противоречит первоначальной идее, должны ответить на следующий вопрос.
Возможно ли зарабатывать деньги, занимаясь майнингом без использования интегральных схем
специального назначения (ASIC)?
Энергопотребление и экология
Рассмотрим, какое количество энергии потребляется системой Биткойн и что это может означать для
валюты и для планеты в целом.
Существует принцип, разработанный Рольфом Ландауэром в 1960-х годах, который гласит, что на
любое необратимое вычисление затрачивается минимальная энергия. Принцип выведен из основ
физики. Не будем здесь рассматривать выводы, за исключением того, что при каждой обработке 1
бита в необратимом вычислении, существует минимальное количество Джоулей, которые
необходимо использовать. Исходя из основных законов физики энергия никогда не разрушается, она
преобразуется из одной формы в другую.
Итак, поскольку любое необратимое вычисление потребляет некоторый объем энергии , а SHA-256
является необратимой, то энергопотребление является неизбежным атрибутом майнинга биткойнов.
Следует отметить, что ограничения, предусмотренные принципом Ландауэра, меньше, чем объем
электроэнергии, который потребляется сегодня, более чем в 1000 раз. Таким образом, на текущий
момент майнеры даже близко не подошли к теоретической оптимальной эффективности вычислений,
но даже если бы теоретический оптимум был достигнут, для майнинга биткойнов по-прежнему
использовался бы некоторый объем энергии.
Почему майнинг биткойнов не может обойтись без потребления энергии? Данный процесс состоит
из 3 частей.
Во-первых, необходимо изготовить оборудование для майнинга. Для этого требуется извлечь из недр
Земли элементы, в особенности редкоземельные металлы и медь, которые используются в
производстве интегральных схем. Затем необходимо изготовить из этих материалов интегральную
схему специального назначения (ASIC). Все это представляет собой энергетические затраты на
производство и эксплуатацию. Едва только заказ ASIC был доставлен майнеру по почте, большой
объем энергии уже был потреблен, включая энергию, затраченную на доставку. То есть энергия была
потрачена только на то, чтобы майнер получил оборудование.
Затем майнер подключит оборудование к сети и начнет майнить. Энергия будет потребляться всё
время, которое оборудование майнит биткоины - этот объем и будет составлять электроэнергию,
потребляемую во время майнинга.
И несмотря ни на что эта энергия должна быть потреблена согласно принципу Ландауэра. Будем
надеяться на то, что со временем энергетические затраты на производство и эксплуатацию будут
снижаться по мере появления новых мощностей в сети. Меньше людей будут тратиться на новые
ASIC, так как они будут устаревать медленнее. Существующая совокупность оборудования может
просуществовать долго. Энергетические затраты на производство и эксплуатацию с годами будут
амортизироваться.
Однако энергопотребление будет всегда, даже, несмотря на то, что оно немного снизится, вследствие
повышения эффективности установки со временем.
Другой факт касательно как электроэнергии, так и энергетических затрат на производство и
эксплуатацию, заключается в том, что они, вероятно, снизятся, вследствие экономии от масштаба.
Управляя огромным центром обработки данных для майнинга, можно использовать энергию более
эффективно. Однако существует нюанс, который заключается в охлаждении оборудования в целях
предупреждения неисправностей. Если майнинг-центр находится в Антарктиде, то, возможно,
оборудование охлаждается естественным путем, однако в любом другом месте придется выложить
огромную сумму за электричество, чтобы охладить оборудование. При этом стоимость
электричества увеличивается по мере роста масштаба. Существуют два основных подхода к оценке
энергопотребления всей системы Биткойн. Конечно, они не дают точную оценку, так как система
Биткоин децентрализована – в ней участвуют майнеры по всему миру и их деятельность не
документируется. Тем не менее, можно вычислить приблизительную цифру.
Рассмотрим первый способ. Вознаграждение за создание каждого блока, которое происходит каждые
10 минут, составляет около 15 000 долларов США или 25 биткойнов. Если пересчитать это как доход
в секунду, получится 25 долларов США в секунду, которые были добыты и получены майнинг-
сообществом. Если майнеры все 25 долларов США в секунду обменяют на электроэнергию, сколько
они могут получить? В США цены на электроэнергию варьируются от штата к штату, допустим,
цена за киловатт-час составит примерно 0,10 доллара США. Перейдем к более стандартной научной
единице измерения – мегаджоуль.
Таким образом, если майнеры все свое вознаграждение в 25 долларов США в секунду потратят на
приобретение электроэнергии, то они должны будут получать 900 мегаджоулей в секунду. Джоуль в
секунду – это ватт. Поэтому 900 мегаджоулей в секунду составляет 900 мегаватт или 900 миллионов
ватт.
Второй способ оценить тот же показатель – это применить принцип восходящего анализа. Выясним,
сколько хэшей вычисляются майнерами, просмотрев сложность каждого блока. И что собой
представляет самое лучшее оборудование, которое могут использовать майнеры? Если изучить
характеристики оборудования для майнинга, то можно обнаружить, что установки с самой высокой
производительностью способны 1 ватт электроэнергии преобразовать в 1 гигахэш, т.е. с помощью
данного оборудования вычисляется 1 миллиард хэшей в секунду и потребляется около 1 ватта
энергии. Общая производительность системы составляет около 150 миллионов гигахэшей или 150
петагерцев.
Конечно же, данное число включает в себя весь объем потребленной на охлаждение энергии и
энергетических затрат на производство и эксплуатацию, которые включены в стоимость чипов, но
здесь рассматривается наиболее оптимальный расчет. Допустим ситуацию, при которой вся сеть
обладала бы производительностью, сравнимую с той, что имеют лучшие установки на рынке. Тогда
можно умножить эти два показателя вместе, и получить, что потребляется около 150 мегаватт на
вычисление того огромного количества хэшей в секунду при такой производительности.
Итак, вернемся к цифре, полученной с помощью нисходящего принципа, которую мы оценили в 900
мегаватт, а, используя принцип восходящего анализа, значение установилось на уровне 150 мегаватт.
Таким образом, всей сетью, возможно, потребляется от 100 мегаватт до 1 гигаватта электроэнергии.
Одна из крупнейших электростанций в мире "Три ущелья", которая находится в Китае – это
электростанция мощностью 10000 мегаватт. На самом деле ее мощность немного выше, а это
средний уровень мощности, который генерируется станцией. В то время как среднестатистическая
крупная гидроэлектростанция генерирует около 1000 мегаватт. Крупнейшая атомная электростанция
в Японии, к примеру, генерирует около 7000 мегаватт, тогда как среднестатистическая атомная
электростанция – около 4000 мегаватт. Угольные электростанции, использовавшиеся в прошлом,
генерировали от 1000 до 2000 мегаватт.
Итак, приблизительная оценка, показала, что Биткойн потребляет меньше 1000 мегаватт.
Следовательно, все система Биткойн потребляет меньше электроэнергии, чем генерируется на
крупной электростанции.
Это значит, что одна крупная электростанция должна работать только на то, чтобы снабжать систему
Биткойн энергией, лишая энергии другие направления, которые в ней нуждаются. Следует отметить
и то, что любая платежная система требует потребления энергии и электричества. Если взять в
качестве примера традиционную валюту, большой объем энергии потребляется на перемещение
золотых слитков, охрану золотых слитков, функционирование банкоматов, автоматов для
сортировки монет, контрольно-кассовых аппаратов, инкассирование. На все это традиционная
денежная система потребляет энергию.
Есть мнение, что Биткойн расходует энергию напрасно, так как эта энергия расходуется на
вычисление SHA-256, которое не служит какой-либо очевидной цели. Но можно заметить, что
энергия, потребляемая традиционной валютной системой, тоже расходуется впустую, и она не
служит никакой другой цели, кроме поддержания валютной системы.
Если Биткойн потребляет электроэнергию, то это не обязательно означает, что она тратится впустую.
Если Биткойн – это полезная платежная система, в таком случае электричество в основном
потребляется для этой цели.
Есть одна довольно интересная идея. Что если попытаться сохранить тепло, выделяемое при
потреблении электроэнергии для майнинга биткойнов, и использовать его для практических целей?
Что если вместо традиционных электрических обогревателей для обогрева дома или нагрева воды
приобрести оборудование для майнинга биткойнов, подключить его к электросети и обеспечить
доступом в Интернет?
В этом случае обогреватель в виде оборудования для майнинга будет применяться для майнинга и, в
то же время, использовать выделяемое им тепло в качестве побочного продукта этого вычисления
для нагрева воды, обогрева дома.
Эффективность данной установки не намного хуже, чем электрообогревателя. Так что это отличная
идея, и, возможно, многообещающая перспектива, заслуживающая рассмотрения в будущем. Однако
существует несколько проблем. Например, электрообогреватели все еще менее эффективны, чем
газовые. Поэтому в географических областях с суровым климатом дома, как правило, обогреваются с
помощью газового котла. Если использовать оборудование для майнинга не только для майнинга, но
и для обогрева, что произойдет, если все выключат свои установки для майнинга биткойнов на лето?
Будет ли пропускная способность системы Биткойн падать сезонно, исходя из того, сколько тепла
необходимо людям? Будет ли это происходить в дни, когда температура будет устанавливаться на
уровне выше среднего?
Итак, пара открытых вопросов, связанных с энергопотреблением Биткойн. Означает ли тот факт, что
Биткойн обеспечивает такой хорошей возможностью преобразовать электроэнергию в деньги, что
странам, которые предоставляют субсидии на электричество, придется переосмыслить этот процесс.
Сейчас во многих странах мира правительство практически субсидирует затраты на электроэнергию,
особенно электроэнергию, используемую в промышленности. Одна из причин- попытка
стимулирования индустрии оставаться в их стране, а не в других. Если одна из главных
составляющих успеха биткойн-майнеров – это дешевая электроэнергия, то можно майнить где
угодно.
И еще один вопрос. Если электроэнергию можно трансформировать в биткоины, означает ли это что
следует охранять розетки? Необходимо ли крупным зданиям с множеством розеток устанавливать
камеры наблюдения, чтобы убедиться, что сотрудники или студенты не пытаются майнить
биткойны, подключая оборудование к источникам питания и просто позволяя ему работать?
Вероятность того, что за первый год удастся создать один блок , составляет 36%. Еще чуть меньше
вероятность того, что получится создать два или более блоков – только в этом случае можно
говорить о прибыли от использования этого оборудования.
Все вышесказанное означает, что для отдельного майнера майнинг – это, по сути, большая игра в
рулетку.
Как показывает время, когда деятельность малого бизнеса стала связана с большим риском, в
поисках путей снижения риска компании объединились и образовали компании взаимного
страхования. Таким образом, фермеры объединились и согласились с тем, что если дело одного из
фермеров прогорит, то остальные обязуются разделить прибыль с ним, чтобы фермер не
обанкротился. Если применить модель взаимного страхования к отдельным биткоин-майнерам, то
получится пул совместного майнинга. Майнеры в пуле пытаются создать блок, а новообразованные
биткоины отправляются администратору пула, то есть в качестве адреса в "coinbase" указывается его
адрес. Управление вознаграждением осуществляется администратором пула. Он распределяет
вознаграждение по всем участникам пула пропорционально вкладу каждого участника.
Очевидно, администратору нельзя полагаться на "честное слово" участников, так как каждому из них
выгодно преувеличивать свой вклад. Существует механизм, с помощью которого майнеры могут
вероятностно доказать, какой вклад они вносят, отправляя шары. Шары – это блоки, которые
недостаточно хороши, чтобы считаться достоверными. Тогда как довольно редко можно создать
действительно достоверный блок, выходной хэш которого начинается с 66 требуемых нулей. Будет
попадаться гораздо больше недостаточно хороших блоков, которые начинаются с множества нулей,
но не с 66, что необходимо, чтобы блок считался достоверным.
Таким образом, общий размер может быть, например, 40 бит или, возможно, 50 бит зависимости от
того, для какого размера образован пул.
Каждый раз после обнаружения предыдущего блока администратор пула, который получает
транзакции и собирает блок, сообщает всем участникам о следующем блоке, над которым все будут
работать. Они составят дерево транзакций Меркла, которое будет включено в этот блок. И, в
частности, они обязательно укажут первой транзакцией в блоке комиссионную транзакцию, которая
создает новые монеты и присваивает право собственности на них пулу.
Затем заголовок блока, над которым участникам нужно будет работать, будет отправлен всем
участникам пула. И они должны представить доказательства того, что они работали над этим,
отправив шары, подтверждающие выполнение работы над этим блоком.
Все майнеры приступают к работе. И все они будут медленно находить почти достоверные блоки
или шары до тех пор, пока один из майнеров пула не создаст достоверный блок, который затем будет
опубликован.
После того, как это произойдет, все участники пула отправят администратору пула все шары,
которые они вычислили. Затем администратор пула распределяет всю сумму вознаграждения,
полученную за опубликованный блок, между всеми участниками пула пропорционально вкладу
каждого участника.
Обратите внимание на то, что тот майнер, который действительно создал достоверный блок,
получает меньше вознаграждения, чем тот, который, в конечном счете, не создал ни одного
достоверного блока, но вычислил множество шар.
Им было бы выгоднее, если бы они занимались майнингом отдельно, так как в этом случае они
получали бы весь объем вознаграждения за созданный блок. Но, безусловно, те майнеры, которым не
удалось создать достоверный блок, рады быть в составе пула, так как они ничего бы не заработали,
если бы занимались майнингом отдельно.
В некоторой степени это самое лучшее решение для майнеров, так как присутствует гарантия.
Каждый раз после нахождения шары, майнер будет получать фиксированную сумму
вознаграждения. В таком случае весь риск ложится на администратора пула. Как правило, при PPS
майнеры платят самые высокие операционные сборы администратору пула.
Таким образом, если пул достаточно крупный, то дисперсия распределения найденных достоверных
блоков будет достаточно низкой. Пропорциональный вид начисления награждений может быть
хорошим решением. И это снизит риск, лежащий на администраторе пула. На данный вид также не
распространяется проблема присущая виду PPS, которая заключается в том, что при оплате за шару у
майнеров нет мотивации на то, чтобы отправлять достоверные блоки. У них нет мотивации, но у них
есть возможность при нахождении достоверного блока сохранить это в тайне.
Отсутствие мотивации на отправку достоверных блоков вызвано тем, что они в любом случае
получат фиксированную сумму вознаграждения за шару. Тогда как при использовании
пропорционального вида начисления наград майнеры, безусловно, хотят отправить достоверные
блоки, так как это приводит к возвращению им вознаграждения.
И последний вид начисления вознаграждения, который был популярен некоторое время, заключается
в том, что администратор не собирает операционные сборы, однако майнеры не могут получить
какое-либо вознаграждение до тех пор, пока их баланс не превысит 1 биткойн. Это означает, что
новые участники пула некоторое время не смогут зарабатывать. А затем они будут равномерно
получать вознаграждение без каких-либо операционных сборов администратору пула.
Участие в пулах с таким видом вознаграждения выгодно, но туда всё сложнее попасть. Пулы
достаточно сильно продвинулись в своем развитии. Существует несколько протоколов, чтобы
запустить пулы майнинга. Существует мнение, что данные протоколы следует стандартизировать
как часть системы Биткойн.
Протоколы для запуска пулов майнинга схожи с протоколами системы Биткойн, которые
используются для функционирования одноранговой сети, и представляют собой интерфейс
прикладного программирования (API), который используется для осуществления коммуникаций
между администратором пула и всеми членами пула. Они позволяют администратору пула сообщать
о том, когда необходимо начинать работу над новым блоком, какой блок следует искать, и чтобы
майнеры могли отправить администратору пула найденные шары. Некоторые аппаратные устройства
для майнинга поддерживают эти протоколы на уровне аппаратного обеспечения.
Достаточно купить такое оборудование для майнинга, подключить к электросети, установить сетевое
соединение, выбрать пул. После этого оборудование сразу начнет получать инструкции от пула и
майнить. Майнинг-пулы впервые были образованы примерно в 2010 году, в период популярности
видеокарт для майнинга, то есть несколько поколений назад. Они быстро завоевали популярность,
так как снижали дисперсию распределения созданных блоков для майнеров-участников пула.
Таким образом, к 2014 году подавляющее большинство всех майнеров стали участниками пулов
совместного майнинга. Мало кто сейчас занимается майнингом отдельно, не вступая в пулы. В июне
2014 года произошло интересное событие - самый крупный пул GHash.io настолько увеличился, что
на него стало приходиться 50% мощности всей системы Биткойн. Это то, чего сообщество Биткоин
долгое время боялось, однако, по существу, GHash предлагал такие хорошие условия всем майнерам,
вступившим в пул, что все захотели присоединиться. В последствии пул GHash немного
уменьшился, так как они сделали свои операционные сборы менее привлекательными, чтобы
попытаться снизить количество майнеров пула. Примерно половина мощности сети Биткоин
контролируется, в основном, 2 пулами совместного майнинга. Остальная часть приходится на
небольшое число других пулов майнинга.
Преимуществом пула майнинга является то, что он делает майнинг более предсказуемым для
участников пула. И облегчает процесс вовлечения небольших по мощности майнеров в игру.
Дисперсия распределения созданных блоков сделала бы невозможным майнинг по экономическим
причинам без существования майнинг-пулов, участвуя в котором, можно на гораздо меньшем по
мощности оборудовании зарабатывать деньги.
Еще одно преимущество майнинг-пула состоит в том, что существует один главный администратор
пула, который подключен к сети и собирает блоки. Фактически это упрощает обновление сети, так
как, при обновлении программного обеспечения администратора майнинг-пула, эффективно
обновляется и программное обеспечение всех участников пула.
Безусловным недостатком майнинг-пулов является то, что они ведут к централизации. И остается
нерешенным вопрос, какой властью на самом деле обладают управляющий элемент майнинг-пула.
Конечно, теоретически майнеры вправе свободно переходить из пула в пул столько, сколько им
захочется. Если майнер получает прибыль в одном пуле, он вероятнее всего будет получать столько
же и в другом пуле, так как вознаграждение, которое они выплачивают, схожи. Сегодня все они
предлагают примерно одно и то же. Но на практике майнеры нечасто меняют пулы просто потому,
что им лень, им легче продолжать сотрудничать с пулом, в который они уже вступили.
Еще одним недостатком пулов совместного майнинга является то, что они способствуют снижению
количества полных нод. Раньше отдельным майнерам приходилось запускать свою собственную
полную ноду. Им всем приходилось хранить полную версию цепочки блоков и верифицировать
каждую транзакцию. Сейчас большинство майнеров перекладывают эту задачу на администратора
пула.
Ранее было сказано о том, что основными задачами майнера являются обеспечение себя
высокопроизводительным оборудованием, дешевой электроэнергией, высокой скоростью
вычислений и надежда на удачу.
Майнерам приходится решать, на основе какого блока они будут продолжать цепочку. В данном
случае стратегия по умолчанию заключается в выборе самой длинной действительной цепочки,
которая была объявлена. Но если 2 человека создают блок одновременно, то майнерам приходится
решать, какую из цепочек блоков продолжать, так как обе они будут самыми длинными цепочками в
истории.
Майнерам приходится решать, когда объявлять о нахождении нового блока, они могут объявить
либо сразу после нахождения, либо выжидать какое-то время и только затем объявлять остальным.
Что если майнер хочет изменить некоторые из этих стратегических решений? Можете ли майнер
зарабатывать больше денег, если будет применять стратегии, отличные от базовой?
Все зависит от того, какие мощности у него имеются - выразим их с помощью параметра α, который
находится в пределах от 0 до 1 и показывает, какую долю мощности от мощности всей сети
контролирует майнер.
Оказывается, что для некоторых α можно заработать больше, применяя стратегии не по умолчанию.
Самая простая атака – это атака "double spending",основная идея которой заключается в проведении
двойного расходования.
Допустим, есть действительная цепочка блоков, майнер отправляет деньги какой-либо жертве,
например, Бобу. Так что, может показаться, что транзакция по отправке денег Бобу находится в
самой длинной действительной цепочке блоков.
Затем атакующий майнер будет работать над более ранним блоком, и для осуществления этого на
практике ему потребуется работать над блоком, который расположен примерно на 6 блоков ранее в
цепочке, основываясь на стандартном количестве подтверждений, которые обычно ждут, прежде чем
принять, что платеж окончательный.
На данном этапе этот блок не будет считаться достоверным, так как он основывается на более ранней
точке. Он не находится в самой длинной действительной цепочке блоков. Однако если майнер
обладает большей частью мощности, т.е. если α больше 0,5, то, в конечном счете, его альтернативная
цепочка блоков будет длиннее, чем та, которая ранее была самой длинной. И в этот момент его самая
длинная цепочка блоков становится действительной.
Таким образом, майнер переписал историю, удалил тот платеж, который был проведен в адрес Боба,
и вернул себе биткойны. И если майнер получил что-то в обмен на эти биткойны, например, валюту
или какие-то товары в реальном мире, которые сложно забрать обратно, то майнер обманул Боба.
Это нечестный способ получения прибыли, возможен если майнер контролирует большую часть
мощности сети.
Итак, атака возможна, если α больше 0,5. На практике это может быть возможным и с , который
принимает значение немного меньшее, чем 0,5, вследствие перегрузки сети и того факта, что в
составе одного пула майнеру не следует работать над сталкивающимися блоками в альтернативной
цепочке блоков.
Иногда говорят об атаке "51" в сети Биткойн, однако было бы ошибкой считать, что это магический
порог, перейдя который, внезапно можно совершить атаку. В действительности, это скорее похоже
на склон, который демонстрирует, что совершить атаку становится легче по мере роста α от 0,5 до 1.
Если майнер пытается совершить атаку с привлечением большого количества других майнеров, это
может стать заметным и сообщество может не принять его альтернативную цепочку, даже если она
будет самая длинная. А может случиться так, что как только майнер начнет совершать подобные
атаки, люди потеряют доверие к системе, что приведет к снижению стоимости биткойна в долларах
США.
На самом деле, если такая атака будет совершена в крупном масштабе, возможно, это приведет к
полному отказу от валюты вследствие резкого падения доверия к ней.
Так кто может обвалить систему Биткоин подобным образом? Такую атаку называют атака
Голдфингер. Она названа так вчесть знаменитого злодея из фильма о Джеймсе Бонде, который хотел
сделать радиоактивным все золото, которое правительство США хранило в Форт-Ноксе, чтобы
фактически уничтожить золотой запас США.
Поэтому, если цель майнера состоит в уничтожении биткойна, тогда, возможно, он захотчет
совершить атаку "double spending", чтобы специально обвалить рынок, сделать биткойны
бесполезными и, возможно, подзаработать либо на продажах без покрытия, либо за счет
значительных запасов некоторых конкурирующих валют.
Помимо этих угроз, неясно, при каких еще сценариях необходимо беспокоиться о
крупномасштабных атаках.
Хотя возможно, что совершить атаку легче, чем достичь значения α>0,5. Чтобы достичь α>0,5
требуется скупать вычислительные мощности, а это очень дорого. При этом они должны быть
больше, чем у кого-либо. Гораздо проще и дешевле подкупить людей, которые контролируют
вычислительные мощности. Можно передать им конверт, полный наличных денег. Или объявить о
создании нового пула совместного майнинга и работать в убыток. Например, объявить, что о награде
1,01, что явно противоречит принципу устойвивого развития, но тем не менее привлечет майнеров в
пул и, возможно, позволит выйти мощности пула за рамки 50%. Также существуют некоторые
другие искусные методы заставить людей работать над вашей альтернативной цепочкой блоков,
например, оставляя подсказки в цепочке блоков.
Участие в такой схеме невыгодно для майнеров в долгосрочной перспективе, так как они будут
наносить ущерб валюте, в которую вложили столько денег (учитывая затраты на оборудование) в
надежде, что она будет оставаться устойчивой.
Так почему подкуп все же возможен? У всех майнеров есть стимул поддерживать валюту биткойн
жизнеспособной, однако у отдельных майнеров появляется стимул отступить и принять взятку с
целью обогащения в краткосрочной перспективе.
Могут ли такие атаки посредством подкупа, как описанные выше, быть жизнеспособными?
Одной из мер защиты, существующих в сети Биткойн против таких атак, является профилактическое
копирование памяти в контрольных точках. С 2010 года каждая версия базового биткойн-клиента
поставляется с определенной контрольной точкой и отказывается принять версии цепочек блоков,
которые не относятся к этой версии.
Прежде чем считаться самой длинной цепочкой блоков, в нее должны входить несколько сотен
блоков. Поэтому появляются вопросы о последствиях этого в плане, насколько система
децентрализована. Так как теперь это означает, что, по сути, центральная сторона, т.е. разработчики,
которые поддерживают базовый биткойн-клиент, решают в некоторой степени, какая цепочка блоков
будет считаться достоверной.
Но следует отметить, что это способствует снижению риска глубокого разветвления в цепочке
блоков.
Еще один вид атаки – атака "утаивание блока" (block-withholding). Основная идея заключается в том,
что майнер не объявляет о блоках сразу, как только находит их. Вместо этого он хочет попытаться
опередить остальных. "Опередить" значит найти два блока подряд, прежде чем остальные майнеры
найдут хотя бы один. До тех пор пока кто-то утаивает два найденных блока, остальные майнеры
будут пытаться продолжить, как они считают, самую длинную достоверную цепочку блоков. И все
эти усилия окажутся пустой тратой времени для них.
Поэтому, пока кто-то опережает остальных на 2 блока, он майнит, по сути, без конкурентов. Как
только остальные найдут действительно достоверный блок, они сразу опубликуют его, и все примут
его. Но затем майнер, который утаивал 2 блока, мгновенно их объявляет, и его цепочка немедленно
становится самой длинной достоверной цепочкой блоков. И этот блок, который остальная часть
майнеров так усердно пыталась найти, мгновенно становится изолированным и отрезанным от самой
длинной цепочки блоков. Данный подход был назван "эгоистичным майнингом".
Так что произойдет, если применить стратегию "утаивание блоков" и опережать остальных только на
1 блок? Вместо того, чтобы быть на 2 блока впереди, как было рассмотрено ранее, у майнера лишь 1
блок в запасе. Когда майнеры объявят о найденном достоверном блоке, ему немедленно следует
объявить о своем блоке. Появляются 2 потенциально самые длинные цепочки блоков, и каждый
майнер будет решать, какую из цепочек продолжать.
Таким образом, если в запасе всего 1 блок, то необходимо вступить в гонку сразу же, как только кто-
то другой нашел достоверный блок. Жизнеспособность подхода "утаивание блоков" будет в
значительной степени зависеть от шансов на победу в этих гонках. Каким образом каждый раз
одерживать победу? Можно ожесточенно бороться за то, чтобы обрести хорошую позицию в сети
или попытаться взаимодействовать с каждой нодой. Можно попытаться подкупить людей, включив в
свой блок небольшие подсказки, чтобы сделать его более привлекательным для продолжения
цепочки. При честной конкуренции вероятность победы в гонках составляет 50%. При такой
вероятности "утаивание блоков" является улучшением только если α>0,25.
Несмотря на то, что такая атака не наблюдалась на практике, удивительно, что это вообще возможно.
Это противоречит исходной идее сети Биткойн, что без значения α>0,5, то есть без большинства
сети, не было лучшей стратегии, чем базовая. Существование этой атаки доказывает, что майнер
даже без контроля более 50% сети может использовать альтернативную стратегию и получить от
этого выгоду.
Еще один интересный случай связан с применением стратегии "punitive forking" (англ. punitive –
связанный с применением наказания, forking – ответвление). Она используется в случае, когда
майнеры хотят внести в черный список транзакции с определенного адреса, чтобы навсегда
заморозить деньги на этом адресе. Майнеры могут объявить, что они отказываются майнить для
продолжения цепочки, в которой присутствует транзакция, отправленная с адреса X.
Причина экстремальности этой стратегии в том, что если кто-то обладает меньшим объемом
вычислительных способностей, чем большинство сети, и объявляет, что отказывается майнить для
продолжения цепочки, в которую включена транзакция с адреса X, он изолирует себя от самой
длинной цепочки, и весь объем майнинга, который он сделает, по сути, оказывается пустой тратой
времени.
Таким образом, можно применить данную стратегию, однако очень быстро цепочка окажется
изолированной. И это стало бы пустой тратой времени и электроэнергии. Но есть гораздо более
умный способ применения стратегии "punitive forking" – это, так называемый, "feather-forking" (англ.
feather – флюгер, forking – ответвление). Основная идея заключается в том, что вместо того, чтобы
объявлять о своем намерении всегда работать над альтернативной цепочкой, если в нее входит
транзакция с адреса X, майнер объявляет публично, что будет пытаться создать альтернативную
самую длинную цепочку, если обнаружит, что текущая цепочка, содержит транзакцию с адреса X.
Но что через некоторое время он откажется от нее. Обычно после одного или двух блоков,
подтверждающих транзакцию с адреса X, майнер возвращается обратно к самой длинной
достоверной цепочке.
Таким образом, вероятность того, что он обрежет или изолирует блок, в котором содержится
транзакция с адреса X, если откажется после одного подтверждения, принимает значение α в
квадрате. И причина в том, что ему нужно найти два последовательных блока, чтобы избавиться от
блока с транзакцией с адреса X до того, как остальные майнеры сети смогут найти следующий
достоверный блок.
Таким образом, если у транзакции с адреса X низкая стоимость, но при этом для каждого майнера
есть вероятность, равная α в квадрате, что он может лишиться награды за блок из-за атаки,
некоторые майнеры могут не включить эту транзакцию в блок. Другими словами, майнеры могли бы
присоединиться к атакующим просто чтобы не терять свою прибыль за блок в случае, если атака
удастся.
Получается, что атакующий может навязывать остальным свой черный список транзакций , даже
если α меньше 0,5. Его успех во многом будет зависеть от того, насколько он убедит остальных в
том, что собирается совершить атаку.
Зачем майнерам создавать черный список? Эта атака позволяет изолировать кого-то так, что он не
сможет тратить свои биткоины. Атакующий может в дальнейшем попросить выкуп за вычеркивание
из черного списка. К черным спискам можно прибегнуть на законных основаниях. Возможно,
некоторые адреса обозначены правоохранительными органами как плохие, и их активы требуют
замораживания. Но гораздо интереснее, когда майнеры делают это, чтобы навязать минимальную
стоимость транзакции.
Вместо черного списка транзакций с определенного адреса майнер создает черный список
транзакций с минимальной стоимостью, которая, по его мнению, не справедлива для майнера,
занимающегося трудной работой.
Идея расставить приоритеты в пользу крупных транзакций и людей, которые редко переводят
монеты или делают это простым способом. Тогда те, кто хочет перевести маленькие суммы,
использовать сложные скрипты или перевести деньги очень быстро, будут платить более высокую
комиссию за транзакцию. В настоящее время по умолчанию, если приоритет транзакции выше, чем
0,576, майнеры подтверждают транзакцию без взимания комиссии.
Это число, полученное довольно случайным образом, но оно находится в базовом клиенте, поэтому
нужно платить, если необходимо перевести биткойны с приоритетом транзакции меньшим, чем
0,576.
В настоящее время комиссии за транзакции не так важны, и причина в том, что вознаграждения за
блок составляют 99% всех доходов, которые зарабатывают майнеры. Но в предыдущих лекциях
было рассмотрено, что размер вознаграждения за майнинг снижается каждые 4 года вдвое. Поэтому
удельный вес транзакционных сборов растет. В итоге настанет время, когда комиссии за транзакции
будут превалировать над фиксированным вознаграждением за майнинг и станут основным доходом
майнеров.
В целом майнеры могут прибегнуть к любой стратегии . Несмотря на это, на практике известно
очень мало примеров применения стратегии, которая отличалась бы от базовой. Необходимо
подчеркнуть, что не существует модели поведения майнеров, которая утверждала бы, что стратегия
по умолчанию оптимальна. Тем не менее большинство майнеров придерживается стратегии по
умолчанию, и система Биткоин функционирует исправно. Но ситуация меняется вслед увеличением
пропускной способности сети, повышением навыков майнеров, большей централизации и
профессионализации майнеров. Но даже вне этих тенденций система должна меняться в
долгосрочной перспективе под влиянием перехода от фиксированного вознаграждения за майнинг к
комиссиям за транзакции.
Эта лекция посвящена вопросам анонимности в системе Биткоин. Существуют разные мнения о том,
насколько анонимен биткоин.
Буквально "анонимный" означает "без имени". Исходя из этого определения свойство анонимности
можно интерпретировать двумя способами. Первый - в системе не используются настоящие имена
(реальные личности). Второй - в системе вообще не используются какие-либо имена.
Известно, что адреса биткойн представляют собой хэши открытых ключей, а не имена реальных
личностей. Тогда в соответствии с первым способом интерпретации термина "анонимность" Биткоин
полностью анонимен. Но в то же время есть хэши открытого ключа, которые выступают в качестве
псевдоидентификаторов. И поэтому, в соответствии со вторым способом, термин анонимность здесь
не подходит. Ученые называют это использованием псевдонима. Между анонимностью и
использованием псевдонима есть четкая разница.
Ранее говорилось о том, что можно создать любое количество открытых ключей (псевдонимов). Но
сделает ли это псевдоним анонимным? Анонимность в информатике - это просто не связанная ни с
чем псевдонимность.
Биткойн - это больше псевдонимная модель, чем анонимная. Почему просто использования
псевдонимности недостаточно для приватности? Если в системе используется псевдоанонимность,
разве может кто-то соотнести псевдоанонимный профиль с реальной личностью? Фактически
псевдоним недостаточно защищен, потому что для него очень легко в какой-то момент установить
обратную связь с реальной личностью, которой он принадлежит. Тогда все прошлые, настоящие и
будущие сделки будут связаны с этой личностью. Есть несколько случаев, когда это может
произойти. Например, существует множество сервисов, таких как торговля Биткойнами онлайн,
услуги кошелька, биржи и другие, которые захотят получить связь с реальной личностью, чтобы
предложить ей сотрудничество.
Рассмотрим следующую аналогию. Боб пришел в кафе и заплатил за свой кофе биткоинами.
Продавец в магазине знает, кто является покупателем, даже несмотря на то, что он может не знать
настоящего имени Боба. Получается, некие идентификационные данные становятся привязаны к
одной из транзакций в биткоине. И если эта транзакция Биткойн затем привязывается ко всем
транзакциям Боба, это полностью нарушает анонимность Боба. Таким образом, использование
псевдонимов крайне незащищено. Его можно легко скомпрометировать различными способами, а
также, даже если прямой связи не произойдет, связанные профили могут быть лишены анонимности
из-за боковых каналов. Что имеется ввиду? Возможно, кто-то смотрит на профиль транзакций Боба с
использованием псевдонима и обнаруживает, что он подключается к сети в определенное время
суток. В этом случае можно сопоставить время дня, когда Боб активен в сети со временем дня, когда
его учетная запись Twitter публикует твиты. Благодаря этому можно найти связь между Твиттером
Боба и транзакциями в Биткойн. Известно, что подобные атаки происходят регулярно, именно
поэтому понятие псевдонимов считается довольно хрупким. Поэтому для реальной анонимности
требуется больше несвязности. Попробуем определить более конкретно, что означает несвязность в
контексте Биткойна. Во-первых, должно быть сложно связать разные адреса одного и того же
пользователя. Во-вторых, должно быть сложно связать разные транзакции одного и того же
пользователя. В-третьих, должно быть сложно связать отправителя платежа с его получателем. Это
может показаться недостижимым, так как платеж представляет собой транзакцию в блокчейне с
входами и выходами. Но если рассматривать платеж не как прямую транзакцию между получателем
и отправителем, то получатель и отправитель могут быть непосредственно не связаны в блокчейне.
Поэтому несвязность между получателем и отправителем может быть достигнута не для всех
транзакций, а для некоторых подмножеств транзакций, которые похожи друг на друга. Это
называется максимизацией конфигурации анонимности. Конфигурация анонимности - это набор
адресов или транзакций, которые необходимо скрыть. Если Боб уверен, что его оппонент получает
тысячи транзакций, похожих на транзакцию Боба и не может точно сказать, какие из этих транзакций
пришли от Боба, можно считать, что анонимность на хорошем уровне. Вычисление степени
анонимности – непростой процесс. Сначала необходимо точно определить модель оппонента, что он
знает и что не знает. Для этого нет общей формулы, ситуация требует тщательного анализа
протокола и системы в каждом конкретном случае.
Необходимо отметить, что в Биткойн часто проводится интуитивный анализ услуг анонимности,
например, услуги микширования, которая будет рассмотрена позже в этой лекции. Для оценки
анонимности придумывают способы такие, как анализ заражения. Это интуитивно понятный способ
отслеживания потока между конкретным адресом отправки и адресом приема. Несмотря на простоту,
анализ заражения не является подходящим методом для расчета анонимности. Причина в том, что он
предполагает определенный тип атаки, которую может совершить противник. Это довольно простая
атака, непосредственно направленная на определение количества потоков между отправляющим и
принимающим адресами. Поэтому если противник окажется умнее, он может реализовать другой вид
атаки, и тогда расчет анонимности методом анализа заражений окажется неверным. Расчет степени
анонимности должен выполняться с точки зрения конкретной конфигурации анонимности, а в
некоторых случаях с учетом распределения вероятностей для этой конфигурации анонимности. И
это требует тщательного анализа протокола обмена данными в системе.
Почему люди хотят анонимности? Денежные операции на основе блокчейн полностью, публично и
постоянно отслеживаются, поскольку по всем транзакциям ведется учет. Фактически это значит, что
если чьи-то идентификационные данные когда–то были связаны с транзакцией биткоинов, его
уровень конфиденциальности намного ниже, чем в традиционной банковской системе.
Несмотря на то, что в системе Биткоин блоки недостаточно анонимны и можно отслеживать потоки,
настоящая сложность для тех, кто отмывает деньги, заключается в переводе биткоинов в валюту, то
есть обналичивание. Плюсом является то, что все попытки повысить анонимность внутри системы
Биткоин никак не упрощают процесс обналичивания, то есть не способствуют нелегальной
деятельности.
Такая дилемма возникает далеко не первый раз. Для примера рассмотрим Tor. Tor - это сеть связи,
которая проводит сообщения между отправителем и получателем через сеть узлов. С помощью
шифрования сеть гарантирует, что до тех пор, пока хотя бы некоторые узлы в этой сети правильны
(не вредоносны), злоумышленник не сможет связать отправителя с получателем. Очевидно, что это
может быть использовано для достижения как честных, так и нечестных целей. Tor используется,
прежде всего, обычными людьми, которые хотят защитить себя или сохранить конфиденциальность
в Интернете при просмотре веб-сайтов. Он используется журналистами, активистами, диссидентами
и т. д. Он также используется правоохранительными органами. Подставные агенты могут посещать
веб-сайты и не афишировать, что их IP-адрес принадлежит правоохранительным органам. Всё это
положительные стороны использования Tor. Но есть и отрицательные стороны. Так, например, с
помощью Tor бот-сеть распространяет вредоносное программное обеспечение. Различить эти
ситуации технически почти невозможно. И поэтому Tor столкнулся с той же проблемой, что и
биткоин. В целом можно сделать вывод о том, что развитие технологии для мира лучше, чем их
отсутствие, и на самом деле одним из основных спонсоров Tor является Государственный
департамент США. Tor помогает диссидентам в других странах, которые борются с репрессивными
правительствами. Недавно так же появилась новость о том, что ФБР провело успешную операцию с
использованием подставного агента против людей, использующих Tor для распространения детской
порнографии. Поэтому необходимо помнить, что существует уровень над технологиями, который
может быть использован правоохранительными органами, и есть различные способы найти людей,
которые используют новые технологии для совершения преступлений.
Следует отметить, что Биткоин не является первой попыткой создания анонимной криптовалюты.
Фактически, еще в 1982 году криптограф Дэвид Шаум предложил нечто вроде "слепых подписей",
которые помогли ему разработать в дальнейшем анонимные электронные деньги.
Слепые подписи - это двухсторонний протокол. Две стороны общаются друг с другом, и в конце
взаимодействия одна сторона производит цифровую подпись некоторого входа, не зная, что это за
вход.
Допустим, что есть банк и протокол анонимных электронных денег на основе слепых подписей ( рис.
6.1). В своей базе данных банк хранит две таблицы. Первая таблица имеет сопоставление
пользователей с балансом, который они имеют на своем банковском счете. Кроме того, у банка есть
еще одна таблица с серийными номерами потраченных монет. Предположим, пользователь хочет
вывести анонимную монету стандартного наименования. Допустим, номинал монеты - 1 доллар, и
все значения относятся к долларам. Таким образом, первое, что банк собирается сделать при
получении этого запроса, это вычесть баланс этого пользователя, он снизился с 10 до 9. Следующее,
что пользователь и банк собираются сделать вместе, это выполнить двухсторонний протокол.
Протокол слепой подписи, в конце которого пользователь выбирает случайный серийный номер
монеты. Это серийный номер для анонимной монеты, и пользователь полностью свободен в выборе
этого номера. Он сделал это, и затем был выполнен протокол, в конце которого пользователь
получил подпись серийного номера, но таким образом, что банк фактически не узнал серийный
номер. Банк не знал, какой номер он подписывал. Он просто знал, что был номер, который он
подписал.
И теперь этот подписанный номер представляет собой анонимный электронный ключ (token). Это
электронный ключ, который пользователь может передать другому пользователю. Итак, допустим,
он хочет сделать платеж другому пользователю. Для этого он отправит этому пользователю не
только подписанный электронный ключ, но и текстовое значение электронного ключа, то есть
серийный номер.
Принимающий пользователь (красная фигура на рис. 6.1) должен немедленно звонить в банк и
пытаться внести этот электронный ключ. Потому что в этой системе синий пользователь может
попытаться произвести двойной расход. Синий пользователь может отправить эту же анонимную
монету 100 различным пользователям. Именно поэтому, когда красный пользователь получает
монету, она должен немедленно связаться с банком, чтобы проверить, действительно ли это честная
сделка. Банк получает сообщение о возврате монеты и отмечает, что теперь он получает
окончательный серийный номер в виде обычного текста, а также его собственную подпись. Банк
проверяет, что это действительная подпись. И, что важно, что он также проверяет, что серийный
номер, который он получил, не входит в список потраченных монет. Вот как он узнает, что это не
попытка двойных расходов. Это законные первые расходы на монету, которую банк ранее
подписывал. И так как банк не видел серийный номер в первый раз, банк не знает, какой
пользователь изначально вывел эту анонимную монету. Вот так достигается анонимность в этом
протоколе.
В период времени между тем как выполняется вывод синим пользователем этой монеты, а затем,
возможно, намного позже, отправка ее красному пользователю, который немедленно сдает её на
хранение, многие другие пары пользователей могут сдавать на хранение и выводить свои монеты. И
у банка нет возможности их различить.
Вернемся к описываемой части протокола. Банк проверяет, что это новый серийный номер, который
он видит в первый раз. Он помещает этот серийный номер в свой список потраченных монет так, что
монета с таким номером больше не может быть потрачена. И добавляет один доллар, или другую
валюту, на счет красного пользователя. И затем отправляет сообщение, в котором говорится, что все
в порядке.
После этого красный пользователь подтверждает, что он получил законную анонимную монету от
голубого пользователя и теперь они могут перейти к завершению транзакции ( рис. 6.2).
Рис. 6.2. Анонимная электронная валюта на основе слепых подписей. Банк не может связать
отправителя и получателя.
Это очень простая анонимная электронная схема, и ключевым свойством здесь является то, что банк
не может связать этих двух пользователей.
Недостатком этой системы является банк, от доверия к которому она полностью зависит. Эта модель
доверия сильно отличается от той, что используется в Биткоин. Поэтому со временем
децентрализация стала более важной задачей, чем анонимность, для развития электронных денег.
Люди были готовы принять децентрализованную систему электронных операций только свойством
псевдонимности, а не реальной анонимности, а затем начать работу над улучшением анонимности.
Как правило, анонимность и децентрализация противоречат друг другу. Для этого есть, по крайней
мере, несколько причин. Из рассмотренного на рис. 6.1 протокола с использованием слепых
подписей видно, что можно рассчитывать на анонимность, но при этом нельзя справиться без
центральной роли банка в этой схеме.
Терминологический словарь
ECash - The Eastern Caribbean Automated Clearing House, электронная сеть для выполнения
электронных транзакций.
Tor (сокр. от англ. The Onion Router)— свободное и открытое программное обеспечение для
реализации второго поколения так называемой луковой маршрутизации. Это система прокси-
серверов, позволяющая устанавливать анонимное сетевое соединение, защищённое от
прослушивания. Рассматривается как анонимная сеть виртуальных туннелей, предоставляющая
передачу данных в зашифрованном виде. С помощью Tor пользователи могут сохранять
анонимность в Интернете при посещении сайтов, ведении блогов, отправке мгновенных и почтовых
сообщений. Есть возможность обеспечить анонимное использование Bitcoin при помощи Tor.
Бывший разработчик Bitcoin Майк Хирн, до того как ушёл на работу в R3, создал клиентское ПО
этой криптовалюты, названный bitcoinj. В отличие от оригинала, он написан на языке Java и
сопряжён с сетью Tor, что позволяет обеспечить анонимность лиц, пользующихся кошельками или
службами, которые принимают Биткойн.
Ранее было сказано, что биткойн использует псевдонимы, и поэтому все транзакции или адреса
могут быть связаны друг с другом. Рассмотрим, как это может произойти.
На этой странице есть ссылка для пожертвований. Это хэш открытого ключа. А рядом с ним
размещена кнопка обновления. Если нажать на эту кнопку, будет сформирована новая ссылка для
пожертвований.
Каждый раз, когда человек хочет сделать пожертвование, оно отправляется новому публичному
ключу, создаваемому WikiLeaks именно для этой транзакции. Таким образом, Wikileaks по
максимуму использует возможность создавать новые открытые ключи. Они получают каждую
транзакцию по новой ссылке.
Это лучший метод, который предлагает Биткойн для достижения анонимности - всегда получать
новые транзакции по новой ссылке, то есть по новому адресу.
Можно подумать, что эти разные адреса не связаны. Рассмотрим, как кто-либо может их связать с
помощью следующей ситуации.
Алиса идет в супермаркет и хочет купить чайник. У Алисы есть несколько Биткойнов разного
достоинства, а в магазине чайник стоит восемь биткойнов.
Алиса имеет разные ссылки и хочет заплатить за чайник. Но у нее нет ссылки с восемью
биткойнами. Поэтому она собирается объединить несколько разных транзакций ввода в одну
транзакцию, чтобы заплатить восемь биткойнов в магазине ( рис. 6.4).
Рис. 6.4. Алиса покупает чайник в магазине
Те, кто наблюдает за этой транзакцией, которая в настоящий момент записывается в блокчейн, видят
два разных источника транзакции. Это может произойти только потому, что оба входных адреса
находятся под контролем одного и того же пользователя. Адреса смогли использовать программное
обеспечение кошелька для создания транзакции, которая объединила их в одну.
Другими словами, общие расходы свидетельствуют о совместном контроле двух разных адресов, и
это не все. Речь идет не только о связи двух разных адресов, которые являются исходными данными
для транзакции. Можно следить за всеми адресами, принадлежащими Алисе. Как только она создаст
новую транзакцию, которая объединяет один из этих адресов с новым адресом, можно добавить этот
новый адрес в набор адресов, которые ей принадлежат.
Это первый способ, как можно связать транзакции вместе. Позже будет рассмотрен метод
анонимности, называемый Coin Join (соединение монет), который помогает избежать такой атаки.
Однако этот способ является надежным только в случае использования обычного программного
обеспечения Биткойн-кошелька, и это было показано во множестве исследовательских работ. В
частности, одна из научных работ "Анализ анонимности в системе биткойнов" использовала этот
метод для определенной цели. Несколько лет назад была широко известна кража биткойнов, и
авторы этой статьи решили посмотреть, как вор перемещал Биткойны между своими несколькими
адресами. Это одна из первых крупных исследовательских работ, которые сделали анализ графика
транзакций.
Поэтому она будет использовать то, что транзакции могут иметь любое количество входов и
выходов. И есть возможность создавать одну транзакцию, которая объединяет два входа для
получения одного выхода, который остается у неё, и другого выхода, который идет на адрес,
которым она владеет. Это называется адресом изменения ( рис. 6.5).
Рис. 6.5. Адреса изменения. Какой адрес у изменения?
Адрес изменения представляет собой загадку для противника. Противник может определить, что эти
два адреса принадлежат одному и тому же пользователю. Он может подозревать, что один из этих
адресов принадлежит одному и тому же пользователю, но не имеет способа узнать, какой именно. В
этом конкретном примере адрес изменения представляет собой небольшую сумму, но это совсем
необязательно. Алиса могла бы иметь адрес, на котором 10 000 биткойнов, может немного потратить
на чайник, а может отправить большую оставшуюся часть обратно себе по собственному адресу
изменения.
Эти выходы транзакций не имеют какого-либо конкретного порядка в цепочке. Поэтому непонятно,
что может сделать противник. Неясно, как противник может определить, чей адрес изменился в
транзакции с несколькими выходами.
В настоящее время не все адреса, являющиеся выходами транзакций, обладают этим свойством. В
рассматриваемом примере с чайником, магазин может рекламировать долгосрочный адрес, по
которому он хочет получать биткойны, вместо того, чтобы каждый раз получать биткойны по
разному адресу. Таким образом, не каждый обычный адрес (не адрес изменения) имеет свойство
быть использованным только один раз, но каждый адрес изменения имеет это свойство.
С другой стороны, этот способ имеет некоторые ограничения. Это просто функция программного
обеспечения для кошелька, и поэтому существует множество ложных срабатываний, которые могут
проявляться в методах кластеризации при использовании такого метода. Тем не менее, можно
использовать технику, которая объединяет общие входы вместе, а также несколько эвристик для
обнаружения адресов изменений.
Размеры кругов представляют собой суммы денег, поступающих в кластеры, а количество ребер,
выходящих из кластера, представляет собой количество транзакций. Можно ли догадаться, кто
может быть основными поставщиками услуг и что могут означать другие кластеры?
Самый большой кластер, который доминирует в объеме транзакций по сравнению с любым другим
кластером, учитывая, что эта статья была написана в 2013 году, это Mt Gox, который в то время был
очень заметным обменником, позже исчезнувшим.
Теперь можно также предположить, что маленький кластер, который имеет малую часть от общего
объема транзакций, несмотря на то, что очень большое количество транзакций проходят через него,
относится к профилю службы азартных игр, Satoshi Dice. Satoshi Dice работает так: кто-то
отправляет ему небольшое количество биткойнов, и он либо выигрывает эту ставку, либо теряет эту
ставку, то есть удваивает свои биткоины или теряет. Итак, можно сделать выводы, что кластеры
принадлежат Mt Gox, Satoshi Dice и другим. Но подобные догадки недостаточно обоснованы, так как
это всего лишь предположения. Авторы хотели бы получить надежный способ определить, какой
поставщик услуг соответствуют каждому из этих кластеров.
Как это можно сделать? Можно зайти на сайт Mt Gox и посмотреть, какой адрес они предлагают для
получения биткойнов. Но это не сработает, потому что они могут предоставлять новый адрес для
каждой отдельной транзакции, и если кто-то просто зайдет на сайт, посмотрит адрес и не выполнит
транзакцию на самом деле, тогда они просто откажутся от этого адреса. Они не собираются повторно
использовать этот адрес для другого клиента. Другими словами, этот адрес никогда не будет
использоваться. Его нельзя будет найти в блокчейне.
Единственный способ надежно определить адреса, связанные с поставщиком услуг, - это фактически
совершить сделку с этим поставщиком услуг, что и было сделано авторами. Они взаимодействовали
различными способами со многими поставщиками услуг, совершив 344 транзакции. Это были
майнинговые пулы, услуги кошелька, биржи, различные торговцы, игровые площадки и так далее.
Фактически, большой кластер - это был Mt Gox. Чуть поменьше - Satoshi Dice. Но многие другие
было бы очень трудно отгадать, и только реально оплатив услуги, авторы смогли идентифицировать
большинство этих поставщиков услуг.
Итак, на данном этапе понятно, как можно определить кластеры и тех, кому они принадлежат.
Следующий вопрос – связать эту информацию с реальными личностями. По крайней мере, есть
несколько разных способов, которыми это можно сделать. Один из них интуитивный. Ранее был
рассмотрен пример с покупкой кофе. После совершения такой транзакции, у продавца кофе будет
достаточно информации для маркировки кластера покупателя кофе. Но есть и другие способы.
Об этом впервые заговорил Дэн Каминский несколько лет назад в статье "Разговоры с черной
шляпой". Он заметил что, когда узел создает транзакцию и хочет ее транслировать в одноранговую
сеть, он будет подключаться сразу к множеству узлов и транслировать эту транзакцию. Итак, если
несколько узлов в сети объединятся, они могут понять, что это новая транзакция, на основе того, что
она является первой, о которой они узнали от этого конкретного узла. Таким образом, это должен
быть узел, имеющий IP-адрес, соответствующий пользователю, который создал эту транзакцию.
Итак, здесь есть связь не между кластером и реальным пользователем. Вместо этого есть связь
между транзакцией и IP-адресом, и, конечно же, IP-адрес - это нечто очень близкое к реальной
личности. Есть множество способов узнать, кому принадлежит конкретный IP-адрес.
Однако Tor предназначен для так называемой активности с низкой задержкой, такой как просмотр
веб-страниц. В случае с небольшим потоком Tor идет на некоторые компромиссы в анонимности,
чтобы добиться низкой задержки.
Биткойн по своей сути является системой с высокой задержкой, потому что для распространения
транзакций по сети требуется некоторое время, и особенно для подтверждения в блок-цепочке.
Таким образом, нет ограничений, связанных с низкой задержкой. Поэтому можно создать более
практичную, лучше настроенную анонимную сеть для поддержки работы Биткоин. Существуют так
называемые смешанные сети, которые могут предложить более высокую анонимность. Но пока это
не до конца исследованная область, а Tor это широко исследованная система, надежно
функционирующая уже сегодня.
Подведем итоги. На основе информации в блочной цепочке разные адреса могут быть связаны друг с
другом, а также могут быть связаны с реальной личностью. На основе информации на сетевом
уровне транзакция или адрес могут быть связаны с IP-адресом. К счастью, последнюю проблему
просто решить. Чтобы повысить анонимность и конфиденциальность при использовании Биткойн,
нужно менять используемые адреса.
Терминологический словарь
Mt Gox – (Mount Gox) — японская биржа цифровых валют, осуществлявшая операции между
криптовалютой Bitcoin и национальными валютами. Владела более 70% трансакций и была ведущей
биржей Биткойн.
Wikileaks (от англ. wiki и leak —"утечка") — международная некоммерческая организация, которая
публикует секретную информацию, взятую из анонимных источников или при утечке данной
информации.
Для того чтобы помешать анализу графика, рассмотренному ранее, существует множество решений.
Первое из них называется смешиванием (микшированием).
Предположим, что есть некоторая служба, которая позволяет пользователям вкладывать биткойны.
Ключевое свойство службы заключается в том, что после того, как биткойны были вложены, она
забывает, кто их вкладывал и обрабатывает все биткойны как неотличимые друг от друга. На самом
деле она могла бы объединить их все в одну гигантскую транзакцию, или она могла бы смешивать их
или разделять и объединять по-разному. Но ключевым свойством является то, что, когда
пользователи позже приходят, чтобы вывести свои биткойны, они не привязаны к монете, которую
они вкладывали, они получают какой-то другой биткойн, случайно выбранный, который ранее
получил посредник. И поэтому кто-то, кто видит эти действия в блокчейне, не имея записей, которые
может хранить посредник, из общедоступной информации в блок-цепочке не сможет связать
конечные адреса ввода с конечными адресами выхода, соответствующими одному и тому же
пользователю.
По похожей схеме работают онлайн-кошельки. В них можно сохранить биткоины, пока они не
понадобятся. Но обеспечивают ли они при этом анонимность?
В блоге New York Times Bits была запись, в которой сообщалось о предварительной публикации
документа двумя израильскими исследователями, описывающего связь между Dread Pirate Roberts,
создателем псевдонимов SO Crib, и Сатоши Накамото. Но, как выяснилось позже, это было ошибкой,
так как ссылка использовала посредника ModGaks, который является сервисом онлайн-кошелька.
Авторам пришлось отказаться от своего исследования, так как они допустили ошибку и не учли
наличия посредника в схеме.
На самом деле, они будут вести учет, когда получат депозит, и они будут поддерживать связь между
личностью и адресом биткойна. Если они будут перемещать деньги, они, вероятно, будут вести учет
этих операций. Даже если кто-то снимает биткоины с другого адреса, онлайн-кошелек узнает ссылку
и сохранит ее.
С другой стороны, в этом есть и плюсы. В онлайн-кошельке можно держать биткоины долго, в то
время как при использовании сервисов микширования пользователи хотят получить их обратно
сразу же с другого адреса.
Как работает миксер? Он запрашивает адрес, по которому пользователь хочет получать биткойны, и
он дает ему адрес для отправки биткойнов в миксер, а затем они оба выполняют транзакцию. Первый
способ увеличения анонимности - использовать серию миксеров вместо одного миксера. Этот
принцип был предложен Дж. Бонуа и др., в 2014 г. в статье "Смешанные монеты: Анонимность для
Биткоина с учетом микширования". Использование серии маршрутизаторов при межсетевом
взаимодействии имеет тот же эффект.
На рис. 6.8 изображен пользователь, который начинает сделку с монеты или входного адреса.
Допустим, противник сумел увидеть связь конкретного пользователя с его адресом. Серия миксеров
отправят его в миксер по этому адресу и вернет биткойн на другой выходной адрес, который они
предоставляют. Микширование вернет такое же количество биткойнов на выходном адресе.
Пользователь не может повлиять на это и должен доверять миксеру. Позже станет понятно, почему
это является проблемой. Сразу или чуть позже пользователь возьмет биткойны в любом количестве,
которое он получил по этому адресу, и отправит их в другой миксер, который, есть надежда, не
будет сотрудничать с первым миксером, и повторит этот процесс снова и снова.
Второй способ повышения анонимности при использовании миксеров заключается в том, чтобы
сделать транзакции максимально похожими. Это минимизирует возможность связи транзакций с
конкретным пользователем. То есть все транзакции микширования должны иметь одинаковые
размеры. Поэтому миксеры должны согласовывать стандартный размер транзакции и использовать
несколько возможных номиналов.
Четвертый способ довольно сложен для понимания. Как миксеры получают оплату за свои услуги? В
значительной степени единственный способ оплаты миксеров - это сократить размер суммы,
которую пользователь отправляет в миксер.
Это создает некую уязвимость, потому что если миксер принимает стандартный процент, тогда
противник может использовать эту информацию для привязки входной транзакции и внешней
транзакции. Поэтому некоторые текущие миксеры пытаются рандомизировать комиссию за
транзакцию. Они говорят, что спишут случайную сумму между 1% и 3%. Это не очень хорошая идея,
потому что, если провести это через цепь миксеров, тогда величина значения во фрагменте
(фрагмент – сумма, которую ввел пользователь) будет сокращаться предсказуемым образом, и это
важная зацепка для противника.
Один из способов решения указанной проблемы заключается в том, чтобы сборы за микширование
работали по принципу "все или ничего".
Другими словами, миксер должен либо поглотить весь фрагмент с небольшой вероятностью, либо
вернуть весь фрагмент. Если миксер хочет взимать плату за микширование в размере 0,1%, тогда
один раз из 1000 миксер должен поглотить весь фрагмент и 999 раз из 1000 миксер должен вернуть
весь фрагмент, не принимая никакой платы за микширование.
Миксер должен генерировать случайное число таким образом, чтобы убедить пользователя в том,
что нет обмана при создании этого случайного числа и действительно у монеты, которую
перечисляет пользователь 99,9% вероятности быть переведенной. Можно использовать
криптографию таким образом, чтобы обе стороны могли быть удовлетворены и работали правильно.
Все четыре из перечисленных выше способов необходимы, чтобы иметь что-либо, приближающееся
к математической уверенности и большую вероятность анонимности. К сожалению, практически ни
один из существующих миксеров не соответствует этим принципам.
Они используют совсем другую модель, где каждый миксер работает полностью независимо через
веб-интерфейс. И пользователь взаимодействует с ними вручную, а не автоматически через
программное обеспечение кошелька. На практике пользователь вручную вводит любую сумму,
миксер немного сокращает ее, вычитая комиссию за микширование, и переводит остаток
пользователю. Таким образом, на текущий момент микширование не предоставляет пользователям
высокой анонимности, но используя четыре способа, описанные выше, свойства анонимности могут
быть существенно улучшены. Но есть еще одна серьезная проблема, которая заключается в том, что
пользователям необходимо доверять миксерам.
Миксеры могут сделать несколько вещей, чтобы повысить свою надежность. Первый способ
заключается в том, что миксер долго предоставляет услуги и не крадет деньги пользователей, тем
самым создавая себе репутацию.
У системы репутации есть свои недостатки. Фактически оператор микширования может утверждать,
что конкурирующий оператор микширования украл все его деньги, даже если этого не произошло.
Как правило, система репутации в реальном мире может работать, даже если есть противоречивые
сведения. Например, пользователи могут доверять только словам видных членов сообщества
Биткойн.
Другой способ заключается в том, чтобы использовать маленькие фрагменты для микширования.
Таким образом, если у миксера есть вероятность в 1% кражи пользовательского фрагмента, то после
100 или около того взаимодействий с небольшими размерами блоков с определенным миксером
пользователь обнаружит кражу. В результате, пользователь научится никогда больше не
использовать этот миксер.
Система может стать лучше, если пользователи будут тестировать миксеры для надежности. Важно
помнить, что фрагменты, которые пользователи посылают в миксеры, обычно уже прошли через
другие миксеры. Таким образом, сам миксер не может знать, от какого пользователя идет этот
фрагмент, и поэтому единственное, что может сделать миксер - это случайным образом красть у
пользователей. Миксер не может украсть у конкретного пользователя. Получается, в среднем,
пользователи не будут терпеть убытки больше, чем средняя скорость кражи миксером. Таким
образом, им не нужно беспокоиться о том, что миксер может выбрать конкретного пользователя и
украсть все его деньги. И, наконец, можно использовать криптографический механизм, в котором
миксер может выдавать пользователю отчет с декларацией. Когда миксер получает фрагмент по
определенному адресу, он должен отправить фрагмент обратно на другой адрес, который
пользователь использует.
Если миксер не выполняет свои обещания, пользователь может опубликовать декларацию, и все
узнают, что конкретный миксер обманывает. И поэтому все перестанут использовать этот миксер, и
он потеряет деньги. В совокупности все три механизма обеспечивают стимулы для того, чтобы
миксеры действовали честно.
Терминологический словарь
Микширование - Биткоин миксер (англ. Bitcoin mixer, Bitcoin tumbler, Bitcoin mixing service) — это
анонимный сервис, который усложняет или делает практически невозможным отслеживание
Биткоин-транзакций до конечного получателя.
Онлайн кошелек - (англ. e-Purse или e-Wallet) — смарт-карта или другой электронный носитель со
встроенным чипом, позволяющий хранить электронные деньги и осуществлять различные платежи
Децентрализованное микширование
И, наконец, нужно отметить, что это идеологически соответствует Биткойну. Если можно избавиться
от необходимости иметь централизованный сервис для какой-либо цели, то обязательно найдется
много пользователей Биткоин, которые сочтут эту идею привлекательной.
Он предложил, чтобы разные пользователи собирались вместе для создания одной транзакции
биткойнов, которая объединяет все их входы, предположительно, равной величины. Как уже
известно из предыдущих лекций, в биткойне все подписи, соответствующие различным входам,
полностью разделены. Поэтому каждая входная подпись самостоятельна. Это позволяет
пользователям легко создавать разные входы, а также разные выходные адреса, соответствующие
разным пользователям и рандомизировать порядок их взаимодействия.
Возможна ситуация, когда пользователи, участвующие в протоколе, будут знать, какой адрес ввода
соответствует адресу вывода, хотя этого тоже можно избежать. Но если кто-то со стороны смотрит
на блок-цепочку, рассматривая только единую транзакцию, даже если он понимает, что это
транзакция Coinjoin, он не сможет сопоставить вход и выход. В этом суть Coinjoin.
Конечно, это всего лишь один раунд микширования. Далее необходимо применить те способы, о
которых было рассказано ранее в этой лекции.
Пользователи, которые хотят сделать микширование, должны найти друг друга. После этого они
должны обменяться друг с другом своими входными и выходными адресами. При этом не имеет
значения, кто конкретно из этих пользователей будет формировать транзакцию. Но уже есть
неподписанная транзакция, соответствующая отправке от этих различных входов на эти разные
выходы.
И тогда узлы передают ее, собирая подписи от каждого из участников. Теперь, если участник,
который сформировал транзакцию, был нечестен и, например, пропустил один из выходов других
участников, протокол прекратит работу, так как другие участники ее не подпишут.
Но если все в порядке, все действуют честно, тогда сделка состоится. И теперь любой партнер может
транслировать транзакцию в сеть. Два из них могли бы сделать это независимо, это не имеет
значения, транзакция, конечно, будет учитываться только один раз.
Свойство безопасности обеспечивается каждым участником, проверяющим, что его выходной адрес
представлен, и что у них на выходе получается по меньшей мере столько же, сколько на входе.
Вторая заключается в том, что участникам известна связь между входами и выходами по крайней
мере одного из участников. Эта проблема опаснее для децентрализованных миксеров, чем для
централизованных. В случае централизованного микширования можно надеяться, что разные
миксеры контролируются разными субъектами, которые не сговариваются друг с другом по разным
причинам. Подобный принцип справедлив и для децентрализованных миксеров, если известно что-
то об их идентификации. Другими словами, миксеры, имеющие известные идентификаторы и
являющиеся авторитетными, уменьшают проблему анонимности.
Есть очень простое решение, чтобы найти участников. Необходимо использовать ненадежный
сервер, к которому разные пользователи могут подключаться и находить друг друга. Но сервер не
обязательно каким-либо образом связан с тем, как будет выполняться протокол, которому уже
должны доверять пользователи.
Для решения проблемы анонимности узла существует простое решение Strawman (соломенное
пугало, подставное лицо). Пользователю нужно передать набор входов и выходов всем
одноранговым узлам, но при этом сломать связь между входом и выходом. Теперь это становится
проблемой анонимности сообщений вместо проблемы анонимности Биткойн. Для этого можно
использовать Tor. Участники собираются вместе, обмениваются входными адресами, разъединяются.
Затем повторно подключаются к Tor и обмениваются выходными адресами.
На практике это недостаточно надежный способ. Лучшим решением может стать создание
механизма маршрутизации, специально предназначенного для обеспечения анонимности участников
этого протокола – дешифровальные микс-сети.
Благодаря этому, если потенциальный противник хочет взломать каждый Coinjoin, ему придется
сделать очень много вычислительной работы. Доказательство сжигания - аналогичная концепция.
Она также называется Fidelity Bonds в биткойне. Концепция позволяет необратимо уничтожить
некоторые биткойны, отправив их на нерасходуемый адрес.
Таким образом в основе первых двух решений лежит повышение стоимости вхождения в протокол.
Следующие два решения заключаются в выявлении одного или нескольких злонамеренных
участников, которые запустили отказ в обслуживании, чтобы их выгнать и запустить Coinjoin вместе
с оставшимися участниками. Это можно сделать в случае доверия к серверу.
Это можно было бы сделать и в чисто децентрализованной манере, как это предлагал документ под
названием CoinShuffle. Был разработан криптографический протокол обвинений. Он предполагает
так называемое "нулевое знание" - любой из участников протокола может распознать нарушителей,
не имея каких-либо доказательств. При этом остальные участники откатывают назад работу
протокола.
Существует также понятие боковых каналов. Следует отметить, что боковые каналы могут быть
очень сложными. Не все виды микширования могут спасти от потоков высокого уровня, которые
могут быть идентифицированы. Рассмотрим пример. Скажем, пользователь Алиса получает
еженедельно определенное количество биткойнов в качестве дохода. И имеет привычку всегда
автоматически и немедленно переводить 5% от суммы на свой пенсионный счет.
Шаблоны, по которым происходит оплата, будут видны в цепочке блоков. Независимо от того, что
Алиса делает, чтобы скрыть связь между адресом, от которого она получает свой доход, и адресом,
на который она передает свои пенсионные накопления, шаблоны здесь будут однозначно
идентифицироваться, потому что это очень специфическое значение, и 5% также будет конкретным
значением. И есть также шаблон времени, каждый раз, когда деньги появляются
Как можно защититься от этого? Майк Херн предложил решение и назвал его уклонениям от
слияния.
Когда пользователи хотят делать платежи, вместо создания гигантской транзакции, объединить
столько ресурсов, сколько необходимо, чтобы оплатить весь платеж за один адрес. Почему бы не
иметь протокол, с помощью которого получатель может предоставить выходных адресов столько,
сколько необходимо. И отправитель, и получатель могут договориться о раскрытии имен, и
отправитель может избежать объединения разных входов и может составлять различные транзакции,
которые отправляют деньги с разных входных адресов на разные выходные адреса.
Терминологический словарь
Боковой канал - Атаки по сторонним или побочным каналам (side channel attacks, SCA) – это вид
криптографических атак, использующих информацию, полученную по сторонним или побочным
каналам.
CoinShuffle – это реализация CoinJoin, способ микширования нескольких транзакций так, чтобы
смешать части каждой из них.
В этой лекции при рассмотрении вопросов анонимности в системе Биткоин часто упоминался Tor
как анонимная коммуникационная технология. Поговорим о ней более детально.
Алиса хочет поговорить с Бобом, поэтому она предварительно выбирает путь через набор
маршрутизаторов ( рис. 6.11). Число маршрутизаторов зафиксировано в протоколе Tor – их всегда
три. Концептуально можно представить, что это будет любое число. И чем больше узлов
используется, тем выше анонимность. Узлы, обозначенные плюсом, - это узлы Tor. Алиса выбирает 3
случайных узла, чтобы написать свое сообщение.
Условие безопасности, состоит в том, что до тех пор, пока хотя бы один из этих трех узлов, который
она выбирает, не скомпрометирован или не сговорился с атакующим, она в безопасности. Сторонний
наблюдатель не сможет найти связь между Алисой и Бобом. Необходимо отметить, что в Tor
возможно много нападений. Одно из них, например, называется атакой корреляции трафика от конца
до конца. В этом случае в потоке трафика между Алисой и кем бы то ни было, могут быть модели
синхронизации, возможно, веб-сайт. И если злоумышленник контролирует обе эти ссылки, то,
просто наблюдая за корреляцией в этих моделях, он может определить, что эти два узла находятся в
контакте друг с другом, даже если он ничего не знает о маршруте, по которому прошло сообщение
между ними.
Основной идеей Tor является сокрытие информации о маршрутизации. Когда сообщение пропадает
от Алисы на первый маршрутизатор, IP-адрес компьютера Боба должен быть где-то в этом
сообщении. В противном случае, этот маршрутизатор не может соответствующим образом
перенаправить сообщение, чтобы дать ему добраться до пункта назначения.
При этом маршрутизатор не должен знать IP-адрес Боба. Потому что, если маршрутизатор
выполняет перенаправление на IP-адрес, он знает IP-адрес Алисы, потому что сообщение пришло от
нее, и IP-адрес Боба, потому что это сообщение направлено ему. И теперь этот маршрутизатор имеет
связь между двумя концами сообщения. И если маршрутизатор вредоносный, это станет проблемой.
Поэтому ответ включает в себя шифрование. Если посмотреть на рис. 6.11 зеленые ссылки
зашифрованы, но также есть незашифрованное соединение.
Рис. 6.12. Многоуровневое шифрование Tor
Это особый способ шифрования, который называется многоуровневым шифрованием ( рис. 6.12).
Алиса и первый маршрутизатор делят симметричный ключ (фиолетовый цвет). Алиса и второй
маршрутизатор разделяют другой ключ, который представлен синим цветом, Алиса и маршрутизатор
три разделяют ключ, который представлен золотым цветом.
Эти симметричные ключи не сохраняются долгосрочно ни одним из этих узлов. Они формируются
по мере необходимости с использованием протокола обмена ключами. Единственными постоянными
ключами являются долгосрочные открытые ключи маршрутизаторов. Алисе не нужно иметь
долгосрочный открытый ключ. Когда она выбирает путь к этим маршрутизаторам, она
обнаруживает, что их открытые ключи выполняют протоколы обмена ключами и получает эти
общие симметричные ключи. И когда она отправит сообщение в R1, оно будет зашифровано три
раза.
Самый внешний уровень шифрования - это симметричное шифрование между Алисой и R1, и это
позволяет R1 снимать шифрование с этого уровня.
И когда маршрутизатор снимает этот уровень шифрования, внутри он находит IP-адрес второго
маршрутизатора и зашифрованное сообщение для отправки второму маршрутизатору. Затем
выполняется следующий шаг. Маршрутизатор номер два снимает еще один уровень шифрования, а
затем маршрутизатор номер три снимает последний уровень шифрования. Теперь сообщение
является незашифрованным, состоящим из простого текстового сообщения, а также IP-адреса Боба.
Итак, маршрутизатор три отправляет это сообщение Бобу обычным текстом.
Логично было бы создать еще один слой (протокол HTTPS или безопасный просмотр веб-страниц
поверх Tor), чтобы сообщение от маршрутизатора три Бобу было зашифровано. Но сам протокол Tor
не гарантирует этого. Нет никакого способа гарантировать это, потому что Боб может быть обычным
веб-сервером, который даже не знает о протоколе Tor, и поэтому Tor не может нести за это
ответственность
Разберемся, почему не сработал бы один уровень шифрования. Например, если бы Алиса пыталась
зашифровать сообщение на всем пути от нее до R3. У многоуровневого шифрования есть очень
важное свойство, - то, что R1 знает только IP-адрес Алисы и адрес R2, не знает адрес R3 или Боба. И
так же каждый узел знает только адреса узла, который был одним шагом впереди него и одним
шагом за ним. И на самом деле, когда сообщение доходит до R2, IP-адрес Алисы больше не
присутствует даже в зашифрованном виде.
При этом если любой из узлов, например, R2, был скомпрометирован, тогда он выдал бы адреса R1 и
R3, но не Алисы или Боба. Так работает Tor.
"Шелковый путь" - известен как скрытый сервис, продававший несколько лет запрещенные товары, в
частности, наркотики. Поэтому серверу "Шелкового пути" необходимо было скрыть свой адрес. Для
того, чтобы скрыть свой адрес, сервер соединяется с "местом встречи", которое является одним из
маршрутизаторов сети Tor. Затем он публикует сопоставление между своим доменным именем и
адресом "места встречи" через службы каталогов, которые предлагает система Tor. И эти доменные
имена не являются обычными DNS-именами. Они называются луковыми адресами. При этом адрес
очень похож на открытые ключи Биткойн, потому что любой может генерировать их.
И теперь клиенту придется изучить "луковый" адрес сайта, который он хочет посетить. Когда
шелковый путь существовал, невозможно было просто набрать silkroad.com, потому что Шелковый
путь не был доступен через обычную сеть. Вместо этого приходилось каким-то образом искать этот
широко известный адрес. Это был не адрес Шелкового пути, это был луковый адрес Duck Duck Go.
Это поисковая система, которая обеспечивает конфиденциальность и анонимность. Там можно было
найти аналогичный адрес, принадлежащий Шелковому пути, и поместить его в браузер с
поддержкой Tor. Потом клиент автоматически находит сопоставление для адреса места встречи,
подключается к этой точке и через эту точку имеет анонимное и зашифрованное соединение с
конечным сервером, без необходимости публикации на сервере фактического IP-адреса. Но для того,
чтобы Шелковый путь функционировал, нужно было решить еще много проблем. У покупателей
должна была быть уверенность в том, что после оплаты Шелковый путь доставит им товар. Поэтому
поддерживалась система репутации поставщиков. Для решения проблемы анонимной доставки
покупателям советовалось предоставить анонимный PO Box.
В этой лекции были освещены вопросы анонимности в сети Биткоин и использование других
технологий для ее поддержания, в частности, анонимные коммуникационные технологии. При этом
необходимо помнить, что анонимность – двусмысленная вещь, которую можно использовать как для
плохих, так и для хороших целей.
Терминологический словарь
Луковая маршрутизация (Onion routing) — это технология анонимного обмена информацией через
компьютерную сеть. Сообщения неоднократно шифруются и потом отсылаются через несколько
сетевых узлов, называемых луковыми маршрутизаторами. Каждый маршрутизатор удаляет слой
шифрования, чтобы открыть трассировочные инструкции и отослать сообщения на следующий
маршрутизатор, где все повторяется. Таким образом, промежуточные узлы не знают источник, пункт
назначения и содержание сообщения.
Фонд Электронных Рубежей (Electronic Frontier Foundation, EFF) — основанная в июле 1990 в США
некоммерческая правозащитная организация с целью защиты заложенных в Конституции и
Декларации независимости прав в связи с появлением новых технологий связи.
DNS (Domain Name System — система доменных имён) — компьютерная распределённая система
для получения информации о доменах.
Договоренности в мире биткойна
Эта лекция посвящена взаимодействию мира биткоина с обществом и политикой, также вопросам
соблюдения законодательства и установленных правил.
Первый вид – это договоренность относительно правил. Это достижение согласия среди участников
сообщества Биткоин по следующим вопросам:
Перечисленные договоренности необходимы для того, чтобы все участники системы могли
взаимодействовать друг с другом и были согласны с тем, что в ней происходит.
Третий вид договоренности, на который опирается биткойн, – договоренность о том, что монеты
имеют ценность. Эта договоренность дает каждому участнику системы уверенность в том, что
биткоины имеют ценность, и если сегодня кто-то заработал биткоин, то завтра он сможет продать
или обменять его на что-то ценное. Любая валюта нуждается в такой договоренности. Этот вид
договоренности, в отличие от других, можно рассматривать отчасти как круговую договоренность.
Вера каждого в то, что получаемый им сегодня биткойн имеет ценность, зависит от его ожидания,
что завтра другие люди будут верить в то же самое.
То есть договоренность в отношении ценности полагается на то, что эта договоренность будет
продолжаться.
Рис. 7.1. Взаимодействие договоренностей
Точно так же договоренность об истории и договоренность о том, что монеты имеют ценность,
связаны между собой. Договоренность об истории означает, что есть согласие в том, кто владеет
монетами. Именно это согласие является необходимой предпосылкой для того, чтобы монеты имели
ценность. Так же необходима договоренность в отношении того, что монеты имеют ценность для
достижения договоренности об истории. Так вознаграждение за блок, встроенное в процесс добычи,
создает стимул заниматься добычей. Таким образом, договоренность о том, что монеты имеют
ценность, создает стимул, который позволяет достичь договоренности в отношении истории. Все три
вида договоренности связаны друг с другом. Следовательно, если одного из них не будет, другие
также не смогут существовать.
И в каком-то смысле гениальность схемы биткойна заключалась в том, что было бы очень трудно
получить один из этих видов договоренностей отдельно от других. Договоренность о правилах во
всемирной децентрализованной среде, где нет понятия личности. Аналогично договоренность об
истории представляет собой очень сложную распределенную проблему структуры договорных
данных, которая вряд ли может быть разрешима сама по себе. Не менее трудно было бы добиться
договоренности о ценности криптовалюты. Необходимо помнить, что биткойн полагается на
договоренности, то есть на согласие участников и что это согласие является хрупким и
взаимозависимым.
Есть также информационные BIP, рассказывающие о вещах, которые кто-то может не знать, или о
процессе принятия решений в системе биткоин, где говорится о том, как в сообществе биткойн все
решается.
Ключевыми разработчиками Bitcoin Core являются шесть человек, изображенные на рис. 7.2. Если
точнее, их пять, так как Сатоши Накамото в настоящее время не активен. Ключевые разработчики
это те люди, которые возглавляют продолжение разработки Bitcoin Core и отвечают за то, какой код
попадает в новые версии этого программного обеспечения.
С одной стороны, ключевые разработчики влиятельны, так как именно они определяют изменения
кода Bitcoin Core и реализуют правила по умолчанию для системы. С другой стороны, так как Bitcoin
Core является программным обеспечением с открытым исходным кодом, любой может его изменить,
создав форк (от англ. fork – развилка, вилка). Помимо этого у ключевых разработчиков нет никакой
официальной власти, поэтому они будут во главе разработки пока сообщество будут устраивать их
действия.
Право сделать форк дает пользователям больше полномочий, чем простое право на выход, как в
случае с централизованной валютой.
Рассмотрим подробнее, что произойдет, если в правилах будет ответвление (форк). На рис. 7.3
изображен хардфорк. Есть цепочка блоков (блокчейн), создающая историю. И в какой-то момент в
блокчейне, в результате разногласий по поводу правил, появится ответвление. Получится две ветви.
Одна ветвь действительна в соответствии с набором правил A, но недействительна в соответствии с
набором правил B. И наоборот, другая ветвь, которая действительна в соответствии с набором
правил B и недействительна в соответствии с набором правил A.
Если произойдет хардфорк относительно того, какими должны быть правила, тогда будут какие-то
транзакции, которые будут действительны в каждой из ветвей и будут какие-то недействительные
только в одной из них. Как только эти ветви расходятся, они не могут объединиться, потому что одна
ветвь является незаконной в соответствии с правилами B, а другая — незаконной в соответствии с
правилами A. Они разделены навсегда. Валюту слева можно назвать биткойном, так как с ним все
согласны.
После форка появляются две новые валюты, которые можно назвать A-койн, соответствующая
набору правил A, и B-койн, соответствующая набору правил B. И в момент форка каждый имеющий
один биткойн получит один A-койн и один B-койн. И с этого момента А-койн и В-койн будут
существовать раздельно, как если бы они были двумя отдельными валютами.
Они могут действовать независимо. Группа A и группа B могут развить свои правила по-разному, и,
конечно же, их цепочки блоков будут продолжать расти и, вероятно, противоречить друг другу.
Поэтому момент форка можно назвать раздвоением валюты. Потому что не только правила или
программное обеспечение, реализующее правила, разделились. Сама валюта была разделена и
раздвоена. Это может произойти в такой системе, как биткойн, но не может случиться в
традиционной валюте, где опция форка недоступна для пользователей.
По первому пути идут, когда причиной форка стало не несогласие с правилами, а желание начать
Альткойн. Это запуск новой криптовалюты с другими правилами. Кто-то пожелал сделать
собственную валюту, и ему было удобно начать с набора правил, который очень близок к биткойну.
Он счел удобным начать с блочной цепи биткойна и сделать форк от нее, как это было
проиллюстрировано на рис. 7.3. В данном случае нет проблемы - Альткойн идет своим путем. Ветви
сосуществуют мирно, кто-то из пользователей предпочитает биткойн, кто-то — Альткойн.
Более интересно, что происходит, когда форк действительно отражает борьбу между двумя группами
по вопросу будущего биткойна. В этом случае две ветви соперничают друг с другом и борются за
долю на рынке.
После форка появляется A-койн и B-койн. Каждая ветка попытается привлечь больше торговцев,
которые бы ее принимали, и больше людей, которые ее бы покупали. Ветви будут бороться за долю
на рынке. Они будут бороться за то, чтобы их воспринимали как настоящий биткойн. Вероятно,
каждая ветвь будет утверждать, что она является настоящим биткойном, и борьба между ними будет
происходить в медийном пространстве. Возможно, в конце концов, одна ветвь победит, а другая
исчезнет.
Подобного рода конкуренция, как правило, заканчивается одинаково. Как только одна валюта из
двух станет восприниматься как более законная и настоящая, имеющая большую долю на рынке,
другая становится своего рода "нишевой" валютой и в конечном итоге исчезает.
Терминологический словарь
Лицензия MIT (англ. MIT license) — лицензия открытого программного обеспечения, разработанная
Массачусетским технологическим институтом. Лицензия MIT является одной из самых ранних
свободных лицензий, так как она относительно проста и иллюстрирует некоторые из основных
принципов свободного лицензирования. Она является разрешительной лицензией, то есть позволяет
программистам использовать лицензируемый код в закрытом ПО при условии, что текст лицензии
предоставляется вместе с этим ПО.
Форк (англ. fork — развилка, вилка) или ответвление — использование кодовой базы программного
проекта в качестве старта для другого. При этом основной проект может как продолжать
существование, так и прекратить его. Ответвленный проект может поддерживать и обмениваться
частью содержимого с основным проектом, а может и приобрести абсолютно другие свойства,
перестав иметь с базовым проектом что-то общее.
Хардфорком (англ. hard fork) называют разбиение блокчейна на две отдельные цепи в результате
использования двух разных протоколов. Новый протокол также может разделить сеть, если все
участники сети не следуют за ним. Например, Ethereum Classic возник в результате хардфорка
Ethereum из-за разного понимания необходимых действий в ответ на взлом DAO.
Софтфорк (англ. soft fork) в отличие от хардфорка, софтфорк — это изменение протокола, в
результате которого созданные блоки признаются действительными и старым программным
обеспечением.
Предположим, что в сообществе возникла дискуссия о том, какой набор правил лучше использовать.
Кто имеет право принять окончательное решение? В любых переговорах есть один способ, который
помогает понять, кто имеет преимущество. Надо лишь представить, что произойдет, если переговоры
не получатся, и все сведется к драке. Человек, имеющий лучшую альтернативу в обсуждаемом
соглашении, будет иметь преимущество в переговорах. Другими словами, тот, кто может выиграть
бой, скорее всего, выиграет и переговоры. Это давнее правило детской площадки: самый большой и
сильный получит свое, даже если драться никто и не будет.
Можно сделать несколько утверждений в отношении того, у кого сосредоточена власть в системе
биткоин. Первое утверждение - власть имеют ключевые разработчики Bitcoin Core, так как они
посредством написания кода создают свод правил системы. Они могут внести любые изменения, с
которыми все по умолчанию согласятся.
Второе утверждение - власть есть у майнеров. Потому что майнеры — те, кто пишет историю.
Майнеры создают блоки, которые фиксируют произошедшие транзакции, и поэтому, если майнеры
решают следовать определенному набору правил, то, вероятно, все остальные должны им следовать.
Если среди майнеров появятся разногласия, и 80% из них захотят один набор правил, а 20% —
другой, вероятно, что группа 80% построит более крупный, более внушительный блокчейн. И
поэтому у них есть возможность подталкивать правила в определенном направлении.
Количество же их власти зависит от того является разделение хардфорком или софтфорком. Но суть
в том, что у майнеров есть определенная власть, потому что они получают возможность писать
историю, и история будет соответствовать любым правилам, с которыми майнеры будут согласны в
долгосрочной перспективе.
Третье утверждение - инвесторы имеют власть. Инвесторы покупают много биткойнов и именно они
решают, имеет ли биткойн какую-либо ценность. Если майнеры контролируют соглашение об
истории, а разработчики — соглашение о правилах, то инвесторы контролируют соглашение о том,
что биткойн будет иметь ценность. В случае хардфорка инвесторы, все или большая часть решат
поместить свои деньги в одну из ветвей, на a-койн или b-койн, тогда у той будет больше воспринятой
легитимности. Именно поэтому у инвесторов есть возможности решить, в каком направлении будет
идти развитие при форке.
Можно также утверждать, что власть имеют торговцы и их клиенты, потому что именно они
генерирует основной спрос на биткойны. Да, инвесторы генерируют некоторый спрос, который
важен для оценки валюты. Но основной спрос, который стимулирует цену валюты, обусловлен
желанием посредничать в транзакциях с использованием биткойна в качестве технологии
транзакций. Торговцы и их клиенты стимулируют спрос, и, как следствие, они управляют
долгосрочной ценой биткойна. Инвесторы, согласно этому аргументу, просто пытаются
предположить, где в будущем будет основной спрос. Таким образом, инвесторы догадываются, куда
будут идти продавцы и клиенты, и, следовательно, именно продавцы и их клиенты действительно
имеют власть.
Платежные системы также имеют власть, так как именно они обрабатывают транзакции. Многим
продавцам не важно, какую валюту использовать, но они хотят такую платежную систему, которая
даст им доллары, простоту использования и возьмет на себя все риски. И если продавцы и клиенты
имеют власть, но все равно полагаются на платежные системы, которые проводят транзакции, то,
возможно, власть как раз и сосредоточена у платежных систем, поскольку они привлекают
первичный спрос. А торговцы, клиенты и инвесторы будут следовать им.
Каждая из рассмотренных групп имеет определенную власть, но факт состоит в том, что она
обладает лишь частью власти. Чтобы стать успешной валюта нуждается во всех формах
договоренностей. Ей нужен стабильный свод правил, написанный разработчиками. Ей требуются
инвестиции. Она нуждается в майнерах, и ей необходимо участие торговцев, покупателей и
платежных систем, которые их поддерживают. Таким образом, у всех этих сторон есть определенная
власть в борьбе за будущее биткойна. В разговоре про управление биткойном необходимо упомянуть
еще одного игрока. Это благотворительный фонд Bitcoin Foundation, основанный в 2012 году. Этот
фонд выполняет две основные вещи. Он платит зарплату ключевым разработчикам или, по крайней
мере, некоторым из них, из ресурсов фонда, для того чтобы они могли полностью посвятить себя
работе над программным обеспечением. Второе, Bitcoin Foundation проводит переговоры с
правительствами, особенно с правительством США, от лица биткойн.
Стоит сказать, что Bitcoin Foundation не руководит биткойном в той же степени, как любая из
рассмотренных ранее групп. Кто-то из членов сообщества состоит в нем, другие — нет. Стоит
упомянуть разногласия, которые возникли о Bitcoin Foundation.
Появились разногласия по поводу членства в совете директоров, когда некоторые члены фонда
столкнулись с финансовыми трудностями и проблемами с законом. Фонду пришлось решать, что
делать с членами совета, которые попали под юридическую ответственность и должны быть в
короткие сроки заменены.
Существует мнение, что Биткоин должен действовать вне досягаемости действующих правительств
и вне государственных границ. Соответственно, не нужны люди, которые будут вести переговоры с
правительствами от лица сообщества Биткоин.
Наконец, были разногласия с Bitcoin Foundation относительно того, кто наделил властью этих людей.
Есть члены сообщества, которые считают, что фонд и люди, его создавшие, не являются настоящими
представителями сообщества и что они сделали себя лидерами того, на что у них не было прав.
Итак, хотя Bitcoin Foundation и имеет определенное значение, все еще есть ряд вопросов
относительно его роли в долгосрочной перспективе. Фонд по-прежнему остается довольно
противоречивой организацией, и эта тема будет обсуждаться в будущем.
Подводя итог, можно сказать, что Биткоин контролируют с одной стороны все, а с другой стороны –
никто. Нет одной организации, группы людей, которая имеет значительную власть. И в то же время
существуют договоренности относительно правил, истории и ценности, которые по факту управляют
биткойном. Любая группа, любой набор правил, любая структура, которая может сохранить эти
договоренности, будет по-настоящему управлять биткойном.
Корни биткойн
Биткойн появляется в 2008 году с выпуском технического описания (white paper) под названием
"Биткойн: децентрализованная электронная денежная система" ("Bitcoin: Peer-to-Peer Electronic Cash
System"), созданного Сатоши Накамото.
Этот документ, который можно с легкостью найти в интернете, является первым описанием того, что
собой представляет биткойн, как он работает и какая философия лежит в его основе. С ним стоит
ознакомиться, чтобы получить краткое представление о техническом дизайне биткойна и о том, как
была определена первоначальная философия его работы. Документ вышел вместе с программным
обеспечением с открытым исходным кодом системы биткойн. Все это было написано человеком
Сатоши Накамото, а Сатоши — одна из главных тайн биткойна.
Имя Сатоши Накамото наверняка является псевдонимом, который взял один или несколько человек
для работы с биткойном.
Сатоши довольно хорошо пишет по-английски и использует как американское, так и британское
правописание. Было много попыток взглянуть на текст, посмотреть на код и попытаться выяснить,
какой родной язык Сатоши? Откуда он? Попытка найти часовой пояс, какой тип машины он
использует, и все, что с ним связано. Люди пытались выяснить, кто этот человек или группа людей.
Сатоши довольно активно работал над биткойном, писал о нем и участвовал в онлайн-форумах до
2010 года. И с тех пор он почти ничего не сказал. Сатоши владеет большим количеством биткойнов с
первых майнингов. Вначале он был, пожалуй, единственным майнером, или одним из немногих
людей, добывающих биткойны, и те биткойны, которые были накоплены его счетами на раннем
этапе, чрезвычайно ценны. И все же эти счета не обналичены. Каждый может видеть, какие учетные
записи, какие адреса биткойн, возможно, принадлежат Сатоши, и поэтому, если бы эти монеты были
обналичены, если бы они были проданы, а поступления были переведены на какой-либо конкретный
банковский счет, это было бы очень заметным событием и стало бы важным ключом к разгадке
личности Сатоши.
Итак, интересно, что, хотя Сатоши и создал систему биткойн и получил на бумаге большую от нее
прибыль, он все же не может ей воспользоваться, чтобы не раскрыть себя и по каким-то причинам он
не хочет этого делать. Настоящая личность Сатоши до сих пор неизвестна.
На рис. 7.4 показан объем транзакции по дням с 2009 года и по лето 2014 года. Биткоин, как
интернет и другие популярные технологии, рос экспоненциально и взлеты на графике, как правило,
соответствуют всплескам огласки. Моменты, когда биткойн, например, стал известен в популярных
изданиях, или, когда происходили события, заслуживающие освещения в печати.
Общая ценность биткойна выросла практически также. На рис. 7.5 в начале можно увидеть очень
малый объем, похожий на ноль. А относительный рост, начинается с середины 2012 года. Это
выглядит почти как экспоненциальный рост, но с двумя пиками, наложенными на него. Один
примерно в марте-апреле 2013 года. Ценность поднимается, а затем снова опускается до основной
экспоненциальной кривой. Второй пик - примерно в начале 2014 года, когда ценность увеличилась
примерно до этого значения, а затем снова опустилось назад к чему-то близкому экспоненциальному
росту. Таким образом, биткойн рос относительно естественно с относительно постоянной
экспоненциальной скоростью с момента своего появления. И полагающие, что биткойн имеет
светлое будущее, верят, что этот экспоненциальный рост будет продолжаться.
Биткойн может очень просто, при определенных обстоятельствах, уничтожить все меры контроля
над капиталом. Ведь кто-то может купить биткойны за капитал внутри страны, вывести их за
пределы страны электронными средствами, а затем продать эти биткойны за средства, которые
находятся вне этой страны.
Таким образом можно перемещать капитал в страну и из нее. Поскольку материальные блага в
подобной электронной форме могут перемещаться очень легко сквозь границы и их невозможно
контролировать, правительство, желающее обеспечить контроль над капиталом, должно отделить
мир биткойна от местной официальной банковской системы, чтобы нельзя было переводить большие
суммы местной валюты в биткойны и наоборот. Поэтому страны пытаются усилить или защитить
свои меры по контролю над движением капитала. Ярким примером является Китай. Эта страна
принимает все более решительные меры, чтобы попытаться отключить биткойн от китайской
валютной банковской системы.
Еще одна причина, по которой правительства могут беспокоиться относительно цифровой валюты,
заключается в том, что она способствует определенным видам преступлений. В частности, таким
преступлениям, как похищения и вымогательство, связанные с выплатой выкупа. Эти преступления
легче совершать, когда оплата может производиться на расстоянии и анонимно. Например,
правоохранительные органы часто полагались на те деньги, которые они давали жертве или семье
жертвы для передачи преступникам. Когда передачу денег можно совершить по электронной почте,
сделать это на расстоянии и анонимно, правоохранительным органам намного сложнее уследить за
деньгами.
И, наконец, становится более простой продажа незаконных товаров, когда перевод средств может
производиться на расстоянии, без необходимости проходить через регулятора. Хорошим примером
этого является анонимная торговая площадка Silk Road (Шелковый путь). Silk Road был, по сути,
eBay для незаконной торговли наркотиками.
Silk Road разрешил продавцам рекламировать свои товары, а покупателям их покупать. Товары
доставлялись обычно по почте или службой доставки, а оплата производилась в биткойнах. Также
Silk Road действовал как скрытый сервис сети Tor. Поэтому серверы Silk Road были скрыты от
правоохранительных органов, и их было довольно сложно найти. А так как эта площадка
использовала для оплаты биткойны, то правоохранительным органам было сложно отследить
движение средств и выяснять, кто участвует в торговле.
Пока товар доставлялся, площадка Silk Road удерживала биткойны и не переводила их продавцу. Это
была инновационная система условного депонирования, которая помогала защитить покупателей и
продавцов от обмана третьей стороной. Биткойны переводились сразу после того, как покупатель
подтверждал, что товар прибыл.
У Silk Road была система репутации, подобная Ebay, которая позволила покупателям и продавцам
получать репутацию за то, что они выполняли честно сделки. Используя эту систему репутации Silk
Road смог дать участникам рынка стимул играть по правилам. Таким образом, Silk Road был
новатором среди криминальных рынков в поиске путей обеспечения соблюдения правил на
расстоянии. Именно этого не хватало его предшественникам. Silk Road управлял человек, который
называл себя Ужасный Пират Робертс. Площадка работала с февраля 2011 года по октябрь 2013 года.
Silk Road был закрыт сразу после ареста его владельца, которым оказался Росс Ульбрихт. Он был
арестован в октябре 2013 года, и сейчас ожидает суда. Считается, что он был владельцем Silk Road и
пытался скрыть свои следы, работая с использованием различных анонимных счетов, используя Tor,
анонимные пересылочные сервисы для электронных сообщений и т.д. Но правительственные
службы заявили, что им удалось соединить все точки и связать его с деятельностью Silk Road, с
серверами и с биткойнами, принадлежащими владельцу Silk Road. Его обвинили в ряде
преступлений, связанных с Silk Road, а также в покушении на убийство.
Правительство в ходе захвата Silk Road получило около 174 000 биткойнов, которые были проданы
на аукционе. Вырученные от продажи деньги поступили в бюджет.
Из истории Silk Road можно сделать несколько выводов. Во-первых, довольно сложно изолировать
реальный и виртуальный миры. Владелец Silk Road считал, что он может жить своей жизнью в
обществе и в то же время иметь другую, тайную сторону жизни, в которой он управляет довольно
крупной бизнес - и технологической инфраструктурой. Сложно полностью разделить эти два мира и
случайно не создать какую-либо связь между ними. Трудно оставаться анонимным в течение
длительного времени, координируя деятельность большой площадки. Несмотря на то, что можно
действовать от имени различных анонимных личностей, со временем создаются связи между ними,
которые позволяют вычислить того, кто скрывается за этими личностями. Еще один вывод, который
можно сделать из этой истории, заключается в том, что правоохранительные органы могут
отслеживать движение денег . Еще до ареста в деле "Silk Road" правительство знало, что есть ряд
адресов биткойн, которые используются владельцем торговой площадки. И они следили за этими
адресами. В результате, владелец Silk Road, будучи богатым, в действительности не мог
воспользоваться этим богатством, потому что любая попытка перевести биткойны в мир долларов
привела бы к отслеживаемому событию и, возможно, к быстрому аресту. И поэтому, хотя г-н
Ульбрихт якобы и был владельцем 174 000 биткойнов, он жил в однокомнатной квартире в Сан-
Франциско. По-видимому, он не мог использовать то богатство, которым владел.
Подводя итог, можно сказать, что даже несмотря на децентрализованность и анонимность сети
биткоин, у правоохранительных органов есть достаточно средств и ресурсов, чтобы отслеживать
движение денег в системе.
Цель политики по борьбе с отмыванием денег заключается в том, чтобы предотвратить перевод
больших сумм за границу или их скрытое перемещение из теневой экономики в легальную. Ранее
рассматривался контроль над движением капитала, благодаря которому страны пытаются
предотвратить перевод денег за границу. В некоторых случаях страны относятся к переводу денег за
границу положительно, но они хотят знать, кто их переводит и кому, откуда получены эти деньги.
Организованные преступные группы часто получают большие суммы денег в одном месте и
стараются перевести их в другое, не показывая, откуда взялись эти деньги. Или они зарабатывают
большие деньги в теневой экономике и хотят перевести их в законную сферу, чтобы их можно было
легально тратить. Борьба с отмыванием денег предназначена для того, что осложнить подобные
действия, либо попытаться поймать людей, пытающихся совершать подобные переводы, либо не
дать им этого сделать, либо чтобы обнаружить определенные виды преступлений или осложнить
работу организованных преступных группировок.
Одно из правил, касающихся борьбы с отмыванием денег, называется "знай своего клиента". Это
значит следующее:
После проверки личности клиента, бизнесу может потребоваться оценка рисков ведения дел с
определенным клиентом, не вовлечен ли он в какие-либо незаконные действия. Подобная оценка
часто основывается на том, как клиент себя ведет, насколько долгие отношения связывают его с этой
компанией, насколько хорошо он известен в этой местности и другие факторы. И, наконец,
существует требование следить за проявлениями нетипичного поведения, которое может
свидетельствовать о преступной деятельности или отмывании денег. Необходимо связать это с
оценкой риска, чтобы понять, каков будет уровень риска в отношении конкретного клиента, и на что
следует обратить внимание при ведении с ним дел. Правило "знай своего клиента" часто будет
советовать компании перестать вести бизнес с клиентом, который выглядит слишком сомнительно
или не может подтвердить свою личность или свою деятельность в достаточной степени для
соблюдения этого правила. Приведем в качестве примера законодательные меры Соединенных
Штатов Америки. Например, компании, работающие в большинстве сфер, должны сообщать о
переводах, превышающих 10 000 долларов США. Они должны заполнять отчет о транзакции, в
котором описана транзакция и кто является второй стороной сделки. При этом эта информация
должна быть подтверждена. Эти отчеты о транзакциях впоследствии анализируются с целью поиска
моделей поведения, которые свидетельствуют об отмывании денег.
Необходимо отметить, что правительства разных стран серьезно относятся к законам об отмывании
денег. И так как система биткоин в силу своей анонимности является хорошим инструментом для
отмывания денег, ей будет уделено особое внимание.
Регулирование
Основной аргумент в пользу регулирования заключается в том, что когда происходит "крах" рынка,
"плохие" результаты признаются плохими практически всеми, тогда в это может вмешаться
регулирование и попытаться решить вопрос неэффективного рынка.
Поэтому аргумент в пользу регулирования в споре начинается с той мысли, что рынки не всегда
дают желаемый результат.
Рассмотрим пример возможного "краха" рынка. Изделия, продаваемые на рынке, могут быть
высокого и низкого качества. Изделия высокого качества несколько дороже в производстве, чем
низкого, но они намного лучше для покупателя. Покупатели предпочитают высококачественные
товары. Поэтому на эффективном рынке потребителям будут поставляться в основном
высококачественные изделия. Потому что цена качественного изделия будет немного выше, но оно
будет намного лучше, поэтому практически все будут покупать изделия высокого качества.
При определенных условиях, рынок будет действовать именно таким образом. Предположим, что
клиенты по какой-либо причине не могут отличить изделие высокого качества от изделия низкого
качества.
Такое развитие рынка хуже, чем нормальное функционирование рынка. Хуже для покупателей,
потому что они должны довольствоваться низкокачественными изделиями, когда на более
эффективном рынке они могли бы купить изделие лучшего качества по незначительно большей цене.
Хуже для производителей, потому что все изделия на рынке низкого качества, и потребители их
плохо покупают. Рынок таких изделий относительно невелик, и поэтому на продаже изделий можно
заработать меньше денег, чем на здоровом рынке. Поэтому и потребителям, и производителям хуже
в мире, где покупатели не могут отличить высококачественные изделия от низкокачественных. Это -
рыночная несостоятельность или "крах" рынка. Это называется асиvметричной информацией, и
результатом является появление рынка, который называют рынком "лимонов".
Есть некоторые рыночные подходы, которые пытаются исправить рынок "лимонов". Первый
рыночный подход основан на репутации продавца. Идея состоит в том, что, если продавец говорит
правду потребителям о том, какие изделия имеют высокое качество, а какие низкое качество, то
продавец улучшает свою репутацию. И как только у него будет высокая репутация, он сможет
продавать высококачественные изделия по более высокой цене, потому что потребители будут ему
доверять. Следовательно, рынок сможет работать более эффективно.
Иногда это работает, иногда — нет, в зависимости от точности предположений, которые делаются о
рынке. Тем не менее, такой рынок не будет работать так же хорошо, как рынок, где потребители
действительно могут отличить качественный товар. Потому что, во-первых, производителю
требуется хорошая репутация. Чтобы создать хорошую репутацию, он должен некоторое время
продавать высококачественные изделия по низким ценам, пока потребители не узнают, что продавец
говорит правду. Это затрудняет доступ честного продавца к рынку.
Другая проблема может возникнуть, когда у бывшего до определенного момента честным продавца
упадут продажи, и он решит уйти с рынка. У него появится материальный стимул обмануть всех
сразу, то есть не оставаться честным до конца. Именно поэтому репутация ничего не значит в начале
деятельности продавца на рынке и в конце.
Другой рыночный подход — это гарантии. Продавец может предоставить покупателю гарантию, что
если эта вещь окажется некачественной, он вернет деньги, заменит ее на новую, починит и т.п.
У данного подхода тоже есть проблемы. Сама гарантия — это еще один вид продукта, который
также может быть хорошего качества и не очень. Гарантия низкого качества — это когда продавец
не спешит что-то делать, когда покупатель обращается к нему со сломанной вещью. Он не меняет ее,
не возвращает деньги, и покупатель впустую тратит свое время.
В случае если на рынке "лимонов" не работают рассмотренные рыночные подходы, может помочь
регулирование.
Есть три способа, с помощью которых регулирование могло бы помочь решить проблему рынка
"лимонов". Во-первых, регулирование может требовать раскрытия информации. Оно может
требовать, например, чтобы все изделия были помечены этикетками с надписью высокое качество
или низкое качество, а на те фирмы, которые указывают неверную информацию, будет налагать
штрафы. Это дает потребителям информацию, помогающую сделать выбор в пользу более
качественного товара.
Второй подход к регулированию — это наличие стандартов качества. Это требование состоит в том,
что никакое изделие не может продаваться, если оно не соответствует стандарту качества.
Устанавливается такой стандарт, что только изделие высокого качества может пройти проверку.
Другим примером несостоятельности рынка или моментом, когда рынок работает не так, является
ценовой сговор. Ценовой сговор образуется, когда разные продавцы товара на рынке договариваются
о поднятии или понижении цены на него. К ценовому сговору относится соглашение о
неконкуренции, когда компании, которые иначе стали бы конкурентами, соглашаются не
конкурировать друг с другом.
Например, если в городе есть две пекарни, они могут договориться, что в одной будут продаваться
только кексы, а в другой — только рогалики. И в этом случае между ними будет меньше
конкуренции, чем, если бы они продавали и кексы и рогалики. Результатом снижения конкуренции
будет рост цен, и торговцы могут сорвать работу рынка. Потому что причина, по которой рынок
защищает потребителей и нормально действует, заключается в конкуренции, когда продавцы
конкурируют и предлагают потребителям лучшие товары по лучшей цене.
BitLicense
Проект о лицензировании деятельности биткойн – BitLicense- был опубликован в июле 2014 года
Департаментом финансовых услуг штата Нью-Йорк. Это одна из служб штата Нью-Йорк, которая
регулирует финансовую отрасль. Принятый документ содержит нормативно-правовые акты, которые
регулируют деятельность виртуальных валют. Рассмотрим его основные положения.
Принятие закона о лицензировании происходило сложно. Публикация проекта в июле 2014 года
вызвала панику в сообществе Биткоин. После длительных, предусмотренных законодательством,
дебатов, была подготовлена вторая версия данного законопроекта. Она была опубликована 25
февраля 2015 года. После чего последовали дополнительные обсуждения, и финальная версия закона
была опубликована 24 июня 2015 года. В финальной версии был учтен ряд предложений,
полученных от сообщества.
Но в реальности этот процесс неизбежен. Как только биткойн обрел настоящую ценность,
правительство ввело правовые нормы регулирования.
Терминологический словарь
Рынок "лимонов" (англ. lemons market, the market for lemons) — модель рынка, описывающая
ситуацию на рынке подержанных автомобилей с асимметричной информацией, в результате которой
нарушается принцип действия рыночного механизма, т.к. ценовые сигналы перестают отражать
реальное положение дел.
Ценовой сговор, картельный сговор (англ. price fixing) – неформальное соглашение участников
одной рыночной отрасли продавать или покупать товары или услуги по определенной цене. Также
картельным сговором является договорное регулирование объемов закупок и продаж участниками
рынка с целью влияния на уровень цен.
Лекция 8:
Если разрабатывать новый алгоритм вычислительных задач, какие особенности позволят ему
завоевать популярность? Что будет помогать правильному развитию сети и препятствовать
неверному?
Существует множество условий, которые должны быть выполнены. Так, например, решения должны
быть легко верифицируемыми, потому что каждый узел в сети, даже не участвующий в активном
майнинге, проверяет решение задачи. Уровень сложности задач должен быть изменяемым. Так,
чтобы трудность нахождения решения могла изменяться со временем, поскольку новые майнеры при
подключении к сети увеличивают ее вычислительную мощность.
Проблема такой постановки задачи в том, что каждый раз вознаграждение получит самый быстрый
майнер сети. Предположим, что есть два майнера с одинаковой скоростью работы и третий,
превосходящий их по скорости в 2 раза. Тогда быстрейший найдет решение, пока другие будут лишь
на половине пути. Третий майнер будет получать все вознаграждения, для остальных же мотивация в
участии пропадает.
Это был пример одного из необходимых условий, остальные будут рассмотрены в ходе рассказа про
альтернативные типы вычислительных задач.
Самый известный алгоритм такого типа – scrypt. Вычисление SHA-256, используемого в биткоине,
требует всего лишь 256 бит памяти. Такой объем легко разместить в регистрах процессора. Время на
каждую операцию составляет порядка сотен миллисекунд. Значит, для полного перебора вариантов
достаточно использовать много параллельных устройств. Scrypt же использует достаточно большое
(по меркам однокристальных интегральных схем) количество памяти для хранения большого
массива псевдослучайных чисел, которые генерируются на первом шаге алгоритма. Данные массива
запрашиваются в случайном порядке и комбинируются с друг другом для создания ключа.
Поскольку алгоритм генерации массива известен, то можно реализовать scrypt без использования
памяти, но это потребует пересчета части элементов массива каждый раз заново, что достаточно
сложно и занимает много времени. Таким образом, scrypt вносит баланс между количеством
затрачиваемой памяти и временем.
Scrypt применяется во второй по популярности криптовалюте – Лайткоин (Litecoin). Кроме того, этот
алгоритм используется для криптозащиты паролей, которая так же имеет целью защиту от ASIC. Это
дает дополнительную уверенность в безопасности криптовалюты.
Пусть на входе строка символов Х. На первом шаге n ячеек памяти (n-количество шагов алгоритма)
заполняются таким образом: в первую ячейку записывается V1 хэш от X, во вторую V2 хэш от
первой ячейки, в третью V3– хэш от значения второй ячейки и так далее ( рис. 8.1).
Если реализовывать алгоритм без буфера памяти, для вычисления A надо было каждый раз
пересчитывать Vi . Общее количество пересчетов равно сумме арифметической прогрессии от 1 до n,
то есть приблизительно n/2. Полное количество вычислений SHA-256 получится n*n/2=n2/2 против
2n вычислений в случае использования буфера. То есть быстрее в n/4 раз.
На практике у scrypt есть несколько минусов. Первый – проверка решения так же требует памяти и
цикла в n шагов. Поэтому при применении алгоритма в качестве доказательства работы
накладывается ограничение на величину n, как в плане выделения памяти, так и в плане времени
выполнения.
Так же вызывает сомнения, насколько он защищен от ASIC. Дело в том, что для выбранных в
Litecoin параметров сложности (N) недостаточно для сглаживания разницы между ASIC и ПК. На
рынке уже появились специальные устройства для майнинга, однако, стоит заметить, что их
производительность в миллионы раз ниже, чем для биткоинов.
Зато у scrypt есть один неоспоримый плюс – поскольку эта функция используется так же для
шифрования паролей, то по мере ее совершенствования возможно желаемый эффект будет
достигнут.
Рассмотрим другой пример алгоритма требующего использования памяти для работы. Он называется
кукушкино хэширование. Для поиска решения на основании строки X строится неориентированный
граф. Вершины графа выбираются по алгоритму
for i = 1 to n:
i = X % N
a = H0(X +i)
b=N+ H1(X+1)
Теперь необходимо определить, есть ли в данном графе цикл длинной K (входной параметр
функции). Если такой цикл найден, то ответом будет Х и индексы вершин.
Рис. 8.3. Алгоритм кукушкиного хэширования
Почему данный алгоритм требует много памяти? Дело в том, что нахождение циклов в графе хорошо
изучено, но используемые для этого методы требовательны к объему ОЗУ. Зато проверить решение
проще, чем в scrypt, нужно просто пересчитать вершины найденного цикла. И для этого не нужно
много ресурсов.
алгоритм x11 – последовательное взятие 11 разных хэш функций. Создание ASIC для каждой
функции отдельно возможно, однако, их объединение резко увеличивает стоимость и
затрудняет построение эффективного устройства.
постоянное изменение вычислительной задачи. При таком подходе каждый промежуток
времени нужно будет создавать новый ASIC. Но при этом также возникнут проблемы у
обычных майнеров – потребуется одновременное обновление всей сети. Кроме того, если
новый алгоритм недостаточно надежен, возрастает вероятность возникновения коллизий.
наконец есть те, кто предлагает не защищаться от ASIC. Да, сейчас для биткоина
используются устройства, великолепно считающие SHA-2. Это уже давно известная
технология и резкий эволюционный скачок ее развития маловероятен. Как уже говорилось
ранее, большие ASIC это всего лишь объединения множества маленьких ASIC. Значит,
стоимость устройств растет параллельно с их производительностью.
Как уже отмечалось ранее, экосистема биткоина очень ресурсоемка. По разным оценкам вся сеть
майнеров потребляет от 150 до 900 мегаватт энергии, что сравнимо с мощностью небольшой
гидроэлектростанции. Но вся мощность используется только для высчитывания SHA-2 хэшей и не
имеет какой-либо полезной функции.
Учитывая вышесказанное, появляется резонный вопрос: есть ли такой алгоритм, который приносил
бы пользу всему обществу, при этом выполняя функции, необходимые для биткоина? Такой
механизм стал бы своего рода утилизацией, снижая затраты на распределенную сеть и ее
воздействие на окружающую среду
Рассмотрим группу наиболее очевидных вариантов. Проблемой для них будет, что объем
пространства поиска решения очень широк, а решение встречается в этом объеме редко. Для
решения подобных задач обычно использовались распределенные вычисления. Но для переноса
этого опыта в экосистему криптовалюты нужно преодолеть массу препятствий.
Для получения вознаграждения нужно найти последовательность простых чисел, называемых цепью
Каннингема, которая вычисляется по формуле pi=2ia+1. Каждый член такой последовательности
проверяется тестом простоты. Первое значение в последовательности делимо на хэш от цепочки
блоков (предыдущего блока, mrkl_root и nonce ).
Давайте рассмотрим другой аспект пользы от биткоина - инвестиции, вложенные в него. По разным
оценкам в инфраструктуру криптовалюты вложено более 100 млн долларов. В эту сумму включены
как расходы на проектирование и производство нового оборудования.
Вот существующий пример – Permacoin, его идея в том, чтобы заменить майнеры, считающие хэши,
на устройства для хранения информации, например, жесткие диски. Тогда побочным результатом
развития сети станет большая распределенная сеть хранилищ с репликацией информации.
Принцип работы алгоритма такой: представьте, что есть большой общеизвестный файл F. Для
простоты предположим, что F выбирается избранным администратором.
В Permacoin файл F разбивается на блоки. Из блоков строится дерево Меркла. Каждый майнер
создает ключевую пару. Используя свой публичный ключ майнер псевдослучайно выбирает
несколько сегментов файла F, которые он будет хранить. Чтобы получить награду за блок майнер
должен выбрать случайно nonce и посчитать хеш h1, включающий хеш предыдущего блока,
merkel_root, публичный ключ и выбранный nonce.
Здесь стоит вспомнить об одном из спорных мест биткоина – честный майнер, то есть участник сети,
который подтверждает все транзакции, включенные в блок, вынужден хранить на жестком диске
информацию о всех непроведенных транзакциях. На данный момент - это около 200 Мб. Этот объем
данных никак не помогает в майнинге и не приносит какого-либо дохода. В случае с Permacoin
хранение данных оплачивается майнингом и быть честным майнером выгодно.
Подводя итог можно сказать, что доказательство полезной работы вполне естественная цель. Но этот
функционал не должен идти во вред первичной цели – безопасности. На сегодняшний день
работающие варианты – распределенное хранилище и нахождение рядов простых чисел. Хотя их
общественная польза пока сомнительна, возможно, будут найдены другие интересные реализации.
Сейчас майнеры биткоина в основном объединяются в пулы вместо одиночного майнинга. Это
приводит к тому, что огромные вычислительные мощности концентрируются в одном месте.
Совсем недавно это проблема стала очень острой, поскольку крупнейший из существующих
биткоин-пулов, Gigahash.IO, занял более 50% от общей мощности сети. Это вылилось в поток
критики и обсуждений того, что подобная ситуация является огромной угрозой для биткоина и
грозит ему гибелью. Пользователи требовали найти техническое решение для проблемы.
Обсудим проблему, которая не лежит на поверхности. Очевидно, что пользователи пула доверяют
друг другу. Майнеры могут собраться и создать большой пул, только если каждый из них делает
часть работы по майнингу. Их взаимодействие обеспечивается распределенным протоколом.
Обычно у пула есть администратор, публичный ключ которого известен всем членам пула. Каждый
майнер посылает свои варианты вычисления администратору, который аккумулирует решения всех
членов. Когда среди них появляется правильное, награда приходит на публичный ключ
администратора. После чего администратор распределяет награду пропорционально количеству
вычислений, сделанному каждым из участников.
Рассмотрим один интересный тип атак на биткоин-пул - атака виджиланте. Предположим, что есть
участник большого пула, который им недоволен. Он участвует в пуле, предоставляя свои
минимальные вычисления администратору пула, но, когда он находит правильное решение, он не
сообщает его администратору, а уничтожает. Суть атаки состоит в том, что снижается выходная
мощность пула. Ущерб для самого виджиланте невелик, ведь он все равно получает вознаграждение
пропорционально его вкладу в вычисления.
Проблема в том, что при такой атаке виджиланте терпит определенный убыток и ничего не
зарабатывает. Очевидно, не стоит надеяться на то, что майнеры будут специально атаковать большие
пулы.
Чтобы убрать возможность коллективного майнинга, нужно создать алгоритм, который будет
поощрять пользователей на подобные атаки. Кроме того, каждый, кто находит решение, должен
иметь возможность забрать вознаграждение себе. С таким подходом у любого был бы стимул
атаковать пул.
То есть в создаваемом алгоритме вычислительной задачи каждая попытка решения должна требовать
знания закрытого ключа пользователя. Этот же ключ будет использоваться, чтобы потратить
полученное вознаграждение. При таком подходе, чтобы пул работал, администратор должен будет
сообщить всем свой закрытый ключ, а значит каждый, нашедший решение сможет забрать награду
себе. Второе необходимое свойство алгоритма - позволить членам пула оставаться инкогнито при
таких действиях.
Блок решения такой задачи будет содержать те же данные, что содержатся в блоке для биткоина: хэш
предыдущего блока, merkle_root и произвольно выбранное nonce. Так же в блок включается
публичный ключ, а майнер должен знать соответствующий приватный ключ. И две подписи,
сделанные с помощью этой пары ключей s1 и s2.
Первый шаг, для того, чтобы определить является ли данное nonce решением для задачи – создание
подписи s1 с использованием ключевой пары. Подпись должна быть действительной для хэша
предыдущего блока и для nonce.
Следующий шаг – вычислить хэш строки, содержащей хэш предыдущего блока, публичный ключ,
nonce и подпись s1. Полученный хэш сравнивается с целевым уровнем сложности, как это
происходит для биткоина.
Теперь после определения станет ли подобранный nonce корректным решением, вычисляется вторая
подпись с использованием той же ключевой пары, но в нее включается так же и merkle_root.
Суть идеи в том, что необходимо вычислить значение подписи s1 с использованием закрытого
ключа, и это покажет правильно ли подобрано решение. И только после нахождения правильного
nonce будет вычислена s2, которая покажет, какие транзакции будут включены в блок. То есть
необходимо знать закрытый ключ для решения задачи – это также позволит забрать вознаграждение
себе. У алгоритма без возможности распределения существует несколько проблем.
При невозможности объединяться в пулы, майнеры могли бы начать использовать еще худшую
форму аутсорса – выполнять майнинг за других. Подобные хостинги для майнеров, возможно еще
большая угроза для децентрализованной сети, поскольку администратор имеет физический доступ
до всех точек майнинга. В настоящее время идет поиск решения для выхода из данной ситуации.
При таком подходе вместо покупки оборудования участник сети сразу покупает монеты. Затем он
отправляет деньги на специальный адрес, и вознаграждение определяется количеством присланных
денег. На этом основании можно создать систему майнинга, как и в биткоине, но без необходимости
использования больших вычислительных мощностей.
Рассмотрим потенциальные плюсы данной распределенной системы. Первый – снижение стоимости
вычислительной сети, не нужно ни производить, ни приобретать специальное оборудование. Второй
плюс, как следствие из первого, – меньшее влияние на окружающую среду. В результате такого
подхода каждый пользователь становится как бы вкладчиком в экосистему, а значит, он будет более
заинтересован в поддержании ее нормальной работы и в ее развитии. Еще один плюс –
защищённость от угрозы со стороны ASICs. Наконец, этот алгоритм защищен от атаки 51%, когда
больше половины вычислительной мощности сети сконцентрировано в руках одного майнера.
Экономика биткоина намного меньше, чем мировая экономика. Значит, возможно, что человек,
который очень богат вне системы биткоина, приобретет огромные вычислительные мощности,
которые невозможно было бы приобрести, используя только средства из экосистемы. Такой человек
или группа людей могли бы сделать атаку 51%. Если же представить, что майнинг основан только на
монетах, существующих лишь внутри сети, то для атаки нужно будет купить 51% существующих
монет. Во-первых, для этого нужно будет перевести часть внешних(реальных) средств в экосистему,
например, через обменную биржу. Во-вторых, такой высокий спрос сильно поднимет стоимость
криптовалюты и затруднит атаку. Конечно, это спорно, но считается, что намного дороже купить
половину существующих биткоинов, чем создать ферму, превышающую половину мощности сети.
Другой вариант называют доказательством сжигания (proof-of-burn, PoB). В этом случае для
майнинга нужно отправить монету на адрес, с которого гарантированно нельзя её потратить.
Например, на адрес, который является хэшем случайного числа, – шансы подобрать к нему
соответствующий публичный и приватный ключи ничтожно малы. С другой стороны, вы получаете
шанс на получение вознаграждения.
Еще один возможный вариант – доказательство депозита (proof-of-deposit, PoD). Монеты вносятся на
временно заблокированный аккаунт, они не уничтожаются, как в предыдущем случае, а вернутся
обратно через время. То есть временно блокируется возможность тратить монеты.
Терминологический словарь
майнер (miner) - программа, используемая для вычислений блоков. Так же человек, который
занимается майнингом.
SHA-2 - группа криптографических алгоритмов, однонаправленная хэш-функция
хэш (hash) - результат вычисления хэш-функции для набора входных данных. Хэш-функция -
преобразование входных данных произвольной длины в выходную строку (хэш) фиксированной
длины, выполняемое определённым алгоритмом
XOR - исключающее ИЛИ, строгая дизъюнкция. В случае двух переменных результат выполнения
операции является истинным тогда и только тогда, когда один из аргументов является истинным, а
второй ложным.
x11 - алгоритм хэширования, который был впервые задействован в создании Darkcoin, использует 11
раундов хэширования с 11-ю различными хэш-функциями (blake, bmw, groestl, jh, keccak, skein, luffa,
cubehash, shavite, simd, echo).
блок транзакций(блок) - специальная структура для записи группы транзакций в системе Биткоин и
аналогичных ей. Блок состоит из хэша предыдущего блока, хеш-суммы всех включенных транзакций
(merkle_root), и случайно перебираемого числа nonce.
merkle_root - дерево Меркла, древовидное хэширование. Хэш всех транзакций необходимых для
блока данных
Из предыдущих лекций стало понятно, что Биткоин можно использовать в качестве валюты. Но есть
много других практических применений, которые можно построить на базе Биткоина: гарантия
обязательств, простановка безопасного штампа времени, выпуск в обращение новых типов
криптовалюты, проведение лотерей, и, наконец, абстрактные рынки. В этой лекции будут
рассмотрены некоторые возможности использования Биткоин и его свойств.
Цель защищенного штампа времени: доказать знание X в определенное время t. При этом, если
требуется, не раскрывать значение X. Доказательства должны быть постоянными, то есть должна
быть запись о знании некоторой информации X в момент времени t или ранее, которую никто не
может уничтожить.
Свойства хеш-функции гарантируют, что нельзя найти какое-то другое значение Х’, которое имеет
такое же значение хэш, что и Х. При этом хэш не должен раскрывать информацию об X – это будет
верно только в случае действительно большого пространства возможных X. Итак, идея безопасного
штампа времени с помощью журнала – публикация обязательства (commitment) в виде хэша X.
Поэтому если кто-то публикует в блокчейне в момент времени t хэш данных X, то в дальнейшем
любой может убедиться, что опубликовавший знал X в момент времени t (или ранее), так как эти
данные невозможно подделать.
На практике это может пригодиться как доказательство знания чего-то в определенный момент
времени. Например, можно опубликовать хэш проекта или схемы какого-то изобретения, не
раскрывая при этом его сути. И в дальнейшем использовать это доказательство при получении
патента.
Можно также использовать эту схему как доказательство получения. Например, при онлайн-
голосовании сервер может опубликовать хэш каждого голоса и время его подачи. И это не позволит
в дальнейшем проигнорировать этот голос. Безопасный штамп времени имеет множество
практических применений.
Можно доказать знание о предстоящих событиях, например, финала спортивного матча или
выборов. После их прохождения можно раскрыть информацию и доказать, что результат был
известен заранее.
Несколько лет назад во время финала Кубка мира, кто-то фальсифицировал, что предугадал
результаты. Он попытался доказать, что ФИФА, которая организует Кубок, является
коррумпированной. Для этого он показал свою учетную запись в Twitter с результатами матча. На
секунду можно поверить в то, что он знал данные результаты. Но на самом деле он записывал
каждый возможный ход игры и результаты до начала матча, а за некоторое время до его конца
удалил все предсказания, оказавшиеся неправдой.
Эту атаку можно провести против любой системы обмена сообщениями, которая позволяет вписать
все возможные результаты, а затем опубликовать только те, которые совпали с истинными. Для того
чтобы избежать этой проблемы необходимо ставить безопасный штамп времени на предсказания.
Еще до появления биткоина было подобное решение, которое заключалась в публикации хэша
прогнозов в газете или в других средствах массовой информации. Газеты хранятся в библиотеках и в
Интернете. И если кто-то увидит хэш в газете, он будет уверен в том, что хэш был поставлен в день
публикации газеты. Также можно просто заплатить газете небольшую плату и поставить хэш любого
дня, который необходим. А затем, после публикации газеты, всякий раз, когда необходимо доказать
свое знание, можно просто опубликовать данные и сослаться на газету. Люди могут обратиться к
газете и времени и узнать, кто и когда взял на себя это обязательство.
Итак, это действительно простое решение, оно отлично работает в автономном режиме, то есть без
Интернета. Вопрос в том, как и где можно поставить хеш-обязательство в биткойне; какое место в
блокчейне или в транзакциях будет занимать хэш информации, знание которой необходимо доказать
в будущем? Самый простой способ – отправка денег не на хэш открытого ключа, который является
адресом, а на хеш данных, знание которых нужно подтвердить. Так как это хэш данных, а не
реальный адрес, отправленные деньги нельзя будет потратить. Поэтому имеет смысл отправлять
минимальную сумму – 1 сатоши. Недостатком этого метода является то, что фактически создаются
недействительные транзакции, которые являются метками времени. И сообщество вынуждено их
отслеживать и поддерживать в блокчейне.
Есть более сложный способ поставить штамп времени - КомитКойн (CommitCoin). Это небольшой
протокол для поиска открытых ключей и подписей, при котором фиксируемые данные вставляются в
биты открытого ключа и подписи. Для того чтобы найти специальный открытый ключ, формируется
множество открытых ключей и множество подписей. Хэш данных, которые необходимо
подтвердить, будет "встроен" в искомый открытый ключ. Для постороннего наблюдателя эта
операция будет выглядеть как обычное формирование открытого ключа. При этом не создаются
непередаваемые транзакционные выходы. У данного метода один недостаток – он сложнее и, как
следствие, дороже. Подробнее с протоколом можно ознакомиться в статье по ссылке:
https://issuu.com/ptmannion/docs/bitcoin_protocol.
Единственным недостатком является то, что это все еще не стандартная транзакция, поэтому она не
будет передаваться по умолчанию узлами сети. Но это предпочтительный способ зафиксировать
данные в цепочке блоков. И на самом деле есть куча стартапов, которые фактически запускают
небольшие веб-сайты, которые собирают множество обязательств людей в большое дерево Merkle. В
конце дня все обязательства публикуются с помощью OP_RETURN. Это способ уменьшить
стоимость публикации OP_RETURN и ограничить раздувание блокчейна нетрадиционными
транзакциями.
Запись любых данных в блокчейн дает возможность создавать совершенно новую валютную систему
без разработки нового консенсусного механизма. При этом биткоин будет использоваться как
журнал, а все данные, необходимые для новой валюты, будут записываться в его блокчейн. Такая
валюта называется оверлейной валютой. При этом данные о новой валюте должны быть в виде
непередаваемых выходов транзакций биткоинов.
Самая известная оверлейная валюта – Mastercoin (Мастеркоин). Она построена поверх биткоина, все
транзакции Mastercoin записываются в цепочку блоков биткойнов, и она поддерживает гораздо более
расширенный набор функций, чем биткойн. Главная идея оверлейной валюты – не нужно
разрабатывать новый консеснусный механизм. И поскольку майнерам биткойна не нужно знать о
правилах Mastercoin, она может поддерживать гораздо более специфические функции, более
сложные интеллектуальные свойства, интеллектуальные контракты, определяемые пользователем
валюты. По сути, API во много раз больше, чем API Биткойна, потому что майнерам это не нужно
понимать. Они готовы просто вслепую написать что-либо в цепочку блоков, которая
отформатирована как действительная транзакция Bitcoin. И сообщество Mastercoin должно
посмотреть на все эти данные и собрать вместе действительное владение Mastercoin на основе того,
что написано в блочной цепочке биткойнов. Таким образом, можно развивать валюту, не создавая
собственную систему консенсуса. Не требуются новые майнеры, можно просто добавить больше
возможностей и развивать их быстрее. Но оверлейная валюта полагается на Биткоин. Это может
быть неэффективно, так как нет возможности предотвратить запись недействительных транзакций в
блокчейн. Мастеркойн более подробно будет рассмотрен в лекции 11.
В прошлых лекциях был рассмотрен пример, когда на основе графа транзакций были сделаны
выводы о владельцах кластеров. Несмотря на то, что фактически биткоин представляет собой
неизрасходованный транзакционный выход, проще представлять его в виде монеты. И каждая
монета имеет длинную историю, связанную с ней, которую любой может видеть в цепочке блоков.
История всех, кто владел какой-либо частью монеты, которая через передачу и транзакции с другими
монетами превратилась в текущую неизрасходованную транзакцию или текущий биткойн.
Как уже отмечалось ранее, это плохо для анонимности. Интересное свойство в том, что биткойны не
являются взаимозаменяемыми. Взаимозаменяемый – это экономический термин, который означает,
что каждый биткойн имеет то же значение, что и любое другой, и их можно обменять без потери или
изменения стоимости.
Каждый биткойн уникален и имеет свою историю. Поэтому они не взаимозаменяемы. История
одного биткоина при определенном контексте может быть лучше истории другого биткоина.
Отсутствие взаимозаменяемости имеет как плюсы, так и минусы.
Если просто написать что-то на банкноте, это не будет иметь никакой ценности. Нужно, чтобы
метаданные были привязаны к конкретной купюре, и никто не смог бы это подделать. Для этого кто-
то, обладающий авторитетом и имеющий ключ, должен подписать комбинацию метаданных и
серийного номера банкноты. Предположим, что футбольная команда "Динамо" хочет начать
использовать долларовые купюры в качестве билетов. Они утверждают, что конкретный серийный
номер банкноты теперь представляет собой билет на определенную игру, возможно, с определенным
местом. Тот, кто владеет этой банкнотой, может прийти на матч и посмотреть его. Для обеспечения
аутентичности будет использован закрытый ключ "Динамо". Им будет подписано сообщение с
указанием номера конкретной игры, даты и всей информации вместе с серийным номером банкноты.
Эту информацию можно наклеить на банкноту в виде 2D штрих-кода.
Теперь владелец этой банкноты может показать ее перед входом на стадион, в базе данных будет
найдена соответствующая подпись и он сможет спокойно посмотреть игру. На самом деле штамп не
обязательно использовать. На стадионе можно просто иметь базу данных, в которой есть список
разных серийных номеров банкнот с указанием мест на стадионе. Зачем же использовать
дополнительно штрих-код?
Валюта может быть не только билетом на спортивный матч. Есть множество практических
приложений рассмотренной схемы.
Как можно реализовать то же самое в криптовалюте, которая позволяет быстро совершать онлайн-
обмены и не доверять банку?
Решением является покраска монет в определенный цвет. При этом монеты не потеряют своей
стоимости. Просто они и включенные в них метаданные будут цветными.
Итак, теперь есть биткойны с разными цветами, и с ними можно совершать все стандартные
транзакции. Таким образом, можно иметь одну биткойновскую транзакцию, которая включает в себя
несколько выходов, некоторые из них зеленые монеты, некоторые фиолетовые, некоторые
неокрашенные монеты. Далее она перемешивает их и имеет выходы, поддерживающие цвет. И в них
будут метаданные, которые позволят убедиться, что монетам соответствует правильный цвет.
Итак, единственное, что добавилось к базовым возможностям Биткоина – это возможность добавить
немного метаданных в транзакции, где в одной выходной транзакции некоторые монеты имеют
определенный цвет. И, конечно, должна быть подпись, чтобы не каждый мог использовать любой
цвет.
Самое популярное предложение для реализации цветовой схемы называется открытыми активами.
Выпуск осуществляется через специальный хэш-адрес хэша данных Х. Поэтому для выпуска
цветных монет нужно выбрать хеш-адрес с оплатой за клик, который будет выдавать любой цвет,
который необходим (например, цвет билета на матч "Динамо"). И тогда любая монета без цвета,
которая пройдет через этот адрес, уйдет с цветом, обозначенным этим адресом. Информацию о
соответствии адреса цвету нужно опубликовать на одном из сервисов, которые отслеживают
соответствие адресов и цветов. При этом монеты могут иметь более одного цвета.
Теперь каждый раз, когда есть транзакция с цветными монетами, нужно использовать специальный
маркерный вывод. Это невыносимый результат, который в случае обязательств позволяет писать
дополнительные метаданные в транзакцию. А в любой транзакции Bitcoin, привычные метаданные
определяют, как значение всех входных транзакций разделено между выходными транзакциями,
нужно добавить этот маркерный вывод при работе с цветными монетами, чтобы решить, какой цвет
монеты использовать. Протокол также поддерживает добавление дополнительных метаданных.
Преимущества заключаются в том, что данная система совместима с Bitcoin. Это дает возможность
для объявления любого цвета и помещения любых метаданных на любую монету. При этом майнеры
не будут участвовать в процессе, занимая какую-либо позицию или устанавливая правила передачи
цветов.
Для того чтобы начать выпуск цветных биткоинов, не нужно обращаться в какой-то центральный
орган. Недостатки этой схемы заключаются в том, что приходится ставить вывод непереносимого
маркера в каждую транзакцию, которая включает в себя цветные монеты. Из-за этого добавляются
небольшие накладные расходы в виде регулярных биткойнов каждый раз, когда необходимо
торговать цветными монетами. И поскольку выход этого маркера является особенным , для проверки
владения цветными монетами, необходимо проверить всю историю транзакций. Недостаточно
просто покрасить монету в какой-то цвет, так как майнеры не работают с цветными монетами. Это
является плюсом системы, так как майнеры не могут на нее влиять. С другой стороны у работающего
с цветными монетами не может быть слабого клиента, так как ему необходимо проверять весь
блокчейн. Это исключает работу с цветными монетами на ограниченных платформах, например, на
телефонах, так как они не смогут хранить всю цепочку и поддерживать ее обновленную копию.
Ранее был рассмотрен пример применения цветных монет в качестве билетов на какое-то
мероприятие. Другой распространенный пример применения – цветные монеты, представляющие
акции компании. Каждый раз, когда необходимо опубликовать новую акцию, биткоины передаются
через хэш-адрес pay-to-script, который окрашивает их в определенный цвет. После этого люди могут
начать торговать ими. Для выпуска акций в таком формате не нужна биржа или какая-либо
инфраструктура, которая используется в автономном мире, можно просто обменять акции в обмен на
обычные биткойны. Покупатели должны верить эмитенту акций. При этом цветные монеты могут
фактически отображать факты в реальном мире – например, владение автомобилем или домом. В
лекции 11 будет рассказано о некоторых трудностях, как юридических, так и социальных,
возникающих при работе с цветными монетами, представляющими недвижимость .
Есть еще один интересный пример применения цветных монет – можно торговать владением
доменных имен и возможностью запускать сервер в цепочке блоков биткойнов. У этого примера
достаточно оговорок и странных свойств. Например, необходимо, чтобы люди владели не простыми
доменными именами, а скупали все хорошие доменные имена. Фактически это было запущено как
отдельный Altcoin под названием NameCoin, о котором будет рассказано в следующей лекции.
Если Алиса и Боб хотят заработать пять долларов, они должны оба согласиться на ставку. Боб
подкинет монету, при этом каждый должен быть уверен в том, что она будет в воздухе, тогда у них
будет очень четкое представление о том, кто выиграл, и что ни один из них не смог повлиять на
результат. Они оба должны верить, что проигравший заплатит ставку. При этом эта сделка не имеет
какой-то юридической силы, так как является простой договоренностью между двумя людьми.
Таким образом, проблема создания случайности, о которой обе стороны могут договориться, должна
быть справедлива, и если один игрок проиграет, то он фактически будет вынужден за это заплатить.
Пользователи в Интернете не могут видеть одну и ту же физическую монету, поэтому они делают
ставки на фальш-монетки. Алиса могла бы сделать ставку в 5 долларов и объявить, что она
подкидывает монету, включив видеокамеру. Но у Боба могут возникнуть сомнения. Алиса могла
записать видеоролик с желаемым результатом заранее и транслировать его в сеть как онлайн-видео.
Решение состоит в том, чтобы использовать обязательства хэша данных Х. Ранее было рассмотрено,
как можно создать обязательство, не раскрывая самих данных X.
Допустим, в онлайн-лотерее участвует три стороны - Алиса, Боб и Кэрол. Для начала все они
выберут случайное число, часто называемое nonce в криптографии, и сохранят его. При этом каждый
должен верить в то, что конечный результат является случайным. В этом протоколе будет два раунда
коммуникации.
В первом раунде все три стороны публикуют хэш случайного числа nonce, которое они выбрали.
Хэш ничего не говорит о случайном числе, если оно выбрано из достаточно большого пространства.
Каждый из них выбирает 128-битную случайную строку, публикует ее хэш и при этом не выдает
какую-либо полезную информацию об этом числе.
Второй раунд наступает строго после завершения первого – каждый участник показывает свое число.
Для того чтобы определить, кто выигрывает лотерею, есть довольно простая программа. Она берет
все три случайных числа (Х данные) и смешивает их в битах. Затем берет хэш данных, делит его на
mod 3, и выдает случайным образом один из трех результатов. Затем можно назначить каждый
результат одному из участников, и это определит, кто станет победителем: Алиса, Боб или Кэрол.
При этом каждый участник сам может проверить справедливость лотереи. Поэтому важным
свойством хэш-функции является то, что она гарантирует случайность. Никто не смог бы выбрать
свое случайное число таким образом, чтобы оно стало более вероятным, и чтобы конечный результат
являлся победой. Особенно учитывая то, что участники не знают случайных чисел других
участников. Не вдаваясь в длинное формальное определение случайности, псевдослучайности и хеш-
функций, можно с уверенностью сказать, что в настоящее время хеш-функции работают корректно.
Нет лучшей стратегии, чем просто выбор случайного числа, что дает одну треть шансов на победу.
Итак, что произойдет, если кто-то не сможет раскрыть свои обязательства? Рассмотрим второй раунд
протокола и предположим, что Алиса и Боб публикуют свои обязательства, а Кэрол анализирует их,
и говорит: "Если я опубликую свое обязательство, я проиграю. Я вижу случайные числа, которые
выбрали Алиса и Боб, я понимаю, какое случайное число я выбрала, и могу запустить этот сценарий
сказав, что я не выиграю."
Итак, если Кэрол захочет обмануть остальных, она просто не опубликует свое число. И теперь
финальный сценарий невозможно запустить, потому что нет одного входа. Получается, что протокол
не работает, если кто-либо из участников злонамерен.
Предположим, Алиса пытается войти в обязательную хэш-кампанию с Бобом. Для этого Алиса
собирается выложить облигацию, которая будет выплачена в двух случаях.
Если Алиса и Боб оба подпишутся, или если Алиса подпишет и покажет свои данные. Тогда можно
проверить в сценарии погашения sig, который включает значение Х и имеет определенный хэш.
Таким образом, биткоин с помощью своих встроенных сценариев предоставляет механизм для того,
чтобы требовать оплату. В одном случае транзакция будет подписана Алисой и Бобом – и все деньги
уйдут Бобу. Боб не сможет потребовать выплаты облигации до некоторого времени t, которое
задается с помощью параметра n_lock_time, о котором было рассказано в предыдущих лекциях. Это
является страховкой от того, что Алиса откажется участвовать в лотерее. Если она в определенный
момент времени ничего не сделает, все деньги уйдут Бобу. В качестве альтернативы Алиса может
опубликовать транзакцию до момента t, вернув деньги себе, но если она это сделает, то ей нужно не
только подписать ее, но и раскрыть Х данные.
Существует два способа претендовать на эту оригинальную транзакцию, и один из них является
действительным результатом протокола. Таким образом, Боб получает облигацию или некоторые
деньги, которые она вложила, или же Алиса получит эти деньги от Боба.
Итак, для того, чтобы участники не могли выйти из лотереи, вместо простых хэшированных
обязательств используются приуроченные обязательства. Если вернуться к ситуации с третьим
участником Кэрол, после того, как она видит случайные числа двух других игроков и понимает свой
проигрыш, у нее не будет стимула не публиковать свои данные – она всё равно потеряет деньги,
поставленные в облигации. Это будет работать, если облигация выше стоимости, поставленной на
карте в лотерее.
Недостатком этой схемы является то, что она довольно сложна. Выполнение срочных хэш-
обязательств требует нескольких транзакций. И когда есть N игроков в лотерее, это фактически
вычисление логарифма в квадрате. Также нужно вкладывать деньги в облигации и ключевое
свойство в том, что отложенная сумма должна быть больше, чем ставка в лотерее. Поэтому это не
самый эффективный способ создать лотерею и тем не менее он достаточно работоспособен для
небольшого числа участников.
В 1985 году возникло небольшое недоразумение. Лотерею выиграла команда "Нью-Йорк Никс",
прогнозируемо выбравшая игрока Патрика Юинга, который был наиболее перспективен. Сразу после
этого пошли слухи о том, что лотерея была фальсифицирована так, чтобы "Нью-Йорк Никс" смогла
выбрать лучшего игрока. В Интернете можно найти всевозможные теории заговора о том, как NBA
сфальсифицировал этот процесс, например, знаменитую теорию Bent Corner, которая говорит, что
они вытащили конверт с изогнутым углом из чаши конвертов с разными именами команд. И даже
сегодня, когда они открывают эту лотерею каждый год, существует целая куча теорий заговора в
Интернете, которые каждый раз утверждают, что процесс прошел несправедливо. Еще один пример
– призывная лотерея 1969 года в США, целью которой было определить, какие молодые люди
присоединятся к Вооруженным силам, а затем отправятся воевать во Вьетнам. Члены конгресса
сбрасывали капсулы с именами участников в пластиковый барабан и далее по очереди протягивали
руку и вытаскивали. Участникам присваивался номер, определявший вероятность их присоединения
к Вооруженным силам США.
Это был первый случай создания лотереи в национальном масштабе. Важно было поддерживать
справедливость и случайность этой лотереи. Но специалисты по статистике проанализировали
результаты в течение следующей недели после проведения лотереи и заметили интересный момент,
который маловероятно произошел в следствие случайности: большинство дней в конце года
получали очень низкие предварительные числа. Причина, по которой это произошло, заключается в
том, что, когда специалисты вернулись и посмотрели на ленту, некоторые капсулы, которые были
наверху, как правило, так и оставались в том же положении, т.е. смешивания не произошло.
Создавалась только видимость смешения капсул. Оба примера показывают, насколько важно создать
публичную случайность, которой могут поверить люди. Рассмотрим применение
криптографического маяка. Этот маяк похож на реальный маяк, регулярно мигающий.
Криптографический маяк будет генерировать новые случайные данные с постоянной скоростью.
Цель его заключается в том, что он будет "излучать" единую случайность, которую никто не сможет
предсказать заранее, поэтому все согласятся с тем, что маяк выводит случайные данные.
Существует целая куча приложений, помимо простых лотерей. Различные приложения систем
аудита и голосования, обеспечивающие доказательство нулевого знания, протоколы "сокращения и
выбора" в источниках по безопасности, содержат множество примеров того, что можно сделать
гораздо проще и эффективнее, если бы был идеальный криптографический маяк, который
удовлетворял бы всем этим необходимым свойствам.
Но, к сожалению, идеальное решение пока не найдено. Поэтому публичный показ колеса, бросание
монеты, кубиков и т.п. остаются популярными и понятными способами показать формирование
случайности. Но они плохо работают при удаленных сценариях, потому что всем участникам
кажется, что процесс сфальсифицирован. Очень трудно установить доверие удаленно в любом
физическом процессе. NBA пытается решить эту проблему на протяжении многих лет, пытаясь
убедить фанатов в том, что они проводят честную лотерею. Они создали и конверты, и
подпрыгивающие шары пинг-понга, но люди всегда придумывают сценарии, в соответствии с
которыми их могут обмануть.
Национальный институт стандартов и технологий, НИСТ, в течение последних нескольких лет
проводит эксперимент, целью которого является запуск собственного маяка. Для генерации
случайных чисел используется сложная настройка с участием двух запутанных фотонов, что дает
гарантии случайности, порожденной квантовомеханическим явлением. И если верить принципу
неопределенности Гейзенберга и другим основным принципам физики, тогда это должно быть
случайным, и никто не сможет это фальсифицировать. НИСТ в Интернете публикует каждые 60
секунд множество случайных данных и подписывает их. Любой может использовать эти данные,
если доверяет НИСТ и его эксперименту.
Для того чтобы решить проблему доверия, можно было бы использовать некоторые природные
явления, за которыми все могут наблюдать и которые сложно подделать. Например, солнечные
пятна, солнечная активность, скорость ветра или температура на определенное число и т.п. Проблема
такого подхода в том, что он довольно медленный – температура и солнечная активность меняются
не так часто. Вторая проблема – может возникнуть необходимость в доверенной стороне. Допустим,
в качестве источника случайного сигнала будут сведения о температуре завтра в Москве. При этом у
одного термометр покажет 25 градусов, а у другого – 26. И разница между этими двумя значениями
будет означать победу в лотерее для одного из участников.
Чтобы обойти эту проблему, вероятно, нужно использовать термометр конкретного человека для
измерения температуры. Или взять сведения у федеральной службы "Росгидромет". В любом случае
снова появляется некая доверенная сторона.
Аналогичная идея заключается в том, чтобы собрать финансовые данные, в частности, цены на
фондовом рынке, и выявить источник случайности из них.
Суть заключается в том, что у всех рассмотренных подходов есть своя доверенная сторона, которая в
какой-то мере управляет процессом. И если перейти на идеологию Биткоин, то необходимо
вспомнить, что Биткоин децентрализован, и в системе фактически нет доверенных участников. Так
можно ли получить источник случайности из блочной сети Биткоина?
Майнерам приходится находить случайное число для каждого блока. Почему нельзя использовать
случайные данные, которые майнеры находят в процессе добычи при создании маяка случайности?
Итак, есть довольно сильный аргумент, что нельзя с большой вероятностью предсказать выпадение
случайного числа.
Поэтому, если бы была возможность предсказать, каким будет следующее случайное число, с
вероятностью, превышающей 1 / d, где d – трудность поиска блока, тогда появится более быстрый
способ добычи блока, чем просто случай. И помните, что d довольно высокое значение сейчас.
Каждый блок, должен иметь 66 бит случайности, которые невозможно предсказать. По крайней
мере, если биткойн безопасен, ни один из майнеров или кто-либо еще не сможет предсказать, какими
будут эти случайные биты.
Насколько дорого стоило бы манипулировать этим? Любой майнер имеет возможность, если он
найдет блок, не публиковать его в сеть, при этом не позволяя ему быть следующим блоком в
последовательности. Майнер может сделать это, если блок будет сгенерирован с маяковым выходом,
который его не устраивает. Также возможна ситуация, когда кто-то пытается заставить маяк вывести
определенный выход. Тогда он может подкупать майнеров, которые находят "нежелательные" блоки
и предлагать им вознаграждение, большее, чем вознаграждение за блок в обмен на то, что эти блоки
не будут опубликованы. Допустим, необходимо застать какой-то маяковый выход с вероятностью p.
Для этого нужно отбросить несколько блоков, пока не будет найден нужный блок. И ожидаемое
количество блоков, которые придется отбросить, - 1 / p-1, а с одним флагом монет p является всего
лишь половиной.
Отбрасывать блок довольно дорого, так как при этом теряется награда за блок в 25 биткоинов или
около 15 000 долларов США.
В среднем нужно будет отказаться от одного блока и потерять всего 25 биткойнов. И если есть
лотерея N-party, где это справедливо между всеми N-сторонами, это будет 25 раз n-1 биткойнов.
Таким образом, процесс будет безопасным, пока выигрыш лотереи будет меньше, чем стоимость
манипулирования. Если два человека хотят сделать ставку на равные шансы, и они хотят
использовать Биткойн в качестве источника случайности, это будет безопасно, если их ставки будут
менее 25 биткоинов.
При этом стоимость манипулирования маяком будет слишком низкой для некоторых случаев.
Например, в случае с лотереей NBA, когда на кону миллионы долларов, одна из команд может
начать подкупать майнеров, чтобы манипулировать процессом. Поэтому вопрос увеличения
безопасности в случае большой выгоды является открытым. В настоящее время нет никакой
случайности в сценарии биткоинов. И поэтому заманчивой кажется идея расширить язык сценариев,
чтобы создать специальный код операции для вызова маяка. И если в рассмотренных примерах маяк
использовался как общедоступный источник случайности, то в случае встраивания случайности в
сценарии, любой майнер смог бы иметь свой источник случайности. Это позволило бы заменить весь
сложный протокол лотереи с облигациями и несколькими раундами одним сценарием, который бы
выводил случайный выход.
Проще говоря, это рынок, на котором можно торговать акциями в будущих событиях.
Это позволяет иметь долю в некоторых событиях в будущем. Например, в том, что "Динамо"
выиграет чемпионат России в 2015 году. Доля будет стоить некоторой цены X, если это произойдет
на самом деле, и ничего не стоить, если это событие не произойдет. До фактического наступления
этого события у актива будет некоторая цена, отражающая то, насколько вероятным все видят это
событие. Давайте посмотрим на чемпионат мира 2014 года в Бразилии. И, допустим, у нас был
рынок, где можно было покупать и продавать акции в командах. В конечном итоге акции будут
стоить дорого у той команды, которая победит чемпионат. Перед началом турнира акции каждой из
пяти команд имеют ненулевую цену, которая отражает мнение рынка о шансах на победу каждой
команды. Например, у команды Германии это число будет 0,12 – это значит, что рынок верит в 12%
шанс на победу. И так далее для каждой команды. По мере продолжения турнира эти цены будут
колебаться, и это будет отражать меняющуюся убежденность рынка в том, насколько вероятна
победа каждой команды.
После группового этапа Англия, которая до начала чемпионата торговалась на 0,05, то есть имела 5%
-ный шанс выигрыша, ушла в ноль. Англия была выбита после группового этапа. И так как у
команды Англии нет возможности выиграть в этот момент, цена отражает то, что их акции сейчас
бесполезны. В это же время команда США, у которой акции в начале турнира стоили 0,01, по
результатам группового этапа подняла свой рейтинг и цена стала 0, 06 - то есть у рынка выросла
уверенность в вероятности их победы.
Получается тот, кто купил акции команды США в начале турнира по 0,01, после проведения
группового этапа может их продать по 0,06, не дожидаясь окончательных результатов турнира. То
есть он может извлечь выгоду не из-за того, что команда США выиграла турнир, а из-за того, что
вера людей в возможность выигрыша турнира командой США выросла после сильного выступления
на групповом этапе.
Но к тому времени, когда на самом деле произошли выборы, Обаме дали 90%-й шанс выигрыша за
день до выборов.
Таким образом, рынок прогнозов был хорошо осведомлен о результатах выборов. Выборы были
почти закончены до того, как были поданы голоса. По крайней мере, было очень маловероятно, что
Обама проиграет выборы. Это демонстрирует всю мощь рынков прогнозирования. Можно читать
газеты, новости в Интернете, смотреть телевидение – и там будет множество противоречивых
мнений различных экспертов. Но если вместо этого посмотреть на рынок прогнозов, то можно
увидеть, что за неделю до выборов вероятность выигрыша барака Обамы была равна 90 процентам.
Вот почему экономисты любят рынки прогнозов – они раскрывают все знания и представления,
которые участники имеют о событиях в будущем.
Они являются отличным механизмом для раскрытия информации, и они позволяют получать
прибыль от возможности делать точные прогнозы. Рынками прогнозов также трудно
манипулировать, так как на ложные прогнозы придется тратить реальные деньги, и такая атака
может стать очень дорогой.
На практике рынки прогнозов имеют довольно хорошую прогностическую силу, благодаря которой
они часто могут менять мнения людей и экспертов.
Следует отметить, что такие рынки также подвергаются регулированию. В течение примерно десяти
лет Intrade был самым популярным рынком прогнозов в сети Интернет.
Итак, биткоин можно использовать для оплаты. Для гарантированной оплаты можно использовать
доверенных арбитров, чтобы выполнять транзакции escrow. Арбитр обеспечит выполнение
контракта, даже в случае если один из участников, поставивший на событие, которое не произошло,
не подпишет транзакцию.
Лучшим решением было бы построить альткоин, который имел явную поддержку для рынков
прогнозирования. Есть предложение сделать это под названием FutureCoin. Он будет иметь
дополнительные типы транзакций, ориентированные на рынки прогнозов. Например, можно
покупать портфель возможных результатов. Допустим, в чемпионате мира участвует 32 команды и за
1 FutureCoin можно купить акции каждой из них.
Затем можно продать долю в каждом результате и получить FutureCoin обратно. Можно купить долю
в каждом результате, а затем продать акции, которые посчитаете бесперспективными. Это будет
одним из способов получения прибыли. Можно купить портфель, дождаться изменения цен и
продать его напрямую за FutureCoins. А можно купить портфель и играть на цене акций внутри
портфеля. После фактического совершения события происходит специальное закрытие, и тогда для
получения прибыли достаточно иметь одну долю в выигрышном результате. Как можно вести
арбитраж, который позволит зафиксировать результат исхода события и получить прибыль тем, кто
поставил на выигрышный вариант развития событий? Самая простая модель - доверенные арбитры.
Любой может стать арбитром. Но для того, чтобы люди доверили арбитру свои выигрыши, они
должны ему доверять. Для этого арбитр создает себе репутацию, работая на рынке долго и честно.
Но всегда есть риск, что арбитр может скрыться или трактовать результаты в свою пользу. Есть
несколько способов организации децентрализованного арбитража. Один из них заключается в том,
чтобы все люди, владеющие акциями на рынке, голосовали за победителей, то есть за то, что
произойдет на самом деле. И есть различные способы, которыми можно попытаться стимулировать
пользователей правильно голосовать. Можно заставить пользователей размещать облигации или
поддерживать репутацию, и, если они голосуют в направлении, отличном от большинства,
накладывать штраф. В результате их репутация снижается. Можно создать аналогичную систему, в
которой вместо голосования пользователей будет криптовалютное голосование майнеров. Если они
будут голосовать неправильно, они получат меньшую награду за блок или не получат ее совсем.
В качестве попытки реализовать это был создан протокол RealityKeys. Суть заключается в том, что
можно фактически подписывать утверждения "да" или "нет" на то, произойдет ли какое-то событие в
будущем.
Следует отметить, что иногда реальность сложна. Для некоторых событий бывает трудно однозначно
определить результат. Есть традиция выливать на тренера победившей в Super Bowl (футбольный
чемпионат) команды напиток Gatorade. Победившая команда выбирает цвет напитка самостоятельно.
Люди делают ставки на то, какой цвет выберет та или иная команда. Оранжевый и желтый цвета
всегда были фаворитами, как самые популярные у команд цвета. В результате на одном Super Bowl
выиграла команда Seattle Seahawks, и они вылили на голову тренеру оранжевую Gatorade. Затем
несколько игроков взяли и вылили на голову тренеру желтую Gatorade. На рынке прогнозов
случилась неразбериха, так как совершенно непонятно, кто победил – те, кто ставил на оранжевый,
или те, кто ставил на желтый цвет. Организации, которые принимали реальные ставки, чтобы
сохранить свою репутацию объявили о том, что они выплатят выигрыш тем, кто поставил на желтый
и тем, кто поставил на оранжевый. То есть они согласились понести убытки, чтобы не испортить
себе репутацию. На децентрализованном рынке прогнозирования это было бы невозможным, так как
нельзя создать деньги из воздуха – выигрыш формируется только из тех денег, которые изначально
поставлены. Есть несколько решений. Одно из них – побеждают оба цвета, и каждый поставивший
на них, получает половину выигрыша.
Скорее всего в следующий раз ставки на это событие принимались бы по-другому. Например, какой
первый цвет Gatorade будет вылит на тренера? Но суть в том, что в реальном мире всегда могут
произойти события, не совпадающие ни с одним прогнозом или сразу с несколькими.
Традиционно это делается централизованно в одной книге заказов. В ней собирают все заказы,
хранят их в секрете и делят разницу пополам. Цена, которую в итоге получает участник, находится
посередине между самой низкой ценой, за которую готовы были продать и самой высокой ценой, за
которую готовы были купить. И это сопряжено с несколькими рисками. Те, кто организовывает
централизованную книгу, могут заранее поставить свои заказы и попытаться совершить лучшую
сделку. Это называется front-running и считается серьезным преступлением. Централизованные
книги заказов регулируются на правовом уровне, чтобы избежать этой проблемы. В
децентрализованной книге заказов нельзя добиться такого сильного правового обеспечения. Поэтому
front-running объявляется особенностью, а не преступлением. Каждый может подавать заказы
майнерам, а майнеры могут соответствовать любой возможной торговле, и вместо того, чтобы
раскалываться посередине, майнер фактически удерживает все распространение в качестве комиссии
за транзакцию. И красота этого заключается в том, что майнеры теперь получают комиссионный
сбор за транзакцию, и у них нет стимулов для работы по схеме front-running, потому что это никогда
не будет более выгодным, чем просто захват распространения в качестве платы за транзакцию.
Единственный недостаток заключается в том, что необходимо заплатить потенциально высокую
плату майнеру. В результате эта схема станет менее эффективной,. Люди, возможно, не захотят
объявлять заранее свою готовность платить, потому что это может привести к большому
распространению, которое майнер получает для захвата. Так что пока неизвестно, как это будет
работать на практике, но, похоже, это очень перспективный подход.
Если подвести итоги всему вышесказанному, Биткоин не позволяет в полной мере реализовать
рынок прогнозов. Нельзя реализовать полностью децентрализованные сделки, децентрализованный
арбитраж и нет встроенной в Биткоин концепции книги заказов. Поэтому возникает идея о создании
совершенно новой валюты с учетом накопленного с 2008 года опыта работы с Биткоином –
Альткоинс (Altcoins). Следующая лекция посвящена новой криптовалюте, перспективам и
проблемам ее развития.
Разнообразие криптовалют
Впервые мир услышал о биткоине в январе 2009 года. Не прошло и двух лет, как в середине 2011-го
была запущена первая рабочая альткоин-система - Неймкоин (Namecoin). После этого появились и
другие биржи, однако широкое распространение альткоины получили только после 2013 года – в
настоящее время новые проекты запускаются каждую неделю. Число криптовалютных систем сейчас
доходит до 500, но и эти цифры весьма условны, так как не все известные системы до конца
проработаны. Также не стоит забывать и о "биржах-однодневках", о которых будет рассказано
позже.
Альткоин и биткоин. Схожесть прослеживается уже в названиях. Эти понятия и в самом деле имеют
много общего. К примеру, структура скрипта: оба содержат генезис-блок, хранящий информацию
обо всех произведенных транзакциях. Если говорить об объеме рынка, то лидером по-прежнему
является биткоин. Но доля альткоина, объединившего под собой множество электронных валют,
постоянно растет.
Неймкоин (Namecoin) - первая альткоин-система, созданная в апреле 2011-го года, то есть спустя 2
года после запуска биткоина.
Неймкоин интересен тем, что имеет очень актуальное и необычное свойство, связанное с
регистрацией имени домена. На самом деле, неймкоин предназначен для децентрализованной
замены доменных имен.
Как и в любой системе регистрации доменов, в Неймкоин заложена собственная иерархия имен. То
есть если кто-то зарегистрирует корневой домен, то он сможет предоставлять пользователям
субдомены. Мощности программы гарантируют свободный выбор имени и защищенность от
присвоения его другими людьми. Можно также продавать домены, находящиеся в собственности, за
криптовалюту.
Догикоин (Dogecoin) – был запущен в 2013 году. Сообщество Догикоин неоднократно поддерживало
сбор средств на благотворительность. Например, В 2014 году было собрано $30000 для ямайской
команды бобслеистов, не получившей финансирования для поездки на олимпийские игры; также
догикоин-сообщество поддержало участника автогонок NASCAR в Талладеге. Создатели стремились
сделать систему близкой к человеку и поэтому уделили особое место набору ценностей,
преследуемых биржей, чувству юмора и подходу к майнингу в целом. В этом и заключен секрет
успеха и популярности догикоина.
Нельзя не отметить одну интересную особенность этой биржи – так называемые "случайные"
бонусы. Изначально размер награды за каждый блок в догикоин определялся случайным образом, но
через некоторое время в такой концепции обнаружился недостаток – выяснилось, что "случайное"
вознаграждение зависит от псевдослучайной хэш-функции предыдущего блока. То есть любой
майнер, понимая, что цена следующего блока низкая, мог переключиться на майнинг другого, более
выгодного альткоина. В конце концов, от случайных бонусов создателям пришлось отказаться.
Догикоин нестабилен, падение процента вознаграждения происходит каждые два месяца.
На рис. 10.1 представлены графики хэширования сети с апреля по август 2014 года для трех разных
криптовалют . На среднем графике изображен догикоин. Можно увидеть две точки в апреле и июле,
когда размер вознаграждения был сокращен вполовину. Когда это произошло впервые, хэшрейт сети
значительно снизился, на 30-50% от средней величины. За этим последовал спад, но в июле хэшрейт
снова вырос…и затем опять сократился в два раза.
Наверху дан тот же график, но уже для биткоина, – очевиден неуклонный рост с медленной
экспоненциальной скоростью. Сравнение этих графиков приводит к выводу о степени стабильности
этих двух валют.
Рис. 10.1. Сравнение хэширования
И еще немного статистики, чтобы не возникло ощущения, что все криптовалюты растут и падают.
Внизу рис. 10.1 приведен график некоторой криптовалюты, название которой не указано из
соображений этикета.
Вообще, сравнивать хэшрейт можно у пары разных альткоинов, имеющих одинаковую схему
майнинга. Вот, к примеру, для альткоина снизу 5 террахэшей в секунду по величине примерно в
10000 раз меньше, чем 100 петахэшей биткоина за то же время. С другой стороны, не имеет смысла
сравнивать частоту хэширования у систем с разными схемами майнинга, поскольку эти показатели
изначально не будут равноценными. Гораздо больше объективной информации можно получить из
сравнения силы хэширования с течением времени.
Стоит всегда обращать внимание на курс валюты. Особенно это касается не всегда стабильных
альткоинов, их стоимость легко прослеживается по графику хэшрейта сети.
Рис. 10.2. Соотношение хешрейта и цены для Догикоина и Лайткоина
На рис. 10.2 на верхнем графике изображен хешрейт Лайткоина, по нему опять же можно заметить
медленный уверенный рост. Приведен также график хешрейта Догикоина, испытавшего за тот же
период несколько скачков и падений.
Иногда смотрят на объем обмена, это очень актуально для альткоинов. Все эти показатели также есть
на сторонних биржах, они вносят некоторую определенность.
Возможно также "перемещать" цену, то есть покупать и продавать валюту для себя по низкой цене
на сторонних биржах. Но этот способ оказывает влияние на объем обмена.
Как уже упоминали ранее, имеет смысл сравнивать силу хэширования валюты или анализировать
хэшрейт сети с течением времени. Это позволяет объективно сравнивать валюты с одинаковой
схемой майнинга. Для сравнения альткоин-систем можно полагаться на степень поддержки
пользователей. Порой бывает сложно верно оценить эти показатели, так как новые биржи на рынке
воспринимаются с недоверием. Может потребоваться помощь крупных участников торговли или
платежных процессоров, обрабатывающих альткоины и биткоины.
Альткоин и биткоин – давние соперники на рынке криптовалют. А, как известно, в любой борьбе
есть победитель и побежденный.
Рассмотрим процесс технического исполнения алгоритма более детально. Каждая новая вычисленная
хэш-функция биткоина зависит от случайного числа, хэша предыдущего блока и корня дерева
Меркла от всех транзакций. Значение хэша должно удовлетворять установленным критериям
сложности (target). И если решение не подошло для биткоин-цепи, оно перенаправляется в смежную
сеть, где продолжает сравниваться со значениями форков – таким образом, почти всегда можно
преумножить свою добычу на некоторый процент ( рис. 10.3).
Данные для добычи параллельного альткоина размещаются в поле scriptSig, находящегося в самом
начале блока ( рис. 10.4). Скрипт в этом месте не проверяется системой, поэтому можно размещать
здесь все что угодно, блок не перестанет работать.
Далее все происходит по описанной ранее схеме – блоки сравниваются сначала в биткоин-системе, а
затем, если решение не подошло, переходят в смежную сеть. Главное условие успеха при таком
подходе – беспрерывный майнинг биткоина.
Безусловно, нельзя не учесть вероятность атак. Такой способ упрощает задачу взлома сети.
Коилдкоин прекратила свое существование именно из-за атаки совмещенного майнинга. Мощностей
сети не хватило, чтобы перекрыть майнинг-пулу добычу биткоина.
Другим недостатком такого способа добычи можно назвать следующее – дороговизна. Если вы
собираетесь попытать удачу таким путем, придется потратиться. Потому что комиссия с нескольких
сетей будет стоить дороже, чем та же операция на какой-нибудь одной альткоин-бирже. Поэтому
очевидно, что число самостоятельных майнеров, пользующихся такой техникой, весьма невелико.
Представим ситуацию: Боб заработал один лайткоин и захотел сторговаться с Алисой, добывшей
биткоин. Чтобы осуществить задуманное, Алиса должна отправить транзакцию по биткоин сети,
которая "передаст" ее монету Бобу, а Боб совершит то же самое, но по лайткоин-сети. Если они
полностью доверяют друг другу, не возникает никаких проблем. Но кто должен перевести валюту
первым, если люди вовсе не знают друг друга?
Технология атомарный своп (atomic swap) позволяет осуществить эту операцию без участия третьего
доверенного лица. За успешную транзакцию будет считаться выполнение двух условий – перевод
биткоина и перевод лайткоина. Алгоритм содержит четкую последовательность шагов.
Рис. 10.5. Перекрестные цепи атомарных свопов. Шаг 1
Алиса генерирует секретный ключ x. Она вычисляет хэш-функцию ключа h=H(x) - публичный ключ
для обеих сторон ( рис. 10.5). Далее она создает депозит (DepositA), который можно потратить, если
он подписан и Алисой и Бобом или Бобом, который знает X. Алиса не публикует депозит в сети.
Чтобы сделка осуществилась, Бобу также нужно создать депозит "Б". У литкоина Боба тоже два пути
- либо он отправится к Алисе после подтверждения, либо останется с хозяином. Действия Боба
аналогичны действиям Алисы – сначала он создаст транзакцию возврата, и лишь затем публикует
депозит. Транзакция возврата ожидает двух подписей до времени Т+1 – это значит, что
подтверждение от Алисы потребуется немногим раньше. Нетрудно заметить, что механизм
взаимодействия пользователей безопасен и прозрачен для обоих – благодаря установленным
интервалам Т+1 и Т+2 все действия пользователей автоматически становятся согласованными во
времени.
На третьем шаге Алиса открывает(reveal) x (до наступления T+1). Она забирает депозит B, а Боб
забирает депозит A. В случае, если она не передает x, по прошествии T+1 у Боба остается его
лайткоин благодаря возвратной транзакции.
Но и в этом способе есть недостатки. Во-первых, количество операций накладывает некий процент
комиссии. Во-вторых, никто не отменял времени на обработку, порой из-за сбоев происходят сбросы
сценария. И, конечно, любые валютные операции безопаснее всего выполнять с доверенными
пользователями.
Схема кажется простой, но на самом деле первые трудности возникают на этапе запуска: ценность
альткоин-биржи пропорциональна количеству пользователей сети. Необходимо найти майнеров,
желающих присоединиться.
Востребованность биржи решает практически все проблемы. Чем больше привлекаемая аудитория,
тем больше транзакций, тем активнее происходит оборот средств. Конечно же, любой криптобирже
необходимо иметь штат разработчиков. Обновления, исправление ошибок, любые сбои – вот
основные направления работы этих людей. Если биржа становится популярной, роль разработчиков
возрастает в геометрической прогрессии: они уже не только вносят коррективы, но и повышают
эффективность работы сети: опять же, для большого количества людей потребуется больше
пространства для совершения транзакций. В технической инфраструктуре альткоинов и биткоинов
существуют так называемые боты-советники ("tipbots") и "краны" ("faucets"). С помощью ботов-
советников система общается с новыми пользователями, не зарегистрированным в сети. Через бота
сеть может выдать неизвестному майнеру сведения о свободной валюте, предложить
зарегистрироваться. Конечно, все это делается для привлечения внимания. Краны предназначены для
стимуляции распространения сведений пользователями, например, за какое-либо упоминание веб-
сайта в сети пользователь получает небольшой денежный бонус.
Почти все альткоины имеют в своем арсенале маркетинговые уловки или брендинг. Например,
привлекающий внимание логотип делает биржу более запоминающейся.
Другое важное оснащение системы – обменные или автоматизированные способы обмена биткоинов
или альткоинов на другие валюты, сюда же относится торговля. Сейчас Альткоин системы
поддерживают множество обменных и платежных процессоров, поэтому если возникнет
необходимость подключения, достаточно будет отправить запрос на добавление криптовалюты в
реестр.
А вот следующий вариант вряд ли покажется таким же тривиальным, как предыдущие. Proof-of-burn,
дословно "доказательство сожжения", - алгоритм, известный среди майнеров как "односторонняя
привязка". Работает он по следующей схеме: за уничтожение цифровой биткоин-единицы
пользователь получает прибыль в другой сети. Выглядит так, будто бы стоимость альткоина и
биткоина эквивалентна. Понятно, что после уничтожения биткоин восстановить невозможно. И
последний алгоритм – "сброс" бесплатных монет. Такая схема используется в основном для
привлечения какой-либо группы лиц. Начальный капитал просто распределяется между членами
этого сообщества.
Альткоины критикуют за схемы "накачки и сброса". В данной схеме дешевые акции преподносятся
как перспективные для вложений.
Чтобы сопровождать эту схему, нужно выбрать альткоин – свою цель. Чаще всего это монеты
небольшой стоимости, либо недавно запущенная биржа. Пока цена низкая, злоумышленникам очень
легко сосредоточить в своих руках большое количество этой валюты. Затем можно запускать
рекламную кампанию по раскрутке, чтобы привлечь внимание пользователей к этой бирже.
Спекулянты преподносят дешевые альткоины как перспективные и выгодные, и если их реклама
работает, цена альткоина начинает быстро расти.
Существует множество негативных мнений об альткоинах в целом. Основаны эти доводы на том, что
данная группа криптовалют весьма ненадежна в обращении. Некоторые опасаются, что одно
присутствие таких бирж может нанести вред всему рынку. Разумеется, такие заявления не лишены
оснований – разделение мощностей добычи между множеством разных альткоинов ослабляет их
собственную защиту.
Еще один повод для споров – это количество валюты на рынке. Если запасы биткоина ограничены 21
миллионом, то у альтернативной криптовалюты нет никаких лимитов.
И, конечно, если у кого-то есть идея нового алгоритма, реализовать ее гораздо проще на альткоин-
платформах. Там не потребуется получать специальных разрешений и обходить ограничения.
Другим весомым аргументом "за" будет и разнообразие функционала альткоинов – всегда можно
найти замену упавшей валюте среди многообразия выбора на рынке. Возможно, что альтернативных
валют и правда чересчур много, но в этом есть их преимущество. Создание и запуск таких систем не
составляют труда, потому можно с уверенностью сказать - альткоины никогда не исчезнут с рынка
электронных валют.
После запуска нового альткоина нужно привлечь пользователей. Варианты кардинально отличаются:
Традиционный. Все владельцы биткоина получают по единице валюты. Без рисков – если сеть
падает, никто из пользователей не несет потерь. То есть в этом случае владелец биткоина
может без опаски пользоваться альткоин-биржами, так как даже в случае их падения он не
лишится своих средств, все сбережения в биткоинах останутся при нем.
Односторонняя привязка: альткоины за биткоины (Proof-of-burn). Обратный эффект – если
альткоин рушится, пользователь теряет и альткоин, и биткоин)
Если пользователь решит воспользоваться этой схемой, то он обязательно должен будет учесть
риски в случае краха альткоинов, в противном случае его ждут большие убытки.
Было бы гораздо лучше, если бы биткоин можно было сдать в залог на некоторый срок, а в это время
заниматься майнингом альткоинов. Биткоины в этом случае были бы защищены, так как в случае
обесценивания альткоина их можно было бы забрать обратно. Это называлось бы уже двусторонней
привязкой, а биткоин стал бы резервной валютой. Для поддержки такой схемы нужны так
называемые сайдчейны (side chains). Сайдчейны – это транзакции биткоина, которые поддерживают
валидацию альткоина. Они позволили бы однозначно сказать, что альткоин уничтожен и можно
вернуть биткоин. Но в настоящее время в силу технических характеристик биткионов, нельзя
получить отчет по добыче альткоинов. Это требует расширения языка транзакций. Поэтому сейчас
для того, чтобы забрать биткоин в схеме с двойной привязкой, необходимо проанализировать всю
цепочку блоков и найти доказательство, что альткоин был уничтожен. То есть каждый нод биткоина
должен хранить всю цепочку данных альткоина.
Решением этой проблемы может стать использование доказательств SPV. Основная идея в том,
чтобы вместо проверки длинной действительной цепочки, проверять просто самую длинную
цепочку. Для того, чтобы доказать действительность цепочки нужно проверить каждую транзакцию.
Если же просто проверять самую длинную цепочку, без доказательства того, что она действительная,
то достаточно проверять заголовки блоков.
Похожую схему используют мобильные клиенты, которые не могут являться полными нодами, так
как не имеют достаточно ресурсов для проверки всей цепочки. Они проверяют только
интересующую их транзакцию, что она включена в дерево Меркла какого-то блока, который был в
прошлом. Это намного быстрее, так как они проверяют только заголовки блоков.
Как уже отмечалось ранее, у некоторых альткоинов формирование блоков происходит быстрее, чем
у биткоина. В этом случае проверка SPV-доказательств может быть медленной. Например,
потребуется n шагов для проверки PoW n блоков альткоина. Чтобы повысить эффективность spv-
проверки, можно хранить блоки не просто в цепочке, а в структуре данных, поддерживающей более
эффективный вид SPV-доказательства.
Рис. 10.8. Проверка PoW
Один из подходов к реализации основан на идее доказательства работы. Предположим, есть 4 блока
4-битной сложности. 4 бита – значит, каждый хэш этих блоков имеет, как минимум, 4 нулевых бита в
начале. И если все 4 блока имеют столько же нулевых битов впереди, то в среднем половина этих
блоков будет иметь уже как минимум 5 нулевых битов впереди. При этом в среднем один блок из
четырех будет иметь и шестой нулевой бит впереди хэша. И так далее, в зависимости от числа
блоков. В среднем потребуется 64 хэша, чтобы найти 4 блока с нулевыми битами в начале хэша.
Почти то же число хэшей потребуется для поиска одного-единственного блока с шестью нулевыми
битами. Идея в том, чтобы проверять блок с самой длинной нулевой цепочкой спереди вместо
проверки всех четырех блоков.
Чтобы осуществить поддержку spv-доказательств такого рода, нужно составить что-то вроде списка
с пропусками ( рис. 10.9). Допустим, что цель – проверка PoW только у четверти блоков. . Чтобы
осуществить алгоритм, логичнее всего будет создать указатель и на предыдущий блок с четырьмя
нулевыми битами, и на блок, имеющий шесть и более нулевых битов спереди. Реализация такого
хранения не потребует больших затрат. Чтобы проверить SPV-доказательство, нужно будет
проверить всего четверть блоков.
Итак, можно сделать вывод, что реализация сайдчейна позволит осуществлять двойную привязку. То
есть резервировать одну криптовалюту во время майнинга другой. В резерве могут находится как
альткоины, так и биткоины. Этот алгоритм необходим, чтобы защититься от рисков краха альткоина.
Для поддержки алгоритма требуются модификации в скрипте биткоина. Альткоины же достаточно
объединить с какой-либо другой валютой, работающей под тем же майнинг-паззлом.
В заключение остается еще раз отметить важность альткоина для экосистемы электронных валют.
Альткоины и биткоины взаимодействуют друг с другом по-разному – порой это сотрудничество, а
иногда и борьба. Взаимодействие происходит как технически – вспомним, например, тот же
параллельный майнинг и транзакции с общим хэшем. Очевидно одно - спектр взаимодействия
электронных бирж будет расти со временем.
Терминологический словарь
Блокчейн (block chain - цепочка блоков)- распределенный реестр, состоящий из цепочки блоков
финансовых транзакций, в которой каждый последующий блок криптографически связан с
предыдущим. В ключает в себя сети peer-to-peer (P2P), распределенное хранение данных и
криптографию.
Цифровая подпись (ЭЦП - электронная цифровая подпись) - код, который генерирует алгоритм
шифрования с открытым ключом, прикрепляемый к транзакции для проверки неизменности её
содержимого и идентификации отправителя. Используется для подтверждения транзакции
владельцем биткоин-кошелька отправителя.
Майнинг (mining), "добыча" - процесс в сети Биткоина и других криптовалют, в результате которого
в блокчейн добавляется новый блок транзакций и происходит эмиссия монет.
Нода (node) - узел (сервер) сети Bitcoin.
Приватный (закрытый) ключ (private key) - кодовая строка, при помощи которой осуществляется
доступ к кошельку или биткоин-адресу. Необходима для осуществления транзакций.
Публичный (открытый) ключ (public key) - парная соответствующему приватному ключу кодовая
строка, к которой имеется открытый доступ. Используется с секретным приватным ключом для
отправки транзакций. Публичный ключ соответствует биткоин-адресу.
Пул (Pool), Майнинг-пул (mining pool) - объединение майнеров, которые коллективно добывают
блок, а затем делят полученное вознаграждение. Майнинг-пулы - способ увеличить доходность при
росте сложности майнинга.
Сатоши Накамото (Satoshi Nakamoto) - анонимный создатель (или группа создателей) одноранговой
электронной денежной системы Биткоин.
Форк (Fork - вилка) - создание альтернативной успешной версии цепочки блоков. Форк успешен,
если он становится самой длинной версией цепочки блоков с точки зрения сложности. В этом случае
альтернативная ветка блокчейна отвергается и становится невалидной. Часто форком называют
новую криптовалюту, которая построена на протоколе существующей. Например, лайткоин (LTC)
является форком биткоина (BTC).
PoW, Proof-of-Work, "доказательства работы" - алгоритм, при помощи которого сеть майнинга
определяет, какой из майнинговых узлов запишет сформированный блок в блокчейн.
Сайдчейнинг (sidechaining) — это механизм, который дает безопасно использовать токены одного
блокчейна в другом, сохраняя возможность обратного перевода. В этом случае оригинальный
блокчейн называют основным, дополнительные блокчейны — сайдчейнами
Технологию Биткоин можно использовать для децентрализации различных вещей: акций, облигаций,
имущества и т.д. В этой лекции будет предпринята попытка разобраться, хорошо ли это для
общества и экономики.
Следующий шаг заключается в том, чтобы вместо использования открытого ключа с жесткой
кодировкой, использовать открытый ключ, который будет динамически обновляться на основе того,
что происходит в цепочке блоков. Что это значит? Когда автомобиль выпускают с завода, у него есть
определенный жестко закодированный блок транзакции в цепочке блоков. При этом тот, кто владеет
закрытым ключом, соответствующим адресу на "выходе" этой транзакции, управляет автомобилем.
Другими словами, открытый ключ, используемый автомобилем для авторизации своего владельца,
соответствует открытому ключу, который является адресом на "выходе" этих Биткойн транзакций
( рис. 11.2). Автомобиль работает с узлом сети Биткойн и постоянно "слушает" цепочку блоков,
используя ее для обновления своего ключа.
Допустим, в цепочке появляется новый блок. В новом блоке осуществляется перенос транзакции на
новый адрес. Этот новый адрес является открытым ключом Боба. Автомобиль автоматически
обновит свой открытый ключ, заметив, что эта транзакция является новым открытым ключом. И тот,
у кого есть закрытый ключ, соответствующий этому открытому ключу, теперь сможет отправить
соответствующее авторизованное сообщение автомобилю, чтобы он заработал ( рис. 11.3).
Рис. 11.3. Умная собственность. Владельцем автомобиля стал Боб
Ключ Боба теперь активирует автомобиль. При этом существует различие между правом
собственности на автомобиль и технической возможностью его открыть и завести, отправив
правильную подпись. Поэтому, сделаем предположение, что эта Биткойн транзакция фактически
представляет собой изменение владельца автомобиля.
Для решения этой проблемы нужен механизм, обеспечивающий то, что ни Алиса, ни Боб не смогут
выйти из транзакции, пока другой не исполнит свою часть сделки. Можно создать единую Биткойн-
транзакцию ( рис. 11.4), которая объединит платеж Боба Алисе и передачу права собственности от
Алисы Бобу. Аналогичный механизм используется в рассмотренной ранее CoinJoin, которая
объединяет средства разных участников и выводит их в произвольном порядке.. Теперь транзакция
имеет два входа и два выхода. Первый вход и первый выход соответствуют тому, как именно
автомобиль понимает право собственности. А второй вход и второй выход соответствуют платежу в
Биткойнах, который осуществляет Боб в обмен на автомобиль. Первые вход и выход, которые
передают собственность, также будут иметь какую-то стоимость, но она может быть настолько мала
(например, 1 сатоши), что особого значения не имеет. Единственный денежный аспект этой
транзакции, который имеет значение, - это вход и выход, которые будут соответствовать оплате
автомобиля. Как и в CoinJoin, обе стороны могут отдельно поставить на транзакцию свою подпись.
То же самое будут делать Алиса и Боб, и уже не имеет значения, находятся ли они в одном и том же
месте или нет, - один из них начнет транзакцию, поставит цифровую подпись и отправит другому. И
другая сторона не сможет изменить ни один из параметров транзакции, не нарушив подпись первой
стороны. Таким образом, единственный оставшийся вариант для другой стороны заключается в том,
чтобы поставить свою собственную подпись на транзакции и передать ее в цепочку блоков, либо
прекратить транзакцию, но в этом случае не произойдет ни передача прав собственности, ни оплата.
И как только транзакция будет подтверждена в цепочке блоков, когда после нее добавятся еще шесть
транзакций или около того, автомобиль сменит владельца, по крайней мере, в том смысле, кто теперь
сможет произвести его запуск, а деньги перейдут в другие руки.
Рассмотрим некоторые базовые принципы этого примера. Технический момент признания права
собственности и передачи права на нее с помощью Биткоина возможен и был рассмотрен выше. Но
каков его реальный аналог в мире, и как все это вписывается в понятие децентрализации?
Это лишь один пример использования технологии блокчейн для децентрализации процессов,
происходящих в реальном мире.
Однако у всех примеров использования технологии блокчейн есть две общие характеристики –
репрезентация и атомарность. Репрезентация отражает то, как сложные сделки реального мира
кодируются в цепочку блоков. В примере с автомобилем взяли идею открытого ключа, который
использует автомобиль, чтобы найти правильную подпись для авторизации владельца. И
представляли этот открытый ключ (если быть точнее, его хэш-сумму) как адрес Биткойна.
Атомарность отражает то, как именно соединяются разные участники транзакции. Согласно ей, либо
все операции выполняются как единое целое, либо не выполняются вообще.
Терминологический словарь
Bitcoin - Биткойн
Cryptocurrency - криптовалюта
Soft-fork – софт-форк (механизм, при котором изменение правил в сети не требует обновления
клиента (программного обеспечения) для их исполнения)
Scalability - масштабируемость
Stocks - акции
Bonds - облигации
Output – выход
Transferring - передача
Input - вход
Intermediary - посредник
Лекция 11
Будущее Биткойна
Умная собственность. Репрезентация и атомарность. Пути интеграции блокчейн: прямое использование
блокчейн, встраивание, слайдчейн, альткоины. Реализация краудфандинга с помощью технологии блокчейн.
Плюсы и минусы децентрализованных технологий в сравнении с традиционной системой.