Больше денег: что такое Ethereum и как блокчейн меняет мир - Виталий Дмитриевич Бутерин
Как описали Сомполински и Зохар, GHOST решает первую проблему – потерю безопасности сети – включением залежалых блоков в вычисление, определяющее, какая цепочка самая «длинная»: в расчет идут не только родительский блок и дальнейшие предки блока, но и залежалые потомки предка блока (на жаргоне Ethereum – анклы, то есть «дяди»). Все вместе они участвуют в вычислении того, за каким блоком стоит большее значение proof of work. Чтобы решить вторую проблему и предотвратить централизацию, мы выйдем за рамки протокола Сомполински и Зохара и введем выплаты за залежалые блоки: такой блок получит 87,5 % от того, что получил бы, если бы попал в блокчейн, а «племянник», включающий залежалый блок, получит 12,5 %. Однако комиссии за транзакцию анклы не получат.
Ethereum реализует упрощенную версию GHOST, которая опускается всего на семь уровней. Она работает следующим образом.
◊ В блоке должен быть указан родитель, а также 0 или более анклов.
◊ Анкл, включенный в блок B, должен обладать следующими свойствами:
◊ он должен быть прямым потомком предка k-го поколения B, где 2 <= k <= 7;
◊ это не может быть предок B;
◊ анкл должен быть валидным заголовком блока, но не обязательно должен быть ранее верифицированным или даже валидным блоком;
◊ анкл должен отличаться от всех анклов, включенных в предыдущие блоки, и всех анклов, включенных в тот же блок (двойное включение невозможно).
◊ За каждого анкла U в блоке B майнер блока B получает дополнительные 3,125 % к своему coinbase-вознаграждению, а майнер блока U получает 93,75 % от стандартного coinbase-вознаграждения.
Такую ограниченную версию GHOST, в которую анклы могут входить только до семи поколений, мы использовали по двум причинам. Во-первых, при неограниченном GHOST возникло бы слишком много сложностей с вычислениями, какие анклы конкретного блока валидны. Во-вторых, неограниченный GHOST в сочетании с предлагаемой Ethereum системой компенсаций ослабляет стимул майнить именно главную цепь блокчейна, а не цепь злоумышленника.
Комиссии
Поскольку участники сети загружают транзакции в блокчейн и проверяют валидность каждой из них, необходим некий регуляторный механизм, и обычно это – комиссии. По стандарту, который когда-то задал Bitcoin, выбор размера комиссии остается за отправителем. Предполагается, что минимальные значения будут устанавливаться динамически за счет решений майнеров. Bitcoin-сообщество широко одобрило такой подход как «рыночный», где стоимость определяется спросом и предложением. Но важно понимать, что проведение транзакций – не рынок, как бы ни хотелось видеть в майнере продавца, предоставляющего отправителю услугу за определенную плату. В реальности каждая транзакция, включенная майнером в блок, должна быть проведена всеми нодами сети, так что по большей части транзакцию осуществляет третья сторона, а не майнер. Здесь возникает риск трагедии общих ресурсов.
Однако при некоторых небрежных упрощениях этот недостаток удивительным образом самоустраняется. Происходит это следующим образом. Предположим, что…
1. Транзакция состоит из k операций и предлагает майнеру, который включит ее в блокчейн, комиссию kR, где R задается отправителем. Майнер заранее примерно представляет, какими будут R и k.
2. Себестоимость проведения операций для каждой ноды равна C (то есть все ноды одинаково эффективны).
3. Есть N майнящих нод c одинаковыми вычислительными мощностями (то есть одна нода – это 1 / N от всей мощности).
4. Нет полных нод, которые не задействованы в майнинге.
Майнер захочет включить в блок только те транзакции, комиссия с которых превысит себестоимость их проведения. Таким образом, предполагаемое вознаграждение составит kR / N, поскольку вероятность нахождения блока для майнера будет равняться 1 / N, а себестоимость проведения транзакции – kC. Следовательно, майнеры будут включать в блок такие транзакции, для которых kR / N > kC или же R > NC. Заметим, что R – устанавливаемая отправителем комиссия за одну операцию транзакции, так что это нижняя граница выгоды, которую он получит от этой транзакции, а NC – себестоимость проведения операции для всей сети. Соответственно, майнерам выгодно включать в блок только такие транзакции, где общая утилитарная выгода превышает себестоимость.
Однако у этой модели есть серьезные расхождения с реальностью.
1. Майнер, проводящий транзакцию, платит больше, чем верифицирующие ноды, поскольку дополнительное время верификации замедляет распространение блока в сети, из-за чего блок с большей вероятностью может залежаться.
2. Существуют полные ноды, которые не занимаются майнингом.
3. На практике вычислительные мощности майнеров могут распределяться крайне неравномерно.
4. Существуют аферисты, политические враги и просто странные люди, которые желают навредить сети, и они вполне могут создавать хитроумные контракты, стоимость которых будет гораздо ниже себестоимости для верифицирующих нод.
По первой причине майнерам выгоднее включать в блок поменьше транзакций, а вторая причина увеличивает NC, так что эти два действия хотя бы частично уравновешивают друг друга. Как именно? Пункты 3 и 4 представляют большую проблему, и для ее устранения мы просто вводим плавающий лимит: ни один блок не может иметь больше операций, чем BLK_LIMIT_FACTOR, умноженный на долгосрочное экспоненциально изменяющееся среднее значение. Вот как это выглядит:
blk.oplimit = floor((blk.parent.oplimit * (EMAFACTOR – 1) +
floor(parent.opcount * BLK_LIMIT_FACTOR)) / EMA_FACTOR)
BLK_LIMIT_FACTOR и EMA_FACTOR – константы, на данный момент составляющие 65 536 и 1,5 соответственно, но эти значения, скорее всего, изменятся после более глубокого анализа.
Существует еще один фактор, сдерживающий разрастание блоков в Bitcoin: большие блоки будут распространяться дольше и, следовательно, больше рискуют залежаться. В Ethereum распространение блоков, требующих больше газа, также может занять больше времени как из-за их физического размера, так и из-за того, что им требуется больше времени на обработку переходов состояния транзакции для проверки. Этот сдерживающий фактор важен для Bitcoin, но не для Ethereum из-за протокола GHOST; следовательно, использование регулируемых лимитов блоков обеспечивает более стабильную опору для работы протокола.
Вычисление и полнота по Тьюрингу
Крайне важное свойство EVM – полнота по Тьюрингу, подразумевающая, что EVM-код может реализовать любое мыслимое вычисление, включая бесконечные циклы. Код EVM допускает два способа написать бесконечный цикл. Во-первых, можно использовать инструкцию JUMP, позволяющую отпрыгнуть в предыдущее место кода, а также инструкцию JUMPI для прыжка при выполнении некоторого условия, допускающую выражения вроде x < 27: x = x × 2. Во-вторых, контракты могут обращаться к другим контрактам, что потенциально может привести к зацикливанию через рекурсию. Здесь возникает закономерный вопрос: могут ли недобросовестные