Uploaded by Юрий Ладыгин

Введение в Ethereum и Solidity

advertisement
Создание децентрализованных приложений на блокчейн
Помощь в программировании искусственного интеллекта
Глава 1. Устраняем пробелы в знаниях о блокчейн-технологиях
05.04.2018
Рубрика: Введение в Ethereum и Solidity
Автор: adminCraft
Содержание страницы
1 Глава 1
2 Для кого будет интересен блокчейн
3 Что делает Ethereum?
4 Примечание
5 Что такое протокол?
6 Три компонента блокчейна
7 Ethereum допускает использование множества цепочек
8 Примечание
9 Это такое же мошенничество, как и Биткойн!
10 Эфир как валюта и товар
11 Закон Грешема
12 Путь к лучшим деньгам
13 Криптоэкономика и безопасность
14 Вспомним старые добрые дни
15 Криптохаос
16 Сила в протоколе
17 Примечание
18 Вы можете создать систему, не требующую доверия
19 Что делают смарт-контракты (на самом деле)
20 Объекты и методы для ценности
21 Просто добавьте коммерческую деятельность
22 Создание контента
23 Где данные?
24 Что такое майнинг?
25 Эфир и цены на электричество
26 Погружение в EVM
27 Примечание
28 Браузер Mist
29 Браузер vs. блокчейн кошелек или цепочка ключей
30 Solidity похож на JavaScript, но…
31 Для чего подойдет Ethereum?
32 Критика
33 “Время простоя, цензура или вмешательство третьих сторон полностью исключены”
34 “Безопасная, свободная и открытая платформа для интернета вещей”.
35 “Обеспечение прозрачного управления для сообществ и организаций”
36 “Обработка аутентификации пользователей и безопасных платежей, а также обмен сообщениями, и даже
децентрализованное хранение данных”
37 “Нет необходимости регистрироваться или платить за хостинг приложений; первая в мире платформа с нулевой
инфраструктурой”
38 Состояние разработки смарт-контрактов в настоящее время
39 Альтернативные монеты
40 Финансирование вашего проекта
41 Решите, с какой стороны войти в эту сферу
42 Примечание для начинающих программистов
43 Примечание
44 Ethereum – свободный и с открытым исходным кодом
45 EVM намерена здесь закрепиться
46 Что вы можете создать сегодня?
47 Приватные и публичные цепочки
48 Получение и отправка эфира
49 Написание смарт-контрактов
50 Создание доказуемых честных приложений
51 Запуск собственного токена
52 Перспектива использования децентрализованных баз данных
53 Что дальше: новые способы работы
54 Итоги Главы 1
55 Примечания к Главе 1
Глава 1
Прежде чем мы начнем, давайте определим некоторые термины, с которыми вы столкнетесь.
Блокчейн – это полностью распределенная одноранговая программная сеть, которая использует криптографию для
защищенного хостинга приложений, хранения данных и легкой передачи цифровых финансовых инструментов,
являющихся эквивалентом реально существующих денег. Криптография – это искусство общения посредством
зашифрованных сообщений. В Биткойн и Ethereum криптография используется для создания единой защищенной
вычислительной среды из тысяч схожих машин, которая работает без централизованного управления и без единого
владельца. При таком потенциале, становится очевидным, почему эта технология стала предметом беспрецедентных
спекуляций, хайпа, путаницы и предсказаний.
Понятие Ethereum может использоваться в отношении трех различных вещей: протокол Ethereum, сеть Ethereum, созданная
компьютерами при помощи данного протокола, и фонд Ethereum по финансированию разработки проектов с
использованием вышеупомянутых двух технологий. Вслед за Биткойн, Ethereum обзавелся своей собственной вселенной,
привлекая энтузиастов и инженеров из целого ряда отраслей. Многие из наиболее набивших оскомину несовершенств
цивилизации могли бы подпасть под действие убийственных приложений на блокчейне, а протокол Ethereum (который
произошел от Биткойн и был расширен) многими рассматривается в качестве сети, в которой эти распределенные
приложения будут создаваться. Для разработчиков, проектировщиков и менеджеров проектов сейчас самое время, чтобы
приступить к прототипированию приложений для сети Ethereum.
Для кого будет интересен блокчейн
Две большие группы исследователей имеют интерес к системам на блокчейне, и особенно Ethereum: разработчики
приложений, заинтересованные в создании продуктов и услуг, и непрограммисты, которым интересен потенциал Ethereum,
возможно, ввиду необходимости по работе или интереса в области финансовых услуг, консалтинга, страхования, права,
разработки игр, работы правительств, логистики или IT. Эта книга также написана на стыке нескольких дисциплин. Она
предоставляет контекстуальное руководство как для программистов, так и для непрограммистов по разработке идей о
том, что создавать, и как это создавать. Книга устраняет разрыв между наукой о вычислениях, экономикой, финансовыми
услугами и, где это необходимо, банковской историей.

На хабр пишут про самые насущные темы о блокчейн простыми словами, а также в интернете есть много
подобных материалов – блокчейн для чайников, реестр на блокчейн и др.
Для программистов сложность в отношении Ethereum, как правило, вызывает не написание кода; как и большинство
проектов по разработке программного обеспечения с открытым исходным кодом, Ethereum представляет собой
дружелюбную среду для тех, кто уже занимается программированием в других средах. Скорее, задача состоит в том, чтобы
понять концепцию “криптоэкономики” или систему стимулов и ограничений, которые защищают сеть.
Для непрограммистов вызов заключается в том, чтобы предсказать, как будет развиваться экосистема, и как вы можете в
нее вписаться. Заявления о том, что блокчейн будет модернизировать банковскую систему или совершит революцию в
сфере страхования, могут быть раздуты, но на сколько?
Что делает Ethereum?
В абстрактных блокчейн-сетях с открытым исходным кодом типа Ethereum и Биткойн есть наборы инструментов, которые
позволяют вам отображать экономическую систему в программном обеспечении, вкупе с управлением учетными
записями и нативной единицей обмена между аккаунтами. Это похоже на игру в монополию. Люди называют эти единицы
обмена монетами, токенами или криптовалютой, но они ничем не отличаются от токенов в любой другой системе и
представляют собой форму денег (или временных видов платежных средств), которые можно использовать только внутри
этой системы.
Блокчейны работают наподобие mesh-сетей или локальных вычислительных сетей (LAN); пиры внутри сети просто
соединены друг с другом при помощи одного и того же программного обеспечения. Если вы хотите, чтобы одна из
подобных одноранговых (P2P) сетей была доступна через веб-браузер, вам необходимо использовать специальные
программные библиотеки типа Web3.js для подключения front-end (GUI, который вы видите в браузере) посредством
JavaScript API к его back-end (блокчейн).
В Ethereum вы можете развить эту концепцию на один шаг вперед легким написанием финансовых контрактов с другими
пользователями внутри системы. Как вы узнаете далее, эти финансовые контракты называются смарт-контрактами.

Ключевым компонентом является идея о полном по Тьюрингу блокчейне. … В качестве структуры данных он
работает примерно также, как Биткойн, с разницей в том, что в Ethereum имеется этот встроенный язык
программирования.
— Виталик Бутерин, создатель Ethereum.3
В Ethereum смарт-контракты пишутся на языке программирования Solidity, о котором вы узнаете в Главе 4. Полнота по
Тьюрингу была преимуществом, за которое быстро ухватились многие разработчики, но более важной является
возможность Ethereum сохранять состояния. В компьютерных вычислениях для системы, умеющей сохранять состояния,
имеется простое определение – это система, которая может обнаруживать изменения информации и помнить о них в
течение определенного времени.
Представьте компьютер без жесткого диска; вы бы не смогли сделать многое с его помощью. Он будет похож на
калькулятор, содержимое памяти которого исчезает.
Возможность осуществлять взаимодействие между пользователями в будущем, и делать это на определенных условиях,
является мощным дополнением к блокчейну. Это позволяет разработчикам ввести поток управления в программирование
транзакций криптовалюты. Это самое большое различие между Ethereum и Биткойн, но не единственное, как вы узнаете.
Примечание
Поток управления означает последовательность выполнения или вычисления инструкций вычислителем. Примерами
являются условные утверждения (if условие then команды) и циклы (которые выполняются в повторяющемся режиме до
тех пор, пока не будут выполнены определенные условия).
В Биткойн все транзакции происходят настолько быстро, насколько это возможно. Поскольку в Биткойн отсутствует
сохранение состояний, ему приходится выполнять все транзакции за один раз. Блокчейн, по задумке создателя (или
создателей) Биткойн, представлял собой распределенный реестр транзакций, который хранит учет всех имеющихся
балансов в сети. (Примечание по стилистике для внимательных читателей: Биткойн как сеть пишется с заглавной буквы,
биткойн как токен пишется со строчной буквы). В Ethereum аналогичная система может быть расширена
стандартизированными средствами.
Во-вторых, этот типовой скриптовый язык упрощает обмен данными между блокчейнами, работающими по протоколу
Ethereum, позволяя группам, использующим раздельные блокчейны, обмениваться информацией и ценностями друг с
другом.
Что такое протокол?
Если вы только начинаете знакомиться с разработкой программного обеспечения, вам будет полезен 10-секундный
экспресс-курс по информационным технологиям (IT). IT можно определить как изучение применения компьютерных
систем для хранения, редактирования, получения и передачи информации. То, как эта информация представляется и
обновляется с течением времени, чтобы отражать внутренние и внешние изменения, зависит от используемой
технологической системы.
В контексте телекоммуникаций протокол – это система правил, которая описывает, как компьютер (и программист) может
подключаться, принимать участие и передавать информацию в системе или сети. Эти инструкции определяют синтаксис
кода и семантику, которые ожидает получить система. Протоколы могут включать в себя аппаратные средства,
программное обеспечение и простые инструкции. Для работы с Ethereum не требуется никаких специальных аппаратных
средств, а программное обеспечение полностью бесплатное.
В Ethereum протокол предназначен для создания децентрализованных приложений с акцентом на быструю разработку,
безопасность и интерактивность.
Три компонента блокчейна
Блокчейн можно рассматривать как базу данных, которая распространяется или дублируется на множество компьютеров.
Инновацией, для обозначения которой используется слово “блокчейн”, является специфическая способность этой сетевой
базы данных согласовывать последовательность транзакций, даже если несколько узлов в сети получают транзакции в
разном порядке.
Это обычно происходит из-за сетевых задержек, связанных с физическим расстоянием; например, транзакция, созданная
пользователем, покупающим хот-дог в Токио, будет сначала отправлена на узлы в Японии. К тому времени, как узел в НьюЙорке получит сообщение об этой транзакции спустя несколько миллисекунд, другая транзакция из близлежащего
Бруклина может пробраться вперед Токийской. Эти несоответствия, обусловленные субъектной перспективой в
распределенных системах, делают их сложными для масштабирования. Сила систем на блокчейне в том, что они
представляет собой совокупность технологий, которые мы можем развернуть, чтобы решить эту проблему.
То, что обычно называют блокчейном, на деле является совокупностью трех технологий, набор из этих компонентов был
изначально придуман псевдоанонимным создателем Биткойн. Вот эти три компонента:
Peer-to-peer networking (одноранговая сеть): группа компьютеров, например BitTorrent-сеть, которые могут
обмениваться информацией между собой, не полагаясь на единый центральный сервер и, следовательно, не
имеющие единой точки отказа.
Асимметричная криптография: способ для этих компьютеров отправить сообщение, зашифрованное для
определенных получателей таким образом, чтобы любой мог проверить подлинность отправителя, но только
предполагаемые получатели могли прочитать содержимое сообщения. В Биткойн и Ethereum асимметричная
криптография используется для создания набора идентификационных данных для вашей учетной записи, чтобы
гарантировать, что только вы можете перемещать свои токены.
Криптографическое хеширование: способ сгенерировать небольшой уникальный “отпечаток” для любых данных,
позволяющий быстро сравнивать большие массивы данных и безопасно проверять, что данные не были изменены;
как в Биткойн, так и в Ethereum используется структура данных Merkle Tree для записи канонической
последовательности транзакций, которая затем хешируется в “отпечаток”, служащий основой сравнения для
компьютеров в сети и за ее пределами, которую они могут быстро синхронизировать.
Сочетание этих трех элементов выросло из экспериментов с цифровыми деньгами в 1990-х и начале 2000-х годов. Адам
Бэк выпустил HashCash в 2002 году, который впервые использовал майнинг для отправки транзакций. Человек (или группа
людей) с псевдонимом Сатоши Накомото добавил к этой инновации распределенный консенсус, создав Биткойн в 2009
году.
Вместе эти три элемента могут имитировать простую базу данных, которая децентрализована и хранится на узлах сети. По
аналогии с группой муравьев, образующих функционирующую колонию, вы можете представлять себе Биткойн в виде
машины. В вычислительных терминах это виртуальная машина, особенности которой мы рассмотрим позже.
Ethereum добавляет, если использовать термины науки о вычислениях, доверительную, с использованием глобальных
объектов, фреймворк-подобную систему обмена сообщениями к парадигме, созданной виртуальной машиной Биткойн.

Ethereum был впервые предложен в 2014 году в “Ethereum White Paper”.
Ethereum допускает использование множества цепочек
Биткойн, который мы знаем сегодня – это не только крупномасштабное развертывание программного обеспечения
Биткойн. К примеру, Litecoin использует модифицированное программное обеспечение Биткойн, как и десятки других
форков. Ethereum был изначально разработан из расчета, что подражание будет неизбежным, и что допустимо появление
множества блокчейнов, а значит должен быть создан набор протоколов, при помощи которых они смогут обмениваться
данными.
Примечание
Для работы с протоколом Ethereum желательно обладать знаниями концепций как экономических, так и
программирования. Эта книга содержит необходимые разъяснения.
Придерживаясь принципиально иной точки зрения, отличной от взглядов создателей Биткойн, разработчики Ethereum
заняли позицию, подразумевающую, что криптовалюта, если она будет существовать в будущем, не будет представлять
собой одну децентрализованную систему. Напротив, это будет распределенная сеть децентрализованных систем,
позволяющая легко и быстро определять и претворять в жизнь множество различных криптографических токенов с
разным назначением и интерпретацией.
Это такое же мошенничество, как и Биткойн!
Если вы работаете в сфере финансовых услуг или изучали экономику, поиск дополнительной информации в Google,
возможно, привел вас к выводу, что Биткойн – это не что иное, как глобальная финансовая пирамида. Давайте положим
конец этим спекуляциям.
Это верно лишь на половину: стоимость биткойна определяется рынком биткойнов. Конечно, определенные организации,
работающие с биткойнами, получили лицензии на осуществление внутренних переводов денежных средств и могут
выкупать ваши биткойны в обмен на доллары США, евро, золото или другие фиатные валюты. Но эти организации –
частные компании, которые начисляют комиссию и могут прекратить работу в любой момент.
Таким образом, Биткойн и похожие на него сети уязвимы только в том плане, что у них нет организаций последней
инстанции, производящих обмен цифровых валют, нет доверенных (правительственных или корпоративных) организаций,
в которых можно быть уверенными, что они будут обменивать ваши биткойны или эфир на доллары США в будущем. За
исключением расчетов через частных лиц, единственный способ обменять биткойны на что-либо, имеющее реальную
стоимость, это связаться с онлайн-сервисом обмена цифровых валют и продать монеты за фиатную валюту, тем самым
найдя другого покупателя.
Сеть Ethereum перемещает токены эфира точно так же, как сеть Биткойн перемещает токены биткойнов. Как вы узнаете,
эфир работает иначе, чем биткойн, и будет более правильно назвать его не криптовалютой, а криптотоваром. Давайте
посмотрим, как экономика Ethereum связана с лежащей в ее основе технологией.
Эфир как валюта и товар
Часто говорят, что биткойн ничем не подкреплен, и это правда. Конечно, современные фиатные валюты точно так же
ничем не подкреплены. Их разница в том, что одобренная правительством фиатная валюта держится по умолчанию всеми
теми, кто оплачивает налоги и покупает государственные облигации. Также, некоторые международные продажи сырьевых
товаров производятся в долларах, что является еще одной причиной для людей держать доллары.
Для криптовалют сохраняются проблемы по внедрению. Сегодня эти цифровые токены остаются быстрым, защищенным и
общедоступным уровнем оборота платежей поверх существующей системы фиатных денег; это экспериментальное
внедрение, которое может однажды развиться до такой степени, что сможет заменить централизованные платежные
сетевые технологии, используемые компаниями типа Visa или MasterCard сегодня на определенные блокчейн компании.
Между тем, потрясающие возможности появляются на горизонте, поскольку правительства и частные институциональные
инвесторы начинают создавать крупные рынки для финансовых продуктов и услуг, выраженных в криптовалютах. Даже
центральные банки могут адаптировать эту технологию. На момент написания этой книги по крайней мере одна страна
выпустила цифровой доллар с использованием программного обеспечения Биткойн: Барбадос. Другие страны активно
изучают перспективы.
Закон Грешема
Какое это имеет значение, если финансовые продукты, контракты, договоры страхования и тому подобные вещи будут
выражаться в криптовалюте? И как это связано с Ethereum?
Валюта, с помощью которой можно купить различные ценные бумаги и активы, это валюта, достойная накопления. Сеть
Ethereum позволяет любому написать надежный, самовыполняемый финансовый контракт (смарт-контракт), который
будет перемещать эфир в будущем. Вполне вероятно, это могло бы обеспечить финансовые контракты, спроектированные
на далекое будущее, что даст вовлеченным в контракт сторонам основание для хранения и использования эфира в
качестве средства сбережения.
Изначально применявшийся к золотой и серебряной валюте, закон Грешема утверждает, что в экономике “худшие деньги
вытесняют из обращения лучшие”. Другими словами, люди сберегают и копят валюты, которые, как они ожидают,
повысятся в цене, при этом они тратят валюты, которые, по их мнению, упадут в цене.
Хотя этот закон и назван в честь финансиста из 16 века, эта концепция появилась задолго до него, в трудах средневековых
авторов, и даже еще ранее, в античных текстах, включая комедию Аристофана “Лягушки”, обычно датируемую 405-м годом
до н.э.:

“Монеты, не тронутые примесями, золотые или серебряные, Каждая хорошей чеканки, проверенная и звенящая
чисто. Однако, мы никогда их не используем! Другие же монеты ходят по рукам…”
На протяжении тысячелетий люди сохраняют результаты своей работы при помощи денежных инструментов, которые
будут оставаться стабильными, оцениваться по достоинству или повышаться в цене, а не при помощи чего-либо склонного
к падению в цене. Криптовалюты на данный момент волатильны и принимаются только несколькими правительствами и
компаниями во всем мире, на момент написания книги. В наше время децентрализованные смарт-контракты практически
не используются в бизнесе. Но аналогичным образом и фиатные валюты, эмитируемые центральными банками, имеют
ужасный исторический опыт и, вне всякого сомнения, подвержены пузырям, депрессиям и манипуляциям. Смогут ли
криптовалюты когда-либо стать реальными деньгами, и станут ли они лучше, чем те деньги, к которым мы привыкли?
Путь к лучшим деньгам
Сегодня Биткойн (обозначаемый условным сокращением BTC) используется людьми, правительствами и компаниями для
передачи ценности и для покупки товаров и услуг. Каждый раз, когда они отправляют биткойны, они платят небольшую
комиссию в сеть, которая выражается в биткойнах. Эфир (обозначаемый условным сокращением ETH) можно
использовать аналогичным образом. Чтобы понять, куда двигаться дальше, вам нужно узнать несколько вещей.
Во-первых, у эфира есть другое применение: им можно платить для запуска программ в сети Ethereum. Эти программы
могут перемещать эфир сейчас или в будущем, или при определенных условиях.
Ввиду своей способности платить за исполнение транзакций в будущем, эфир также можно считать товаром,
своеобразным топливом, позволяющим сети запускать приложения и услуги. Таким образом, в сравнении с биткойном, у
него есть дополнительный аспект внутренней ценности; это не только средство сбережения.
В наши дни подавляющее использование фиатных валют может быть поводом считать, что криптовалюты – это “худшие”
деньги, что они более подвержены обесцениванию в долгосрочной перспективе. И все же, биткойн и эфир, как всем
хорошо известно, накапливаются держателями, и даже хранятся на счетах по крайней мере одной компании, на момент
написании книги, – Grayscale, дочерней компании Digital Currency Group. Между тем, центральные западные банки
экспериментируют с практически нулевыми процентными ставками и количественным смягчением, также известным, как
печатание денег, во все более опасных и отчаянных попытках сдерживать инфляцию и дефляцию.
Уменьшение размера вознаграждения в биткойнах вдвое каждые четыре года, проблемы глобальной монетарной
политики, общая экономическая неопределенность и снижение доверия к фиатным валютам – все это притягивает к
рынку огромное количество скрытых накапливаемых криптовалют ввиду роста цен на обслуживание реального спроса.
Это выражается в постоянно растущих ценах большей части криптографических токенов, несмотря на внутридневную
волатильность их цен. Это балансирование между держателями, спекулянтами и потребителями создает процветающий и
здоровый рынок криптовалют, и дает основание предполагать, что криптотокены как класс активов уже используются в
качестве денег, и даже больше.
Криптоэкономика и безопасность
Одна из причин, по которой стоит поднять тему валют и товаров в ходе обсуждения смарт-контрактов, – это стремление
приучить вас мыслить в категориях создания экономических систем в чистом программном обеспечении. В этом
заключается потенциал Ethereum.
Разработка программных систем на основе теории игр формирует новую область криптоэкономики, которую мы обсудим в
этой книге в рамках технических занятий. То, что может показаться простым на начальном этапе – например, эквитимонета – порождает множество сложностей после представления в виде программного кода. В сущности, что делает
системы Биткойн и Ethereum столь защищенными, так это то, что они не основаны на какой-либо взломоустойчивой
технологии, а больше полагаются на мощные финансовые положительные и отрицательные стимулы с целью удержать
злоумышленников в стороне.
Это привлекательные преимущества, которыми должен восхищаться любой инженер или разработчик ПО. Но раскрутка
монет в роли денег (или временных видов платежных средств) – это полностью отдельная, дополнительная задача по
привлечению внимания людей к пользовательским приложениям. Эта книга решает обе половины данной проблемы.
И хотя наиболее очевидные примеры применения подобного программного обеспечения можно найти в сфере финансовых
услуг, приложения будущего могут также использовать аналогичные рычаги – доверие, транзакции, деньги, разработка
сценариев – для совершенно других целей. Как и в случае с командной строкой, которая со временем привела к GUI, а
теперь и к приложениям виртуальной реальности (VR), вы можете выбрать, что создать с помощью Ethereum. Но мы
обсудим несколько примеров, в любом случае.
Вспомним старые добрые дни
Это правда, что Биткойн и Ethereum добавляют немного сложности – экономическую составляющую – в написание
программного обеспечения. Но при этом, в некоторых аспектах, они проще; работа с децентрализованными протоколами
похожа на работу с компьютерами образца 1970-х годов. Это были громоздкие и дорогие системы с ресурсами общего
пользования, и люди могли арендовать эти машины на время у компании или университета, владевших ими. Сеть Ethereum
работает как один большой компьютер, который исполняет программы синхронно; это машина, которая виртуализируется
сетью других машин. Будучи состоящей из множества частных компьютеров, виртуальная машина Ethereum (EVM) сама по
себе может считаться компьютером, ресурсы которого используются совместно и который никому не принадлежит.
Изменения в EVM вносятся посредством хардфорка: нужно убедить все сообщество операторов узлов обновить
программное обеспечение Ethereum на новую версию. Основная группа разработчиков не может просто так протолкнуть
изменения. Они задействуют политический процесс убеждения и разъяснения. Подобное устройство, не имеющее
владельцев, призвано максимально увеличить время безотказной работы и защищенность, при этом свести к минимуму
мотивацию играть нечестно.
Криптохаос
К настоящему времени у вас могло возникнуть множество вопросов. Не беспокойтесь – вся эта информация будет иметь
больше смысла, когда вы углубитесь в детали в последующих главах. Будьте уверены: каждый, кто сталкивается с
разработкой блокчейнов впервые, испытывает потрясение. Это новая технология, все очень быстро меняется, и опыт
работы с децентрализованными системами достаточно редко встречается.
Никто не знает, что будет дальше, но ясно, эта технология работает – капитализация рынка всех криптовалют вместе
взятых достигла объема, превышающего 26 миллиардов долларов США (на момент написания этой книги). Розничные
торговцы, крупные и не очень, в онлайне и в офлайне начинают принимать платежи в цифровых монетах. (Обратите
внимание, что если не указано иное, все суммы в долларах выражаются в долларах США).
Поэтому, даже если вы никогда до этого не программировали, не бросайте читать эту книгу. Проект Ethereum строится с
учетом того, что им будут пользоваться новые разработчики, и предоставляет вам инструменты для создания небывалых
решений старых проблем. Вам решать, что создавать с помощью этого мощного нового инструмента. Предмет изучения
этой книги – как создавать, и почему вам стоит обучиться разработке блокчейнов.
Сила в протоколе
В современной технологической индустрии правят протоколы прикладного уровня: это уровень, на котором обитают все
пользовательские данные. Многомиллиардные компании типа Google, Facebook и Twitter построили огромную
инфраструктуру для поддержки международных групп пользователей. Все построено на базе протокола управления
передачей/межсетевого протокола (TCP/IP), протокола передачи гипертекста (HTTP), простого протокола передачи почты
(SMTP) и ряда других протоколов.
В Ethereum, как и в Биткойн, прикладной уровень более тонкий, по крайней мере, в данное время, поскольку сам протокол
предоставляет множество возможностей. По факту, многие компании, работающие на базе Биткойн, это весьма
незначительные уровни поверх того, что уже является невероятно эффективной платежной сетью.
Примечание
Рыночная капитализация является показателем ценности организации или экосистемы. Она рассчитывается путем
умножения цены одной доли в капитале (например, один эфир) на их количество в обращении. Рыночная капитализация
часто считается показателем внедрения криптовалюты; впрочем, использование денежной базы может быть более
целесообразным. Денежная база – это общая сумма наличных денег в обращении и денег, хранимых в качестве резерва
организациями, работающими с деньгами.
По итогу, взрывного развития Биткойн, которого ожидали венчурные капиталисты всего лишь пять или шесть лет назад, не
случилось. Вместо этого Биткойн-индустрия быстро консолидировалась.
Однако, рыночная капитализация сети Bitcoin выросла до почти 19 миллиардов долларов менее чем за 10 лет. Рыночная
капитализация Ethereum составляет порядка одного миллиарда долларов. Это беспрецедентный, быстрый новый способ
раскрутки нового сетевого протокола.
Традиционные веб-приложения являются в значительной мере дорогостоящими, потому что они должны разрабатываться
для хранения и обмена пользовательскими данными, и, следовательно, должны иметь системы для изолирования
злоумышленников, чтобы добиться доверия. Множество частных дата-центров осуществляют свою деятельность из
бомбоустойчивых защитных сооружений и за слоями колючей проволоки. Если безопасность, обеспечиваемую подобными
уровнями частной инфраструктуры, можно превзойти при помощи защищенной децентрализованной сети, владельцы
онлайн-компаний сталкиваются со значительно более низкими накладными расходами, они могут направлять
сэкономленные средства на обслуживание своих клиентов, чтобы обойти устаревших игроков на рынке. Приложения и
сервисы на базе блокчейна революционны не только по причине своей защищенности, но и ввиду того, насколько
экономически выгодными они могут быть для работы при масштабировании.
Вы можете создать систему, не требующую доверия
Когда вы изучите язык Solidity, то быстро поймете, какие программы вы сможете написать, – именно в этот момент
наступит реальный порог вхождения. Цель проектов из этой книги – точно показать, как и где блокчейны могут улучшить
или автоматизировать взаимодействие конечных пользователей во всевозможных сферах деятельности, а также позволят
создавать новые виды продуктов и услуг. Вы узнаете, как банковские продукты и услуги, которые мы знаем сегодня и
которые на протяжение более ста лет развивались методом проб и ошибок, могут измениться, извлечь пользу или достичь
определенного уровня при помощи не требующих доверия распределенных или полураспределенных систем. В этом
контексте “не требующий доверия” означает “не требующий веры в то, что контрагенты будут действовать честно и без
сбоев, а значит невосприимчивый к мошенничеству и другим рискам невыполнения контрагентами своих обязательств”.
В сети уже есть хороший материал по Ethereum и Solidity для разработчиков программного обеспечения, готовых
приступить к работе. Однако, если вы прочитали эту документацию, у вас, вероятно, осталось больше вопросов, чем
ответов. Далее, мы разъясним определенный жаргон.
Что делают смарт-контракты (на самом деле)
Даже на этих первых нескольких страницах книги вы, вероятно, столкнулись с рядом совершенно новых концепций. Но
есть один термин, который будет постоянно всплывать в Ethereum, и речь о таком понятии, как “смарт-контракт”: умный
контракт – это определенная бизнес-логика, которая работает в сети, в полуавтономном режиме перемещающая ценность
и обеспечивающая выполнение платежных соглашений между сторонами.
Смарт-контракты часто приравнивают к программным приложениям, но это упрощенная аналогия; они больше похожи на
концепцию классов в традиционном объектно-ориентированном программировании. Когда разработчики говорят о
“написании смарт-контрактов”, они, как правило, имеют ввиду практику написания кода на языке Solidity, который будет
исполняться в сети Ethereum. Когда код выполняется, единицы ценности могут быть переданы так же легко, как данные.
Как уже высказывалось в этой главе ранее, у цифровых денег огромные перспективы.

Но как именно это работает? Как данные могут выступать в роли денег в децентрализованной системе?
Ответ на этот вопрос зависит от ваших технических знаний. Итак, давайте рассмотрим достаточно углубленный пример.
Объекты и методы для ценности
В компьютерных вычислениях объект – это обычно небольшой фрагмент данных (информация), инкапсулированный в
определенную структуру или формат. Часто эти данные имеют собственные инструкции, называемые методами, которые
указывают, каким образом можно использовать или получить доступ к объекту. Теперь давайте представим, что
содержащаяся в этом объекте информация имеет ценность для кого-нибудь, и этот человек захочет заплатить за то, чтобы
привести в действие метод, который отобразит эту информацию.
В приведенном ниже примере давайте представим, что пользователь хочет заплатить небольшую плату за использование
рецепта торта, который он или она нашли в интернете. В нашем примере этот рецепт является объектом данных. В самом
буквальном смысле, характеристики торта, как объекта, называются атрибутами, и они хранятся вместе с методами по
определенным адресам памяти компьютера.
Объект ниже представляет атрибуты торта и содержит метод, при помощи которого компьютер может отобразить
инструкции о том, как объединить эти ингредиенты, чтобы сделать торт. Хранение информации подобным способом
облегчает программе и программисту выполнение загрузки и выгрузки атрибутов без изменения кода для команд вывода
данных на устройство отображения. Другими словами, объекты – это модульные фрагменты информации, которые могут
комбинироваться и рекомбинироваться нужным образом. Это необходимо будет вспомнить в последующих главах, когда
мы будем обсуждать строение блоков, составляющих блокчейн. В JavaScript вы можете написать объект “торт” следующим
образом:
var cake = { rstIngredient: “milk”, secondIngredient: “eggs”, thirdIngredient: “cakemix”, bakeTime: 22
bakeTemp: 420 mixingInstructions: function() {
return “Add ” this. rstIngredient + ” to ” + this.secondIngredient + ” and stir with ” + this.thirdIngredient + ” and bake at ” + bakeTemp
+ ” for ” + bakeTime + ” minutes.” ;
}
};
Это пример того, как компьютеры “перемещают” данные, чтобы вывести пригодные для своих пользователей-людей
результаты. В Ethereum вы можете описать функции, которые будут отправлять деньги подобно тому, как метод этого
небольшого объекта под названием mixingInstructions, при его исполнении, может вывести инструкции по смешиванию
ингредиентов для торта.
Просто добавьте коммерческую деятельность
Как вы узнаете в Главе 4, код Solidity может использоваться на бэкенде приложения для добавления микроплатежей,
учетных записей пользователей и функционала даже простым компьютерным программам, без необходимости
использования сторонних библиотек или продвинутых ноу-хау в программировании.
Представьте на мгновение, что выполнение функции mixingInstructions стоит несколько центов в эфире. После того, как
цена за рецепт торта списывается с баланса Ethereum-кошелька пользователя, – что в среднем занимает несколько секунд
– ваш смарт-контракт будет вызывать метод mixingInstructions и показывать пользователю, как приготовить торт. Все это
можно сделать без аутентификации, платежных API, учетных записей, кредитных карт, обширных веб-форм и всех
стандартных механизмов, используемых при создании приложений для электронной торговли. Фактически, все ваше
JavaScript-приложение должно взаимодействовать с глобальным публичным блокчейном Ethereum с помощью упомянутой
ранее программной библиотеки Web3.js.
Создание контента
До сих пор в этой главе мы фокусировались на использовании эфира в финансовых целях, но пример с рецептом торта
демонстрирует еще одну большую потенциальную область применения Ethereum: интеллектуальная собственность,
лицензирование и роялти за контент. Сегодня продажа контента в интернете или через приложения означает работу с
влиятельными дистрибьютерами, включая Apple, Google и Amazon, которые создают штрафные правила, связанные с
продажей цифрового контента, и взимают большие комиссии.
Ethereum позволяет упростить осуществление микротранзакций, в результате чего пользователь платит лишь, скажем,
$0.25 за рецепт – это сумма, которую было бы нецелесообразно платить при использовании перегруженных комиссиями
кредитно-карточных сетей. На данный момент у создателей контента есть проблемы при ведении бизнеса подобным
образом, включая волатильность цены эфира, но как вы узнаете из последующих глав, решения этих проблем будут
найдены по мере развития сети.
Где данные?
Подождите: если сетевой протокол предоставляет такой большой функционал “из коробки”, и это распределенная система,
то где хранятся данные пользователей? Конкретное описание работы сети Ethereum является темой следующей главы, но
если мы будем придерживаться принципа рассмотрения в первую очередь животрепещущих вопросов, то вот быстрое
краткое изложение того, как транзакции записываются в сети Ethereum: все они хранятся на каждом узле (ноде) сети.
Все транзакции в Ethereum хранятся в блокчейне, каноническая история изменений состояния хранится на каждой
отдельной ноде Ethereum.
Когда вы платите за время вычислений в сети Ethereum, это включает в себя стоимость проведения транзакции и хранение
данных, содержащихся в вашем смарт-контракте. (Если ваш контракт становится меньше после исполнения, вы получите
частичный возврат в виде уменьшенной комиссии за транзакцию).
Как только вы исполните ваш смарт-контракт, и комиссия будет выплачена с вашего баланса эфира, эти данные затем
будут включены в следующий блок. Поскольку сеть Ethereum требует, чтобы все узлы хранили полную базу данных
состояний всех контрактов, любой узел может сделать запрос в локально-хранящуюся базу данных. Если вам сейчас
подумалось о том, что это нельзя масштабировать, то вы очень внимательный читатель. Версии Ethereum 1.5 и 2.0
определяют дорожную карту для решения этой проблемы масштабирования.

Мы углубимся в то, как работает блокчейн Ethereum, в следующей главе.
Что такое майнинг?
Поскольку распределенная система не имеет одного владельца, машины могут свободно подключаться к сети Ethereum и
начинать проверку транзакций. Этот процесс называют майнингом. Но какая у него цель?
Майнинговые ноды “совещаются”, чтобы прийти к консенсусу относительно последовательности транзакций во всей
системе, что необходимо для табулирования балансов аккаунтов всех пользователей “на лету”, даже несмотря на большое
количество транзакций, проходящих в сети. Этот процесс потребляет электроэнергию, которая стоит денег, поэтому
майнерам выплачивается вознаграждение за каждый добытый блок: около 5 эфиров.
Эфир и цены на электричество
Майнерам выплачивается эфир за майнинг, а также за выполнение скриптов в сети (в виде газа, про который мы объясним
позже). Стоимость расходов на электроэнергию для работы серверов в сети Ethereum является одним из факторов,
который дает эфиру, как криптотовару, его внутреннюю стоимость – другими словами, кто-то заплатил реальные деньги
своей энергосбытовой компании для работы своих машин для майнинга.
Специальные риги для майнинга, в которых используются массивы видеокарт для увеличения вероятности завершения
расчета блока и получения награды, могут увеличивать счета за электроэнергию в пределах от $100 до $300 в месяц за
одну машину, в зависимости от ваших местных тарифов.
Майнинг – это фундаментальная составляющая Биткойн и Ethereum, и, в принципе, работает аналогичным образом в обеих
сетях, с некоторыми оговорками. Ethereum и здесь изменил парадигму, особенно касаемо выпуска эфира. Как именно это
работает, мы рассмотрим в Главе 5.
Погружение в EVM
Цель этой книги – научить программистов и владельцев продуктов тому, как и для чего можно запрограммировать
виртуальную машину Ethereum (EVM). EVM – это название только что описанной системы. Книга написана таким образом,
чтобы ее смысл был понятен как для специалистов по финансам, так и для “технарей”, чтобы разработчики и прикладные
специалисты могли легче прийти к общему пониманию того, что им стоит создать совместно, и какие инструменты
подходят для их проекта. Но для начала мы должны потратить еще немного времени на основы использования и хранения
эфира.
Примечание
Если вы не понимаете, что такое виртуальная машина, не переживайте; это станет понятно в дальнейшем. На данном этапе
вы можете представлять себе виртуальную машину в качестве компьютера, состоящего из множества других
компьютеров.
Браузер Mist
В настоящее время развертывание приложений – это все еще сложный процесс, но есть способы простого
прототипирования смарт-контрактов с использованием лишь скриптов на Solidity. Для этого вы будете использовать
нативный браузер Ethereum, который называется Mist. Помимо всего прочего, этот браузер отображает состояние баланса
на ваших аккаунтах. В Главе 2 больше рассказывается о кошельках, браузерах, инструментах командной строки и
обозревателях блокчейнов, но сначала примечание по терминологии.
Браузер vs. блокчейн кошелек или цепочка ключей
Mist иногда называют кошельком, это термин, заимствованный из терминологии Биткойн в блокчейн. Почему Биткойнприложения называют кошельками? Не потому, что они хранят ваши деньги, хотя приложения кошельков и позволяют вам
отправлять и получать платежи. Эти приложения, будучи установленными на ваш смартфон, содержат выпущенные
криптографические ключи, которые позволяют вам читать и записывать данные в распределенную базу данных. Итак, хотя
“цепочка ключей” и была бы более подходящей метафорой, “кошелек” – это термин, который закрепился.
Если у вас есть желание забежать вперед и взглянуть на Mist, вы можете найти ссылку для загрузки под Windows, Mac и
Linux на GitHub проекта Ethereum: https://github.com/Ethereum/mist/releases
С помощью инструментов командной строки в Mist и Ethereum можно протестировать пробные контракты, используя
“ненастоящий” эфир, чтобы убедиться, что вы не потеряете никакие реальные деньги во время отладки. И хотя это кажется
немного примитивным, если у вас есть опыт работы с современными средами разработки, это великолепная отправная
точка для менее подготовленных в техническом плане обучающихся, поскольку это побудит их изучить сетевые и
низкоуровневые компьютерные системы только лишь для создания простого демо-приложения.
Solidity похож на JavaScript, но…
Сферический код Solidity в вакууме будет большей своей частью интуитивно понятен для тех, кто знает языки JavaScript,
Java или C. Хотя Ethereum-приложения не хостятся на каком-то одном сервере, внутренности Ethereum-приложения
представляют собой ряд (относительно) простых файлов смарт-контрактов, которые похожи на JavaScript. Вы создаете их
локально, а затем разворачиваете их для распространения по всей сети и децентрализованного хостинга. В этом смысле
разработка в Ethereum объединяет работу с сетью, хостинг приложений и работу с базами данных в одно целое.
Как и в случае со многими новыми технологиями, внедрение этих систем является непростой задачей. Мы поговорим о
нескольких способах делать это проще. Но после создания вашего первого приложения, обладающего минимальным
функционалом, вы быстро достигнете самой интересной части: придумывать, какие новые приложения и системы можно
создать с вашими новыми навыками.
Для чего подойдет Ethereum?
Ethereum подходит для создания экономических систем в чистом программном обеспечении.
Другими словами, это софт для бизнес-логики, в котором люди (пользователи) могут перемещать деньги (данные,
представляющие ценность) по сети со скоростью и масштабом, которые мы обычно получаем при работе с обычными
данными. Не за плавающий период в три-семь дней, который вы получаете при использовании коммерческой банковской
системы. И без комиссии со стороны вендоров типа Visa, MasterCard и PayPal. Например, с помощью простого Ethereumприложения можно достаточно просто платить небольшие суммы сотням тысяч людей, в десятки стран мира, каждые
несколько минут, в то время как при традиционной банковской системе вам придется иметь целый отдел по расчету
заработной платы, работающий сверхурочно, чтобы постоянно изменять баланс и иметь дело с трансграничными
проблемами.
Критика
Если вы обращали внимание на кампании по продвижению Ethereum, то скорее всего, у вас сложилось несколько более
отчетливое понимание относительно того, что может быть создано при помощи этого программного обеспечения. Вот
подборка мечтательных заявлений об Ethereum и блокчейне в целом с очевидными и простыми встречными доводами.
“Время простоя, цензура или вмешательство третьих сторон полностью исключены”
Если вы не знакомы с миром разработки программного обеспечения с открытым исходным кодом, то вам поначалу
покажется малопонятным то, как происходит управление базой кода. Даже несмотря на то, что протокол Ethereum был
написан небольшой группой основных разработчиков, для изменения того, как функционирует сеть, необходимо
взаимодействие множества категорий участников проекта, это отлаженный процесс. По мере роста сети так называемые
хардфорки станут менее целесообразными и менее необходимыми, и следовательно, менее частыми. Помните, что
развитие сети Ethereum еще не завершено. Она находится в рабочем состоянии сегодня, но не будет полностью готова до,
ориентировочно, 2019 года. Средства для дальнейшей разработки обеспечиваются швейцарской некоммерческой
организацией Ethereum Foundation.
“Безопасная, свободная и открытая платформа для интернета вещей”.
Машины могут исполнять множество смарт-контрактов, в этом направлении идет работа. Например, вы забрели в район
города, где раньше не бывали, и вы теряете сигнал сотовой связи. Ваш телефон может автоматически “арендовать”
определенное время у ближайшей фемтосоты в сторонней сети и заплатить маршрутизатору небольшую плату, все это без
необходимости запрашивать ваше разрешение. Цена и скорость могут быть переменными в смарт-контракте, созданном
маршрутизатором, это похоже на соглашение об уровне предоставления услуги (SLA), благодаря которому могут быть
переведены деньги в том случае, если вы даете свое согласие на это.
“Обеспечение прозрачного управления для сообществ и организаций”
Ок, здесь более неоднозначно: появление прозрачных компаний – это вероятный исход. Но децентрализованные
автономные компании (попеременно называемые DAO или DAC), возможно, появятся в далеком будущем. Похоже, что
индустрия остановилась на термине “децентрализованная организация” или DO, именно этот термин мы будем
использовать в этой книге. Прогресс в этой области – очень запутанное дело. Управление посредством
криптографического инструмента допускает использование всех тех манипуляций, от которых веками страдала
демократия. Один голос – с одного адреса кошелька? Но кто его владелец? Если монета – это голос, будут ли править
богатые? Разговор на эту тему лежит по большей части за пределами этой книги, но если кто-либо агитирует вам идеи о
полностью автономных организациях, корпоративных или правительственных, возможно, вам стоит заинтересоваться
истинными мотивами.
“Обработка аутентификации пользователей и безопасных платежей, а также обмен
сообщениями, и даже децентрализованное хранение данных”
Это станет полностью правдой, когда Ethereum продвинется дальше по своей дорожной карте. В действительности, вы
получаете аутентификацию пользователей и безопасные платежи уже при подключении к блокчейну Ethereum, но
одноранговая связь и децентрализованное хранение (сам по себе только зарождающийся бизнес-сегмент в области
программного обеспечения и блокчейнов) в настоящее время доступны только при сторонних интеграциях. Тем не менее,
дорожная карта Ethereum включает в себя эти элементы, планируемые названия которых – Swarm и Whisper. В настоящее
время оба они доступны в виде ограниченных экспериментальных версий.
“Нет необходимости регистрироваться или платить за хостинг приложений; первая в мире
платформа с нулевой инфраструктурой”
Технически это правда, но время – деньги, и поскольку мы говорим о хостинге и развертывании, то становится ясно, что
“бесплатно” и “эффективно” могут быть взаимоисключающими понятиями в мире этого нового программного обеспечения.
Состояние разработки смарт-контрактов в настоящее время
Несколько тестовых проектов разработки на Solidity доступны сегодня. Если вы думаете о развертывании полноценного
пользовательского приложения, у вас не будет большой конкуренции. Пока что…
Как бы то ни было, большая часть силы блокчейна состоит в создании приложений, позволяющих пользователям
проводить транзакции: покупка, продажа, лицензирование, торговля, потоковая передача данных и так далее. Это
означает, что люди должны иметь определенное количество эфира или нативной монеты, принадлежащей вашему
проекту. Оборот и доступность подобной нативной монеты называется ее ликвидностью. Высокая ликвидность может
помимо всего прочего привести к более стабильным ценам в валюте и сетевому эффекту.
Во многих случаях предприимчивые разработчики будут пытаться раскручивать свои монеты в обращение для получения
преимуществ ликвидности. В действительности, EVM и эфир работают точно таким же образом. Ethereum Foundation
собрал с помощью краудфандинга порядка 18 миллионов долларов во время запуска проекта в 2014 году. Взносы,
полученные в биткойнах, были конвертированы в эфир, и так зародилось сообщество.
Альтернативные монеты
Альткойны – это Биткойн-аналоги, которые используют кодовую базу Биткойн. Могут существовать объективные
основания для запуска альткойна; они не всегда создаются с целью осуществления прямой атаки на базу пользователей.
Ethereum сохраняет многие основополагающие идеи Биткойн, но может рассматриваться как совершенно новая сеть,
поскольку его ключевые компоненты отличаются.
Финансирование вашего проекта
Краудфандинг – это один из способов для предпринимателей бороться с тяготами и расходами на бета-тестирование в
реальном времени и сбор средств путем продажи раннего доступа к продукту или услуге потенциальным пользователям. В
сфере криптовалют это называется запуском токена. Некоторые компании используют термин “первичное предложение
токенов” (ICO), потому что это похоже на термин с Уолл-стрит “первичное публичное предложение” (IPO). Однако этот
термин может ввести в заблуждение, поскольку токены не всегда являются эквивалентом акций. Это справедливо и для
биткойна, и для эфира, которые не представляют собой долю чего-либо.
Если вы хотите привлечь средства для финансирования своего проекта на Ethereum, нет смысла создавать проектоднодневку. Управляющие активами и управленческий персонал быстро осознают возможности этой технологии, и если
вы ищете работу, инвестиции или варианты развития бизнеса, все это можно найти в данной сфере (или скоро будет
доступно). Ищите локально проводимые мероприятия по теме Биткойн или Ethereum на www.meetup.com, чтобы найти
других криптоэнтузиастов и собрать команду.
Решите, с какой стороны войти в эту сферу
Помимо освещения технических аспектов Ethereum, эта книга предоставляет целый ряд контекстуальной информации,
которая поможет вам решить, как программирование на Solidity и распределенные приложения могут вписаться в вашу
карьеру. Эта книга также направлена на выявление новых векторов для инновационного мышления о программном
обеспечении.
Один из примеров – долговечность. В устаревших веб-сервисах время работоспособности зависит от того, оплатили ли
разработчики счета за хостинг, и обслуживают ли они серверы. В результате, немногие люди создают программные
приложения, предназначенные для выполнения команд, скажем, через 30 лет.
Сеть Ethereum является также полностью резервированной распределенной базой данных с копиями на каждом узле. Это
означает, что вы можете быть уверены в том, что приложение незамедлительно ответит, если будет выполнено
определенное условие, даже если это условие произойдет через десятилетия в будущем – и даже если все узлы к тому
времени поменяются.
Избавление от старых ограничений для программного обеспечения и банковского дела, а также представление новых,
является сквозной темой этой книги.
Примечание для начинающих программистов
Знание о том, как работают монетарные, банковские и страховые системы будет большим преимуществом при
проектировании приложений на Ethereum. Если вы сможете совместить эти знания с техническими, это будет круто.
Примечание
Вам не нужно добавлять в закладки URL-адреса или сохранять сноски в этой книге. Вы найдете актуальные ссылки для
всех цитат из этой книги, проиндексированные по главам, по адресу: http://eth.guide
Так что, даже если вы непрограммист и не собираетесь им становиться, продолжайте чтение разделов, в которых
обсуждается код, в любом случае. Это поможет вам уловить пределы возможностей. А если вы решаете изучить
программирование на Solidity с нуля – не имея опыта в программировании – уроки из этой книги доступны и для вас.
В некотором смысле изучение разработки на Ethereum может быть проще и более интуитивно понятно, чем изучение вебразработки с нуля.
Ethereum – свободный и с открытым исходным кодом
Ethereum может быть разветвлен (форк) и реплицирован в другие системы, которые будут совместимы. Вполне возможно,
что в будущем можно будет даже перемещать монеты из одной цепочки в другую. Хотя это далеко не простой процесс,
научные статьи о том, как это можно сделать, уже появляются.
Стоит отметить, для непрограммистов, что “свободный” и “с открытым исходным кодом” – это не синонимы. Открытый
исходный код – это методология создания программного обеспечения; свобода – это социальная концепция. Согласно
GNU Foundation: “Когда мы называем программное обеспечение свободным, мы имеем ввиду, что оно уважает основные
свободы пользователя: свободу запускать его, изучать и модифицировать, передавать копии с изменениями или без них”.
EVM намерена здесь закрепиться
Как вы узнаете, у Ethereum есть амбициозный план по развитию и еще более амбициозные цели. При условии, что Ethereum
будет развиваться согласно планам команды ключевых разработчиков, его долгосрочным вкладом в развитие технологии
блокчейна может стать EVM. Язык Solidity может стать одним из языков, код которых компилируется в байткод для EVM.
Solidity сам по себе, несомненно, будет развиваться и меняться, сегодня он далек от совершенства и законченности. Но уже
сегодня он позволяет нам создавать и тестировать сценарии использования криптовалюты способами, которые, пожалуй,
в экосистеме Биткойн удалось бы реализовать не так скоро.
Если вкратце, Ethereum стремится создать систему, в которой можно испытывать и доказывать работоспособность
экономических моделей. На данный момент Solidity выглядит готовым к тому, чтобы стать де-факто языком для создания
подобных моделей, в случае, если они запускаются в глобальной виртуальной машине типа EVM.
Что вы можете создать сегодня?
Мы достаточно поговорили о потенциале; что можно создать сегодня? Довольно много, но давайте разложим варианты на
две категории: частные (приватные) и открытые (публичные). На сегодняшний день Ethereum можно описать как единый
публичный блокчейн и протокол для создания множества блокчейнов. Понимание потенциала в различных областях (и как
он может проявляться) зависит от понимания, чем публичная цепочка отличается от приватных Ethereum-цепочек,
используемых в корпоративном секторе или других обособленных кругах.
Приватные и публичные цепочки
Поскольку любой может сделать форк проекта Ethereum, возможно “сделать свой собственный Ethereum”, а не работать в
публичной цепочке. Это называется приватным блокчейном, и как альткоины на основе Биткойн, он представляет собой
дублирование усилий существующего сообщества разработчиков Ethereum.
Как вы поймете к концу книги, использование приватных цепочек в целом является не лучшей идеей для продукта или
сервиса на стадии стартапа, но это не останавливает некоторые компании от попыток запустить их. Вместо того, чтобы
изобретать колесо, куда лучшей идеей для предпринимателей является построение блокчейна на основе публичной
Ethereum-цепочки.
Как вы узнаете, в публичной цепочке много вычислительной мощности, выделяемой на обеспечение ее безопасности, что
делает ее достаточно пригодной для запуска широкомасштабных защищенных веб-сервисов небольшими компаниями.
Тем не менее, публичный блокчейн Ethereum сегодня является полностью открытым, и некоторые корпорации могут
предпочесть хранить свои конфиденциальные транзакции в приватной цепочке, которая будет иметь определенную связь
с публичной цепочкой. В контексте корпоративного программного обеспечения, где корпоративным сотрудникам
выдаются определенные права и привилегии на считывание и запись данных в цепочку компании, подобная реализация
называется контролируемым блокчейном. Для контролируемых блокчейнов адреса кошельков обычно выпускаются
доверенной третьей стороной, которая верифицирует ваше разрешение на доступ в систему, точно таким же образом, как
служба безопасности офисного здания выдает разрешение на проход внутрь здания. По этой же аналогии, публичную
цепочку можно представить в виде городского парка или другого общественного пространства.
Прямая зависимость между масштабом и надежностью блокчейна станет очевидной в следующих главах. Тем не менее,
мы рассмотрим настройку приватных цепочек в Главе 9, чтобы лучше понять сходства между блокчейнами и базами
данных.
В публичных и приватных цепочках Ethereum вы можете делать следующее:
Отправлять и получать эфир.
Писать смарт-контракты.
Создавать доказуемо честные приложения.
Запускать свой собственный токен на основе эфира. Все это описывается в последующих подразделах.
Получение и отправка эфира
Вы можете отправлять и получать эфир, при этом в приватной цепочке у вас будет приватный эфир – не имеющее
ценности временное платежное средство. Любой может получить публичный адрес кошелька Ethereum, загрузив кошелек
Mist, который мы рассмотрим в следующей главе. Кроме того, доступны мобильные приложения кошельков в iOS App Store
и Google Play. Чтобы продавать доллары за эфир, вам нужно зарегистрироваться на криптовалютной бирже или
воспользоваться услугами коммерческих организаций, осуществляющих переводы денежных средств, типа Coinbase.
Большинство людей просто покупают биткойны (которые более широко доступны в ATM-банкоматах, а также через сеть
дилеров наличных средств LocalBitcoins.com) и конвертируют их в эфир на бирже, либо при помощи сервисов по обмену
криптоденег типа ShapeShift.io.
Написание смарт-контрактов
Вы можете управлять платежами и переводами между счетами (и даже между разными контрактами), даже если
возникает множество непредвиденных обстоятельств, или если они растягиваются далеко в будущее и через
государственные границы. Истинный потенциал здесь основывается на том, насколько неостановимой в
действительности является публичная цепочка, и это зависит от того, кто в ней участвует, и сколько злоумышленников
попадают в систему. С другой стороны, приватные цепочки могут предоставлять точно такой же функционал
ресурсообеспеченным группам, только в частном порядке.
Создание доказуемых честных приложений
Создание доказуемо честных приложений особенно важно для игровой индустрии и гэмблинга. Ожидайте появления
видеоигр и игр виртуальной реальности, внедряющих баллы, которые будут эквивалентом реальных денег и которые
можно будет потратить в реальном мире.
Запуск собственного токена
С практической точки зрения, раскрутка вашего собственного токена – это нечто похожее на развертывание системы
учетных записей пользователей.
С помощью контракта токена Ethereum вы можете создать субвалюту для использования в приватном транзакционном
реестре, который доступен только вам и вашей закрытой группе, но который использует публичную цепочку во всех
остальных случаях – это позволит вам избежать создания форка или поддержки вашей собственной сети майнинговых
машин. Это удобно, и отлично подходит для большинства разработчиков и организаций. Динамика токенов и цепочек
станет понятна в Главах 5 и 9.
Перспектива использования децентрализованных баз данных
Как и у всех баз данных, у блокчейна есть схема: правила определяют, ограничивают и обеспечивают отношения между
сущностями. Мотивы для нарушения или изменения этих отношений можно найти в различных отраслях, это приводит к
коррупции и взяточничеству, и это делает не требующие доверия качества блокчейна еще более привлекательными для
бизнеса, чем предыдущие поколения программного обеспечения и сетевых технологий.
Во всех базах данных совместно используемый доступ для чтения и записи вызывает огромные сложности. Машины по
всему миру могут иметь разную задержку, в зависимости от того, где физически находится база данных, это может
привести к нарушению порядка некоторых операций записи. Проблема становится еще более трудной, если
предполагается, что несколько сторон имеют общий доступ к базе данных; например, несколько компаний, образующих
торгово-промышленную группу. Ввиду данной проблемы расходы крупных компаний на организацию режима совместного
доступа для чтения и записи с другими компаниями чрезвычайно высоки, и сегодня утечки информации о пользователях
происходят все чаще.
В настоящее время корпоративные IT-отделы научились практически полностью контролировать, чтобы эти системы
работали как положено. Но по мере их масштабирования, возможностей для совершения неправомерных действий
становится настолько много, что потенциальные злоумышленники не могут не воспользоваться ими.
Что дальше: новые способы работы
В сентябре 2016 года тысячи сотрудников банка Wells Fargo были уволены за манипуляции с базами данных счетов в целях
накрутки показателей продаж и получения бонусов, предназначенных для вознаграждения менеджеров по продажам за
открытие новых счетов. Цена подобных ошибок в суде будет огромной, как и цена на создание программного обеспечения,
которое могло бы хоть как-то противодействовать совершению администраторами ошибочных изменений. Ethereum
предлагает новую возможность для бизнеса и потребителей по взаимодействию в более надежной среде, чем прикладной
уровень, выстроенный в современной сети на базе протокола HTTP.
Итоги Главы 1
В этой главе вы узнали, что Ethereum предлагает иной подход к созданию программного обеспечения, подход, в котором
безопасность и доверие встроены на уровне протокола. Это может оказать существенное глобальное воздействие. По
мере того, как мир оцифровывается, крупномасштабные системы становятся все более критически важными для всех
видов организаций – не только в банковской и страховой сфере, но также для городских служб, розничной торговли,
логистики, распространения контента, журналистики, производства одежды и любой другой индустрии, где задействованы
данные о происхождении товаров или платежи.
Далее, мы поработаем с Ethereum, создадим ключи для доступа к блокчейну Ethereum при помощи программ, называемых
клиентами. В следующей главе рассматривается использование клиентских приложений Ethereum для Windows, macOS,
Linux, iOS и Android.
Примечания к Главе 1
1
Ethereum Blog, “Visions, Part 1: The Value of Blockchain Technology,” https://blog.Ethereum.org/2015/04/13/visions-part-1the-value-of-blockchain-technology/, 2015.
2
American Banker, “Blockchain Won’t Make Banks Any Nimbler,” www.americanbanker.com/bankthink/blockchain-wont-makebanks-any-nimbler-1079190-1.html, 2016.
3
YouTube, “Technologies That Will Decentralize the World,” www.youtube.com/watch?v=er-k3ehpFaM&feature=share, 2016.
4
Harvard Business Review, “Management in the 1980s,” https://hbr.org/1958/11/management-in-the-1980s, 1953.
5
Wikipedia, “Merkle tree,” https://en.wikipedia.org/wiki/Merkle_tree, 2016. 6
6
GitHub, “Ethereum White Paper,” https://github.com/ethereum/wiki/wiki/White-Paper, 2014.
7
Coindesk, “Bitt Launches Barbados Dollar on the Blockchain,” www.coindesk.com/bitt-launches-barbados-dollar-on-theblockchain-calls-for-bitcoin-unity/, 2016.
8
Wikipedia, “Gresham’s Law,” https://en.wikipedia.org/wiki/Gresham%27s_law, 2016. 9
9
USV Blog, “Fat Protocols,” www.usv.com/blog/fat-protocols, 2016. 10
10
Daily Fintech, “Bitcoin Market Going into Consolidation Before Product Market Fit,”
https://daily ntech.com/2016/02/03/bitcoin-market-going-into-consolidation-before-product-mark et- t/, 2016.
11
Coinbase Blog, “App Coins and the Dawn of the Decentralized Business Model,” https://medium.com/the-coinbase-blog/appcoins-and-the-dawn-of-the-decentralized-business- model-8b8c951e734f#.cweqnimd2, 2016.
12
Ethereum Blog, “The Business Imperative Behind the Ethereum Vision,” https://blog.Ethereum.org/2015/05/24/the-businessimperative-behind-the-Ethereum-vision/, 2015.
13
GNU Foundation, “Why Open Source Misses the Point of Free Software,” www.gnu.org/philosophy/open-source-misses-thepoint.html, 2016.
14
Nesta.org.uk. “Why you should care about blockchains: the non- nancial uses of blockchain technology,”
https://www.nesta.org.uk/%E2%80%8Bblog/%E2%80%8Bwhy-you-should-care-about-blockchai ns-non- nancial-usesblockchain-technology, 2016.
15
CNN Money, “5300 Wells Fargo Employees Fired Over 2 Million Phony Accounts,”
http://money.cnn.com/2016/09/08/investing/wells-fargo-created-phony-accounts-bank-fees/, 2016
16
Daily Fintech, “How Blockchain Technology Could Integrate Financial & Physical Supply Chains and Revolutionize Small
Business Finance,” https://daily ntech.com/2016/06/14/how-blockchain-technology-could-integrate- nancial-physica lsupply-chains-and-revolutionize-small-business- nance/, 2016.
Создание децентрализованных приложений на блокчейн
Помощь в программировании искусственного интеллекта
Глава 2. Браузер Mist
05.04.2018
Рубрика: Введение в Ethereum и Solidity
Автор: adminCraft
Содержание страницы
1 Глава 2
2 Примечание
3 Примечание
4 Кошелек в качестве компьютерной метафоры
5 Что есть адрес?
6 Примечание
7 Где мой эфир?
8 Метафора о банковском служащем
9 В криптовалютах вы держите свои собственные активы
10 Визуализация транзакций в Ethereum
11 Уход от банковской истории
12 Как шифрование приводит к доверию
13 Системные требования
14 Подробнее про Eth.guide и эту книгу
15 Инструменты для разработчиков
16 CLI-ноды
17 Примечание
18 Рекомендация: используйте Parity вместе с Geth
19 Примечание
20 Наконец-то, разбираемся с браузером Mist!
21 Загрузка и установка браузера Mist
22 Примечание
23 Настройка браузера Mist
24 Примечание
25 Поиск вашего нового адреса
26 Отправка и получение эфира
27 Примечание
28 Понимание типов аккаунтов в Ethereum
29 Примечание
30 Примечание
31 Резервное копирование и восстановление ваших ключей
32 Использование бумажных кошельков
33 Использование мобильных кошельков
34 Работа с сообщениями и транзакциями
35 Транзакции изменяют состояние
36 Редактирование глобальной базы данных
37 Итак, что же такое блокчейн?
38 Плата за транзакции
39 Описание номиналов
40 Получение эфира
41 Анонимность в криптовалютах
42 Обозреватели блокчейнов
43 Примечание
44 Итоги Главы 2
45 Примечания к Главе 2
Глава 2

В области криптовалютного программного обеспечения есть два ключевых типа клиентских приложений: кошельки и полные
узлы (ноды).
Примечание
Под кошельком обычно имеют в виду легковесный узел, который подключается к блокчейну для выполнения основных
функций, таких как отправка и получение криптовалюты. Полные узлы – это командные интерфейсы, с помощью которых
можно выполнять полный спектр операций, которые разрешены в сети.
Как мы узнали из предыдущей главы, слово Ethereum может обозначать как протокол Ethereum, так и сеть Ethereum, созданную
компьютерами при помощи протокола. Управление нодой в сети позволяет вам загружать смарт-контракты. Для получения и
отправки криптовалюты (в нашем случае, эфира), все что вам нужно, это приложение кошелька для вашего компьютера или
смартфона.
Ethereum имеет несколько клиентских приложений, мы обсудим их в этой книге. Наиболее полезным (для большинства
читателей) является браузер Mist, удобный для использования кошелек, который может выполнять некоторые функции полной
ноды – а именно, исполнять смарт-контракты.
Со временем все программы, относящиеся к классу веб-приложений, будут доступны через Mist, их бэкенд будет построен на
базе Ethereum mist; вот почему его называют браузером. Не обманывайтесь простотой Mist. Сегодня он полезен для отправки и
получения криптовалюты эфира. Но в будущем он также может стать местом для распространения пользовательских и
корпоративных программных приложений, практически как App Store.
Примечание
Термин “валюта”, а именно “криптовалюта“, означает взаимозаменяемую единицу ценности системы, подобно токену или
временному платежному средству. Что конкретно представляют собой эти небольшие токены, станет понятно позже в этой
главе. Понятие “взаимозаменяемый”, применительно к валюте, означает, что одна денежная единица равноценна другой
аналогичной денежной единице. В терминологии фиатной валюты можно сказать, что один доллар можно заменить на другой, у
них равная ценность.
В этой главе вы узнаете, как получить доступ к сети с помощью Mist и других приложений, чтобы понять основы отправки

и получения токенов эфира между аккаунтами.
Последующие главы подробно рассказывают, как работает система, и как программировать смарт-контракты для нее.
Кошелек в качестве компьютерной метафоры
Кошельки – это программные приложения для компьютеров или мобильных устройств, которые хранят ваши ключи к EVM. Эти
ключи сопоставлены с учетной записью (аккаунтом), на эту учетную запись ссылается длинный адрес. В Ethereum аккаунты не
хранят ваше имя или любую другую персональную информацию. Они псевдонимные. Любой пользователь может сгенерировать
аккаунт в Ethereum, подключившись к сети с помощью любого Ethereum-клиента (например, Mist). Вы можете сгенерировать
сколько угодно аккаунтов.
Если вы уже скачали кошелек Ethereum или полный узел на компьютер или смартфон, вам, скорее всего, было предложено
создать аккаунт. Возможно, приложение кошелька также предложило вам создать пароль для защиты ваших ключей с
помощью шифрования. Как вы можете догадаться, эти ключи являются важным элементом для отправки и получения эфира.
Для начала давайте взглянем на адрес вашего аккаунта, который также называется открытым ключом. У вашего открытого
ключа есть соответствующий ему закрытый ключ, позволяющий получить доступ к вашему аккаунту. Этот закрытый ключ
должен храниться в секрете и нигде не публиковаться.
Аккаунты как в Биткойн, так и в Ethereum представлены длинными шестнадцатеричными адресами. Ethereum-адрес выглядит
подобным образом:
0xB38AA74527aD855054DC17f4324FE9b4004C720C

В протоколе Биткойн исходный шестнадцатеричный адрес кодируется с применением Base58 со встроенным номером версии и
контрольной суммой, но изнутри выглядит также, как Ethereum-адрес. Вот пример Биткойн-адреса:
1GDCKfdTo4yNDd9tEM4JsL8DnTVDw552Sy
Чтобы получать эфир или биткойны, вы должны предоставить отправителю свой адрес, вот почему он называется открытым
(публичным) ключом. Конечно, такие строки трудно запоминать. Если вы начинающий программист, возможно, вы задаетесь
вопросом, что тут происходит; что за неудобочитаемые буквенно-цифровые нагромождения? Опытные программисты скорее
всего знают, что подобные открытые и закрытые ключи являются частью асимметричного шифрования ключей.
Что есть адрес?
Почему адреса аккаунтов, – которые предназначены для того, чтобы быть публичными, и которые многие люди даже
размещают на своих веб-сайтах – почему они состоят из таких длинных шифрованных строк? Почему мы не можем просто
обойтись именами пользователей?
Ответ в том, что однажды в будущем вы, вероятно, сможете генерировать имена пользователей на простом английском языке,
но они будут функционировать больше как имена доменов верхнего уровня. Вы будете арендовать имя у децентрализованного
регистратора доменов, и оно будет перенаправлять на ваш реальный адрес аккаунта, почти так же, как домены верхнего уровня
перенаправляют на нужный IP-адрес сегодня.
Много планов для сети Ethereum mist находятся в процессе разработки, которые в конечном счете воспроизведут детали
сегодняшней сети на базе HTTP, которую мы знаем. Чтобы узнать больше о дорожной карте Ethereum, перейдите к Главе 11.
Примечание
Аккаунт – это объект данных: запись в реестре блокчейна, индексированная по ее адресу, содержащая данные о состоянии
учетной записи, например, о ее балансе. Адрес является открытым ключом, принадлежащим конкретному пользователю; это то,
при помощи чего пользователи получают доступ в свои аккаунты. На практике, с технической точки зрения, адрес представляет
собой хеш открытого ключа, а не сам по себе открытый ключ, но для простоты понимания лучше проигнорировать эту разницу.
В EVM асимметричная криптография используется сетью для генерации и распознавания действительных адресов Ethereum, а
также для “цифровой подписи” транзакций. В защищенной передаче данных асимметричная криптография используется для
шифрования приватного обмена данными, так что даже если сообщения перехватываются злоумышленниками, они остаются
нечитаемыми. В блокчейне схожий принцип работы; это метод для того, чтобы убедиться, что сообщения (в виде запросов на
проведение транзакций в EVM) исходят от настоящего владельца адреса, а не от постороннего лица, пытающегося увести ваши
средства.
Где мой эфир?
Важно отметить, что эфир не хранится на какой-либо определенной машине или в приложении. Ваш баланс эфира может быть
запрошен, а эфир отправлен или получен с любого компьютера, на котором запущен узел или кошелек Ethereum. Даже если
компьютер, на котором обитает ваш кошелек Mist, будет уничтожен, ничего страшного: все что вам нужно, это ваш закрытый
ключ, и вуаля, вы можете получить доступ к своему эфиру с другого узла.
Однако, если вы передадите кому-либо другому свои закрытые ключи, то этот человек сможет получить доступ к EVM и вывести
ваши деньги даже без вашего ведома. С точки зрения сети, любой, у кого есть ваши закрытые ключи, это вы.
Поскольку EVM является глобальной машиной, она не способна понять, с какого узла вы будете создавать транзакцию. В
отличие от современных веб-приложений, Ethereum не ищет “доверенный” компьютер; он не отличит ваш смартфон от любого
другого смартфона. Если это кажется необычным, подумайте об этом как о банковской ATM-системе, которая предоставляет
доступ к счету любому, кто имеет номер вашей дебетовой карты и четырехзначный пин-код.
Как упоминалось в Главе 1, утеря вашего смартфона или компьютера в результате кражи или их разрушение не означают потерю
ваших денег, если были соблюдены следующие условия:

Вы сделали резервную копию закрытого ключа.
Вы не давали свой закрытый ключ никому другому.
Сделать резервную копию закрытого ключа настолько просто, что вы можете скопировать и вставить его в текстовый файл,
сохранив на USB-флеш-накопителе. Или можете записать его на бумаге. Далее в этой главе вы узнаете о других методах
резервного копирования закрытых ключей.
Метафора о банковском служащем
В некотором смысле, использование кошелька или полного узла можно представить как если бы вы заняли место кассира в
банке и сами бы контролировали свои деньги. Не в том смысле, что вы можете взять бумажные деньги из кассы, а в том, что
банковский служащий контролирует узел в компьютерной системе банка, который может исполнить транзакции в глобальной
базе данных транзакций. Кассир контролирует базу данных банка, которая подключается к другим базам данных банка.
В традиционной банковской системе, если взять в более широком смысле, бумажный чек – это письменная инструкция для
кассира о совершении транзакции с использованием компьютерной системы банка. На чеке указан номер вашего счета и
маршрутный номер. (В следующей главе мы больше поговорим о традиционной банковской системе).
На данный момент важно лишь отметить, что огромные человеческие и вычислительные ресурсы требуются на то, чтобы взять
ваш бумажный чек, превратить его в электронную транзакцию, отправить эту транзакцию другой стороне и затем обновить
балансы обеих сторон. В криптовалютах эта устаревшая банковская система – совокупность человеческих и компьютерных
процессов – полностью устранена за счет использования алгоритмического механизма согласования, работающего в
одноранговой компьютерной сети. Расчеты и клиринг транзакций происходят в самой сети за считанные секунды (или, в случае
с биткойном, минуты), в течение которых транзакции подписываются цифровой подписью и пересылаются узлом. Таким
образом, для криптовалютной транзакции справедливо утверждение, что “расчет является торговой операцией”.
В криптовалютах вы держите свои собственные активы
Криптовалюты отличаются от фиатных валют, используемых традиционными банками, которые централизованы. Ваши токены
виртуальны, а ваш баланс (и баланс других людей, держащих эфир) табулируется сетью блокчейна. Нет материальной валюты
эфира или биткойна, хотя определенные третьи стороны создали коллекционные монеты с предварительно загруженной
криптовалютой.
Будьте предельно осторожны в отношении любого онлайн-сервиса или организации, которые предлагают держать, хранить или
управлять эфиром, биткойнами или любой другой криптовалютой. Преимущество распределенных открытых систем
заключается в исключении из транзакций контрагентов и предоставлении субъектам возможности проводить транзакции на
одноранговой основе. Смысл в том, что вы можете хранить эти активы защищенным образом без участия кастодианов.
Вместе с тем, мы живем в мире фиатной валюты. Даже если криптовалюты – это действительно будущее (а как вы узнаете из
этой книги, есть потрясающее доказательство тому, что за ними будущее), возможно, пройдет несколько лет или больше в
качестве переходного периода, в котором люди будут иметь и криптовалютный кошелек, и традиционный банковский счет.
Подводя итог: не используйте никакие кошельки или онлайн-сервисы, которые хранят ваши закрытые ключи. Используйте
только приложения, которые хранят ваши закрытые ключи на вашем устройстве. Далее в этой главе вы найдете рекомендации
по настольным и мобильным кошелькам. Давайте вернемся к объяснению назначения Mist в качестве вашего шлюза на пути к
EVM.
Визуализация транзакций в Ethereum
Лучший способ для начинающих Ethereum-программистов визуализировать концепцию блокчейна – представить себе
бумажный журнал учета хозяйственных операций, который можно синхронизировать с другими бумажными журналами учета по
всему миру.
Когда приложение кошелька пытается внести изменения в базу данных, это изменение обнаруживается ближайшим узлом
Ethereum, который затем распространяет это изменение по всей сети. С течением времени все транзакции записываются в
каждый реестр.

Говоря абстрактно, это работает как полиграф, запатентованный в 1803 году Джоном Исааком Хокинсом. Это была первая
“копировальная машина”, хотя в наше время так называют детекторы лжи.
Как известно, Томас Джефферсон отозвался с похвалой об этом копировальном устройстве как о непревзойденном
изобретении для своего времени:
Полиграф похож на блокчейн по своей сути: множество согласованно работающих машин записывают одинаковые данные в
одинаковые локальные базы данных. В Биткойн и Ethereum mist технологическая инновация заключается в том, что эти
изменения состояния могут приходить не по порядку из-за сетевых задержек, но сеть способна приводить их в соответствие в
единый реестр.
Как упоминалось ранее, ваш адрес иногда называют вашим открытым ключом, но лучшей аналогией будет банковская ячейка с
уникальным индивидуальным номером. Закрытый ключ – это единственная вещь во всей этой системе, называемая точным
образом: он открывает ваш аккаунт и позволяет вам выводить из него эфир.

Что такое эфир, по сути?
Это всего лишь баланс в вашем аккаунте. Когда вы отправляете и получаете эфир, фактически ничто и никуда не отправляется и
не принимается.
В EVM, когда один баланс вырастает, система убеждается, что это произошло по причине того, что другой аккаунт отправил
платеж и тем самым уменьшил собственный баланс на ту же сумму. Это закрытая система. На практике невозможно дать
самому себе бесплатный эфир, или, по крайней мере, это не стоило бы тех затрат, которые вам пришлось бы понести в попытках
фальсифицировать данные в реестре. Ethereum использует финансовые стимулы и антистимулы для обеспечения безопасности,
как вы узнаете из Главы 7.
Уход от банковской истории
Одним из наиболее интересных аспектов протокола Ethereum является схема выпуска эфира, о ней мы поговорим позже. Пока
важно отметить, что (как и в биткойне) никто не сможет выпустить больше эфира, чем изначально задумано. Это
характеристика резко контрастирует с последними 400 годами существования финансовых рынков и центробанков, которые
больше напоминают историю крупномасштабных мошенников.
Со времен мошеннических биржевых сделок конца 17-го века на Лондонской аллее торгов предприниматели и мошенники
продавали доли в предприятиях, как законно, так и нет. Часто они тайно выпускали новые акции для себя и своих сообщников,
когда цена на них росла, – это явление в 19-м веке американцы назвали разводнением акций.

Со временем спекуляции с акциями стали времяпрепровождением, которым наслаждались люди всех возрастов и
происхождения по обе стороны Атлантики, и появились современные фондовые биржи, с их процессами и контрагентами,
выступающими в роли посредников, обеспечивающих надежные транзакции. Но даже при банковском регулировании, принятом
после Великой депрессии, недобросовестные предприниматели все еще находили способы создавать тайные биржевые пулы
или распродавать акции без публичной огласки – после вывода своих денег они оставляли предприятия в состоянии краха.
Несколько раз в современной истории спекулятивные пузыри уничтожали благосостояние и человеческий прогресс с таким же
размахом, как и биржевой крах 1929 года в США. Так или иначе, подобные депрессивные эпизоды в США и Европе (включая
Панику 1873-1879 годов) были вызваны либо центральными банками, либо самими инвесторами, которые устраивали
беспорядок с базовым объемом денег, акций или облигаций на крупных рынках.
Как шифрование приводит к доверию
В Главе 1 мы практически не коснулись серьезного обсуждения криптографии и вместо этого сфокусировались на влиянии
криптосетей. Но есть нечто странное в защищенной сети, состоящей из множества неизвестных компьютеров, работающих
сообща. Почему один злоумышленник, затесавшийся в сеть, не может ее взломать и украсть весь эфир? Чтобы ответить на этот
вопрос, для начала давайте вспомним, что блокчейн использует следующие методологии:
Асимметричное шифрование
Криптографическое хеширование
Одноранговые распределенные вычисления
Давайте потратим немного времени и коротко поговорим о первом элементе из этого списка – асимметричной криптографии,
которую иногда в широком смысле называют криптографией с использованием открытых (публичных) ключей. Небольшое
отступление здесь поможет нам лучше уяснить, как публичная сеть может быть защищенной. Мы обратимся к двум другим
элементам в Главе 6.
Асимметричная криптография – это метод отправки защищенных сообщений внутри сети, где отправитель и получатель не
доверяют каналу связи. В случае с EVM эти сообщения являются транзакциями, которые подписываются и отправляются в сеть,
чтобы изменить состояние некоторых ее аккаунтов. Она называется асимметричной, потому что каждая сторона имеет пару
разных, но математически связанных ключей.
Криптография с открытым ключом была разработана для связи в военное время и при правильном применении может быть
максимально безопасной. В отличие от криптографически защищенной связи с использованием симметричного ключа,
шифрованные коммуникации с применением публичного ключа не требуют безопасного канала связи между сторонами. Это
важно в Биткойн и Ethereum, потому что любой компьютер, использующий протокол, может присоединиться к сети, без какихлибо проверок. Однако сложность вычислений, связанных с шифрованием данных, полезна только для небольших объектов
данных, таких как буквенно-цифровая строка, которая становится вашим закрытым (приватным) ключом. Вот почему
шифрование должно использоваться расчетливо.
Не вдаваясь в подробности, можно сказать, что Ethereum использует шифрование для валидации и верификации того, что
любые и все изменения, произведенные с балансами аккаунтов в EVM, являются законными, и что никакой счет не был
увеличен (или уменьшен) по ошибке.
Если вы только начинаете знакомиться с наукой о вычислениях, то сам механизм шифрования может быть неясным. Вот
некоторые определения, которые помогут двигаться дальше:
Симметричное шифрование: процесс, при помощи которого фрагмент простого текста, обычно содержащийся в
документе, смешивается с более короткой строкой данных, называемой ключом, для создания шифротекста на выходе.
Эти выходные данные могут быть обращены или дешифрованы принимающей стороной, если только у нее есть точно
такой же ключ. Попытка декодировать сообщение без ключа была бы крайне затратной по времени и дорогостоящей в
вычислительном отношении – настолько, что некоторые виды шифрования считаются практически не поддающимися
взлому даже при огромных вычислительных ресурсах.

Асимметричное шифрование: этот способ шифрования информации требует, чтобы программа выпускала два ключа
одновременно, один из них публичный, а второй вы храните в секрете. Публичный ключ является публичным в том
смысле, что вы можете размещать его у себя на сайте или в социальных сетях, это как адрес электронной почты. (Во
время общения стороны могут использовать открытые ключи друг друга для шифрования информации, как описано
ниже).
Криптозащищенный обмен данными: в нашем первом примере Алиса использует открытый ключ Боба для шифрования
сообщения. Когда он получит зашифрованные данные, то сможет расшифровать их с помощью своего подходящего
закрытого ключа, тем самым будет обеспечено, чтобы только Боб мог прочитать это сообщение. Это называется
криптозащищенным обменом данными. Но это оставляет открытой опасную возможность: любой может отправить
сообщение Бобу, выдавая себя за Алису. Откуда он узнает, что Алиса является реальным отправителем сообщения?
Криптозащищенный обмен данными с использованием электронных цифровых подписей: если бы Алиса хотела убедить
Боба, что она – реальный отправитель, она бы поступила по-другому. Во-первых, она бы взяла свое незашифрованное
сообщение и зашифровала бы его, используя свой закрытый ключ. Затем она снова шифрует его при помощи открытого
ключа Боба. Когда Боб получает сообщение, он расшифровывает его сначала с помощью своего закрытого ключа, но
сообщение по-прежнему остается зашифрованным. Он должен расшифровать его еще раз, используя открытый ключ
Алисы. Этот второй уровень шифрования гарантирует ему, что Алиса действительно является отправителем сообщения,
потому что, как можно предположить, ни у кого нет закрытого ключа Алисы, кроме нее самой. Это называется
“криптозащищенным обменом данными с использованием электронных цифровых подписей”.
Если бы Алиса зашифровала открытый текст, используя лишь свой закрытый ключ, то любой человек, у которого есть ее
открытый ключ, смог бы расшифровать его. Это называется “форматом открытого сообщения”, поскольку
обеспечивается удостоверение личности отправителя, и при этом сообщение может быть дешифровано любым
человеком.
Цифровая подпись: для максимальной безопасности Алиса должна выполнить еще одно условие: она будет хешировать
открытый текст своего сообщения и прикреплять этот хеш к этому сообщению. Затем она шифрует этот набор с помощью
своего закрытого ключа, и еще раз – открытым ключом Боба. Когда Боб получит и расшифрует зашифрованные данные,
он сможет прогнать сообщение с открытым текстом от Алисы через тот же самый алгоритм хеширования. Если по какойлибо причине “отпечаток” сообщения окажется другим, то это будет означать, что текст изначального сообщения был
поврежден или изменен в пути.
Больше информации вы получите в Главе 6, которая описывает майнинг, метод, по которому отдельные транзакции
транслируются в EVM, похож на описание цифровой подписи выше, где содержимое транзакции хешируется и зашифровывается
перед тем, как быть переданным пирам. Теперь, когда вы можете оценить безопасность сети Ethereum, давайте перейдем к делу
– к установке Mist.
Системные требования
Большинство пользователей предпочитают использовать браузер Mist, но в этом разделе будут перечислены и другие
инструменты, которые могут показаться интересными для разработчиков. Mist облегчает отправку и прием эфира. В нем также
есть интерфейс для быстрого и легкого исполнения смарт-контрактов. Мы поговорим подробнее о том, как запускать смартконтракты, в Главе 4.
Mist хорошо работает на современном компьютере с объемом оперативной памяти не менее 2 ГБ и 30 ГБ свободного места на
жестком диске. Для менее производительных машин попробуйте расширение MetaMask Chrome. Оно будет описано далее в этом
разделе.
Вы найдете последнюю версию Mist на GitHub проекта Ethereum (https://github.com/ethereum/).
Подробнее про Eth.guide и эту книгу
Поскольку Ethereum – это новый и быстроразвивающийся проект, некоторые ссылки на него и документацию могут измениться
после публикации этой книги. По этой причине самые необходимые ссылки и справочный материал также перечислены на
сайте: https://eth.guide/ и регулярно там обновляются новым материалом.
Чтобы сделать сайт более полезным в качестве справочного руководства, для популярных тем созданы субдомены. Вы будете
встречать эти сокращенные ссылки в тексте.

Сайт https://eth.guide/ связан с проектом этой книги на GitHub, так что вдобавок вы сможете найти проекты с примерами кода из
этой книги по этому же адресу.
Полный URL-адрес на GitHub-проект этой книги: https://github.com/chrisdannen/Introducing-Ethereum-and-Solidity
Если вы – неподготовленный в техническом плане читатель и только собираетесь приступить к изучению основ, переходите к
разделу под названием “Наконец-то, разбираемся с Mist!”. Разработчики, продолжайте чтение, чтобы узнать, какие еще
инструменты нужно внимательно изучить на данном этапе вашего путешествия в Ethereum.
Инструменты для разработчиков
В дополнение к Mist, разработчикам следует обратить внимание на эти три инструмента:
Расширение MetaMask для браузера Chrome (полезно для всех)
Geth (полезно для разработчиков intermediate-уровня)
Parity (полезно для продвинутых разработчиков)
Расширение для Chrome MetaMask – это самый простой способ начать работать с Ethereum mist. Оно позволяет вам исполнять
смарт-контракты и транзакции прямо в браузере, без необходимости поднимать полный узел Ethereum. MetaMask умеет
создавать аккаунты и отправлять или получать эфир. Вы можете скачать MetaMask либо через меню расширений в Google
Chrome, либо с сайта проекта по адресу.
Для удобства, MetaMask не загружает полный блокчейн на ваш компьютер; также он не может обрабатывать (майнить)
транзакции и зарабатывать (добывать) эфир. Однако это незначительные недостатки для пользователей, которым нужно просто
врубиться в Ethereum по-быстрому.
MetaMask был разработан Аароном Дэвисом (a.k.a. Kumavis) из ConsenSys, это компания по Ethereum-разработке и консалтингу,
чьи бесплатные инструменты вы будете часто встречать в этой зарождающейся экосистеме блокчейна Ethereum. ConsenSys –
это венчурная студия и консалтинговая компания, насчитывающая в своем составе 60 сотрудников, базируется в Бруклине, НьюЙорк. Компанией управляет соучредитель проекта Ethereum Джозеф Любин.
MetaMask был частично профинансирован грантами на разработку (DEVgrants) от Ethereum Foundation. Эти гранты открыты для
всех, кто работает над проектом Ethereum, и их получение не требует от создателя проекта отказываться от какой-либо доли в
проекте. Чтобы узнать больше о DEVgrants, вы можете посетить канал этой программы в Gitter или подписаться на Twitter
@devgrants.
CLI-ноды
Если вы уже решили приступить к разработке на Solidity, скачайте полную консольную ноду. Самые популярные ноды с
командным интерфейсом (CLI) для сети Ethereum написаны на Go и C++, и они называются Geth и Eth (альтернативные названия:
go-ethereum и cpp-ethereum).
Примечание
Поскольку для разных операционных систем есть множество Ethereum-клиентов, в этой книге мы будет использовать самую
простую среду разработки: Ubuntu 14.04 и Geth. Пользователи Mac или Windows могут попробовать установить виртуальную
машину, например VirtualBox, на которой можно запустить Ubuntu.
Продвинутые разработчики могут попробовать соединить Geth с Parity, это сверхбыстрый клиент Ethereum, написанный на языке
программирования Rust. В Главе 6 мы поговорим о базовых командах в Geth.
Рекомендация: используйте Parity вместе с Geth
Parity.io – это частная компания по разработке в среде Ethereum, состоящая из некоторых бывших участников проекта Ethereum,
включая Гэвина Вуда, еще одного соучредителя проекта Ethereum, который создал язык Solidity и является автором “Ethereum
Yellow Paper”.
Вместе со своей командой они создали мощный узел на языке программирования Rust. Parity работает на macOS, Windows,
Ubuntu и в среде Docker. Вы можете узнать больше на странице проекта на GitHub: https://github.com/ethcore/parity

Примечание
Если вы планируете использовать кошелек Mist через свою ноду Parity, вам нужно будет вручную запустить Parity перед
запуском Mist. В противном случае, Mist будет подключаться через свой собственный узел. Под капотом у браузера Mist
работает нода Geth.
Подробные пошаговые инструкции по настройке кошелька Mist с работающим на бэкенде Parity доступны на YouTube-канале
команды Ethcore (www.youtube.com/watch?v=sta-p5d1blQ).
Наконец-то, разбираемся с браузером Mist!
Теперь, когда вы лучше понимаете, какую роль играет клиент Ethereum, давайте установим его на ваш компьютер. Браузер Mist
совместим с компьютерами на Linux, macOS и Windows, 32- и 64-битными архитектурами. Если вы не знаете разрядность вашей
системы, проверьте профиль оборудования. Большинство современных систем являются 64-битными.
Загрузка и установка браузера Mist
Сначала загрузите Mist по ссылке, как показано на изображении 2-2.
На странице проекта Ethereum на GitHub скачайте исполняемый файл для своей операционной системы или загрузите исходный
код для самостоятельной компиляции.
Вы найдете эту ссылку среди ссылок на другие клиенты на странице.
В Windows двойным кликом запустите загруженный исполняемый файл. На macOS откройте загруженный образ диска и
переместите кошелек Ethereum в папку Программы. В Ubuntu используйте Debian package или разархивируйте zip-файл и
откройте его для установки.
Примечание
Не стоит запускать сразу несколько узлов одновременно. Если, к примеру, вы попытаетесь открыть Geth в то время, как у вас
уже запущен Mist, вы получите сообщение об ошибке, указывающее на то, что узел уже запущен на вашей машине.
Настройка браузера Mist
После того, как вы скачали и запустили установочный файл, появится экран приветствия, как на изображении 2-3. (В нем
содержатся некоторые из тех больших обещаний, о которых мы говорили в Главе 1!).

Основная сеть также называется основной цепочкой. Тестовая сеть – это среда-“песочница” для экспериментирования с
ненастоящим эфиром и отладки контрактов.
Здесь вам будет задан вопрос, к какой цепочке или сети вы желаете подключиться? На данном этапе не имеет значения, какую
из них вы выберете; вы сможете переключаться между сетями позже. Но для наших задач давайте сделаем вам настоящий
адрес кошелька: нажмите “Использовать основную сеть” (“Use the main network”).
Обратите внимание на нижнюю часть окна, которая показывает загрузку блоков. Это приложение запускает полный узел

сети Ethereum; это означает, что оно хранит собственную копию блокчейна, которую для начала должно загрузить перед
тем, как будут совершены какие-либо реальные действия. Это займет много времени, потому что блокчейн хранит записи
о всех транзакциях в цепочке Ethereum.
Далее вы увидите окно, показанное на изображении 2-4, которое вы можете пропустить – если только вы не участвовали в
краудсейле Ethereum в 2014 году. Если участвовали, следуйте указанным инструкциям, чтобы получить свой эфир.

Краудсейл Ethereum, который выдал своим участникам права на файл, представляющий собой эфир, прошел в 2014 году.
Нажмите на опцию “Пропустить” (“Skip”), если вы не участвовали.
После выбора пароля, как показано на изображении 2-5 (не забудьте записать или запомнить его), вы увидите напоминание,
которое требует определенных пояснений.
Далее, выберите пароль.
Примечание
В сети Ethereum нет функционала по восстановлению пароля. Причина в том, что ваш пароль предназначен только для этого
локального экземпляра кошелька Mist; он не сохраняется в блокчейне Ethereum. Фактически, ваш закрытый ключ – это все, что
вам нужно для того, чтобы воссоздать этот аккаунт на любом другом компьютере с установленным Mist. Пароль, который вы
создаете, защищает вас лишь от злоумышленника, который может сесть за ваш компьютер и потратить ваши деньги через
интерфейс Mist. Это не помешает кому-либо украсть ваши закрытые ключи из файловой системы вашего компьютера, если он
оставлен без защиты. Примите меры предосторожности, например, отключите автоматический вход в учетную запись при
запуске системы на Mac, Linux или Windows.
На следующем экране, показанном на изображении 2-6, вы впервые увидите адрес своего кошелька (“etherbase”), это как URLадрес для этой машины, при условии, что этот узел и его данные находятся в исправном состоянии. Если вы удалите приложение
Mist и его данные из вашей системной библиотеки, то эта пара открытого и закрытого ключа – ваш “etherbase” – будет удалена.
Вот почему необходимо создавать резервные копии своих аккаунтов, мы рассмотрим, как это делается, в конце этой главы.

Здесь вы можете увидеть новый адрес. Вы также можете внести на счет биткойны, которые будут конвертированы в эфир при
помощи API Shapeshift.io
Наконец, вы увидите экран, как на изображении 2-7, когда блокчейн начнет синхронизацию с вашим компьютером. Если вы
нажмете “Запустить приложение” (“Launch Application”), загрузится интерфейс Mist. Не сокрушайтесь, если ваш новый аккаунт не
будет отображаться какое-то время. Он появится, когда узел будет полностью синхронизирован.
Это займет некоторое время. Ваш новый аккаунт появится, когда все будет готово.
Поиск вашего нового адреса
Вы можете создать больше адресов, но все они будут существовать на базе этого адреса “etherbase”, это упрощает резервное
копирование.
Если вы проследуете по дальнейшим экранам, то заметите, что это просто тайм-киллеры, которые позволяют вам узнать больше
об Ethereum, пока загружается блокчейн. Если вам интересно, нажмите на любой из примеров на этих экранах, чтобы увидеть
код контракта.

Отправка и получение эфира
Для отправки эфира сначала нужно иметь его на счету. В основной сети токены стоят денег, либо могут быть добыты с
помощью майнинга. Однако это слишком тяжелый способ для большинства начинающих освоиться в Ethereum.
Мы создали аккаунт в основной сети, на тот случай, если вы заинтересованы в хранении реального эфира в спекулятивных
целях или у вас уже есть друзья и коллеги, которые используют его для платежей. Для большинства читателей использование
тестового эфира (который вы можете генерировать бесплатно в тестовой сети под названием Ropsten) – это лучший способ, чем
платить деньги за реальный эфир для его использования в основной сети. Инструкции по подключению к Ropsten представлены
в Главе 5.
На данный момент стоит объяснить, как отправляется и принимается эфир, не для проформы, потому что это поможет
прояснить то, каким образом работает базовая система. Эфир отправляется через диалоговое окно “Отправить” (“Send”),
показанное на изображении 2-8.
Диалоговое окно “Отправить” в Mist упрощает отправку, получение и проверку балансов эфира без использования интерфейса
командной строки.
Чтобы отправить эфир, выполните следующие действия:
1
В реальной жизни узнайте адрес в Ethereum у человека, которому необходимо отправить эфир.
2
Откройте Mist. Нажмите “Отправить” в верхней части кошелька Mist. Откроется диалоговое окно “Отправить”.
3
Выберите, с какого кошелька вы хотите отправить эфир.
4
Вставьте адрес получателя.
5
Введите сумму.
6
Нажмите “Отправить”.
Вы увидите еще две опции, которые можно использовать: поле для ввода данных, куда можно внести дополнительный текст
(например, номер заказа или комментарий с благодарностью) и ползунок для выбора комиссии за транзакцию (“transaction fee”).
Назначение комиссии за транзакцию станет понятным в Главе 6. А сейчас оставьте ползунок в положении по умолчанию, и ваши
транзакции будут обрабатываться без проблем.
Примечание
Из практических соображений при отправке эфира ваш кошелек Mist должен быть полностью синхронизирован. Это означает,

что вам может понадобиться подождать некоторое время, пока Mist не скачает блокчейн, чтобы вы могли быть уверены в том,
что ваши транзакции будут обработаны без ошибок. Как вы узнаете позже, это не обязательно с технической точки зрения; узлы,
которые какое-то время находятся офлайн, в действительности способны инициировать транзакции, но только при условии, что
пользователь создает транзакцию через командную строку, с актуальной информацией об аккаунте, который используется.
Для получения эфира необязательно, чтобы ваш узел был синхронизирован. Если вы захотели проверить свой баланс, вы
можете спокойно нажать на “Запуск приложения” и пропустить процесс синхронизации во время запуска Mist.
Понимание типов аккаунтов в Ethereum
Пользователи взаимодействуют с блокчейном Ethereum при помощи аккаунтов. В профессиональной терминологии Ethereum
аккаунты, созданные и используемые людьми, называются внешними аккаунтами (“externally owned accounts”). Они отличаются
от аккаунтов для контрактов (“contract accounts”), адреса которых задействуются смарт-контрактами.
Примечание
Внешние аккаунты не всегда контролируются людьми. Иногда они контролируются доверенными рабочими станциями,
находящимися где-то в другом месте. Суть в том, что такие аккаунты являются внешними для EVM.
Если это отличие приводит вас в замешательство, вспомните, что в сети Ethereum контракты могут действовать вместо людей.
Вы можете отправить ценность (эфир) людям или вы можете отправить ее в адрес смарт-контракта, который будет действовать
автоматически. Например, контракт на перевод денег может использовать депозит отправителя, разделить его на три части и
отправить суммы дальше трем разным родственникам человека.
Таким образом смарт-контракты могут действовать вместо людей для автоматизации задач внутри децентрализованной
организации или быть посредником при проведении транзакции между физическими лицами, которые в противном случае
нуждались бы в контрагенте.
Примечание
И аккаунты контрактов, и внешние аккаунты являются объектами состояния. Аккаунты контрактов содержат состояние баланса
на аккаунте и хранилище контракта; внешние аккаунты содержат только состояние баланса. Вместе с тем, важно отметить, что
сообщество разработчиков Ethereum на данный момент рассматривает предложение по созданию большего количества
абстракций в EVM. Замысел состоит в том, чтобы абстрагироваться от неоднозначности, которую мы имеем сегодня, путем
превращения всех аккаунтов в непосредственно смарт-контракты. Таким образом, пользователи свободны в определении своей
собственной модели обеспечения безопасности.
Повторим некоторые основы:
Пара ключей выпускается, когда вы регистрируете новый аккаунт.
Вы можете зарегистрировать столько аккаунтов, сколько необходимо.
Создание аккаунта (пары ключей) может быть выполнено любым узлом Ethereum (даже если он не подключен к сети).
Нигде в мире нет общего списка пар ключей или аккаунтов.
Номера аккаунтов не связаны с вами, вашей личностью или вашим компьютером.
Вы можете получить доступ к сети Ethereum с помощью вашего закрытого ключа с любого устройства, на котором
запущен узел Ethereum.
Резервное копирование и восстановление ваших ключей
Продолжая работу в браузере Mist, после того, как он завершит синхронизацию с блокчейном, перейдите в меню “Аккаунты”
(“Accounts”), затем “Резервное копирование” (“Backup”) – “Аккаунты”. Откроется папка. Внутри этой папки находятся текстовые
файлы с длинными именами, которые начинаются с даты создания, например “UTC – 2016-09-01 (…)”. Каждый из этих файлов с
простым текстом представляет собой учетную запись.
Создайте резервную копию папки “keystore”, заархивируйте ее и поместите в безопасное место, например, на электронный USBключ или зашифрованный жесткий диск.

Если вы откроете один из этих текстовых файлов, то обнаружите свою пару ключей, открытого и закрытого, отформатированную
в определенной нотации.
Для восстановления аккаунта на другом узле, не том, где вы создали аккаунт, просто поместите папку “keystore” таким же
способом, как был описан выше. Вместо дублирования уже имеющихся там файлов, восстановление аккаунта Ethereum в Mist
заключается в простом копировании текстового файла, содержащего закрытый ключ, внутрь папки “keystore” и перезапуске
Mist. Для получения полного руководства посетите: http://backup.eth.guide http://restore.eth.guide.
Если вы хотите найти папку “keystore” на своем жестком диске через терминал, то она обычно находится в следующих
директориях:
Mac: ∼/Library/Ethereum/keystore
Linux: ∼/.ethereum/keystore
Windows: %APPDATA%/Ethereum/keystore
Предыдущий процесс позволит забэкапить только ваши обычные аккаунты. Контракты кошелька хранятся в папке “application
data”, так что сделайте еще и резервную копию этой папки (после того, как выполните упражнения из последующих глав):
Mac: ∼/Library/Application Support/Mist/
Linux: ∼/.con g/Mist или, в более ранних версиях, ∼/.con g/Chromium/Mist (папка скрыта)
Windows: C:Users< Your Username >AppDataRoaming или ∼AppDataRoamingEthereumkeystore
Каждый раз, когда вы создаете новый аккаунт в Mist, обязательно берите файл с ключами и делайте его бэкап.
Использование бумажных кошельков
Вы, вероятно, заметили в прошлом разделе, что узел Ethereum не обязательно должен быть подключен к сети, чтобы создать
аккаунт. Это связано с тем, как сеть Ethereum генерирует адреса; она может создать новую действующую пару ключей с
практически нулевым шансом, что такая пара ключей уже существует.
Эта характеристика системы допускает существование того, что большинство веб-приложений не могут предложить:
“бумажный” аккаунт. Такие сайты, как MyEtherWallet позволяют пользователям создавать пару ключей прямо в браузере,
которые можно хранить на компьютере локально. Этот сайт также позволяет легко распечатать пару ваших ключей на бумаге
для безопасного хранения.
Это называется бумажным кошельком, потому что в нем содержится QR-код, позволяющий людям вносить средства на ваш
Ethereum-аккаунт, просто просканировав QR-код с листа бумаги. Теоретически, вы можете собирать платежи в эфире таким
способом, но вам нужно будет поместить закрытый ключ в экземпляр Mist (или другой клиент) для доступа к эфиру и отправки
его куда-либо еще.
Использование мобильных кошельков
Растет число мобильных приложений кошельков для iOS и Android, которые хранят закрытые ключи в самом мобильном
устройстве. Самым популярным и заслуживающим доверие на сегодняшний день является Jaxx, показанный на изображении 29, который был разработан канадской софтверной компанией Decentral. Их программное обеспечение работает на Mac, Linux,
Windows и даже на нескольких других платформах, включая Firefox и Chrome. Decentral управляется соучредителем проекта
Ethereum Энтони Ди Йорио.

Jaxx, возможно, является лучшим выбором приложения кошелька для iOS и Android. В нем можно держать биткойны, эфир и
некоторые другие криптовалюты.
Внешний вид базового интерфейса, который вы видите на изображении 2-9, стал относительно стандартным UI для приложений
кошельков. Пользователи получают свои адреса и могут наблюдать их в виде QR-кода. QR-коды облегчают отправку эфира или
биткойнов в личном порядке, практически также, как Snapchat использует QR-коды, чтобы пользователи могли фолловить друг
друга, просто сделав снимок кода другого пользователя.
Здесь вы найдете список надежных приложений кошельков: http://wallets.eth.guide
Прежде чем идти дальше, стоит отметить, что умение работать с QR-кодами – это все, что нужно для принятия участия в
криптоэкономике. Чтобы отправить кому-либо эфир или биткойны через мобильный кошелек, вы нажимаете “отправить”,
сканируете QR-код получателя (или вставляете в поле его открытый ключ) и вводите сумму. Адресат получит свой эфир за
считанные секунды.
Работа с сообщениями и транзакциями
В Ethereum транзакции используются для обозначения изменений состояния в распределенной базе данных (то есть, в
блокчейне). Транзакции изменяют балансы аккаунтов внутри EVM. Сообщения – это объекты данных, передаваемые по сети
между смарт-контрактами, которые не обязательно приводят к каким-либо изменениям в цепочке. Например, когда один
контракт проверяет баланс другого контракта.
Транзакции изменяют состояние
Транзакция в Ethereum основана на элементе данных, несущем криптографическую подпись, который попадает в блокчейн и, как
следствие, записывается на каждом узле сети. Каждая транзакция приводит к запуску сообщения для выполнения (завершения)
этого изменения состояния, но сообщения также могут отправляться при помощи кода EVM. Эти сообщения являются
приватными для сторон и никак не отображаются в блокчейне.
Редактирование глобальной базы данных

Одна из причин, по которой блокчейн-сети типа Ethereum афишируются как неизменяемые, заключается в том, что как только
транзакция записывается в глобальную общую базу данных, она не может быть отменена никакой другой транзакцией. В
терминологии современных платежных систем это называется системой безвозвратных платежей.
В североамериканских каналах платежей возврат платежа определяется как принудительный возврат средств владельцу счета,
инициированный банком-эмитентом. Поскольку в Ethereum нет никакого центрального управляющего органа, то не к кому
обращаться за помощью, если вы ошиблись с транзакцией. В настоящее время единственный способ отката транзакции – это
форк состояния (“state fork”), для которого требуется, чтобы все узлы сети согласились на ручное возвращение транзакции. Это
чрезвычайно сложный и практически неосуществимый сценарий, оставленный для случаев атак на всю сеть в целом, в той или
иной форме.
Причиной для подобной транзакционной модели является обеспечение безопасности. Сравните отправку криптовалюты с
одного аккаунта на другой и процесс выписки традиционного бумажного чека. В случае с последним, банк получает данные об
исходящей транзакции с вашего счета. Сначала банк проверяет баланс, чтобы убедиться, есть ли у вас средства для оплаты
суммы, которую вы указали на чеке; если их нет, то банк владельца счета не увеличивает баланс счета. Вместо этого вам
придется оплатить штраф за необеспеченный чек.
Транзакции в сети Ethereum работают аналогичным образом. Система гарантирует, что сумма, исходящая из одного аккаунта,
всегда будет добавлена на целевой аккаунт. Если по какой-либо причине отсутствует доступ до целевого аккаунта – например,
по причине недействительной криптографической подписи – то баланс исходного аккаунта не будет уменьшен, и, следовательно,
средства не будут потеряны. В Ethereum транзакции, сгенерированные извне, всегда подписываются криптографическими
ключами отправителя и получателя, что позволяет эффективным образом обеспечивать, чтобы злоумышленники не могли
создавать транзакции, а деньги не могли потеряться только лишь по причине неправильно набранного адреса.
Итак, что же такое блокчейн?
До сих пор мы тщательно избегали разбора концепции блоков и фокусировались на том, как инициируются транзакции. Далее
мы обсудим клиринг и выверку транзакций сетью. Блок представляет собой единицу времени, охватывающую определенное
количество транзакций, точно так же, как сердцебиение – это период времени, в течение которого определенное количество
крови перемещается по телу живого организма. В течение этого периода записываются данные транзакций; по истечении этой
единицы времени начинается новый блок.
Блокчейн представляет собой историю изменений состояния сетевой базы данных в EVM.
Процитируем документацию Ethereum:

Блоки в блокчейне представляет из себя единицы времени; сам блокчейн является временным измерением и представляет
собой полную историю состояний в дискретные моменты времени, обозначенные блоками в цепочке.3
Смарт-контракты могут быть загружены в сеть в определенном блоке, но могут в действительности не отправлять никаких
сообщений или транзакций до значительно более позднего блока.
Плата за транзакции
Когда человек отправляет транзакцию, EVM требуется небольшая комиссия для обработки транзакции.
Это также справедливо и для загрузки смарт-контрактов: пользователи должны заплатить за вычислительные затраты,
которые EVM потратит на выполнение каждого контракта. Принуждая пользователей платить за транзакции в EVM, вероятность
появления экономически неэффективных и бесконечно работающих программ теоретически снижается. Эти издержки
заложены в единицу под названием газ. Вы можете рассматривать газ в качестве показателя, указывающего на количество
шагов, которые потребуется совершить EVM для завершения инструкций в транзакции. Если это простой перевод денег от
одного человека другому, то комиссия за транзакцию будет небольшой, потому что для этого потребуется небольшое
количество вычислительных шагов.
В случае со сложным смарт-контрактом, однако, комиссия будет выше, поскольку EVM должна будет использовать свои
глобальные ресурсы, чтобы выполнить код на Solidity из контракта и выяснить, какие транзакции затем необходимо будет

выполнить в качестве результата.
Отправители транзакций должны включать лимит газа, который позволит понять, сколько они готовы заплатить за исполнение
своей транзакции. Полные узлы в сети, которые майнят или обеспечивают защиту сети за оплату, предоставляют аппаратные
средства для множества этих транзакций, которые должны быть сопоставлены, подтверждены, взаимозачтены, урегулированы
и сохранены в блокчейне, таким образом они получают комиссию за транзакцию, которую платит пользователь, когда он или
она отправляет эфир другу или исполняет смарт-контракт. Майнеры, которые исполняют транзакцию, забирают комиссию себе,
это неявный рыночный механизм в деле. Будет ли исполнена транзакция или нет, определяется количеством газа, которое
отправитель готов заплатить. Если суммарное количество шагов превышает бюджет газа, запланированный на транзакцию, все
шаги откатываются, и никакая часть транзакции не исполняется. Если пользователь отправляет транзакцию со слишком низкой
транзакционной комиссией, она будет обработана только по прошествии определенного времени, либо вообще не будет
обработана.
В целом, любая операция стоит некоторого количества газа; большая часть операций стоит 1 единицу газа. Сложная транзакция
может стоить сотни единиц газа. В любом случае, в долларовом эквиваленте все сводится к крайне малым суммам.
Описание номиналов
Как и в фиатных валютах, балансы и значения эфира имеют стандартизированные номиналы для малых единиц. Все балансы
эфира стандартно выражаются в эфире (ether), а дробные части выражаются в wei.
Например, 10.234 эфира (Ether) = 10,234,000,000,000,000,000 Wei.
Если сравнить эфир с долларом, то wei – это как даймы, квотеры, пенни и никели. В таблице 2-1 подробно описаны номиналы
wei.
Таблица 2-1.
Номиналы эфира. В столбце “Единица” (“Unit”) слева представлены эквивалентные номиналы биткойна в скобках.
Единица
Значение Wei
Количество Wei
Wei
1 wei
1
Kwei (babbage)
13 wei
1,000
Mwei (lovelace)
16 wei
1,000,000
Gwei (shannon)
19 wei
1,000,000,000
Microether (szabo)
112 wei
1,000,000,000,000
Milliether ( nney)
115 wei
1,000,000,000,000,000
Ether
118 wei
1,000,000,000,000,000,000
Вы можете найти инструмент для конвертации эфира в wei на сайте: https://etherconverter.online
Получение эфира
Самый простой способ получить эфир, это конвертировать биткойны в кошельке Mist, как было описано ранее в этой главе. Вы
можете зарабатывать эфир майнингом, но, как упоминалось ранее, это потребует начальной настройки; вы не можете майнить
эфир внутри Mist, если только он не подключен к тестовой сети. (Это связано с тем, как тестируются и выполняются в сети
смарт-контракты, вы узнаете об этом в Главе 5).
Если вы хотите купить эфир за фиатную валюту, например, за доллары США, вам нужно будет сделать это на бирже или с
помощью лицензированного обменника. Список онлайн-платформ, которые продают эфир, вы найдете по ссылке.

Эфир в тестовой сети бесплатный, мы уже говорили об этом в данной главе. Инструкции по получению тестового эфира с
помощью “крана” приведены в Главе 5 с более подробной информацией по созданию транзакций.
Анонимность в криптовалютах
Биткойны и эфир не являются анонимными платежными инструментами. Любой, кто знает ваш открытый ключ, может
посмотреть в блокчейне и увидеть там информацию о датах и суммах в транзакциях, входящих и исходящих из вашего аккаунта.
На основании этих данных можно составить паттерн транзакций, из которого будет возможно вывести вашу деятельность.
Федеральные органы власти уже используют машинообучаемые транзакции для декодирования паттернов расходов на теневых
рынках типа AlphaBay.4
Понятия анонимности, конфиденциальности и приватности в криптовалютах обычно смешиваются новичками, иногда это
приводит к катастрофическим последствиям. Адреса Биткойн и Ethereum являются по своей сути псевдонимными; они не
связаны с вашим реальным именем или какой-либо другой персональной информацией. Но каждая транзакция, которую вы
отправляете, является публичной, в том смысле, что любой может увидеть ее в блокчейне. Вот почему публичные блокчейны
расхваливают за их прозрачность; если вы знаете чей-то открытый ключ, вы можете посмотреть на все его транзакции.
Данные внутри непосредственно смарт-контрактов закодированы, но не зашифрованы. Шифрование используется только для
хеширования больших массивов данных и верификации отправителей и получателей транзакций. Тем не менее, вы можете
зашифровать данные самостоятельно, перед тем как поместить их в смарт-контракт, если вы хотите использовать публичные
цепочки Ethereum для личных целей.
Как вы узнаете дальше, каждая транзакция в Ethereum оставляет место для дополнительной полезной нагрузки в виде текста,
которое маркируется как “Input Data” (“Входные Данные”). Не испытывайте соблазн и не помещайте в него секретные данные
для безопасного хранения, если только не собираетесь их предварительно зашифровывать. Но даже в этом случае хранение
строк с паролями или PIN-кодов в блокчейне Ethereum – это в целом плохая идея, потому что он публичный, и записи из него
никогда нельзя будет удалить. Любой может исследовать блокчейн типа Ethereum с помощью доступного через интернет
приложения под названием обозреватель блоков (“blockchain explorer”).
Обозреватели блокчейнов
Как и в случае с Биткойн, каждая транзакция, входящая и исходящая из EVM, записывается в публичный реестр. Транзакция,
показанная на изображении 2-10, является типичной для блокчейна Ethereum. По нажатию на адрес отправителя или получателя
вы сможете увидеть транзакции по этому адресу с момента его создания. Этот скриншот сделан с сайта Etherscan, но любой
человек может разработать свой обозреватель блоков для публичной цепочки Ethereum.

Все транзакции эфира и биткойнов публичны. Некоторые пользователи избегают связывания своей личности со своим
открытым ключом и создают новый аккаунт для каждой транзакции. Другие же наоборот, используют один и тот же открытый
ключ годами, рекламируя его в качестве канала по приему пожертвований или взносов на те или иные цели.
Примечание
Обозреватели блокчейнов показывают вам историю записи всех транзакций в сети и позволяют вам связать воедино историю
транзакций. Нет необходимости записывать вручную детали ваших транзакций!
Как вы можете увидеть на изображении 2-10, транзакции имеют целый ряд атрибутов. Мы поговорим подробнее о том, что
означают эти поля, в Главе 3, но на данный момент вот “сухой остаток”: отправка и получение эфира происходят приватно для
участников, потому что открытые (публичные) ключи псевдонимны по свой сути – но эти транзакции не являются строго
секретными, в том смысле, что все транзакции доступны для публичного просмотра в блокчейне. Легко отследить движение
денег с одного аккаунта на другой.
Итоги Главы 2
До сих пор мы двигались быстро. В этой главе вы узнали больше информации о кошельках и клиентах Ethereum. Если вы начали
синхронизацию вашего экземпляра Mist в процессе чтения этой главы, то вероятно, она еще даже не завершилась!
Между тем, давайте готовиться к развертыванию смарт-контракта.
Несмотря на то, что для следующей главы вам не нужен будет доступ к вашей машине на Ubuntu, стоит заняться ее настройкой
для Глав 4, 5, 8 и 9. А пока что приступайте к следующей главе, в которой вы узнаете, как работает виртуальная машина Ethereum
(EVM).
Примечания к Главе 2
1
Gavin Wood, GitHub, “Ethereum Yellow Paper,” https://github.com/ethereum/yellowpaper, 2014.
2
StackExchange, “When Transferring Ether, Who Needs to be in Sync with the Blockchain,”
https://ethereum.stackexchange.com/questions/2273/when-transferring-ether-who-needs-to-be-i n-sync-with-the-blockchain, 2016.
3
Ethdocs.org, “Account Types, Gas, and Transactions,” http://ethdocs.org/en/latest/contracts-and-transactions/account-types-gasand-transactions.html, 2016.
4
Science Magazine, “Why Criminals Can’t Hide Behind Bitcoin,” www.sciencemag.org/news/2016/03/why-criminals-cant-hidebehind-bitcoin, 2016.
Создание децентрализованных приложений на блокчейн
Помощь в программировании искусственного интеллекта
Глава 3. Виртуальная машина Ethereum (EVM)
05.04.2018
Рубрика: Введение в Ethereum и Solidity
Автор: adminCraft
Содержание страницы
1 Глава 3
2 Сеть центральных банков вчерашнего дня
3 Что из себя представляют виртуальные машины?
4 Роль протокола Ethereum в банковской сфере
5 Любой может создать банковскую платформу
6 Что делает Виртуальная машина Ethereum (EVM)?
7 Глобальная одноэлементная машина
8 Приложения для EVM называются смарт-контрактами
9 “Умные контракты”
10 EVM запускает байткод
11 Машины состояний
12 Цифровой vs. аналоговый
13 Утверждения состояний (“state–ments“)
14 Роль данных в состоянии
15 Как работают внутренности EVM
16 EVM постоянно проверяет наличие транзакций
17 Создание общей машины, повествующей о том, что произошло
18 Криптографическое хеширование
19 Что делают хеш-функции (или алгоритмы хеширования)
20 Примечание
21 Блоки: история изменения состояний
22 Суть времени блоков
23 Недостатки коротких блоков
24 Блокчейн из “соло-узлов”
25 Распределенная защита
26 Роль майнинга в функции перехода состояний
27 Примечание
28 Аренда времени в EVM
29 Привет, газ!
30 Примечание
31 Почему газ так важен?
32 Почему газ не оценивается в эфире?
33 Комиссия как мера регулирования
34 Работа с газом
35 Особенности газа
36 Как газ связан с масштабируемостью системы
37 Аккаунты, транзакции и сообщения
38 Внешние аккаунты
39 Аккаунты контрактов
40 Транзакции и сообщения
41 Характеристики транзакций
42 Характеристики сообщений
43 Примечание
44 Оценка комиссионных отчислений в виде газа для операций
45 Операционные коды в EVM
46 Итоги Главы 3
47 Примечания к Главе 3

Глава 3
Виртуальная машина Ethereum (EVM) – это глобальный компьютер, который может использовать любой человек за небольшую
комиссию, выплачиваемую в эфире.
EVM (Ethereum Virtual Machine) – это единый глобальный 256-битный “компьютер”, в котором все транзакции хранятся локально на
каждом узле сети и исполняются с относительной синхронностью. Это глобально доступная виртуальная машина, состоящая из
множества отдельных компьютеров.
Этот гигантский компьютер, к которому может получить доступ любой человек, имеющий узел или приложение кошелька,
позволяет легко перемещать произвольно большие количества ценности (деньги) практически мгновенно. Хотя любой может
использовать эту глобальную виртуальную машину, никто не может создавать в ней поддельные деньги или переводить средства
без разрешения.
Если вам кажется экономически невыгодным существование целой EVM со всеми ее узлами, реплицирующими одинаковые
транзакции и слепо поддерживающими одинаковое состояние между тысячами отдельных компьютеров, важно иметь
надлежащее основание для сравнения с тем, как сегодня работают информационные технологии в области финансового
обслуживания. EVM – это образец простоты и эффективности по сравнению с ними! Что еще более важно, вся эта работа не
проводится впустую. На деле, как вы узнаете из этой главы, подтверждение результатов этой работы – это именно то, что в
действительности защищает сеть.
Сеть центральных банков вчерашнего дня
Сегодня корпорации, страховщики, университеты и другие крупные учреждения тратят огромные суммы денег на создание и
поддержание программных сервисов и IT-инфраструктуры для своих сотрудников и всех своих направлений бизнеса. Их
различные притоки и оттоки средств регулируются крупными коммерческими банками, у которых есть своя собственная
архитектура, политика, база кода, базы данных и уровни инфраструктуры. Конечно, все это работает поверх Fedwire (федеральной
автоматизированной системы денежных переводов), которая является системой валовых расчетов в режиме реального времени
(RTGS) Федерального Резерва.
Федеральный Резерв является центральным банком США. Fedwire используется всеми банками-членами Федерального Резерва
для расчетов окончательных платежей в электронных долларах США. Любой аттестованный и действующий в юрисдикции штата
банк может стать членом системы, купив в ней долю. Fedwire принадлежит и управляется непосредственно 12-ю федеральными
резервными банками, и хотя она собирает взносы, работает она не ради извлечения прибыли.
Эта система обрабатывает немыслимые суммы долларов США – триллионы за триллионами. Она обладает некоторыми
великолепными возможностями: есть система овердрафта, которая покрывает все существующие и утвержденные счета, и эта
система признанно надежна, даже для перевода средств между континентами. Она функционирует в той или иной форме уже
порядка ста лет.
Как вы можете представить, обеспечение безопасности и надежности программного обеспечения Fedwire чрезвычайно дорого
обходится. Правда, стоимость построения и обслуживания уровней поверх RTGS еще выше, в силу ее требований безопасности. В
конечном итоге эти расходы возлагаются на корпорации, которые пользуются услугами коммерческих банков, в виде комиссий. У
этих компаний есть расходы на обслуживание своей собственной IT-инфраструктуры. В совокупности все это приводит к
значительному повышению цен и комиссий для обычных потребителей.
Что из себя представляют виртуальные машины?
Если вы были не знакомы с виртуальными машинами в начале чтения этой книги, возможно, к настоящему времени вы уже
понимаете, что виртуальная машина (VM), в контексте Ethereum, является одним глобальным компьютером, состоящим из
составных узлов, которые в свою очередь сами являются компьютерами.
В целом можно сказать, что виртуальная машина – это эмуляция компьютерной системы при помощи другой компьютерной
системы. Эти эмуляции основаны на тех же компьютерных архитектурах, что и объекты их эмуляции, но обычно они
воспроизводят эту архитектуру на другом “железе”, не том, эмулировать которое они были предназначены. Виртуальные машины
могут быть созданы программными средствами, аппаратными или использовать обе категории средств. В случае с Ethereum
используются обе. Чем обеспечивать защищенную работу сети из тысяч дискретных машин, как в системе Fedwire, Ethereum
использует подход по обеспечению защищенной работы одной очень массивной машины, которая может охватить всю планету.

Как вы поймете из длинного списка клиентов Ethereum для различных операционных систем, EVM – это собирательная эмуляция,
запущенная на тысячах машин, которые – на своем уровне – могут использовать любую из десятков версий Windows, Linux, ethOS
и macOS (подробнее о ethOS в Главе 6).
Роль протокола Ethereum в банковской сфере
В рамках этой книги мы не постулируем гипотезу о том, подходят ли системы на основе блокчейна для использования
суверенными центральными банками, или что эти системы совершенно точно являются заменой для центробанков. Более
вероятно, что сами центральные банки начнут внедрять эту технологию. Коммерческие банки определенно заинтересованы в ней;
вы найдете более подробную информацию о банках и предприятиях, вовлеченных в разработку контрактов Ethereum, в Главе 11.
Система Fedwire – это система расчетов с интерфейсом взаимодействия, разработанным под нужды банков с лицензией штатов и
их операторов. К примеру, конечный пользователь розничного банка практически никак не взаимодействует с этой системой;
работа с ним выполняется розничным банком.
Разработчики программного обеспечения расценивают Fedwire, как “платформу для банков”. Что выберет банк для построения
поверх Fedwire (качество обслуживания, банковские онлайн-инструменты, физические традиционные филиалы, финансовые
продукты, сопутствующие продажи) – это то, что выделит его из числа других банков в системе Fedwire.
Любой может создать банковскую платформу
Ethereum значительно более универсален. Он позволяет любому человеку поднимать сеть с таким же или даже лучшим уровнем
обеспечения безопасности и надежности, чем у Fedwire, и с возможностью выполнения почти мгновенных защищенных
трансферов ценности. И это лишь стартовая точка для Ethereum.
Разработчики могут создавать любые виды финансовых продуктов или бизнес-логику, которые пожелают, на базе этого
защищенного реестра, с помощью автоматических и неизменяемых скриптов, без необходимости оплачивать
непроизводительные издержки, сваливающиеся на них традиционной банковской инфраструктурой с централизованным
размещением и хранением информации.

Но есть ли возможность масштабирования до скоростей и размеров Fedwire?
Ответ – да, есть,
Ethereum способен на это, но процесс займет несколько лет. Нет прямого или установленного предела ни для размеров блоков, ни
для размеров транзакций. В Биткойн размер блока ограничен до 1Мб, что составляет примерно 7 транзакций в секунду. В
Ethereum эти лимиты увеличиваются или уменьшаются в зависимости от спроса и пропускной способности сети.
Однако это не означает, что блоки могут быть неограниченного размера. Напомним, что единицы работы в сети Ethereum
оцениваются в газе. Таким образом, более крупные, более сложные ethereum смарт контракты стоят больше газа для хранения и
исполнения. Максимальное количество газа, которое может быть потрачено на блок, является переменной, но есть максимум.
Теоретически, одна крупная транзакция может израсходовать весь лимит газа для одного блока. Но если будет поддерживаться
постоянный спрос на большие лимиты газа, то система будет увеличивать лимит газа на блок с шагом в 0,09%. (Подробности о
том, как это работает, можно прочитать в “Ethereum Yellow Paper” (формулы 40-42). На момент написания книги лимит газа для
одного блока составлял 4,041,325 газа на блок.
Что это значит для индустрии финансовых услуг? Определенно, не гибель, но возможно, некоторую неожиданную конкуренцию.
Последствия могут быть в разукрупнении сферы банковского обслуживания на все более мелкие бренды, поскольку публичная
цепочка Ethereum масштабируема и способна обрабатывать все больше транзакций все быстрее и быстрее.
Лаура Шин, автор и ведущая блокчейн-ориентированного подкаста Unchained, провела интервью с Адамом Людвином о блокчейнстартапе из Сан-Франциско Chain в 2016 году и написала следующее:
– Что касается владельцев сети в действующей системе, если вы идете в JPMorgan Chase Bank и кладете на депозит $50
наличными, Chase берет эти деньги, выпущенные Федеральным Резервом, на хранение в своей сети. Но Людвин сказал, представьте

себе, что вместо банков, работающих в сети Fedwire, нынешняя система для электронной обработки платежей между банкамичленами будет воссоздана на блокчейне, ключи от которого банки будут хранить для совершения переводов.
– Это может затем привести к тому, что кастодианами для такой валюты будут становиться нефинансовые организации. “Для
небольших сумм вам не нужен банк,” – сказал Людвин. – “Могут ли Google, Apple, Facebook хранить небольшие суммы цифровых
денег? Меняет ли это модель того, кто может быть хранителем этих денег? Ответ – да.” Дополнительно, это может открыть новые
возможности для peer–to–peer кредитования, уменьшая зависимость потребителей от банков в вопросах получения кредитов.
Что делает Виртуальная машина Ethereum (EVM)?
К настоящему времени EVM может отчетливо обозначить себя: единая, защищенная, не имеющая владельцев виртуальная
машина, которая предлагает дешевый, Fedwire-подобный функционал с дополнительным набором разного рода магии.
Как все это работает?
В EVM можно запускать произвольные программы (смарт-контракты, упомянутые в Главе 1), написанные на языке Solidity. Эти
программы, получая определенные входные данные, всегда будут выполнять операцию вывода в том же порядке, с одинаковыми
нижележащими изменениями состояния. Это делает программы на Solidity полностью детерминированными и гарантирует их
исполнение, при условии, что вы достаточно заплатили за транзакцию; но мы поговорим о плате за газ чуть позже в этой главе, а в
последующих мы дойдем до обучения solidity.
Любые задачи, которые могут быть выполнены компьютерами, можно выразить в виде программ на Solidity, что делает их
теоретически полными по Тьюрингу. Это означает, что вся распределенная сеть, каждый узел, выполняет каждую программу,
исполняемую на платформе. Когда один пользователь загружает смарт-контракт через свой узел Ethereum, он включается в
последний блок и распространяется по сети, где сохраняется на каждом другом узле в сети.
Как мы уже обсуждали, задача каждой ноды в EVM состоит в том, чтобы запускать одинаковый код, это часть протокола
обработки блоков. Узлы обрабатывают блоки и запускают любой код, заключенный в транзакциях. Каждый узел делает это
независимо; он не только сильно распараллелен, но и достаточно избыточен.
Несмотря на все внешние признаки, это эффективный способ балансировать глобальный реестр надежным образом. Важно
помнить, насколько много денег, мощностей и человеческой энергии расходуется на каждый банк по всему миру, чтобы наладить
его собственную уникальную IT-систему или набор из систем для каждого из его направлений деятельности. В банковской
системе, базирующейся на Ethereum, все пользователи (корпорации или клиенты) получают прямой доступ к похожей на Fedwire
системе бесплатно, имея возможность программировать транзакции. Поскольку протокол является свободным и опенсорсным,
любой может запустить узел и подключиться к сети. К сожалению, последние разъяснения по системе Fedwire зачастую остаются
без упоминания о криптовалютах, хотя это важный контекст в плане понимания преимуществ крупных публичных блокчейнов.
Вы можете найти актуальную, написанную сообществом, документацию проекта Ethereum в “Homestead Documentation
Initiative”: http://ethdocs.org/en/latest
Эта документация создана не под редакцией фонда Ethereum, но она стала популярным ресурсом за счет понятного объяснения
технических концепций.
За более глубокими техническими пояснениями и для просмотра предложений по улучшению Ethereum (“Ethereum Improvement
Proposals”, EIPs), обратитесь к вики Ethereum по адресу.
На странице вики вы найдете “Ethereum White Paper”. Если после прочтения этой книги у вас останутся вопросы о том, как работает
Ethereum, скорее всего ответ вы сможете найти либо в “White Paper”, либо в упомянутом ранее “Yellow Paper”, ссылку на который вы
также сможете найти в вики Ethereum.
В Главе 11 содержится дополнительный перечень научных статей, связанных с проектом Ethereum. В числе прочих тем, они
посвящены будущему проекта, включая масштабируемость и интероперабельность публичной цепочки Ethereum с частными или
корпоративными цепочками.
Глобальная одноэлементная машина
EVM – это транзакционная одноэлементная (“singleton”) машина с общим состоянием. В вычислительной сфере это означает, что
она представляет собой один гигантский объект данных, а не то, чем она является физически: сеть дискретных машин-синглтонов,

действующих по отдельности и в постоянной связи друг с другом. (Если вы непрограммист, то возможно, помните из Главы 1, что
объект представляет собой небольшой фрагмент информации, которая отформатирована определенным образом, и которая
содержит атрибуты, а также методы для чтения или изменения этих атрибутов).
Приложения для EVM называются смарт-контрактами
С позиции разработчика программного обеспечения, EVM также является средой исполнения для небольших программ, которые
могут быть исполнены сетью.
“Умные контракты”
Вместо того, чтобы утомлять вас этимологией словосочетания “смарт-контракт”, давайте проясним одно: в нашем контексте
контракт относится к определенному виду контрактов – финансовому контракту, также известному в более разговорной речи, как
дериватив или опцион. Финансовые контракты – это соглашения о покупке и продаже в определенный момент в будущем, обычно
по установленной цене. В контексте Ethereum смарт-контракты – это соглашения между аккаунтами о передаче эфира (то есть,
платежа) при выполнении определенных условий.
Причина, по которой эти смарт контракты называются “умными” (“smart”), заключается в том, что они выполняются машиной, а
активы (эфир или другие токены) перемещаются автоматически. Эти контракты могут быть приведены в исполнение даже через
сотни лет после их написания, при условии, что сеть к тому времени будет все еще работать – и даже если большое количество
злоумышленников попытаются вмешаться. EVM полностью изолирована (работает по принципу “песочницы”) и свободна от
вмешательства, изолирована от других сетей, это делает невозможным отказ сторон от исполнения смарт-контракта. С
практической точки зрения, это достигается благодаря тому, что смарт-контракты наделяются властью условно депонировать
активы (эфир или другие токены) и перемещать их, когда условия контракта удовлетворяются.
EVM запускает байткод
EVM имеет свой собственный язык – байткод EVM, в который компилируются ваши смарт-контракты. Solidity является
высокоуровневым языком программирования, написанные на нем программы компилируются в байткод и загружаются в
блокчейн Ethereum с помощью клиентского приложения, такого как браузер Mist, или полного узла.
Машины состояний
EVM, как мы уже несколько раз говорили, является машиной состояний. Вместо того, чтобы просто раскрыть эту концепцию и
двигаться дальше, давайте воспользуемся моментом и рассмотрим, что именно представляет из себя компьютер, прежде чем
перейти к тому, как Ethereum расширяет эту концепцию.
Цифровой vs. аналоговый
Фундаментальной идеей в концепции компьютера состояний является идея переключателя, который может находиться в двух
состояниях: включен или выключен. Нули и единицы (общепринятый язык машин) используются для передачи состояний
массивам метафорических переключателей, которым, условно говоря, задается определенная конфигурация для кодирования
указанных букв, цифр или других символов клавиатуры. Все символы на клавиатуре (и не только) могут быть представлены всего
восемью переключателями, поэтому память компьютеров кратна восьми. Например, код символа для запятой 0010 1100.
В компьютерном программировании буквы и цифры могут использоваться для написания машинных инструкций, в разговорной
речи это называется кодом. Американская ученая и контр-адмирал флота США Грейс Хоппер (изображение 3-1) разработала
первый компилятор, который автоматически транслировал человекочитаемый код в машинный код (типа байткода EVM), который
является менее абстрактным и, следовательно, находится на один шаг ближе к нулям и единицам, о которых мы так много
говорим.

Контр-адмирал Грейс Хоппер была одним из первых программистов, кто писал код для гарвардского компьютера Марк I в 1944
году.
Утверждения состояний (“state–ments“)
Сами по себе отдельные фрагменты кода можно поделить на две группы: выражения и утверждения. Выражения используются
для вычисления определенного условия; утверждения (запомните это ключевое слово!) используются для записи информации в
память компьютера. В совокупности, выражения и утверждения позволяют компьютерам изменять базу данных предсказуемым
образом при наступлении определенных условий. В этом состоит главный смысл автоматизации, и именно поэтому компьютеры
столь полезны для нас!
Утверждения могут вернуть значение “true” или “false”, и, в зависимости от кода, этот двоичный результат может привести к
добавлению, удалению или изменению информации в одном из многочисленных адресов памяти компьютера. (Поскольку язык
Solidity строго типизирован, в нем нет “псевдоправдивых” (“truthy”) и “псевдоложных” (“falsy”) утверждений, как в Javascript).
Четкое различие между “true” и “false”, “да” и “нет”, “включен” и “выключен” – это то, что позволяет компьютерам безопасно
принимать решения вместо людей.
Роль данных в состоянии
Каждый раз, когда вы изменяете данные в памяти компьютера, можете подумать о зиллионах его внутренних переключателей
(большинство из них виртуализированы способом, который мы обсуждали ранее в этой главе), которые переводятся в немного
другую конфигурацию. Под состоянием обычно понимается текущее состояние системы: действительная последовательность
изменений в информации по различным адресам памяти машины, которая привела к текущему содержанию памяти.
Важно различать атрибут и состояние. Состояние – это то, что может легко и предсказуемо меняться. Давайте используем пример
с автомобилем.
Перекраска автомобиля – это тяжелая работа, но она может быть выполнена. Цвет краски является примером атрибута. В
псевдокоде вы можете сказать следующее о машине:
bodyColor = red
В компьютерном программировании это называется парой ключ/значение. Ключ, bodyColor, имеет присвоенное ему значение,
которое является red (“красный”). Чтобы изменить значение этого ключа, ваш код выполняет новое утверждение значения, чтобы
оно стало иным:
bodyColor = green
И теперь ваша машина перекрашена. У нее новое значение цвета (“зеленый”).
Теперь, давайте предположим, что вы указали компьютеру, что цвет этого автомобиля будет часто меняться. Другими словами, вы
делаете цвет автомобиля переменной. Что ж, можно сказать, что переменная (в данном случае, цвет) может иметь состояние,

которое является изменяющимся значением. Но отдельное значение, такое как green (“зеленый”), не имеет состояния; green – это
просто green.
Одометр представляет еще один пример переменной с изменяемым состоянием.
Значение одометра может быть 1000, это число, которое само по себе не имеет состояния; это всего лишь цифра. Вскоре
состояние одометра изменится на новое значение (1001), но это произойдет только в том случае, если в кабине автомобиля будут
отданы команды, которые заставят двигатель и трансмиссию изменить состояние передачи с нейтральной на первую, и так далее.
Достаточно хорошее знакомство с концепцией переходов состояний поможет непрограммистам разобраться с по-настоящему
трудными задачами, лежащими при проектировании децентрализованных систем. Следующие несколько разделов этой главы
содержат экспресс-курс.
Как работают внутренности EVM
Если это ваше первое знакомство с внутренними компонентами компьютера, важно помнить, что компьютер никогда понастоящему не находится в состоянии покоя, пока он включен. Сам по себе компьютер выполняет функцию состояния,
непрерывно проверяя изменения своего состояния. Это похоже на старательного студента, который задумывается тысячи раз в
секунду, если какая-либо новая работа ложится ему на стол.
Когда вызываются новые инструкции, компьютер запускает код и может записывать новые данные в свою память. Важно
отметить, что каждое изменение состояния должно основываться на последнем изменении состояния; компьютер не может
вбрасывать информацию в адреса памяти как попало.
Если что-то пойдет не так – допустим, одна из этих инструкций не является возможной с математической точки зрения –
состояние машины станет недопустимым, и программа закроется или остановится. Фактически, вся система может упасть.
Программы, которые постоянно проверяют определенные условия, в программировании называются циклами, поскольку они
продолжают работать (циклировать) до тех пор, пока не будет встречено указанное условие. EVM работает в непрерывном цикле,
который пытается исполнить любые инструкции, содержащиеся в текущем счетчике команд (любую программу, готовую для
обработки). Счетчик команд работает как очередь в закусочной: каждая программа встает в очередь и ждет свой черед.
У этого цикла несколько задач: он вычисляет стоимость газа для каждой инструкции; при необходимости использует память для
исполнения транзакции, если вычисление преамбулы проходит успешно. Этот цикл повторяется до тех пор, пока виртуальная
машина не завершит выполнение всего готового к запуску кода, либо не выдаст исключение или ошибку, и откажется от этой
транзакции.
К этому моменту мы легко прошли через столетие науки о вычислениях, чтобы добраться до EVM. Теперь мы начнем замедляться
и посмотрим, как некоторые ее компоненты работают на практике.
EVM постоянно проверяет наличие транзакций
Машины состояний (машины с памятью) можно рассматривать как существ, которые никогда не спят. Будучи машиной состояний,
EVM хранит непрерывную историю всех транзакций внутри своей памяти, вплоть до самой первой транзакции. В отличие от
людей, которым приходиться иметь дело с несовершенной памятью, состояние компьютера (в сегодняшнем виде) является
конкретным конечным результатом каждого отдельного изменения состояния, которые произошли внутри этой машины с
момента ее первого включения.
Последнюю версию состояния машины можно назвать канонической “правдой” этой машины о реальности к настоящему
моменту. В Ethereum эта правда касается балансов аккаунтов и серий транзакций, которые делают ваш баланс таким, каким он
является сегодня.
Создание общей машины, повествующей о том, что произошло
Транзакции, в силу вышесказанного, представляют собой некое подобие машинного повествования, хронику – допустимый в
вычислительном отношении переход от одного состояния к другому. Как говорит Гевин Вуд в “Yellow Paper”:

Существует гораздо больше недопустимых изменений состояния, чем допустимых. Недопустимое изменение состояния – это,

например, уменьшение баланса аккаунта без равнопротивоположного увеличения другого баланса. Допустимое изменение
состояния – это такое состояние, которое происходит посредством транзакции.
С течением времени система (как в Биткойн) стремится создавать достоверную историю для обеспечения того, чтобы каждое
последующее изменение состояния было легитимным, и чтобы злоумышленник не мог вставить ни одной своей инструкции.
Криптографическое хеширование
Следующий раздел объясняет, что из себя представляют блоки: что в них хранится, как они работают, и как они создают цепочку.
Чтобы правильно понять этот материал, вам сначала нужно узнать о криптографических алгоритмах хеширования и чем они
полезны.
Что делают хеш-функции (или алгоритмы хеширования)
В общих словах, назначение хеш-функций, в контексте блокчейна, заключается в том, чтобы быстро сравнивать большие массивы
данных и оценивать схожесть их содержимого. Односторонний алгоритм преобразует транзакции полного блока в 32 байта
данных – хеш или строку из букв и цифр, которая не содержит в себе распознаваемой информации о транзакциях. Хеш создает
безошибочную сигнатуру для блока, позволяя строить следующий блок поверх него. В отличие от зашифрованного текста,
получаемого посредством шифрования, и который можно расшифровать, результат хеширования не может быть “расхеширован”.
Примечание
Хеш заданного массива данных всегда один и тот же. В вычислительном отношении невозможна ситуация, когда два различных
массива данных имели бы одинаковый хеш. Изменение даже одного символа в массиве данных полностью изменит хеш.
Блоки: история изменения состояний
Транзакции и изменения состояний сети Ethereum сегментируются на блоки, а затем хешируются. Каждый блок подтверждается и
проверяется до того, как следующий канонический блок может быть помещен “поверх” него. Таким образом, узлам в сети не
нужно индивидуально оценивать достоверность каждого отдельного блока в истории сети Ethereum, чтобы просто вычислить
текущие балансы аккаунтов в сети. Они лишь проверяют, что их “родительский блок” является последним каноническим блоком.
Они делают это быстро, проверяя, что новый блок содержит правильный хеш транзакций и состояний своего “родителя”.
Все блоки, связанные воедино, включая первичный блок (“genesis block” – почетное название первого блока, добытого сетью
после выхода в онлайн), называются блокчейном. В некоторых кругах вы услышите, что блокчейн называют распределенным
реестром или технологией распределенного реестра (DLT).
Реестр – это точная формулировка, поскольку цепочка содержит каждую транзакцию в истории сети, что делает ее по сути
гигантской бухгалтерской балансовой книгой. Однако большая часть так называемых цифровых реестров не используют
доказательство выполнения работы (“Proof-of-work”) для защиты сети, как это делают Биткойн и Ethereum.
Суть времени блоков
В Биткойн один блок равен 10 минутам. Это так называемое время блока выводится из констант, жестко закодированных в схему
выпуска Биткойн, в общей сложности 21 миллион монет будут выпущены с 2009 по 2024 год, а вознаграждение за майнинг
уменьшается вдвое каждые четыре года.
В Ethereum время нахождения блоков не является функцией графика выпуска эфира. Вместо этого, время блоков является
переменной, которая поддерживается на максимально низком возможном уровне ради скорости подтверждения транзакций.
На момент написания этих строк она составляет в среднем порядка 15 секунд. Более короткое время блоков в Ethereum стало
возможным благодаря исследованию технологии блокчейн после запуска Биткойн, которое показало, что меньшее время
нахождения блоков не только технически достижимо, но и целесообразно во многих отношениях. Как бы то ни было, более
короткое время блоков имеет ряд недостатков, которые более подробно рассматриваются в Главе 6.

Недостатки коротких блоков
Важно отметить, что большое время подтверждения блоков в Биткойн затрудняет розничную торговлю и другие практические
применения. Когда блоки короче, а транзакции движутся быстрее, опыт пользователя становится лучше. Однако более короткие
блоки и более быстрые транзакции повышают вероятность того, что отдельно взятый узел получит неправильную
последовательность транзакций, поскольку он может не узнать о некоторых транзакциях, которые идут издалека (или узнает о них
позже).
Чтобы компенсировать это, майнерам, которые находят валидные, но не “выигрывающие” блоки, выплачивается неполное
вознаграждение в качестве утешения. В Ethereum подобные блоки называются “дядями” (“Uncles”).
Что делает блок валидным, а что делает его “выигрывающим”, является темой Главы 6.
Чтобы посмотреть на полный протокол блоков Ethereum, посетите страницу.
А теперь, давайте продолжим наш обзор EVM.
Блокчейн из “соло-узлов”
Теоретически вы можете согласовывать изменения от множества узлов с помощью одного компьютера: централизованный
сервер, обрабатывающий последовательность транзакций. Действительно, веб-приложения, такие как Google Docs, имеют
сложные, работающие в реальном масштабе времени механизмы, которые помогают им справляться с конфликтующими
изменениями, сделанными разными пользователями, некоторые из которых могут иметь более скоростные соединения, чем
другие, а некоторые могут редактировать документ офлайн.
Как вы узнаете из Главы 9, когда вы разворачиваете собственный блокчейн, возможно использовать протокол Ethereum с
помощью одной машины. Она будет вполне нормально обрабатывать ваши транзакции, если один или несколько узлов будут
майнить в цепочке. Но если кто-либо отключит данную машину, ваша цепочка перестанет быть доступной, а транзакции
остановятся.
Именно поэтому, несмотря на то, что Ethereum является свободным и опенсорсным программным обеспечением, потребность в
наличии многих, многих узлов для создания устойчивой сети является причиной, по которой разработчики движутся и работают в
одном направлении (по большей части) как единое сообщество над небольшим количеством публичных цепочек.
Распределенная защита
Распределенный характер виртуальной машины Ethereum и тот факт, что она состоит из множества узлов по всему миру, означает,
что она должна разрабатываться под определенные цели для решения проблемы разности соответствий, которая может
возникнуть, когда происходит множество практически одновременных изменений одной и той же базы данных от многих
пользователей со всего мира.
Действительно, решение этой проблемы доказуемым и заслуживающим доверия образом является предназначением EVM, как и
виртуальной машины Биткойн. Устойчивость и безопасность EVM достигаются большим количеством машин, добывающих блоки
в сети, стимулом для которых является зарабатывание вознаграждения, номинированного в эфире или биткойнах. Мы быстро
пройдемся по этой теме перед тем, как углубиться в полное разъяснение в Главе 6.
Роль майнинга в функции перехода состояний
Майнинг – это процесс использования вычислительной работы для объявления блока – который является майнерской версией
последней истории транзакций – каноническим блоком для самого последнего блока в цепочке. Как именно это происходит, мы
рассматриваем в Главе 6, но мы подняли эту тему сейчас, чтобы показать, что поощряющее вознаграждение за майнинг
происходит в рамках функции перехода состояний. Благодаря майнингу достигается консенсус, необходимый для того, чтобы
выполнять правильные изменения состояний, и майнерам выплачивается награда за вклад в его достижение. Именно так
“создаются” эфир и биткойн.
Напомним, что каждый раз, когда создается новый блок, он загружается, обрабатывается и проверяется узлом в сети. Во
время обработки каждый узел исполняет все транзакции, содержащиеся в блоке. Это длительный процесс со множеством


шагов, но мы изложим их в кратком виде. Функция перехода состояний в Ethereum может быть определена как
нижеследующие 6 шагов
.
Для каждой транзакции в блоке EVM выполняет следующее:
1
Проверка транзакции на соответствие установленному формату. Имеет ли она правильный набор значений? Является ли
сигнатура валидной? Соответствует ли значение nonce (счетчик транзакций) в транзакции значению nonce в аккаунте?
Если чего-либо из этого не хватает – возвращается ошибка.
2
Расчет комиссии за транзакцию путем умножения требуемого объема работы (обозначается как STARTGAS, как вы узнаете
из таблицы 3-1) на цену газа. Затем с баланса аккаунта пользователя вычитается комиссия и увеличивается значение
nonce отправителя (счетчик транзакций). Если в аккаунте недостаточно эфира, возвращается ошибка.
3
Инициализация платежа за газ; с этого момента вычитается определенное количество газа за каждый обработанный байт
в транзакции.
4
Передача суммы транзакции – отправляемой суммы – на принимающий аккаунт. Если принимающий аккаунт еще не
существует, он будет создан. (Офлайн-узлы Ethereum могут генерировать адреса, поэтому сеть может не знать об
указанном адресе до тех пор, пока транзакция не состоится).
Если принимающий адрес является адресом контракта, запускается код этого контракта. Это продолжается до тех пор, пока код не
завершит исполнение или не закончится платеж за газ.
5
Если у отправляющего аккаунта недостаточно эфира для завершения транзакции, или закончился газ, все изменения из
этой транзакции откатываются назад. В качестве предупреждения – комиссионные отчисления, которые по-прежнему
отправляются майнеру и не возмещаются.
6
Если транзакция выдает ошибку по любой другой причине, газ возмещается отправителю, а любые комиссии, связанные с
использованным газом, отправляются майнеру.
Примечание
Данные из смарт-контракта исполняются на 4-ом шаге функции перехода состояний, как описано выше.
Таблица 3-1.
Стоимость типовых операций EVM.
Имя операции
Описание
Расход газа
step
1
Сумма по умолчанию за цикл
исполнения
stop
0
Бесплатно
suicide
0
Бесплатно
sha3
20
Хеш-функция SHA-3
sload
20
Берет из постоянного хранилища
sstore
100
Помещает в постоянное хранилище
balance
20
Запрос баланса аккаунта

create
100
Создание контракта
call
20
Инициализация read-only вызова
memory
1
Каждое дополнительное слово при
расширении памяти
txdata
5
Каждый байт данных или кода для
транзакции
transaction
500
Базовая плата за транзакцию
contract creation
53,000
Изменено в Homestead с 21000
Аренда времени в EVM
Как вы, наверное, уже поняли, EVM – довольно продуманная машина, гораздо более надежная и заслуживающая доверия, чем
любая другая имеющаяся сеть в наши дни. Для каждой инструкции, которую исполняет EVM, должна быть предусмотрена
стоимость, чтобы гарантировать, что система не зависнет из-за бесполезных спамовых контрактов.
Каждый раз, когда исполняется инструкция, внутренний счетчик отслеживает комиссии, которые взимаются с пользователя.
Всякий раз, когда пользователь инициирует транзакцию, его кошелек резервирует небольшую часть средств (выбранную
пользователем) для оплаты этих комиссий.
После того, как транзакция транслируется в сеть с определенного узла – скажем, Боб посылает Алисе немного эфира со своего
компьютера – сеть распространяет транзакцию повсеместно, так чтобы все узлы смогли включить ее в последний блок.
Верите или нет, но данное объяснение все еще представляет собой лишь поверхностный взгляд на внутреннее устройство EVM.
Вы узнаете больше в Главах 5 и 6. А сейчас будет полезно разобраться с тем, что такое комиссии, какова их роль в исполнении
транзакций, и каково их влияние на паттерны в разработке.
Привет, газ!
Газ – это единица работы, используемая для измерения того, насколько дорогостоящей в вычислительном отношении будет
операция в Ethereum. Расходы на газ оплачиваются небольшими суммами эфира.
У газа двойное предназначение. Во-первых, он гарантирует предоплаченное вознаграждение для майнеров, которые исполняют
код и защищают сеть, даже если исполнение по какой-либо причине потерпит неудачу. Во-вторых, он позволяет обойти проблему
остановки (прим. переводчика: по Тьюрингу) и обеспечивает, чтобы исполнение кода не могло продолжаться дольше
предоплаченного для него времени.
Газ – это единица работы; это не субвалюта, и вы не можете хранить или накапливать его. Он просто измеряет, как много усилий
необходимо приложить для выполнения каждого шага транзакции в вычислительном отношении.
Чтобы иметь возможность оплачивать расходы на газ, вам просто нужно добавить эфир в свой аккаунт. Вам не нужно
приобретать его отдельно; не существует токена для газа. К любой операции, возможной для выполнения в EVM, привязан
определенный расход газа.
Примечание

Суммарное количество использованного газа, умноженное на цену газа, дает сумму комиссии, начисленную по отдельно взятой
транзакции.
Почему газ так важен?
Расходы на газ гарантируют, что время вычисления в сети будет соответствующим образом оценено. Это работает по-другому в
Биткойн, где комиссия основана на размере транзакции в килобайтах. Поскольку код Solidity может быть произвольно сложным,
короткий фрагмент инструкций может генерировать большое количество вычислительной работы, тогда как длинный фрагмент
может генерировать меньше работы. Вот почему комиссии в EVM основаны на объеме выполняемой работы, а не на размере
транзакции.
Почему газ не оценивается в эфире?
Поскольку эфир торгуется публично на криптовалютных биржах, он подвержен спекулятивным периодам инфляции и дефляции.
Использование единицы газа для вычислительной работы целесообразно, потому что это отделяет цену вычислений от
высоковолатильной цены токена эфира.
Комиссия как мера регулирования
Как вы узнаете из Главы 7, такие сети, как Биткойн и Ethereum, используют экономические стимулы и антистимулы для того, чтобы
делать определенные атаки на сеть нецелесообразными. Комиссии относятся к категории сдерживающих факторов.
Начнем с того, что важно признать, что работа узла Ethereum представляет определенный риск. Есть стоимость аппаратного
обеспечения, плюс время и затраты на электроэнергию оператора ноды, и со стороны сети есть стоимость загрузки и
подтверждения доказательства выполненной работы и заголовка блока. Поэтому имеет смысл взимать плату за транзакцию с
целью предотвращения расходования производительности сети хулиганами.
Блоки, которые потребляют избыточное количество газа, представляют большую опасность для Ethereum. Их распространение по
сети может занять много времени вследствие их огромного размера. Как система адаптируется к запросам пользователей, у
которых могут иметься легитимные основания на использование крупных смарт-контрактов, станет понятно позже в этой главе, а
также в Главе 6. Протокол помогает сокращать последние блоки при помощи различных методов, которые мы рассмотрим в Главе
6, и выставляет плавающее ограничение на операции, которое на текущий момент устанавливает 65536 операций за один блок.
Работа с газом
В этом разделе вы изучите детали работы с газом, а затем узнаете, как газ связан с масштабированием системы.
Особенности газа
Давайте рассмотрим некоторые детали работы с газом:
К сожалению, термин “газ” создает некоторую путаницу. Для каждой транзакции требуется значение STARTGAS. Это
значение упоминается как gasLimit в “Yellow Paper” и часто просто как gas в Geth и Webjs
Каждая транзакция также требует от пользователя указания цены газа.
Сумма, заданная в STARTGAS, умноженная на цену газа, депонируется на время исполнения вашей транзакции.
Если цена газа, которую вы предлагаете за транзакцию, слишком низкая, узлы не будут обрабатывать транзакцию, и она
будет оставаться в сети невыполненной.
Если ваша цена газа приемлема для сети, но расходы на газ выходят за пределы доступных средств на балансе вашего
кошелька, то транзакция не будет исполнена и откатится назад; эта неудавшаяся транзакция записывается в блокчейн, и
вы получаете возмещение за весь STARTGAS, не использованный в транзакции.
Использование чрезмерного STARTGAS не приводит к более быстрой обработке ваших транзакций, а в некоторых случаях
может сделать ее менее привлекательной для майнеров.
Как газ связан с масштабируемостью системы

Если вы отправляете вычислительно сложный набор инструкций в EVM, единственным человеком, по которому это ударит, будете
вы. Работа потратит ваш эфир и остановится, когда закончится эфир, выделенный вами для транзакции. Это не окажет никакого
влияния на чужие транзакции. Невозможно затруднить работу EVM, не заплатив для этого очень много в форме комиссий за
транзакции.
Масштабирование де-факто осуществляется при помощи системы комиссионных отчислений в виде газа. Майнеры могут
свободно выбирать транзакции, за которые выплачиваются самые высокие комиссионные вознаграждения, а также могут
коллективно выбирать лимиты газа в блоке. Лимит газа определяет, сколько может быть выполнено вычислений (и сколько
памяти может быть выделено) в одном блоке.
Благодаря этому цена вычислений в EVM остается гибкой и легко реагирующей на потребности пользователей системы, а также
на расходы майнеров, которые выполняют важную работу по обработке транзакций, обслуживанию оборудования и оплате счетов
за электроэнергию.
Аккаунты, транзакции и сообщения
Напомним из Главы 2, что в Ethereum есть два типа аккаунтов:
Внешние аккаунты
Аккаунты контрактов
Давайте более пристально взглянем на то, каковы возможности этих двух типов аккаунтов.
Внешние аккаунты
Внешний аккаунт (EOA) также известен как аккаунт, контролируемый при помощи пары закрытых ключей, которые могут
храниться человеком или на внешнем сервере. Эти аккаунты не могут содержать код EVM. Характеристики EOA включают:
Содержит баланс эфира
Способен отправлять транзакции
Контролируется с помощью закрытых ключей аккаунта
Не связан ни с каким кодом
База данных ключ/значение, содержащаяся в каждом аккаунте, где ключи и значения являются 32-байтными строками
Аккаунты контрактов
Аккаунты контрактов не контролируются людьми. Они хранят инструкции и активируются внешними аккаунтами или другими
аккаунтами контрактов. Аккаунты контрактов обладают следующими характеристиками:
Содержат баланс эфира
Хранят определенный код контракта в памяти
Могут быть приведены в действие людьми (отправляющими транзакцию) или другими контрактами, отправляющими
сообщение
При исполнении могут выполнять сложные операции
Имеют свое собственное постоянное состояние и могут вызывать другие контракты
Не имеют владельца после включения в EVM
База данных ключ/значение, содержащаяся в каждом аккаунте, где ключи и значения являются 32-байтными строками
Транзакции и сообщения

Транзакции исходят от внешних аккаунтов, которые обычно контролируются людьми. Это способ для внешнего аккаунта
отправлять инструкции в EVM для выполнения какой-либо операции. Другими словами, это способ для внешнего аккаунта
поместить сообщение в систему. В компьютерной терминологии сообщение представляет собой фрагмент данных, содержащий
инструкции. Для программистов сообщения – это вызовы функций.
Транзакция в EVM представляет собой криптографически подписанный пакет данных, хранящий сообщение (как описано ранее), в
котором содержится указание для EVM, что нужно сделать – отправить эфир, создать новый контракт, запустить существующий
контракт или выполнить определенные вычисления. Адреса контрактов могут быть получателями транзакций, как и пользователи
с внешними аккаунтами. Вспомните обсуждение криптографически защищенной связи в Главе 2, когда мы говорили о
зашифрованных коммуникациях: транзакция похожа на приватный обмен данными между двумя пользователями в
незащищенной сети, которые, тем не менее, могут “отправлять” ценность (токены) друг другу.
Характеристики транзакций
Транзакции обладают следующими характеристиками:
Адрес получателя; если не указать адрес получателя (и прикрепить данные смарт-контракта) – это метод для загрузки
новых смарт-контрактов. Как вы узнаете, будет возвращен адрес контракта, чтобы пользователь знал, как получить доступ
к этому контракту в будущем.
Подпись, идентифицирующая отправителя
Поле значения, показывающее отправляемую сумму
Опциональное поле данных для сообщения (если транзакция отправляется на адрес контракта)
Значение STARTGAS,
указывающее максимальное количество шагов вычислений, которые предоплачены
Значение GASPRICE, представляющее плату, которую отправитель готов заплатить за газ.
Характеристики сообщений
Сообщение представляет собой фрагмент данных, отправляемый одним контрактом другому контракту (никогда для или от
человека). Сообщения – это виртуальные объекты, которые никогда не будут сериализованы и существуют только в EVM. Когда
майнер получает вознаграждение в сети Ethereum, это реализуется с помощью сообщения, увеличивающего баланс адреса для
получения платежей майнера; это не представляет собой транзакцию.
Сообщение отправляется, когда контракт запускается виртуальной машиной EVM, и это приводит к исполнению операционные
коды CALL и DELEGATECALL. Вы узнаете об операционных кодах в следующем разделе этой главы.
Примечание
Поскольку сеть Ethereum не подключена к HTTP-сети, она не использует HTTP-методы. Вместо этого она использует коды
операций, которые традиционно используются для передачи сообщений внутри одного локального хоста. Вот что имеется ввиду
под характеристиками, включающими такую формулировку, как “единая глобальная машина”. Биткойн работает аналогичным
образом.
Сообщения отправляются на адреса других контрактов, которые в свою очередь запускают код, заключенный в сообщении. Таким
образом, контракты могут взаимодействовать друг с другом.
Сообщение содержит следующие характеристики:
Адрес отправителя сообщения
Адрес получателя сообщения
Поле значения (указывается, сколько эфира отправляется, если вообще отправляется)
Опциональное поле данных (содержащее входные данные для контракта)
Значение STARTGAS, ограничивающее количество газа, которое может использовать сообщение

Оценка комиссионных отчислений в виде газа для операций
Транзакции должны обеспечивать достаточное количество STARTGAS для покрытия всех вычислений и хранения. Однако, в EVM
много операций, трудно запомнить, сколько стоит каждая из них.
В таблице 3-1 показаны затраты на некоторые типовые операции EVM.
Актуальная таблица Google Docs, содержащая стоимость различных операций EVM может быть найдена по адресу.
Операционные коды в EVM
Как вы узнаете, некоторые из этих операций можно назвать методами. Одна из самых запутанных вещей в парадигме блокчейна
заключается в том, что она объединяет технические соглашения из нескольких областей науки о вычислениях и сетях. Одним из
примеров является использование операционных кодов в Ethereum (и Биткойн). В таблице 3-2 показаны все коды операций,
доступные для EVM, и соответствующие им функции.
Таблица 3-2.
Это полный список операционных кодов EVM.
0s: Остановка и арифметические
операции
0x00
0x00
Остановить исполнение
0x01
ADD
Операция сложения
0x02
MUL
Операция умножения
0x03
SUB
Операция вычитания
0x04
DIV
Операция целочисленного деления
0x05
SDIV
Целое число со знаком
0x06
MOD
Остаток при целочисленном делении
0x07
SMOD
0x08
ADDMOD
Остаток при целочисленном делении
0x09
MULMOD
Остаток при целочисленном делении
0x0a
EXP
Операция возведения в степень
0x0b
SIGNEXTEND
Расширение длины с дополнением до
Остаток при целочисленном делении со
знаком

двух (число со знаком в
дополнительном коде)
10s: Сравнение и побитовые
логические операции
0x10
LT
Сравнение “меньше, чем”
0x11
GT
Сравнение “больше, чем”
0x12
SLT
Сравнение “меньше, чем” со знаком
0x13
SGT
Сравнение “больше, чем” со знаком
0x14
EQ
Сравнение на равенство
0x15
ISZERO
Простой NOT оператор
0x16
AND
Побитовая операция AND
0x17
OR
Побитовая операция OR
0x18
XOR
Побитовая операция XOR
0x19
NOT
Побитовая операция NOT
0x1a
BYTE
Возвращение одного байта из слова
SHA3
Вычисление хеша Keccak-256
ADDRESS
Получение адреса
20s: SHA3
0x20
30s: Информация о сети
0x30
текущего исполняемого аккаунта
0x31
BALANCE
0x32
ORIGIN
Получение баланса заданного аккаунта
Получить адрес отправителя
транзакции
Получить адрес отправителя вызова.
0x33
CALLER
Это адрес аккаунта, напрямую
отвечающего за данное исполнение
(прим. переводчика: за исключением
delegatecall)
Получить депонируемое значение (wei)
текущей инструкции/транзакции,
отвечающей за данное исполнение
0x34
CALLVALUE
(прим. переводчика: wei, отправляемые
вместе с текущим вызовом)
Получить входные данные текущей
0x35
CALLDATALOAD
0x36
CALLDATASIZE
текущей среде (прим. переводчика:
размер данных вызова в байтах)
0x37
CALLDATACOPY
Копировать входные данные текущей
среды
Получить размер входных данных в

среды в память. Относится к входным
данным, передаваемым посредством
команды вызова сообщения или
транзакции
Получить размер кода, работающего в
0x38
CODESIZE
0x39
CODECOPY
0x3a
GASPRICE
Получить цену газа в текущей среде
0x3b
EXTCODESIZE
Получить размер кода аккаунта
0x3c
EXTCODECOPY
Копировать код аккаунта в память
текущей среде
Копировать код, работающий в текущей
среде, в память
40s: Информация о блоке
Получить хеш одного из 256 последних
0x40
BLOCKHASH
0x41
COINBASE
0x42
TIMESTAMP
Получить временную метку блока
0x43
NUMBER
Получить номер блока
0x44
DIFFICULTY
Получить сложность блока
0x45
GASLIMIT
Получить лимит газа для блока
0x50
POP
Удалить элемент из стека
0x51
MLOAD
Загрузить слово из памяти
0x52
MSTORE
Сохранить слово в память
0x53
MSTORE8
Сохранить байт в память
0x54
SLOAD
Загрузить слово из хранилища
0x55
SSTORE
Сохранить слово в хранилище
0x56
JUMP
Изменение счетчика команд
0x57
JUMPI
Условное изменение счетчика команд
0x58
PC
0x59
MSIZE
0x5a
GAS
0x5b
JUMPDEST
завершенных блоков
Получить адрес майнера, завершившего
блок
50s: Стек, память, хранилище и
операции потока
Получение значения счетчика команд
до инкрементирования
Получить размер активной памяти в
байтах
Получить количество доступного газа,
включая соответствующее понижение
Отметить валидный пункт назначения
для прыжков
60s and 70s: Push-операции
0x60
PUSH1
Разместить 1-байтовый элемент в стеке
0x61
PUSH2
Разместить 2-байтовый элемент в стеке
Разместить
0x7f
PUSH32
32-байтовый (машинное слово) элемент
в стеке
80s: Операции дублирования
0x80
DUP1
Дублирование первого элемента стека
0x81
DUP2
Дублирование второго элемента стека
0x8f
DUP16
Дублирование шестнадцатого элемента
стека
90s: Операции обмена
0x90
SWAP1
0x91
SWAP2
0x9f
SWAP16
Заменить первый и второй элемент
стека
Заменить первый и третий элемент
стека
Заменить первый и семнадцатый
элемент стека
a0s: Операции с логами
0xa0
LOG0
Добавить запись лога без тем
0xa1
LOG1
Добавить запись лога с одной темой
0xa4
LOG4
Добавить запись лога с 4 темами
f0s: Системные операции
Создать новый аккаунт со связанным
0xf0
CREATE
0xf1
CALL
Сообщение-вызов в аккаунт
0xf2
CALLCODE
Сообщение-вызов в данный аккаунт с
кодом альтернативного аккаунта
0xf3
RETURN
кодом
Прекратить исполнение, вернуть
выходные данные
Сообщение-вызов в данный аккаунт с
0xf4
DELETECALL
кодом альтернативного аккаунта, но
сохраняя текущие значения для
отправителя и значения.

Прекратить исполнение; пометить для
удаления
Прекратить исполнение и
0xff
SUICIDE
зарегистрировать аккаунт для
последующего удаления
В традиционной веб-разработке примерным эквивалентом операционного кода будет операция по протоколу HTTP, также
известная как метод доступа по протоколу HTTP. К ним относятся GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE и CONNECT.
Эти методы надежны и хорошо известны.
В Ethereum и Биткойн все работает иначе. Поскольку сеть также является и глобальной машиной, “методы”, которые вы
используете для совершения вызовов по сети, – это лишь машинный код, типа того, что используется внутри отдельного
компьютера.
Итоги Главы 3
Эта глава составила более полное представление о EVM как о базе данных, и как вносятся изменения в ее состояние. Хотя
обоснование архитектуры должно быть для вас теперь более понятным, многое еще предстоит обсудить. Если вы хотить
прочитать дополнительную документацию о том, как EVM исполняет программы, вы найдете список ресурсов по адресу.
Также про тему EVM можно почитать дополнительно на Habr.
Далее необходимо разобраться в вопросе: что значит запускать программы в EVM? Ответ заключается в написании и
развертывании работающих согласованно смарт-контрактов для создания распределенных приложений.
Как мы упоминали в этой главе, каждый контракт имеет свой собственный адрес с хранилищем, где он может хранить любой
произвольный код. Когда транзакция попадает по этому адресу, или контракт вызывается другим контрактом, его код оживает
внутри каждого узла EVM, что приводит к дальнейшим передачам сообщений или транзакциям эфира.
Инструкции, составляющие смарт-контракты, хранятся в байт-коде EVM. Но до того, как они компилируются в байт-код, они
пишутся человеком на языке программирования Solidity. Этот язык является предметом следующей главы.
Примечания к Главе 3
1
Forbes, “Central Banks Explore Blockchains: Why Digital Dollars, Pounds Or Yuan Could Be A Reality In 5 Years,”
www.forbes.com/sites/laurashin/2016/10/12/central-banks-explore-blockchains-why-digital-dolla rs-pounds-or-yuan-could-be-areality-in-5-years/#5ef54e7176d8, 2016.
2
Wikipedia, “Grace Hopper,” https://en.wikipedia.org/wiki/Grace_Hopper, 2016.
3
Gavwood.com, “Ethereum: A Secure Decentralised Generalised Transaction Ledger”, http://gavwood.com/paper.pdf, 2016.
4
Bitcoin Wiki, “Controlled Supply,” https://en.bitcoin.it/wiki/Controlled_supply, 2016.
5
Google Code, “Diff-Match Patch,” https://code.google.com/p/google-diff-match-patch/, 2016.
6
Ethereum White Paper, “Ethereum State Transition Function,” https://github.com/ethereum/wiki/wiki/White-Paper#ethereum-statetransition-function, 2016.
7
GitHub, “Ethereum White Paper,” https://github.com/ethereum/wiki/wiki/White-Paper, 2016.
8
ConsenSys Media, “Ethereum, Gas, Fuel and Fees,” https://media.consensys.net/ethereum-gas-fuel-and-fees3333e17fe1dc#.ozbhydyz6, 2016.

Создание децентрализованных приложений на блокчейн
Помощь в программировании искусственного интеллекта
Глава 4. Программирование на Solidity
06.04.2018
Рубрика: Введение в Ethereum и Solidity
Автор: adminCraft
Содержание страницы
1 Глава 4
2 Для начинающих
3 Воплощение глобальной банковской системы (но это не точно)
4 Очень крупная инфраструктура
5 Общемировая валюта?
6 Дополнительная валюта
7 Перспективы Solidity
8 Браузерный компилятор
9 Изучение программирования EVM
10 Примечание
11 Примечание
12 Простое развертывание
13 Примечание
14 Кейс по написанию бизнес-логики на Solidity
15 Пиши, внедряй, расслабляйся
16 Обоснование архитектуры
17 Примечание
18 Написание циклов в Solidity
19 Выразительность и безопасность
20 Важность формальных доказательств
21 Историческое влияние общего глобального ресурса
22 Как злоумышленники разрушают сообщества
23 Гипотетическая атака, написанная на Solidity
24 Примечание
25 Автоматические доказательства идут на помощь?
26 Детерминизм на практике
27 Потери при преобразовании
28 Тестирование, тестирование, тестирование
29 Командная строка
30 Примечание
31 Форматирование Solidity-файлов
32 Советы по чтению кода
33 Операторы и выражения в Solidity
34 Что такое выражение?
35 Что такое оператор?
36 Публичные и приватные функции
37 Примечание
38 Типы значений
39 Логические значения
40 Целые числа со знаком и без
41 Адреса
42 Методы адресов
43 Ключевые слова, связанные с адресом
44 Примечание
45 Менее общие типы значений
46 Комплексные (ссылочные) типы
47 Глобальные специальные переменные, единицы и функции
48 Свойства блока и транзакции
49 Памятка по операторам
50 Глобальные функции
51 Исключения и наследование
52 Итоги Главы 4
53 Примечания к Главе 4
Глава 4
Solidity – это новый язык программирования, предназначенный для написания программ, называемых смарт-контрактами,
которые могут запускаться виртуальной машиной Ethereum (EVM). Этот новый язык представляет собой совокупность
соглашений из сетевых технологий, языка ассемблера и веб-разработки.
Представьте, что вы на пляже в другой стране. Вы приехали сюда неожиданно для себя и проскочили мимо пункта обмена
валюты в аэропорту, полагая, что сможете использовать свою кредитную или дебетовую карту во время поездки и что у
вас не будет потребности в наличных деньгах. В спешке вы забыли свои солнцезащитные очки. У продавца, идущего по
пляжу, есть очки, которые вам подходят. По факту, они лучше, чем те очки, которые вы заметили в зоне duty-free в
аэропорте. К несчастью, у него нет устройства для чтения кредитных карт – только телефон на Android – а у вас нет
местной валюты. Он дает вам небольшую визитную карточку с адресом электронной почты и номером телефона, на
случай, если вы захотите купить эти очки позже. На мгновение задумайтесь о подобном сценарии, и вы осознаете силу
основанной на протоколе цифровой валюты.
Почему вы можете отправить человеку текстовое сообщение или e-mail, или даже позвонить ему, но не можете отправить
ему деньги также просто?
Для начинающих
В предыдущей главе описывалось, как EVM изменяет состояние, а в этой главе вы узнаете, какие виды инструкций EVM
может обрабатывать для изменения состояний.
В общем смысле, вычислительная среда представляет собой бесконечный цикл, в котором раз за разом выполняется
какая-либо текущая операция согласно программному счетчику. (Перемещение по очереди в программном счетчике
производится при помощи операционного кода JUMP). Счетчик программы выполняет итерации одну за другой до тех пор,
пока не будет достигнуто завершение конкретной программы. Машина выходит из цикла исполнения только в том случае,
если она встречает (выдает) ошибку или получает инструкцию, в которой ей говорится остановиться (STOP) или вернуть
(RETURN) результат или значение.
Эти операции имеют доступ к трем типам областей хранения данных:
Стек – контейнер, в который могут быть добавлены или удалены значения (push или pop). Значения стека
определяются с помощью метода.
Динамическая память (реализуемая с помощью “heap” или “кучи”) – бесконечно расширяемый байтовый массив.
Она сбрасывается, когда программа завершается.
Хранилище ключей/значений для балансов аккаунтов, в случае с адресами контрактов – код на Solidity.
Контракты на Solidity также могут иметь доступ к определенным атрибутам входящего сообщения, таким как ценность,
отправитель и данные входящего сообщения, а также данные из заголовка блока.
Воплощение глобальной банковской системы (но это не точно)
У банков по всему миру есть компьютерные системы, которые, будучи модернизированными и по большей части
современными, являются потомками машин, которые предшествовали интернету и совершенно точно Всемирной паутине.
В итоге, они спроектированы как хранилища данных. Нет единой глобальной банковской сети, есть большое количество
взаимосвязанных национальных систем и частных банковских программных стеков, все они со своими собственными
особенностями.
Очень крупная инфраструктура
Система, такая как Ethereum, имеет узлы по всему миру, которыми управляют частные лица, они получают вознаграждение
за свою деятельность в виде комиссий за майнинг, выраженных в эфире. Мы рассмотрим, как это работает, в Главе 6.
Система очень децентрализована.
В результате, криптовалютные протоколы имеют возможность улучшить проведение финансовых транзакций до уровня
удобства, которым мы сегодня наслаждаемся, используя современные телекоммуникации. И все же, как
децентрализованная система одноранговых узлов запускает “программы”?
Общемировая валюта?
Как видите, идея об универсальной криптовалюте, похоже, основана на предположении, что каждый человек на Земле со
временем загрузит криптовалютный кошелек на свой мобильный телефон. Однако, реализация подобной утопической
мечты не предусмотрена дорожной картой Ethereum. Вместо этого разработчики ядра Ethereum решили упростить третьим
сторонам создание дополнительных валют или кастомных токенов, которые будут выпускаться под их брендом и
использоваться для особых целей (по аналогии с системой наград за использование кредитных карт).
Эти третьи стороны (будь то существующие корпорации, стартапы, муниципальные образования, университеты или
неправительственные организации) могли бы полагаться на публичную цепочку или крупные контролируемые цепочки,
чтобы продвигать множество различных видов токенов, почти так же, как глобальная банковская система способна
справиться с обработкой множества различных валют.
Маловероятно, что большинство людей впервые познакомятся с эфиром ради экспериментов с криптовалютами. Скорее
всего, они в конечном итоге будут иметь цифровые токены или баллы в рамках программы лояльности к бренду,
университетской программы или спонсируемой работодателем системы. Спортивные стадионы, тематические парки,
городские летние лагеря, торговые центры, крупные бизнес-центры – везде, где сообщество обменивает деньги,
дополнительная валюта может иметь смысл.
Дополнительная валюта
Зачем вообще стране могут быть нужны несколько видов денег? В течение десятилетий, ведущих к становлению
Федерального Резерва, сегодняшнего центрального банка США, в обороте было множество локальных валют. Эти
бумажные банкноты, как правило, были обеспечены депонированным где-либо золотом и в силу этого были локальными
по своей сути; сертификат на золото стоит мало, если учреждение, которое его выкупает, находится за тысячи километров.
В период, предшествовавший широкому распространению систем частных денег (период в истории США, известный как
эра “диких” банковских операций), многие типографии сделали своим основным источником дохода печатание денег с
различными антиконтрафактными особенностями, чтобы конкурировать с другими типографиями.
Бенджамин Франклин был владельцем одной из таких типографий, которые обогащались за счет печатания
дополнительных валют. В действительности, он был известен своими мерами по борьбе с подделками, выходящими за
рамки общепринятых. По данным Смитсоновского института, однажды он официально выпустил местную валюту
Пенсильвании с ошибкой в названии штата, в надежде ввести в заблуждение фальшивомонетчиков, которые считали, что
эти банкноты были подделками. Многие из векселей, напечатанных Франклином, содержали слова “To Counterfeit is Death”
(“Смерть за фальшивомонетничество”).
Понятие “дополнительная валюта” относится к средствам обращения, действующим наряду с национальной фиатной
валютой, удовлетворяющим потребности, с которыми не может справиться национальная валюта. Эти валюты обычно
имеют четыре цели:
Содействовать местному экономическому развитию в рамках небольшого сообщества
Создавать социальный капитал в этом сообществе
Способствовать более стабильному образу жизни
Для обеспечения потребностей, которые не могут решить обычные деньги
Программирование на Solidity позволяет любому человеку создавать дополнительную валюту с простым контрактом
токена. Эти токены могут обладать любыми параметрами, которые требуются исходя из ситуации, вы узнаете об этом,
когда мы будем разворачивать контракт токена в Главе 5.
Перспективы Solidity
Solidity – это высокоуровневый контрактно-ориентированный язык, схожий с JavaScript и языками C. Он позволяет вам
разрабатывать контракты и компилировать их в байт-код EVM. В настоящее время это флагманский язык для Ethereum.
Хотя это и самая популярная библиотека языка для работы с EVM, она не была первой и, вероятно, не будет последней.
В протоколе Ethereum есть четыре языка на одинаковом уровне абстракции, но сообщество постепенно начало склоняться
к Solidity, который потеснил Serpent (близкий к Python), LLL (Lisp-подобный язык) и Mutan (похожий на Go), последний из
которых признан устаревшим.
Изучение Solidity позволит вам перемещать токены ценности в любой системе на основе Ethereum. И поскольку Ethereum и
Solidity сами по себе являются свободными и опенсорсными, талантливые умы, вероятно, будут создавать аналоги и
релизить их, либо разворачивать их в частном порядке. Фактически несколько групп уже осуществили именно это; вы
узнаете об этих сторонних разработчиках и их подходах в Главе 11.
Вы можете найти официальную документацию Solidity по адресу.
Однако, и другие сайты также предоставляют полезные материалы по Solidity. Для удобства, вся самая популярная
документация по Solidity находится по ссылке.
Браузерный компилятор
Самый распространенный способ тестирования кода на Solidity – использование компилятора на базе браузера. Его можно
найти по адресу.
Для быстрого ознакомления вы также найдете его на странице.
Если вы добрались до этого раздела, то вам, возможно, уже интересно, как можно самостоятельно изучить Solidity.
Несмотря на то, что, конечно, легче начать программировать на Solidity, если вы уже знаете другой язык
программирования, но если вы не программист, это не должно вам помешать.
Изучение программирования EVM
Иногда легче выработать новую привычку, чем избавиться от старой. Многие архитектурные требования в разработке
децентрализованных приложений покажутся странными или своеобразными для действующих разработчиков веб- и
нативных приложений. Вдобавок, они могут уже иметь профессиональные или личные интересы в других языках или
предметных областях. Так что не думайте, что у всего мира есть фора по отношению к вам, если вы только приступаете к
изучению. Мир Ethereum еще только начинает развиваться.
Примечание
Ключевые термины программирования будут определяться по мере изучения, и многое вы почерпнете из контекста.
Попробуйте ознакомиться с книгой по JavaScript, предназначенной для начинающих, в которой имеются более глубокие
объяснения некоторых ключевых концепций из этой главы.
Начинающие программисты могут подступиться к Ethereum без каких-либо имеющихся допущений. Это даже лучше, они
обнаружат систему, которую они смогут (безусловно, через определенное время) понять от начала и до конца. Не все
хакеры, и даже инженеры программного обеспечения знают тонкости базовых сетей на уровнях ниже их провайдеров
хостинга приложений. В традиционных веб-приложениях у вас есть множество отдельных серверов с базами данных,
совместное использование и обмен данными по сети. Эти данные могут управляться приложениями, которые находятся на
разных серверах. Еще больше серверов могут быть в связке для балансировки в случае резких увеличения нагрузки.
Примечание
Сервер – это компьютер, который действует согласно отведенной ему роли, выступая в качестве составной части
определенного вида сервиса, который вы хотите предоставить людям через интернет. Некоторые сервера хранят данные
(подумайте об электронных таблицах информации, таких как имена и адреса клиентов) в так называемых базах данных.
Некоторые сервера запускают приложения, к которым другие компьютеры могут иметь доступ через сеть.
В Ethereum сеть является базой данных, и эта сеть может запускать приложения, доступные для всех ее участников. Вы, по
итогу, достаточно многое узнаете обо всех трех аспектах.
Наблюдение при помощи обозревателя блокчейна за новыми транзакциями – это нечто необыкновенное, когда вы знаете,
что там на деле происходит. Хотя изучение Ethereum может показаться очень трудоемким, гораздо больше работы
потребуется, чтобы изучить сегодняшний интернет также основательно и глубоко.
В следующих подразделах представлены другие причины, по которым вы должны начать экспериментировать с Solidity.
Простое развертывание
Не факт, что в Ethereum у вас будут возникать трудности с развертыванием и масштабированием обычного вебприложения. Все необходимые смарт-контракты для бэкенда распределенного приложения, также известного как dapp,
могут быть аккуратно упакованы в несколько документов и отправлены в EVM, и раз! – ваша программа становится
доступной в этот же момент любому человеку на Земле, у которого установлен кошелек Ethereum или узел c командной
строкой. Сегодня разработчики могут захотеть создать “гибридные” децентрализованные приложения Ethereum, которые
будут доступны через обычные веб-браузеры, и в этом случае реализация возможности проведения платежей в эфире
только прибавляет работы. Но к тому времени, когда работа над сетью будет завершена через 2-3 года, будет гораздо
проще хостить все компоненты приложения с использованием протокола Ethereum.
Примечание
В бизнес-сленге время разработки и вывода на рынок (TTV) – это количество времени, которое проходит с момента, когда
клиент запрашивает что-либо, до момента, когда он получает это. Это может быть чем-то осязаемым, материальным, а
может и не быть. Однако низкое время TTV предполагает, что продукт или сервис можно легко продумать, а также быстро
предоставить его людям, которые хотят его использовать.
В Ethereum можно быстро и недорого (хотя и не просто, пока еще) разрабатывать и разворачивать неизменяемые,
работающие без сбоев, нецензурируемые приложения, которые перемещают реальные ценности на произвольные
расстояния. И все это бесплатно, за исключением расходов на газ, генерируемых вашими программами, и расхода вашего
личного времени (и времени работы вашего компьютера). Для инженеров программного обеспечения, поставщиков услуг,
системных администраторов и менеджеров по продуктам долгосрочным последствием работы с экосистемой Ethereum
будет появление менее хрупких систем, более быстрый выпуск итераций продукта и гораздо меньшее время на развитие
инфраструктуры для поддержки новых приложений или сервисов. Короче говоря, это может привести к существенному
сокращению времени TTV для вендоров корпоративного программного обеспечения и групп штатных специалистов.
Кейс по написанию бизнес-логики на Solidity
Благодаря инновационным характеристикам, судьба Ethereum в 2017-м году и далее не обязательно будет зависеть от
мейнстримовой популярности или признания Ethereum сегодняшними клиентами. Напротив, он полагается на
популярность среди разработчиков, брендов, корпораций, организаций, правительств и других институтов, которые в
состоянии создать Ethereum-токен для своего сообщества, и, возможно, даже свой собственный брендированный кошелек.
Они могут сделать это в интересах быстрого и безопасного внедрения новых замечательных продуктов и сервисов с
ультранизкими накладными расходами. Это также относится к крупным маркетинговым кампаниям, которые должны
разворачиваться все быстрее и быстрее в современных условиях, чтобы не отставать от скорости культуры мемов в
интернете. Беспрепятственный характер проведения платежей в криптосетях позволяет как никогда ранее выстраивать
отлаженные продажи (со встроенными платежами) и маркетинговый опыт при работе с клиентами.
Дополнительная валюта также является очень ценным инструментом для использования в программах вознаграждений,
клубах по интересам и крупных розничных территориях. Клиенты, которые держат деньги в форме брендированной
монеты, склонны тратить на этот бренд более регулярно, также как постоянные авиапассажиры сегодня остаются
лояльными “милям в воздухе” и схемам бонусов по кредитным картам, которые предоставляют им лучшую выгоду.
Сегодня программы лояльности могут быть запутанными и даже слегка мошенническими. Но прозрачность основанной на
технологии блокчейн монеты лояльности сделает ее столь же хорошей, какой является любая другая форма
криптовалюты, в том смысле, что она сможет стать объектом для торговли на биржах или будет приниматься третьими
сторонами в качестве оплаты.
Пиши, внедряй, расслабляйся
Многие приложения, поддерживающие Ethereum, могут использоваться через кошелек Mist или другое Ethereum-нативное
приложение, у которого “под капотом” запущена нода. Для разработчиков клиентских приложений добавление
совместимости с новыми токенами на основе Ethereum тривиально, в том плане, что будет существовать высокий уровень
наложения и взаимосовместимости между кошельками Ethereum и токенами, так же как сегодня существует множество
IMAP- и POP-совместимых email-клиентов.
Также сегодня имеется возможность создания Ethereum-программы, которая будет доступна через обычный старый Веб,
для чего потребуется определенная доработка. Впрочем, развертывание будет становиться все более легким с
использованием новых сторонних фреймворков, примеры которых приведены в Главе 8.
Как бы то ни было, это не означает, что классические веб-приложения исчезнут. Многие люди и организации имеют
огромные ресурсы, вложенные в устаревшие веб-приложения. Как и говорилось, сеть Ethereum позволяет намного проще и
дешевле разворачивать и управлять широкомасштабными приложениями, как вы узнаете, что будет склонять все больше и
больше команд к рассмотрению возможности децентрализации своих приложений.
Обоснование архитектуры
Язык программирования Solidity имеет JavaScript-подобный синтаксис, но он был специально разработан для компиляции
в байт-код для виртуальной машины Ethereum. Как было отмечено в Главе 3, EVM запускает код, который полностью
детерминирован; одинаковые алгоритмы с одинаковыми входными данными всегда будут давать одинаковые результаты.
Это можно доказать математически, как вы узнаете позже в этой главе.
Solidity статически типизирован, поддерживает наследование, библиотеки и сложные пользовательские типы, помимо
прочих особенностей. Аккуратное использование типов может помочь программистам понять, как их программы будут
выполняться. Список типов данных в Solidity представлен в конце этой главы.
Примечание
Понятие “типы данных” говорит само за себя. Программист имеет возможность сообщить машине, какой тип данных
ожидать: для примера, будет ли это число или строка из букв? Языки программирования со слабой типизацией не требуют
от программиста быть конкретным; языки со строгой типизацией требуют.
Интересно, что в Solidity вы можете писать ассемблерные вставки. Если вы предпочитаете выполнять определенную
операцию, используя один из операционных кодов EVM, перечисленных в Главе 3, вы можете встраивать этот код в свои
контракты на Solidity. Просто напишите assembly {…} в своем коде вместо инструкции на Solidity.
Написание циклов в Solidity
Циклы служат основой для потока управления в программировании – другими словами, речь о кодификации if-this-then-that
(если это, тогда то) ситуаций или do-this-while-doing-that (делать это, пока делается то) параллелизмов. В большинстве
языков программирования циклы инициализируются одинаковым синтаксисом. Solidity придерживается всех тех же
синтаксических принципов, что и JavaScript, и C+, когда дело касается циклов.
Итератор цикла – это объект, который позволяет программисту перемещаться по контейнеру или списку. Иногда
итераторы используются для указания компьютеру выполнять одну и ту же операцию определенное количество раз, либо
применять ее к ряду элементов в коде.
Цикл общего назначения имеет схожий синтаксис в JavaScript, C и Solidity. Он инструктирует компьютер сосчитать от 0 до
10:
for (i=0; i<10; i++) {…}
Если вы внимательно изучили список операционных кодов в предыдущей главе, вы, возможно, заметили, что EVM
позволяет создавать циклы двумя способами. Вы можете писать циклы на Solidity или создавать их с помощью
инструкций JUMP и JUMPI. Это обеспечивает переход к определенному номеру шага в программном счетчике. Вспомним,
что счетчик программы отслеживает количество и порядок вычислительных шагов в заданной программе в процессе ее
выполнения в EVM.
Это всего лишь один из способов, с помощью которого Solidity и коды операций EVM могут вместе использоваться для
создания контракта, который будет по большей части выразительным и читабельным, а также дешевым для запуска.
Важно отметить то, что ввиду используемого способа расчета стоимости газа, применение операционных кодов может
упростить реализацию или удешевить исполнение определенного функционала, и это может быть особенно полезно при
написании вашей собственной библиотеки для языка.
Если вы никогда серьезно не работали с кодом ранее, и подобная концепция циклов трудна для понимания, не
переживайте; следующие разделы предоставят больше контекста.
Выразительность и безопасность
Прилагательное “выразительный” используется в науке о вычислениях для обозначения кода, который легко написать и
понять человеку. Выразительные языки – это мост между мыслительными паттернами человека и паттернами исполнения
машины. Быть выразительным для языка значит, что его различные конструкции должны быть интуитивно понятными, а
его шаблонный код (в частности, ключевые слова, специальные переменные и операционные коды) должен использовать
удобные для восприятия человеком слова, которые помогут программистам помнить, что они собой представляют.
Выразительные языки должны быть скомпилированы во что-то более удобное для машин, прежде чем их можно будет
запустить, и для этого требуется работа со стороны компьютера. В конечном счете, о выразительных языках как правило
труднее рассуждать (сложнее предсказать их поведение), в то время как более ограниченные, низкоуровневые и менее
абстрактные языки делают эти рассуждения проще.
Последний рубеж – это смарт-контракты, которые могут быть легко формально проверены, а также написаны на
выразительном языке высокого уровня, таком как Solidity. Эта проблема требует автоматизации и в действительности,
автоматическая формальная верификация сейчас уже находится на горизонте – факт, от которого специалисты в области
теории вычислительных систем должны быть в восторге, и от которого разработчики Ethereum сами того не желая
извлекут пользу.
Важность формальных доказательств
Если вы изучаете программирование на Solidity, вы можете столкнуться с любопытством других разработчиков, которые
перейдут сразу к делу: как вы предотвратите написание бесконечного цикла и заблокируете машину?
Это далеко не узкоспециализированный спор, это самый актуальный вопрос, связанный с ролью инженеров программного
обеспечения в современном мире: может ли человечество создать свободный, открытый для доступа виртуальный
компьютер, который другие люди не смогут саботировать? Если ответ будет “да”, то он резко противоречит теории трагедии
ресурсов общего пользования.
Историческое влияние общего глобального ресурса
В экономике трагедия ресурсов общего пользования – это идея о том, что общий ресурс не может существовать вечно. Со
временем пользователи, действующие в собственных интересах, истощают ресурс, поскольку им не приходится платить за
его использование. Подобный сценарий, в котором кто-либо может обогащаться или действовать расточительно при
экстернализации издержек на других людей, известен как риск недобросовестного поведения, моральный риск.
Вот пример: в Нью-Йорке в конце 2016-го года муниципальное правительство установило компьютерные терминалы на
улицы Нижнего Манхэттена. Эти терминалы предоставляли бесплатный Wi-Fi для проходящих пешеходов. Однако, эти
терминалы также поставлялись с небольшим сенсорным экраном, позволяющим пользоваться доступом в интернет.
Стоило только установить эти общие ресурсы, как проходящие мимо люди начали ставить стулья, смотреть YouTube или
порнографию, ковыряться в сети часами.
Администраторы программы были вынуждены быстро ограничить доступ к интернету через экран, и теперь терминалы
служат в основном как обычные точки доступа Wi-Fi.
Таким образом, идея о чрезвычайно дешевом, общедоступном компьютере, типа EVM, это не что иное, как фантастика. Он
может быть доступен для каждого, с любого компьютера, отовсюду, и он будет запускать программы в далеком будущем.
Никто не будет владеть им, и никто не сможет манипулировать им. Он даже сможет хранить ваши деньги.
Как злоумышленники разрушают сообщества
Децентрализованные экономики представляют собой зарождающуюся угрозу всем видам частных привилегированных
кругов по всему миру, особенно в развивающихся экономиках, где могущественные люди предпочли бы, чтобы мир
продолжил свое существование без решения трагедии ресурсов общего пользования (и таким образом, у власти бы
оставались новые диктаторы или сборище безумцев). Безопасность сети Ethereum является предметом Главы 7. Однако
средства защиты Ethereum находятся повсюду, даже непосредственно в языке программирования, поэтому следует
упомянуть о них.
Для этого обсуждения вы можете представить себе сеть как сообщество людей, общающихся друг с другом посредством
компьютеров. Атакующий – это человек, который ненавидит эту группу и стремится причинить ей вред любой ценой.
Гипотетическая атака, написанная на Solidity
Представьте, что атакующий хочет заблокировать EVM с помощью смарт-контракта, написанного на Solidity, который будет
потреблять крайне много памяти. Злоумышленник готов заплатить за газ, сколько бы он ни стоил. (Это реальный
сценарий, как вы узнаете из Главы 7). Имейте ввиду, что для целей из этого примера контракт также может быть написан
на любом языке, созданном для EVM, например, на Serpent или даже на низкоуровневом EVM-коде, а не только на Solidity.
Согласно теореме Райса, поведенческие свойства некоторых компьютерных программ математически неразрешимы, то
есть невозможно написать другую компьютерную программу, которая однозначно предскажет, будет ли код Solidity,
который вы ей покажете, когда-либо завершен.
Таким образом, невозможно написать сколько-нибудь эффективную контролирующую программу, которая будет
“прихлопывать” гипотетический, требующий много памяти смарт-контракт, написанный атакующим для данного сценария.
Примечание
Смарт-контракты отличаются от распределенных приложений (или dapps), хотя и те, и другие распределены и обладают
свойствами приложений. Dapp – это приложение с графическим пользовательским интерфейсом, которое использует
смарт-контракты Ethereum на бэкенде, а не обычную базу данных и хостинг-провайдера для веб-приложений. Доступ к
dapps можно получить через браузер Mist или через интернет.
EVM справляется с этим различными способами, включая жесткий лимит на количество вычислительных шагов на блок,
ее детерминированный язык и затраты на газ. Тем не менее, серые зоны всегда будут исследоваться злоумышленниками,
если будет существовать финансовый стимул, а при рыночной капитализации в 1 миллиард долларов имеется
значительный стимул взломать EVM и украсть эфир.
Хотя серые области нельзя было проработать изначально, их можно исправить серией форков протокола со временем. Что
касается непреднамеренно разрушительных программ, то задача сообщества Ethereum – разрабатывать шаблоны и
методы, которые будут способствовать идейно простым, легко доказуемым контрактам, которые могут разрабатываться
по стандартным шаблонам. В Главе 5 рассматриваются некоторые из этих лучших практик.
Автоматические доказательства идут на помощь?
Несмотря на то, что невозможно создать контролера, который бы исключал некорректные программы, становится все
более реализуемо создание доказуемо корректных программ при помощи машино-проверяемого доказательства –
автоматической программы, которая математически доказывает другие программы.
Поскольку смарт-контракты перемещают деньги, они идеально подходят для автоматических математических
доказательств. Задача этой области науки о вычислениях и математических исследований состоит в обеспечении при
помощи систематического подхода того, чтобы исходный код удовлетворял определенной формальной спецификации. Это
возможность для независимых аудиторов прийти и математически проверить, действительно ли программа делает то, что
она должна делать.
Автоматизация процесса доказательства является толчком к развитию для бизнеса, но не принесет большой выгоды для
среднестатистического программиста, изучающего Solidity. Доказательства просто показывают, действительно ли в
программе произошло именно то, что вы запланировали. Если ваша программа не будет доказана, автоматическая
система не скажет вам, как ее написать получше.
Тем не менее, смысл изучать эту проблему состоит в необходимости просигнализировать о том, что сети Ethereum
однажды действительно смогут выдержать большие объемы автоматизированных, перемещающих деньги ботов,
безопасно управляющихся с триллионами долларов; и что разработка этих ботов может стать не таким медленным,
рискованным и запутанным процессом, каким он является сегодня.
Детерминизм на практике
Объединив идеи из предыдущих разделов, вы можете увидеть, что в каком-то смысле вся идея полноты по Тьюрингу
может быть идеализированной концепцией ограниченной рациональности при проектировании публичной системы в
реальном мире.
В силу этого, можно также сказать, что на практике EVM не совсем полная по Тьюрингу, потому что ограниченный характер
исполнения контрактов на Solidity может в скором времени позволить теоретически предсказывать поведение любой
программы, которую будет запускать EVM.
Биткойн не справляется ни с одной из этих проблем. Серые области, существующие между выразительными языками и
машинными, существуют и для языка сценариев Биткойна, который также компилируется в машинный код во время
выполнения.
Потери при преобразовании
Интересно отметить, что вопрос о доказательствах имеет много общего с концепцией выразительности, обсуждавшейся
ранее в этой главе. Человек может произвести математическое доказательство только на высокоуровневом, абстрактном
языке, то есть на читабельном языке программирования, таком как Solidity. Выполнение такого доказательства с помощью
ассемблерного кода или машинного кода было бы практически невозможным даже для наиболее просвещенных в
математике людей.
Процесс компиляции – перевод понятного человеку кода в низкоуровневый, машинный код – приносит в жертву много
(интерпретируемой человеком) информации о том, как рассуждать о программе. Он также жертвует информацией, которая
была бы полезной для автоматического доказательства теорем. Таким образом, в процесс всегда вводится некоторая
неопределенность или неоднозначность. Сегодня вы не можете быть полностью уверены, что даже математически
доказанный смарт-контракт, написанный на Solidity, будет по-прежнему оставаться доказуемым после компиляции.
Тестирование, тестирование, тестирование
Способ предотвратить потерю ваших денег из-за неоднозначности кода – это протестировать его вдоль и поперек. Сеть
Ethereum поставляется с тестовой сетью Ropsten, которая использует тестовый эфир, который ничего не стоит и может
быть быстро получен из крана в среде-”песочнице”.
На самом деле Ropsten ничем не отличается от основной цепочки. Это просто другая цепочка, предназначенная для
тестирования. Подобно “Титанику” и кораблю аналогичного класса “Британнику”, они идентичны, за исключением имен, как
и любая другая цепочка, запущенная кем-либо. В этих цепочках нет ничего особенного или священного; вы создадите
цепочки, подобные им, в Главе 8.
Командная строка
Имейте в виду, что большинство важных функций Ethereum можно выполнить в кошельке Mist: отправить и получить эфир,
отследить токены и развернуть контракты. Использование Geth (или другого клиента командной строки) является
хорошим выбором для разработчиков, которые собираются научиться писать dapps. Глава 6 уделяет больше внимания
Geth.
В этом разделе мы кратко рассмотрим настоящий смарт-контракт, чтобы изучить один простой пример, как смарт-контракт
может быть использован.
Примечание
Если вы не можете читать или писать код, не волнуйтесь. Руководство по синтаксису и структуре следует за этим
примером, они помогут вам понять, что делает данный код. В следующей главе мы развернем стандартный токен Ethereum,
что не потребует никакого написания кода.
Вы узнаете, как развернуть такой контракт в Главе 5. Вы будете рады узнать, что существует всего три требования для
развертывания простого контракта на Solidity:
Текстовый редактор, такой как TextEdit на MacOS, Gedit на Ubuntu или Notepad на Windows. Убедитесь, что включен
режим текста без форматирования, который уберет все шрифты, подчеркивания, выделения жирным, гиперссылки
и курсивный шрифт. (Никогда не используйте жирный шрифт для написания кода!)
Кошелек Mist, рассмотренный в Главе 2.
Браузерный компилятор Solidity, расположенный по адресу или доступный по следующей короткой ссылке.
Как мы продемонстрируем в Главе 5, все, что вам нужно сделать, чтобы “загрузить” контракт, это скопировать и вставить
ваш код на Solidity из текстового редактора в браузерный компилятор Solidity. Оттуда вы будете компилировать код в байткод и копировать-вставлять этот байт-код в Mist. Это действительно очень легко, но давайте не будет увязать в логистике
сейчас. Вместо этого мы рассмотрим поведение смарт-контракта ниже, так чтобы вы смогли осознать потенциал
автоматического контракта, который отправляет и получает деньги. Следующий пример был изначально написан
Сайрусом Эдкиссоном ( vedogit на GitHub), инженером программного обеспечения из Кентукки и энтузиастом Ethereum,
проживающим сейчас в Нью-Йорке. Он был адаптирован для этой книги.
Вы назовете этот контракт PiggyBank (“копилка”), используя CapsCase (вместо camelCase) согласно правилам именования в
Solidity. Вы можете найти эти правила именования и остальную часть руководства по стилю Solidity по ссылке.
Теперь давайте посмотрим на PiggyBank.sol:
contract PiggyBank { address creator; uint deposits;
//Объявление этой функции как публичной делает ее доступной для других пользователей и смарт-контрактов.
function PiggyBank() public
{
creator = msg.sender; deposits = 0;
}
//Проверяется, было ли помещено какое-либо количество эфира на депозит. Когда он депонирован, количество депозитов
увеличивается и общее количество возвращается.
function deposit() payable returns (uint)
{
if(msg.value > 0) deposits = deposits + 1;
return getNumberOfDeposits();
}
function getNumberOfDeposits() constant returns (uint)
{
return deposits;
}
//Когда внешний аккаунт, который создал этот контракт, снова вызывает его, он завершает работу и отправляет обратно
свой баланс.
function kill()
{
if (msg.sender == creator) selfdestruct(creator);
}
}
Вы можете найти больше примеров скриптов на Solidity для программистов всех уровней и навыков по адресу.
Форматирование Solidity-файлов
Одна из основных деталей отсутствует в предыдущем примере контракта. Каждый файл Solidity должен иметь (но не
обязательно) версию препроцессорной директивы (pragma), указание версии Solidity, на которой был написан контракт. Со
временем это должно предотвращать ситуации, когда будущие версии компилятора отказываются принимать старые
контракты.
Версия pragma для этого файла 0.4.7, поэтому вы должны добавить в заголовок файла следующее:
pragma solidity ^0.4.7;
Дополнительные сведения о структуре файлов Solidity можно найти по адресу.
Советы по чтению кода
Вот шесть фактов, которые сделают этот контракт более понятным для начинающих:
Компьютеры читают код сверху вниз, слева направо, как и носители английского языка. Размещение одной строки
перед другой в общем случае означает, что компьютер сначала увидит эту инструкцию.
Как правило, программы берут входные данные и возвращают выходные данные. Вычислимые функции
(математические функции, которые могут выполняться компьютером) определяются как функции, которые могут
быть записаны как алгоритмы.
Алгоритмы получают данные, выполняют по ним операцию и возвращают какие-либо выходные данные.
Программы – это алгоритмы с другими вложенными в них алгоритмами.
Алгоритм подобен машине: вы можете многократно использовать его. Таким образом, написание алгоритмических
инструкций – программирование – покажется вам очень похожим на игру Mad Libs, которую компьютер
впоследствии автоматически заполняет пользовательской информацией (или контрактом Ethereum) посредством
транзакции или вызова сообщения. Иногда эта информация представляет собой простое число (например, 5
эфиров).
Операторы – это символы между английскими словами, такие как знак равенства, знаки плюса и минуса. Они
работают по большей части так, как вы и ожидаете, за некоторыми исключениями. Вы увидите операторы Solidity в
таблице 4-1.
Таблица 4-1.
Приоритет
Описание
1
Постфиксный инкремент декремент
Вызов как функции
<func> (<arg…>)
Индексация массива
<array>[<index>]
Доступ к элементу
<object>.<member>
Круглые скобки
(<statement>)
2
Префиксный инкремент декремент
Операция
и
++, —
++, —
и
Унарный минус
плюс
и
+, –
Унарные операции
delete
Логическое NOT
!
Побитовое NOT
3
Возведение в степень
**
4
Умножение, деление и остаток от деления
*, /, %
5
Прибавление вычитание
+, –
6
Побитовый оператор смещения
<<, >>
7
Побитовый AND
&
8
Побитовый XOR
^
9
Побитовый OR
|
и
10
Операторы сравнения
<, >, <=, >=
11
Оператор
==, !=
12
Логическое AND
&&
13
Логическое OR
||
равенcтва, оператор неравенства
<corditional>
14
Тернарный оператор
<if-true> :
?
<if-false>
=, |=, ^=, &=, <<=, >>=,
15
Оператор присвоения
16
Оператор “запятая”
+=, -=, *=, /=, %=
,
Типы – это “существительные” компьютерного программирования. Поэтому когда вы видите тип, вы знаете, что
разрешено в этом пространстве Mad Lib. Общий тип в Solidity – это адрес.
Изначально компьютеры использовали, чтобы быстро выполнять математические расчеты. На протяжении десятилетий в
основном физики были теми людьми, кто использовал компьютеры, они хотели решить сложные математические задачи,
чтобы найти ответы на вопросы, наподобие этого: в какой день и время лучше всего запустить Apollo 11, так чтобы у него
был кратчайший путь до Луны?
EVM гораздо ближе к этому оригинальному компьютеру, но она подходит для размышлений о сложном бухгалтерском
учете и фискальных согласованиях, чему вы могли научиться в бизнес-школе, программируя электронные таблицы в
Microsoft Excel. Напомним, что базы данных – это всего лишь электронные таблицы, а компьютерные программы
управляют этими базами данных. Таким образом, когда вы что-либо объявляете, вы говорите компьютеру поместить это в
электронную таблицу – в частности, поместить это в стек.
Компьютер самостоятельно определит, сколько памяти выделить для хранения значений в любых временных или так
называемых динамических вычислениях – небольших, ключевых логических операторах, используемых для вычисления
условных операций, таких как if-then (если-то). (Важно определить стек и heap (“кучу”), чтобы убедиться в том, что именно
здесь находится опасность программ, пожирающих память: в указании компьютеру использовать больше динамической
памяти, чем он может выделить).
Операторы и выражения в Solidity
Как вы узнаете, функции присутствуют в Solidity повсюду. Однако они используются по-разному.
Некоторые функции дают на выходе значение, например, число или ответ на вопрос true/false. Каким именно может быть
это значение, определяется типами Solidity, о которых упоминалось ранее; значение true/false называется Boolean.
Что такое выражение?
Функции, которые выдают значение, называются функциональными выражениями. Поскольку выражения оцениваются в
значениях того или иного типа, в программировании они могут использоваться вместо значений.
Другие функции являются декларативными и ведут к созданию выделенного места в памяти компьютера, которое будет
использоваться каждый раз при выполнении этого метода. Эти декларативные функции важны, поскольку они
необходимы для написания операторов.
Что такое оператор?
Говоря очень упрощенно, оператор говорит компьютеру выполнить действие. Компьютер использует выражения, чтобы
узнать, как выполнить это действие, и когда. Таким образом, компьютерные программы состоят из операторов, а
операторы часто состоят из выражений (или других операторов).
Публичные и приватные функции
В JavaScript и Solidity вы можете использовать точки с запятой для связывания операторов в цепочку и сообщать
компьютеру, что в коде появляется другой оператор:
function rst(); function second()
В Solidity вы также можете объявить, хотите ли вы, чтобы определенные функции были доступны вне программы. Эти
обозначения перечисляются ниже:
public (публичная): видимая извне и изнутри (создается функция доступа для переменных хранения/состояния)
private (приватная): видимая только в текущем контракте (по умолчанию)
Примечание
Функции, написанные на Solidity, по умолчанию не являются публичными. Вы должны объявить их публичными при
создании, или они не будут доступны для контрактов за пределами того контракта, в котором они находятся. (Прим.
переводчика: на момент перевода книги тип видимости функций по умолчанию – public)
Несмотря на то, что это всего лишь введение в грамотность кода, этого должно быть достаточно для вас, чтобы начать
расшифровывать, что делают некоторые из смарт-контрактов, которые мы обсудим позже.
Типы значений
При написании кода на Solidity вы можете указать компьютеру, какой тип значений ожидать в каждой алгоритмической
инструкции. В этом разделе описываются типы значений, который EVM может интерпретировать.
Логические значения
Известные в программировании как bool, логические (булевы) выражения
это выражения true/false, результатом вычисления которых является “истина” или “ложь”.
Целые числа со знаком и без
Известные в программировании как int и uint, это числа. Они могут быть отрицательными, если у них есть знак, то есть
минус, указывающий, что они со знаком. Таким образом, целые числа без знака являются положительными.
Адреса
Тип адреса содержит 20-байтовое значение, которое представляет собой размер адреса Ethereum (40 шестнадцатеричных
символов или 160 бит). Типы адресов также имеют типы методов.
Методы адресов
Эти два метода позволяют вам запрашивать баланс аккаунта или переводить эфир на аккаунт. Будьте внимательны с
методом transfer в смарт-контрактах. Лучше использовать паттерн, в котором получателю позволено снимать деньги, чем
иметь контракт, инициирующий переводы.
balance
transfer
Ключевые слова, связанные с адресом
Ключевые слова поставляются с языком Solidity. Они представляют методы для использования языка
предопределенными способами. Вы можете использовать эти ключевые слова в своем коде для выполнения общих задач,
необходимых для смарт-контрактов. К ним относятся следующие:
.balance (uint256): возвращает баланс адреса в wei
.send(uint256 сумма) returns (bool): отправляет заданную сумму в wei на адрес и возвращает false при неудаче
this(тип текущего контракта): текущий
контракт,
явно преобразуемый в address
selfdestruct(адрес получателя): уничтожает текущий контракт, отправляет его средства на заданный адрес
Примечание
Возможно запросить баланс текущего контракта, используя ключевое слово this.balance.
Менее общие типы значений
Несколько других типов значений могут быть полезны, если вы уже является программистом среднего или продвинутого
уровня:
Байтовые массивы с динамическим размером
Числа с фиксированной запятой
Рациональные и целочисленные литералы
Строковые литералы
Шестнадцатеричные литералы
Перечисления
Комплексные (ссылочные) типы
В целом, типам в Solidity выделяется 256 бит памяти в хранилище EVM; это 2048 символов. Более длинные типы могут
привести к более значительным затратам на газ для перемещения. Вам нужно тщательно выбирать типы во время
выделения постоянного хранилища в стеке EVM. Вот комплексные типы, которые превышают 256 бит:
Массивы
Литералы массивов / строковые массивы
Структуры
Соответствия
Массивы, структуры и другие комплексные типы имеют расположение данных, которое может использоваться
программистами на Solidity для управления вне зависимости от того, как они хранятся, динамически в памяти или в среде
постоянного хранения. Это может помочь вам управлять комиссиями.
Глобальные специальные переменные, единицы и функции
Глобальные специальные переменные могут быть вызваны любым смарт-контрактом на Solidity в EVM; они встроены в
язык. Большинство из них возвращают информацию о цепочке Ethereum. Единицы времени и эфира также глобально
доступны. Литеральные числа могут принимать суффиксы wei, nney, szabo или ether и будут автоматически
конвертироваться между субноминалами эфира. Числа валюты эфира без суффикса считаются Wei.
Суффиксы, связанные со временем, могут использоваться после литеральных чисел для преобразования между
единицами времени. Здесь секунды являются базовыми единицами, а единицы рассматриваются как глобальные
единицы.
Ввиду существования високосных годов будьте осторожны при использовании этих суффиксов для расчета времени,
поскольку не все годы имеют 365 дней, и не все сутки имеют 24 часа. 1000 миллисекунд = 1 секунда, 1 минута = 60 секунд, 1
час = 60 минут, 1 день = 24 часа, 1 неделя = 7 дней, 1 год = 365 дней.
Свойства блока и транзакции
Обратите внимание, что эти глобальные переменные доступны только в смарт-контрактах на Solidity. Их не следует путать с
вызовами JavaScript Dapp API, которые вы можете делать в Geth, о которых вы узнаете в Главе 6.
block.blockhash (uint blockNumber) returns (bytes32): Хеш данного блока, работает только для 256 последних блоков
block.coinbase (address): Адрес майнера текущего блока
block.di culty (uint): Текущая сложность блока
block.gaslimit (uint): Текущее ограничение блока по газу
block.number (uint): Номер текущего блока
block.timestamp (uint): Временная метка текущего блока
msg.data (bytes): Полные данные вызова
gas (uint): Оставшийся газ
msg.sender (address): Отправитель сообщения (текущий вызов)
msg.sig (bytes4): Первые 4 байта данных вызова (идентификатор функции)
msg.value (uint): Количество отправленных Wei с сообщением
now (uint): Временная
метка
текущего
блока
(алиас
для
block.timestamp)
tx.gasprice (uint): Цена газа транзакции
tx.origin (address): Отправитель транзакции (полная цепочка вызова)
Обратите внимание, что значения всех методов msg (то есть, msg.sender и msg.value) могут изменяться для

каждого вызова внешней функции, даже если они являются библиотечными функциями. Если вы хотите
реализовать библиотечные функции с ограничениями доступа на использование msg.sender, вам необходимо
вручную указать значение msg.sender в виде аргумента.
Памятка по операторам
В таблице 4-1 показаны операторы, которые вы можете использовать в выражениях на Solidity.
Глобальные функции
В целом в Solidity специальные функции в основном используются для предоставления информации о блокчейне, но
некоторые из них также могут выполнять математические и криптографические функции. Эти функции перечислены ниже:
keccak256(…) returns (bytes32): Вычисляет
хеш Ethereum-SHA-3 (Keccak-256) аргументов (плотно упакованных)
sha3(…) returns (bytes32): Алиас для keccak256()
sha256(…) returns (bytes32): Вычисляет хеш SHA-256 (плотно упакованных) аргументов. “Плотно упакованный”
означает, что аргументы связаны/соединены без заполнения. Чтобы узнать, как добавить заполнение к
аргументам, обратитесь к следующей ссылке.
ripemd160(…) returns (bytes20): Вычисляет RIPEMD-160 хеш (плотно упакованных) аргументов
ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address): Восстанавливает адрес, связанный с открытым
ключом из подписи эллиптической кривой, возвращает 0 при ошибке
addmod(uint x, uint y, uint k) returns (uint): Вычисляет (x + y) % k, где суммирование происходит с произвольной
точностью и не повторяется при 2**256
mulmod(uint x, uint y, uint k) returns (uint): Вычисляет (x* y) % k, где умножение происходит с произвольной точностью
и не повторяется при 2**256
this (текущий тип контракта): Текущий контракт, явно преобразуемый в его адрес. Также стоит упомянуть
переменные, связанные с контрактами, которые могут быть полезны при написании контрактов на Solidity:
super: Контракт на один уровень выше в иерархии наследования. Для получения дополнительной информации о
наследовании, смотрите ссылку в следующем разделе
selfdestruct(адрес получателя): Уничтожает текущий контракт, отправляет его средства на указанный адрес
assert(bool condition): отдает исключение, если условие не выполняется
revert(): Прекратить выполнение и откатить изменения состояния
Исключения и наследование
Некоторые ситуации автоматически вызывают исключения. Чтобы увидеть их все, перейдите по адресу.
Язык Solidity также поддерживает множественное наследование. Даже если контракт наследует от нескольких других
контрактов, в блокчейне создается только один контракт, код из базовых контрактов всегда копируется в окончательный
контракт. Подробности об общей системе наследования можно найти по адресу.
Итоги Главы 4
В этой главе вы сделали первые шаги для понимания влияния программ, написанных для EVM. Вы также критически
рассмотрели, как эти программы могут достичь значимого уровня полноты по Тьюрингу, не жертвуя безопасностью сети.
Мы лишь кратко коснулись формальной математики, которая делает эти программы столь многообещающими для
корпоративных информационных технологий. Но, если повезло, вы узнали достаточно для мотивации углубиться в
Ethereum White Paper и Yellow Paper и увидеть своими глазами, как EVM достигает доказуемого консенсуса.
В Главе 5 вы развернете свой первый токен-контракт в EVM. Вы также узнаете о социальной и культурной истории
монетарных инструментов, а также какую роль это играет для вашего понимания потенциала Ethereum.
Примечания к Главе 4
1
Smithsonian Education, “Revolutionary Money,”
http://www.smithsonianeducation.org/educators/lesson_plans/revolutionary_money/i ntroduction.html, 2016.
2
Wikipedia, “Counterfeit Money,” https://en.wikipedia.org/wiki/Counterfeit_money, 2016.
3
Investopedia, “Complementary Currency,” www.investopedia.com/articles/economics/11/introduction-complementarycurrencie s.asp, 2016.
4
New York Times, “Internet Browsers to Be Disabled on New York’s Free Wi-Fi Kiosks,”
www.nytimes.com/2016/09/15/nyregion/internet-browsers-to-be-disabled-on-new-yor ks-free-wi- -kiosks.html?_r=0, 2016.
5
Wikipedia, “Rice’s Theorem,” https://en.wikipedia.org/wiki/Rice%27s_theorem, 2016.
Создание децентрализованных приложений на блокчейн
Помощь в программировании искусственного интеллекта
Глава 5. Смарт-контракты и токены
06.04.2018
Рубрика: Введение в Ethereum и Solidity
Автор: adminCraft
Содержание страницы
1 Глава 5
2 EVM в качестве бэкенда
3 Смарт-контракты для распределенных приложений
4 Активы, обеспеченные чем угодно
5 Обмен на фиатную валюту
6 Эфир в роли стеклянных бус
7 Криптовалюта как мера времени
8 Владение активами и цивилизация
9 Ваши личные сбережения = репутация
10 Деньги, токены, репутация… Что с того?
11 Монеты – предметы коллекционирования
12 Функция коллекционных предметов в человеческих системах
13 Ранние подделки
14 Ювелирные изделия и предметы искусства в качестве денег
15 Шаг к банкнотам
16 Платформы для высокоценных цифровых предметов коллекционирования
17 Токены – это категория смарт-контракта
18 Примечание
19 Примечание
20 Токены как социальные контракты
21 Токены – отличное приложение для старта
22 Примечание
23 Создание токена в тестовой сети
24 Примечание
25 Получение тестового эфира из крана
26 Примечание
27 Примечание
28 Примечание
29 Регистрация ваших токенов
30 Развертывание вашего первого контракта
31 Примечание
32 Примечание
33 Один дом, разные адреса
34 Примечание
35 Экспериментируем с контрактами
36 Итоги Главы 5
37 Примечания к Главе 5
Глава 5
Небольшие шаблоны кода многократного использования (в терминах программирования, классы), написанные на Solidity,
называются смарт-контрактами, отсылка к финансовым контрактам. Вы можете представлять себе смарт-контракты как
подходящий инструмент для создания финансовых деривативов в качестве веб-сервиса – с некоторыми особенностями.
В предыдущей главе вы узнали, как использовать Solidity для создания инструкций для виртуальной машины Ethereum. Темне
менее, мы не дошли до загрузки вашей программы в EVM, этот процесс в разработке компьютерных приложений обычно
называется развертыванием. В этой главе представлен процесс, с помощью которого вы сможете развернуть (задеплоить)
свои скрипты на Solidity в EVM, что сделает их доступными в качестве реального продукта или сервиса.
EVM в качестве бэкенда
Программные приложения в том виде, в котором они существуют сегодня для Веба, iOS, MacOS, Windows, Android, Linux и т.д.,
как правило состоят из двух частей: фронтенд и бэкенд. К бэкенду обычно относятся база данных и логика взаимодействия с
ней, которая (как вы узнали из Главы 3) является местом, где программа хранит свою информацию. Под фронтендом обычно
понимается та часть приложения, которую видит пользователь: интерфейс с его различными метками и элементами
управления. В дизайне программного обеспечения элементы управления – это общий термин для маленьких кнопок,
слайдеров, ручек настроек, сердец, звезд, иконок с большим пальцем и любых других мелочей, на которые вы можете нажать,
чтобы что-либо произошло.
Как мы уже говорили ранее, современные веб-приложения используют совокупность компьютеров и серверов, большая часть
которых работают под управлением какой-либо версии Linux, что играет жизненно важную роль во временами нестабильной
хореографии компьютеров, работающих сообща, чтобы доставить “комплексный” интерфейс на ваш смартфон или компьютер
(обычно в надежде, что вы заплатите за этот интерфейс).
Ни EVM, ни виртуальная машина Биткойн не являются полнофункциональными на сегодняшний день. EVM будет продолжать
становиться быстрее по мере того, как разработчики ядра будут переходить к более быстрому времени блока; как это
работает, станет понятно в Главе 6.
В сухом остатке на данный момент имеем то, что EVM является некоей заменой для традиционного бэкенда приложений и
обычного хостинга веб- или мобильных приложений. Хотя EVM сама по себе является полноценным компьютером, она еще не
является законченной end-to-end платформой, способной хостить HTML/CSS-интерфейсы; самая полезная роль, которую она
может играть, – это бэкенд для распределенного приложения.
Смарт-контракты для распределенных приложений
Умный контракт – это всего лишь единица функционала, которую вы загружаете в EVM. Термин “распределенное приложение”
или dapp обычно описывает доступный для веб или смартфонов фронтенд приложения с графическим пользовательским
интерфейсом, которое использует EVM в качестве бэкенда. Если только это не очень простое dapp, его бэкенд-функционал
будет опираться на несколько смарт-контрактов.
Активы, обеспеченные чем угодно
В финансовой терминологии актив – это ценный ресурс, который, как вы ожидаете, принесет выгоду или ценность в будущем.
Активами могут выступать физические природные ресурсы или абстрактные финансовые инструменты, но по определению
цена актива должна увеличиваться со временем. (Если она падает, то актив называется обесценивающимся).
Можно сказать, что криптовалюты – это активы, обеспеченные чем угодно. Что именно это означает, станет понятным к концу
этой главы. Давайте посмотрим на следующий пример.
Обмен на фиатную валюту
Предположим, что вы Алиса, и вы живете в Японии. Для целей этого примера предположим, что вы платите японскими
йенами, и что цены на такие вещи, как аренда, питание и основные виды обслуживания деноминированы в йене.
Допустим, вы хотите заплатить кому-то в Нью-Йорке за услуги по переводу. Этого человека зовут Боб. Боб – переводчик,
использующий доллары США; он хранит сбережения в долларах; также он платит налоги в долларах.
Это создает проблему. Для большинства людей в иностранной валюте нет особой нужды, и обмен влечет за собой высокие
комиссионные и риски проскальзывания цены. Проскальзывание относится к снижению цены, прежде чем у вас будет
возможность продать ваш лот. Бобу не нужны йены, а Алиса не держит ни одного доллара.

Хотя в этом примере и используются фиатные деньги, Алиса и Боб могут также иметь капусту и стеклянные бусы для обмена.
Да, это правда, что один из них может просто добраться до ближайшего пункта обмена, возможно, в международном
аэропорту, но это не будет экономным решением.
В случае использования криптовалют им нужно только установить обменный курс или коэффициент между их местной
валютой и криптовалютой, а затем конвертировать местную цену обмениваемых товаров с помощью этого коэффициента.
Используют ли они стеклянные бусы или бумажные деньги, это не важно. Для совершения сделки все, что им нужно, это
просто сойтись в цене.
Эфир в роли стеклянных бус
Этот пример демонстрирует одно из фундаментальных свойств эфира и биткойнов: они являются стандартными единицами
учета ценности и одновременно средством обмена самих себя. Деньги также служат этим целям, но в действительности
средства обмена (бумага) – это просто представление ценности, которая существует в реестре какого-либо банка. В этом они
одинаковы.
Как вы узнаете больше из Главы 6, эти стандартные единицы учета ценности в сущности заносят себя в таблицу учета и сводят
баланс целого реестра всякий раз, когда платеж перемещается из одного места в другое. Это еще одно преимущество в
сравнении с современными деньгами, которые являются инертными и “не имеют представления о существовании” других
денег в системе. Как вы можете себе представить теперь, это делает смарт-контракты идеальными для написания
самоисполняемых финансовых соглашений.
Деривативный контракт представляет собой финансовую “ставку” между двумя или более сторонами, сделанную на
стоимость базового актива. Дериватив по сути говорит, что при определенных условиях Алиса соглашается выплатить Бобу
определенную сумму. Количество финансовых деривативов на сегодняшний день на Земле превышает один квадриллион
долларов. Это популярные небольшие инструменты!
Что дает криптовалютам возможность быть использованными подобным образом? Ответ на это станет более ясным в Главах
6 и 7, но учитывая уместность, давайте проведем некоторые мысленные эксперименты, которые ускорят обучение.
Криптовалюта как мера времени
Поскольку криптоактивы и криптовалюты невозможно подделать, это обеспечивает их таким интересным свойством, как
мера времени. Глава 7 описывает схему выпуска эфира, но дело здесь в том, что эти токены почти как кольца деревьев – их
появление происходит путем процесса высокой сложности, который не может быть “ускорен”. Таким образом, при торговле с
кем-либо, находящимся в удаленной экономике, становится легче доверять ценам, выраженным в криптовалюте, поскольку
подделка невозможна, независимо от того, насколько богата или могущественна группа, с который вы торгуете.
Криптовалюты, на момент написания книги, не подлежат выкупу никакими центральным органами за золото или фиатные
деньги. Однако они классифицируются как имущество или валюта в некоторых странах.
Тем не менее, можно сказать, что криптовалюты получает свою цену на рынке: они стоят столько, сколько люди готовы за нее
заплатить. Это контрастирует с обеспеченной золотом валютой, которая подлежит выкупу локальными казначействами, или
даже с облигациями, выкуп которых на собственную фиатную валюту гарантирует правительство на десятилетия вперед.
В силу своего статуса децентрализованных цифровых средств обмена, криптовалюты могут быть определены как “активы,
обеспеченные чем угодно”. Не имеет значения, торгуете ли вы крупным рогатым скотом, бананами, фьючерсами на сою или
непубличными акциями – сделка может быть проведена в криптовалюте. Единственная задача – договориться в цене.
Сегодня, даже если покупатель и продавец соглашаются совершить транзакцию между собой в криптовалюте, скорее всего
они быстро продадут эту криптовалюту за местные фиатные деньги, чтобы избежать проскальзывания цен. Это будет
происходить все реже и реже по мере стабилизации цен на криптовалюты. Цены будут становится стабильнее по мере
увеличения объема транзакций по всему миру, а рынки для торговли криптовалютами станут более глубокими и более
ликвидными.
Эфир похож на другие криптовалюты, такие как биткойны, в этом отношении, но он приобретает некоторую внутреннюю
ценность благодаря своей практической значимости при оплате расходов на газ в EVM. Как мы обсуждали в Главе 3, это

делает эфир более похожим на товар, такой как нефть или кукуруза, которые получают свою соответствующую встроенную
ценность за счет их использования в качестве топлива или пищи соответственно.
Владение активами и цивилизация
Само собой разумеется, что изобретение денег в качестве социальной концепции является основополагающим для
цивилизации. В пантеоне великих человеческих идей оно, возможно, входит в число таких инноваций, как приручение
животных, геометрия и каменные орудия.
Будучи очень восприимчивыми к сетевому эффекту, деньги развиваются медленнее, чем другие технологии. Поскольку люди
предпочитают деньги, которые можно хранить в течение длительных периодов времени, и при этом они будут сохранять свою
ценность в далеком будущем, человеческие общества не стремятся к переходу на новые средства обмена во избежание
обесценивания своих сбережений!
Концепция сетевого эффекта описывает, как технологии становятся более полезными индивидуально для каждого по мере
того, как их популярность растет и расширяется через географическое пространство.
Возможность использовать биткойны для покупки розничных товаров во всем мире является примером его положительного
сетевого эффекта. Это делает торговлю возможной везде, где бы вы ни были, как показано на примере с продавцом на пляже
в Главе 4.
Сбережения или прибавочная стоимость позволяют людям инвестировать в будущее. 50 тысяч лет назад или сегодня, имея
избыток пищи, топлива или человеческих трудовых ресурсов в своем распоряжении, вы можете планировать заранее и
предпринимать действия, которые используют этот излишек, чтобы обеспечить еще большие излишки для будущих
поколений. Примером служит сообщество, которое после не бывало высокого урожая культур увеличивает свое население и
коллективно строит плотину для орошения своих полей, улучшая урожайность сельскохозяйственных культур еще больше.

Так как же связан этот экскурс в историю с криптовалютами?
Ваши личные сбережения = репутация
Люди, которые накапливают сбережения в определенной форме денег, будь то золото, ожерелья из раковин или доллары
США, будут реинвестировать в свое будущее. Как правило, люди инвестируют в географические области, где проживают они и
их семьи. В экономике это называется “домашний уклон”. Это один из способов достижения людьми статуса в обществе:
пожертвования на общественные работы, руководство конструктивными общественными движениями или обеспечение
широкомасштабной занятости.
Как обсуждалось в Главе 1 и в предыдущем разделе, биткойны и эфир не обеспечены гарантиями того, что какая-либо
организация будет их выкупать за что-либо в любой момент в будущем. По этой причине, семья, стремящаяся защитить свое
наследие, может считать биткойны или эфир плохим выбором для долгосрочных сбережений. То же самое касается и других
долгосрочных организаций, таких как благотворительные фонды, пенсионные фонды, трасты и фонды целевых капиталов.
Кто знает, будет ли кто-либо использовать эти сети через 50 лет! Для сравнения, национальные государства склонны
существовать веками. Когда они выпускают фиатную валюту, они также создают армии для защиты своих экономических
систем; нет такой центральной власти, которая бы обеспечивала использование биткойнов или эфира. Чтобы добавить еще
больше неопределенности, отметим, что компьютерные сети в целом появились не так давно, чтобы мы могли действительно
знать о продолжительности их пригодности, по сравнению с правительствами, которые существовали (в той или иной форме)
на протяжение тысячелетий и могут существовать тысячи лет. Как криптовалюта станет более долговечной, чем деньги,
которые у нас уже есть?
Деньги, токены, репутация… Что с того?
Долговечность – это убийственное преимущество актива: чем дольше актив будет расти в цене, и чем сложнее его будет
подделать, тем он более желаем. Вот почему так много людей хранят свои богатства на долгосрочной основе в облигациях и
недвижимости.

Чтобы убедиться в реальности данного факта, нужно подумать о биткойнах и эфире как о цифровых объектах
коллекционирования. Как вы узнаете, это самый выгодный подход при рассмотрении множества сценариев использования
смарт-контрактов. В конечном счете, научиться писать программы для EVM – это такая же непростая задача, как выяснить,
что именно создавать. И долгая история денег дает нам множество подсказок относительно того, какие типы принципиально
новых бизнес-транзакций или социальных концепций можно реализовать при помощи этого нового класса активов.
Многое было написано о потенциале Ethereum для раскрытия реального потенциала интернета, особенно интернета вещей. Из
литературы об Ethereum, которая уже есть в сети, легко представить промышленные или розничные сценарии, в которых
небольшие компьютеры могут выполнять микротранзакции.
Но такой подход ограничивает нас транзакциями, которые мы и так уже совершаем сегодня. Перспектива протоколов
Ethereum и Биткойн – это представление новых видов транзакций и инструментов. Что насчет мира повседневных
потребительских товаров в этом интернете вещей? Разве эти товары не “вещи” тоже?
Предположим, вы печатаете Ethereum-адрес (открытый ключ) на физическом товаре, и этот адрес относится к смартконтракту.
Или на практике, рассмотрите QR-код, показанный на изображении 5-1, который является машиночитаемым кодом в шаблоне
с вложенным квадратом. Этот код ведет на ссылки для этой книги. Если вы отправитесь в iOS App Store или Google Play на
своем смартфоне, то найдете какое-то количество бесплатных приложений для чтения QR-кодов. Просто поищите “QR reader”.
Представьте себе, как эти QR-коды, напечатанные на повседневных ценных товарах, таких как одежда, ювелирные изделия,
произведения искусства или другие физические товары, могли бы комбинировать концепции деривативных контрактов,
ежедневно перезагружаемых дебетовых карт и коллекционных предметов.
QR-коды обеспечивают простой способ для машин читать криптовалютные адреса и URL-адреса. Данный QR-код ведет на
http://eth.guide.
Монеты – предметы коллекционирования
Прежде чем спускаться глубже в эту кроличью нору, давайте прикоснемся к антропологической истории, с разрешения Ника
Сабо, пионера криптовалют, чьи плодотворные веб-эссе повлияли на многих современных криптовалютных энтузиастов и
шифропанков.
В 2002 году Сабо писал о сопряжении физических товаров, представляющем абстрактную ценность на протяжении
человеческой истории. Он объяснял, что предметы коллекционирования позволяли нам принимать участие в более крупных и
сложных финансовых транзакциях.

Коллекционные предметы имели крайне важное значение для проведения подобных транзакций впервые. Объекты
коллекционирования аугментировали наши высокоразвитые умы и язык в качестве решений дилеммы заключенного,
которая удерживает практически всех животных от сотрудничества посредством отложенного взаимного обмена с
“чужаками”.

Без заслуживающего доверия предмета коллекционирования для обмена вы, возможно, не захотите торговать ресурсами с
кем-либо, находящимся за пределами вашей расширенной родственной (семейной) сети. Это не особо подходит для мирного
сосуществования в более крупных национальных государствах.
Функция коллекционных предметов в человеческих системах
Основная функция денег – учет одолжений: служить в качестве закрытой системы учета для сообщества, чтобы отслеживать
взятые одолжения и выданные одолжения. Это становится полезным, поскольку все большие и большие группы пробуют
взаимодействовать и сотрудничать друг с другом.
Использование предметов коллекционирования для подсчета одолжений
это суть первоначального учета. Со временем ценность этих одолжений стала абстрактной, что привело к появлению
общих инструментов определения ценности, таких как золото. Это объясняет современную связь между богатством и
уважением.
Ethereum и Биткойн бьют в самое сердце проблемы, возраст которой десятки тысяч лет, речь об учете репутации
естественного человеческого поведения, а также несовершенного поведения. Сабо продолжает:
– Репутационные представления могут страдать от двух основных видов ошибок – ошибок касаемо того, кто совершил те или
иные действия, и ошибок в оценке значения или ущерба, обусловленного этими действиями. Для неандертальцев и человека
разумного, при относительно одинаковом размере их мозга, достаточно вероятно, что каждый член локального клана
отслеживал все одолжения, сделанные в адрес другого члена локального клана… Между кланами внутри племени
использовались как учет одолжений, так и предметы коллекционирования.
Два клана внутри племени, обменивающиеся предметами коллекционирования в закрытой системе, представляют собой
нечто вроде закрытой банковской базы данных. Или приватного блокчейна. Сабо пишет:
– Между племенами предметы коллекционирования полностью заменили механизм взаимного обмена, основанного на
репутации, хотя насилие по-прежнему играло главную роль в обеспечении защиты своих прав, как и высокая стоимость
транзакции, препятствовавшая большинству видов торговли.
Практически как современные банки, группы людей былых времен испытывали трудности в торговле вне своей системы
учета. Чью денежную систему вы используете? Кто ведет учет межплеменных одолжений? Не удивительно, что было столько
кровопролития: возможности для нечестной игры слишком стойки.
Ранние подделки
Решением для межплеменной торговли было использование редких предметов искусства: не просто редких земельных
элементов, но любых объектов, которые нельзя было просто найти или создать с нуля. Они не могли быть просто набором
красивых объектов. Их должно было быть крайне трудно достать, либо они должны были представлять из себя продукты
квалифицированной искусной работы, что гарантировало, что каждый предмет коллекционирования имел за собой
определенное количество человеко-часов (рабочего времени). Появляющийся в результате такой работы предмет для
коллекционирования можно считать “доказательством работы” (proof-of-work) мастера. И следовательно, мы возвращаемся к
концепции, озвученной ранее: биткойны и эфир как хранилища времени. Как говорит Сабо:
– Это должно было обладать определенными функциональными свойствами, такими как обеспечение защиты при надевании
на человека, компактность для возможности спрятать или приложить к захоронению, а также дороговизна, исключающая
возможность подделки. Эта дороговизна должна была проверяться получателем перевода с использованием многих таких же
навыков, какие коллекционеры используют для оценки предметов коллекционирования сегодня.
Ювелирные изделия и предметы искусства в качестве денег
Возможно, нет ничего более основополагающего для экономического прогресса человечества, чем заслуживающий доверия
набор предметов коллекционирования, которые можно использовать в качестве денег. Причина в том, что деньги
способствуют сотрудничеству. Сабо говорит о том, что сотрудничество является нашей определяющей адаптационной
функцией на групповом уровне:

– Сегодня большая часть крупных животных на планете боятся летящих предметов – это адаптация лишь к одному виду
хищников.
Да, это мы, создающие орудия приматы, которые охотятся как волки и живут в социальных колониях, как термиты! В
некотором смысле современные криптовалюты являются супер-деньгами для наших сложных систем человеческих
взаимоотношений, потому что они представляют собой базовые элементы неизменной системы учета, которая может
охватить весь земной шар.
Шаг к банкнотам
Деньги, репутация и статус всегда были объединены вместе. Это было логичным, что примитивные ценности – это вещи,
которые вы могли одеть; будь то золотые украшения или усеянные бриллиантами короны. В конце концов, почему бы вам не
похвастаться статусом, который был дарован вам тяжелой работой (или удачей)?!
Однако, поскольку общество становится богаче, любой может владеть небольшим количеством золота; потом еще немного
большим, потом еще. Подъем уровня благосостояния приводит к созданию рынков для новых товаров и услуг, которые
позволяют самым богатым людям наслаждаться жизнью такими способами, которые подчеркивают их социальный статус. В
какой-то момент становится слишком много того, что можно одевать или носить, и люди начинают соревноваться в
абстракциях, таких как бренды товаров или частные школы, куда ходят их дети.
К этому моменту в развивающемся обществе в банках хранится достаточно богатств, чтобы владельцы индивидуальных
счетов могли начать торговать банкнотами. Как это работает, лучше всего объяснено экономическим исследователем
Мартином Армстронгом. Сабо говорит:
– Различие между банкнотами и депозитными расписками, выпускавшимися “золотых дел мастерами”, было простым.
Депозитная квитанция преобразовывалась в банкноту, если квитанция подлежала к оплате на предъявителя, а не держателя
счета. В связи с этим, Банк Англии Патерсона де факто ловко создал банковские билеты в обращении, поскольку их квитанции
подлежали выплате на предъявителя, таким образом создав “банкноты” для обращения, не имея резерва для покрытия
подобного инструмента.
Биткойн лишь слегка переработал эту связь, создав аккаунты на предъявителя; тот, у кого есть пароль и закрытый ключ от
аккаунта, по умолчанию считается его владельцем. Биткойн-адреса, также как и адреса Ethereum, не регистрируются на
физических лиц. Они создаются псевдонимно.
Эфир похож на выпуск банкнот, его также можно обменять на вычислительное время в EVM.
Платформы для высокоценных цифровых предметов коллекционирования
В цифровом контексте, надежное хранилище времени обладает невероятным потенциалом в качестве платформы для
цифровых предметов коллекционирования: ценных предметов, которые могут быть отображены, использованы или
помещены в личное пространство – онлайн или в реальной жизни – и которые невозможно подделать, а также трудно украсть
у их законного владельца.
Когда большинство людей думают об интернете вещей, они представляют себе сенсорные датчики, самодиагностирующее
промышленное оборудование и транспортные средства без водителя. Интернет ценностей (эвфемизм, относящийся к
технологии блокчейн) является одной из множества метафор, которая используется для концептуального представления
Биткойн и Ethereum. Но вместо того, чтобы размышлять абстрактно, может быть более полезным подумать о потенциале в
категориях ценных произведений искусства, ювелирных изделий, предметов моды или премиальных товаров, которые очень
похожи на те, что мы имеем в мире сегодня, но которые обладают отличительными особенностями – можно проверить
источник их происхождения и права собственности, информация о которых хранится в блокчейне.
В будущем, возможно, никогда нельзя будет “забыть” о правах собственности, ценности и происхождении физической вещи до
тех пор, пока работает блокчейн, в который эта вещь была внесена и учтена. Через 100 лет на телевидении не будет передачи
“Antiques Roadshow”. (Мы могли бы даже написать смарт-контракт, чтобы сделать ставки на это!)

Токены – это категория смарт-контракта
В целом, протокол Ethereum может гордиться собой за то, что он не имеет ярко выраженных особенностей, это является одной
из причин, по которой токены (как концепция) так сильно переплетаются со смарт-контрактами (как концепция). Токены – это
всего лишь один из способов применения функциональности смарт-контрактов в EVM.
Примечание
В этой главе вы развернете свой собственный токен.
Токены – это один из частных (и популярных) способов применения смарт-контрактов. По этой причине кошелек Mist дает
возможность особенно просто создавать токены.
В настоящее время нет такой другой категории смарт-контрактов, которая была бы адаптирована подобным образом в Mist.
Итак, Ethereum обеспечивает один популярный сценарий использования смарт-контрактов, а именно подвалюту, также
известную как токен. В надежде облегчить работу, разработчики Ethereum поместили простой в использовании шаблон внутрь
кошелька Mist для быстрого запуска ваших собственных токенов. По всей видимости, последуют и другие шаблоны для
типовых смарт-контрактов. Но в настоящее время шаблон, который мы получаем из коробки, – это возможность создавать
настраиваемую единицу ценности, которая может передаваться по сети наравне с эфиром внутри EVM.
Если бы вам пришлось сформулировать идею о простом в эксплуатации процессе по созданию токенов для краткой
презентации на тему предлагаемых пользователям преимуществ, это было бы примерно так: “ультра-безопасная цифровая
денежная система с автоматическим балансированием реестра, предоставляемая как услуга”.
Теперь, когда вы получили представление об историческом потенциале Ethereum и Биткойн для запуска новой эры
криптографических предметов коллекционирования и умных устройств, давайте вернемся к сути дела, касающейся
развертывания токена на практике.
Примечание
В этой главе содержатся упражнения, в которых используется кошелек Mist, вы должны были установить его в процессе
чтения Главы 2. После установки на ваш компьютер он может отображаться как Ethereum Wallet. Эта книга упоминает его как
“Mist”, чтобы отличить его от многих других кошельков Ethereum, доступных на сегодняшний день для настольных и
мобильных компьютеров.
Токены как социальные контракты
Токены иногда называют монетами, как вы узнали из Главы 3. Вы также узнали, что сами по себе токены – это смартконтракты. (С достаточным количеством повторений эти термины, надеюсь, войдут в ваш естественный словарный запас к
концу этой книги!).
Но сами по себе токены (как и все формы денег) также могут рассматриваться как социальные контракты или соглашения
между группами пользователей. На простом английском языке неявное соглашение группы, использующей токен, было бы
следующим: “Мы все согласны с тем, что этот токен – деньги в нашем сообществе”. Это также негласное соглашение не
подделывать его, тем самым не подрывая доверие к системе!
Сегодня самая близкая вещь к социальному контракту в форме программного обеспечения – это, вероятно, лицензионные
соглашения конечного пользователя или EULA, которые подписывают пользователи при создании учетных записей в таких
сервисах, как Facebook, Twitter, iTunes или Gmail. Это соглашение обычно включает в себя положения о запрете такой
деятельности, как рассылка спама другим пользователям, которая ухудшит опыт пользователей по взаимодействию с
сервисом.
Мышление в подобных категориях позволяет нам представить, как наши цифровые медиа и цифровые товары могут стать в
наше время цифровыми предметами для коллекционирования, которые обсуждаются, продаются и отображаются в
социальных сетях будущего, в которых онлайн-артефакты, такие как селфи или подкасты, могут быть проданы, лицензированы
или арендованы за комиссию произвольного размера.

Токены – отличное приложение для старта
В процессе создания токена учитывайте, что его ценность будет определяться сообществом, использующим его. Из этого
следует, что гораздо легче запустить токен в существующее сообщество, которое уже торгует с применением какого-либо вида
денег или временных платежных средств.
Однако, создание подвалют не является единственным способом применения криптоактивов. Концепция актива весьма
обобщена. Активы в форме финансовых контрактов или смарт-контрактов могут использоваться для представления доли в
капитале или для лотерейных билетов, либо просто временного платежного средства в местной экономике. Цена может быть
определена рынком или может быть привязана к другому активу. Правила главным образом зависят от вас.
Примечание
Временное платежное средство (scrip) – это термин, произошедший от слова “расписка/подписка” (subscription). У него есть
множество определений из прошлого, но главным образом оно относится к долговым распискам. Он также может относиться
к частной валюте, такой как воздушные мили или премиальные баллы. Он используется в этой книге для обозначения общей
единицы учета: горошины, которые подсчитывает гигантский децентрализованный бухгалтер EVM! (прим. переводчика: bean
counter – “тот, кто скрупулезно считает каждую горошину, каждую мелочь”, используется в англ. языке в отношении бухгалтеров).
В Ethereum токены существуют на основе публичного блокчейна: вы можете создать подвалюту эфира, но эфир всегда будет
оставаться привилегированным токеном, в котором получают свою награду майнеры и выплачиваются расходы на газ. Если
вы хотите по-настоящему независимую блокчейн-сеть, вы можете создать свой собственный приватный блокчейн и
полностью отключится от основной цепочки Ethereum.
Создание подвалюты проще и удовлетворит требованиям большинства сценариев применения для любопытных
разработчиков. Если вы работаете в учреждении, заинтересованном в использовании собственного блокчейна, ничего не
бойтесь: мы обратимся к созданию вашей собственной приватной цепочки и криптоэкономике, которая будет отделенной и
отличающейся от публичной цепочки Ethereum в Главе 8.
Создание токена в тестовой сети
Вам нужно будет подключиться к тестовой сети Ropsten и освоиться с отправкой эфира в ней, прежде чем вы сможете
развернуть контракт.
Примечание
Тестовая сеть Ropsten раньше называлась Morden, поэтому вы можете по-прежнему встречать это название в старой
документации.
Запустите кошелек Mist на вашем персональном компьютере. Перейдите в меню “Дополнительно” кошелька Mist и выберите
пункт “Сеть”, который позволит вам выбрать тестовую сеть, как показано на изображении 5-2.
Как только вы начнете использовать тестовую сеть, вы должны увидеть предупреждение в браузере Mist, выделенное
красным цветом, как показано на изображении 5-3.Подключение к тестовой сети.

После подключения к тестовой сети вы увидите индикатор в пользовательском интерфейсе Mist.
Получение тестового эфира из крана
В Ethereum достаточно просто настроить сборщик (кран), который выдает искусственный эфир, вы можете использовать его в
тестовой сети Ropsten. В этом разделе вы не будете настраивать собственный кран, но будете использовать сторонний
сборщик, показанный на изображении 5-4 и доступный по адресу.
Вы также найдете актуальную на сегодня ссылку на этот кран на странице.Тестовая сеть Ethereum поставляется с функцией
для получения тестового эфира, который может быть использован при написании или отладке контрактов.
Выполните следующие шаги, чтобы получить эфир для тестовой сети из крана:
1.1. Убедившись, что ваш кошелек Mist подключен к тестовой сети, создайте адрес, если вы еще этого не сделали. Скопируйте
этот длинный шестнадцатеричный адрес (начинающийся на 0x…) в буфер обмена вашей системы, а затем вставьте его в
адресное поле:
2.2. Чтобы получить эфир, нажмите кнопку “Отправить мне 1 тестовый эфир”.
Если вы хотите протестировать передачу эфира, вы можете это сделать, отправив тестовый эфир с одного адреса в своем
кошельке Mist на другой адрес своего кошелька Mist. Для этого: вернитесь в Mist и создайте новый адрес кошелька на
домашнем экране. Вы можете использовать диалоговое окно “Отправить” для отправки эфира с одного из ваших адресов на
другой. Это будет приблизительно одинаково по скорости как для отправки эфира самому себе, так и для отправки кому-либо
на другом конце мира; в этом состоит красота распределенных систем.
В тестовой сети также есть обозреватель блокчейна, где вы можете увидеть все свои транзакции в тестовой сети. Просто
введите один из ваших адресов Mist из тестовой сети в поле поиска в нижеследующем блокчейн-обозревателе, и вы увидите
список всех транзакций: http://testnet.etherscan.io/

Теперь, когда мы поигрались с тестовым эфиром в цепочке Ropsten, давайте перейдем к следующему шагу по созданию
собственной подвалюты на основе эфира, также известной как токен, без написания какого-либо кода.
Примечание
Что разделяет тестовую сеть и основную сеть? Они являются разными цепочками. Как компьютер со множеством жестких
дисков, ваш узел Ethereum может подключаться ко многим цепочкам.
В следующем разделе вы проложите себе путь в будущее “денег-как-веб-сервиса”. Другими словами, вы будете использовать
шаблонный код для создания собственной настраиваемой системы учета и передачи ценности – вашей собственной базы
данных активов, защищенной публичной цепочкой Ethereum!
Упражнение: создайте настраиваемый токен без написания кода.
Создание собственного токена может быть выполнено примерно за 5 минут. Все, что вам нужно, это браузер Mist, который вы
загрузили в процессе чтения Главы 2, и текстовый редактор. Если вы используете macOS, Windows или Ubuntu, на вашем
компьютере есть приложение для редактирования текста, но вы также можете выбрать стороннее приложение типа Sublime
Text.
Помните, что ссылки для загрузки всех клиентских приложений Ethereum, включая Mist, можно найти по адресу.
Примечание
В этом упражнении вы создадите свой токен в тестовой сети. Вспомним, что все смарт-контракты, включая токены, стоят
денег (эфира) для развертывания в EVM. Не то, чтобы создавать токен в основной сети было опасно, но вам нужно будет
заплатить небольшое количество реального эфира, чтобы развернуть его там, а нам нет смысла тратить реальные деньги –
какой бы маленькой ни была сумма!
Если вы программировали ранее, то вы знаете, что большинство сред разработки принуждают вас работать в
интегрированном наборе приложений для создания своего приложения. В протоколе Ethereum можно писать и разворачивать
приложение, используя только текстовый редактор вашего компьютера и кошелек Mist. Довольно удивительно!
В процессе подготовки откройте кошелек Ethereum Mist. Перейдите на вкладку “Контракты” в правом верхнем углу, как
показано на изображении 5-5.
1.1. Выберите опцию “Развернуть новый контракт”, как показано на изображении 5-6.На вкладке “Контракты” вы можете
вставить и развернуть свой контракт.

Нажмите на кнопку “Развернуть новый контракт”, чтобы ввести код контракта.
2.2. Перейдите к Github-проекту этой книги и найдите документ mytoken.sol. Скопируйте код из этого файла. Он похож на код на
изображении 5-7.
Код для этого тестового проекта на Github.
3.3. Скопируйте этот код. Затем вернитесь в кошелек Mist и вставьте его в поле с надписью “Исходный код контракта на
Solidity” на вкладке “Контракты”, как показано на изображении 5-8. Убедитесь, что вы заменили все, что там есть, во время
вставки; содержимое, показанное здесь, является замещающим текстом.

Замените весь замещающий текст при вставке вашего исходного кода контракта.
4.4. Теперь код должен выглядеть так, как показано на изображении 5-9.Замените весь замещающий текст при вставке вашего
исходного кода контракта.
После того, как вы вставили код контракта, вы должны увидеть новый раскрывающийся список, он станет доступен в правой
части экрана.
5.5. Теперь вы увидите, что имя контракта автоматически загрузилось в меню справа. Оно должно иметь название “My Token”
(“Мой токен”). Выберите его. Должны появиться поля, показанные на изображении 5-10.

После того, как вы вставите код контракта, вам нужно ввести параметры вашего токена.
Примечание
Обратите внимание на светло-серый текст после каждой характеристики и вспомните наше обсуждение типов из Главы 4. Вы
увидите, что поля объем эмиссии (supply) и количество знаков после запятой (decimals) должны быть типа uint или
положительными числами; все остальное может быть строками из произвольного текста или цифр.
6.6. Далее, давайте заполним эти поля:
Объем эмиссии: сколько токенов вы хотите создать?
Имя: как должен называться токен?
Символ (тикер): используйте любой символ на клавиатуре в качестве вашего “знака доллара”
Количество цифр после запятой: сколько вам нужно суб-единиц для токена? 100 как в долларах и центах? Или 1000?
Или 10000?
7.7. Теперь, когда вы установили параметры, прокрутите страницу вниз и нажмите на кнопку “Развернуть”. Вы можете оставить
слайдер комиссии в позиции по умолчанию; все, что не будет потрачено при разворачивании вашего токена, будет возмещено.
8.8. На вкладке “Кошельки” прокрутите список до последних транзакций, и вы должны будете увидеть адрес только что
развернутого контракта.
Чтобы увидеть ваш баланс токенов, вам нужно будет “наблюдать” за этим токеном. Это тема следующего упражнения.
После того, как вы создали токен, вы можете отправить его кому-либо еще, у кого есть кошелек Mist, после того, как он
предоставит вам адрес своего кошелька. Чтобы получатель смог увидеть этот токен, вам нужно будет сообщить ему о том,
чтобы он начал “наблюдение” за ним. Более подробная информация об этих особенностях приведена ниже.
Упражнение: Наблюдение за токенами.
Будь то токен, созданный вами, или токен, созданный какой-либо крупной организацией, все токены в системе Ethereum

создаются на равных условиях. Ваш кошелек Mist будет игнорировать их, если только вы не скажете ему делать обратное. Так
же, как ваш iPhone не станет загружать каждое приложение из App Store, Mist позволяет вам искать и загружать только те
токены, которые вам нужны.
Как видно из диалогового окна “Наблюдать за контрактом” (Watch contract), показанном на изображении 5-11, для
отслеживания токена нужно немногое. Давайте углубимся.
Знание базовых вещей о токене позволяет браузеру Mist отслеживать ваш баланс в этом токене.
После того, как смарт-контракт был загружен в EVM, больше ничего не требуется для того, чтобы кто-либо из любого уголка
планеты смог получить к нему доступ. В парадигме кошелька Mist загрузка приложений не требуется, хотя код для контрактов
попадает в каждый блок и таким образом пассивно загружается на любую машину, которая майнит.
В связи с тем, что все смарт-контракты поставляются в виде сервиса и выполняются локально примерно в одно и то же время,
это похоже, как если бы на вашем компьютере уже имелся весь App Store, и вам просто нужно было бы вызвать приложение.
Подобный вызов конкретного приложения или контракта является наиболее распространенным примером использования
приложений категории токенов, которые вы сейчас изучаете. В терминологии токенов мы называем это наблюдением за
токеном. Поскольку токены являются таким распространенным и полезным способом применения смарт-контрактов, вы
найдете готовый интерфейс для наблюдения за токенами в кошельке Mist. Вот как это работает:
1.1. Вернитесь на вкладку “Контракты” в Mist.
2.2. Нажмите “Наблюдать за токеном” (Watch Token).
3.3. Вставьте адрес токена. Впишите имя токена, если оно есть.
4.4. Вам не нужно вводить что-либо в поле JSON, потому что Mist поставляется с фронтендом для токенов. Вы введете
определенные данные здесь, когда будете разворачивать специфический контракт позже в этой главе.
5.5. Нажмите на кнопку “Наблюдать”. Теперь вы должны увидеть, что баланс этого токена отображается в вашей основной
панели инструментов Mist.
Для просмотра других контрактов требуется поиск адреса контракта в блокчейн-обозревателе. Множество блокчейнобозревателей доступны для цепочки Ethereum, вы можете найти их по адресу.
В упражнениях из этой главы вы будете разворачивать контракты в тестовой сети, поэтому они не будут видимы в устаревших

версиях обозревателей. Обозреватели похожи на считыватели баз данных, а тестовая сеть – это обособленная база данных
(или цепочка), не связанная с основной сетью, в которой проводятся транзакции с реальным эфиром, и для которой большая
часть блокчейн-обозревателей предоставляют интерфейс.
Регистрация ваших токенов
Токены доступны для проверки публично, если вы зарегистрируете свои токены с помощью обозревателя блокчейна, такого
как Etherescan, и приведете их в соответствие со стандартом токенов ERC. ERC означает Ethereum Request for Comment (запрос
комментариев по Ethereum) и относится к общему соглашению под названием RFC, используемому ведущими организациями
в области технической разработки и определения стандартов для интернета.
В дополнение к документам ERC, разработка Ethereum в рамках сообщества также руководствуется Ethereum Improvement
Proposals или EIP (предложений по улучшению Ethereum). Вы можете посмотреть список всех предварительно
запрограммированных стандартизированных функций, доступных для стандартного токена, на странице.
Венчурная студия Ethereum ConsenSys также выпустила свободный и опенсорсный стандартный код смарт-контракта:
https://github.com/ConsenSys/Tokens
Оба этих URL-адреса также представлены на странице.
Развертывание вашего первого контракта
На запуске протокола Ethereum были представлены несколько стандартных контрактов, но они очень сильно устарели. К
моменту написания этой книги стандартизированы только токены, о чем свидетельствует мастер настройки токенов, который
вы использовали в браузере Mist для развертывания ваших токенов.
Однако, благодаря Гэвину Вуду, есть набор простых контрактов, выпущенных под лицензией Apache 2, с которыми вы можете
поэкспериментировать. Ниже мы развернем один из этих контрактов, но вы можете найти остальные на странице.
Хотя контракт, представленный ниже, уже не считается “стандартным”, он является полезным инструментом для обучения,
поскольку эффективно демонстрирует определенную автономность, присущую смарт-контрактам, в частности, как они могут
хранить ваш эфир и возвращать его только в том случае, если вы заранее выдадите им подобные инструкции.
Примечание
Давайте вспомним, что в Ethereum есть два типа аккаунтов: первый тип – это аккаунты смарт-контрактов, вторые – внешние
аккаунты, которые контролируются парой ключей и обычно находятся в распоряжении человека или внешнего сервера.
Если нехватка библиотек стандартных контрактов кажется вам странной, не волнуйтесь. Достаточное количество сторонних
команд создают библиотеки стандартных контрактов, некоторые из них даже специализируются на определенных областях.
Множество ресурсов, включая примеры контрактов на Solidity, лучшие практики, руководства, учебные материалы и
библиотеки контрактов перечислены на странице.
Дважды перепроверьте, что вы действительно подключены к тестовой сети, прежде чем задеплоить контракт в первый раз.
Если вы используете MacOS, Windows или Ubuntu, вы увидите меню “Разработка” (Develop) в верхней панели, как показано на
изображении 5-12 в среде Ubuntu 14.04. Также обратите внимание, что Mist может выполнять майнинг в тестовой сети. Это
позволит вам тестировать контракты локально. Подробнее об этом – в следующих разделах.
Дважды перепроверьте, что вы в тестовой сети. Упражнение: развернуть простой контракт за пять минут.

Контракт Owned – это, пожалуй, самое популярное учебное пособие по смарт-контрактам. Это связано с тем, что он
устанавливает одну из основополагающих взаимосвязей, возможных в EVM: взаимосвязь между внешним аккаунтом и
аккаунтом контракта. Не ошибитесь: эти аккаунты являются дискретными сущностями, но взаимосвязь между внешним
аккаунтом и аккаунтом контракта может быть запрограммирована.
Вспомним, что аккаунт контракта, если он неправильно запрограммирован, может потенциально запереть деньги,
отправленные в его адрес – без предоставления каких-либо средств для возврата этих денег. В контрактах нет бэкдоров, даже
для людей, которые их создают. EVM совершенно не прощает ошибок в этом плане! Вот почему мы используем тестовую сеть
и ненастоящий эфир, который мы получаем из крана, при создании контрактов в этой среде-песочнице.
Вы найдете код контракта здесь: https://github.com/chrisdannen/Introducing-Ethereum-and-Solidity/.
Из-за рискованной природы контрактов важно практиковать написание контрактов, которые вы, программист, сможете
контролировать. Исходя из этого, называемый Owned контракт учит, как написать небольшой класс для эфира, который
контролируется другим кодом на Solidity. Давайте посмотрим на owned.sol:
//! Owned contract.
//! By Gav Wood (Ethcore), 2016.
//! Released under the Apache Licence 2. pragma solidity ^0.4.6;
contract Owned {
modi er only_owner { if (msg.sender != owner) return; _; } event NewOwner(address indexed old, address indexed current); function
setOwner(address _new) only_owner { NewOwner(owner,
_new); owner = _new; }
address public owner = msg.sender;
}
Примечание
Не забудьте добавить версию Solidity (pragma) в первую строку вашего контракта перед его развертыванием. Это не является
строго необходимым, но помогает предотвратить ошибки компилятора.
Вы развернете контракт Owned мгновенно, и EVM выдаст вам адрес контракта. Как только он будет загружен в тестовую сеть,
вы сможете вставить этот адрес контракта в поле To в кошельке Mist и отправить на его адрес определенное количество
эфира для его активации. Это сделает ваш внешний аккаунт msg.sender и, следовательно, владельцем этого контракта.
Что это значит? Этот контракт будет размещен в EVM навсегда, и у него будет одна функция: он будет принадлежать человеку
или контракту, которые его вызывают, по заданному адресу. Помните, что если кто-либо другой скопирует этот контракт и
развернет его самостоятельно, он будет находиться в той же самой EVM, но будет существовать по другому адресу. Это будет
отдельный экземпляр того же самого контракта.
Один дом, разные адреса
В компьютерных вычислениях мы могли бы сказать, что два человека, которые разворачивают один и тот же контракт в
одной и той же EVM по обязательно разным адресам – это примерно то же самое, что и постройка двух домов по одному
чертежу. Они не могут занимать одно и то же физическое пространство, но являются всего лишь копиями одного класса или
чертежа, если говорить о реальной жизни.
Owned.sol – это “золотистый ретривер” среди смарт-контрактов: позови его, и он тут же прибежит и подтвердит, что вы его
владелец, – независимо от того, являетесь ли вы человеком, управляющим внешним аккаунтом, или это попросту другой
смарт-контракт, который вызывает owned.sol программным образом.

Если Алиса загружает owned.sol в EVM из Индии, к нему можно будет получить доступ как к локальному скрипту, а значит,
можно и расширить при помощи контракта, который вы загрузите в EVM из Нью-Йорка. Круто, не так ли?
В последнем развертывании – токена – вы просто вставили код на Solidity и позволили Mist выполнить свою работу. Это
круто, но слишком легко. Чтобы узнать больше, что происходит “под капотом”, давайте вручную скомпилируем код Solidity в
байт-код EVM, используя онлайн-компилятор. В качестве напоминания, вы можете найти онлайн-компилятор по адресу.
После того, как вы откроете компилятор в своем браузере, вернитесь на Github-страницу этой книги.
Давайте скомпилируем и протестируем контракт Owned. Найдите скрипт на Solidity под названием owned.sol в репозитории
Github и откройте его, чтобы выполнить следующие шаги:
Примечание
Скопируйте весь текст в файле. Он включает в себя заголовок версии pragma в верхней части, который сообщает компилятору,
на какой версии языка Solidity был написан этот контракт.
1.1. Скопируйте текст этого контракта в буфер обмена вашего компьютера (Ctrl+C в Windows или Linux и Command+C на Mac).
2.2. Вставьте свой код (Ctrl+V или Command+V) в основное текстовое поле браузерного компилятора. Если там есть образец
кода, сначала очистите это поле целиком. Вам не нужен никакой мусор в вашем прекрасном чистом контракте. Все должно
выглядеть примерно так, как показано на изображении 5-13.
Вставьте код контракта в окно компилятора в браузере.
3.3. Нажмите кнопку “Скомпилировать” (Compile), и ваш контракт начнет компиляцию. Выберите байт-код, который появится в
соответствующем поле, и скопируйте его в буфер обмена.
4.4. Вернитесь к браузеру Mist.
5.5. Повторите процесс развертывания контракта из контракта токена: в кошельке Mist перейдите на вкладку “Контракты” в
правом верхнем углу и нажмите “Развернуть новый контракт”. Вставьте свой новый байт-код в поле для байт-кода контракта.
6.6. Прокрутите страницу вниз и нажмите на кнопку “Развернуть”.
7.7. На вкладке “Кошельки” прокрутите список до последних транзакций и вы увидите адрес только что развернутого
контракта.

8.8. Пройдите через тот же путь “Наблюдение за контрактом”, который вы проходили для токена. Вставьте адрес контракта,
полученный из вашего списка транзакций и дайте контракту название “Owned”. В этот раз вы добавите немного JSON-кода в
поле.
9.9. Далее, вернитесь к браузерному компилятору Solidity и скопируйте содержимое из раздела интерфейса JSON на странице.
Это обеспечивает базовый фронтенд для вашего контракта, основанный на том, что компилятор смог собрать из вашего кода
на Solidity.
Экспериментируем с контрактами
Теперь, когда ваш контракт развернут с интерфейсом в Mist, вы можете его активировать. Чтобы вызвать контракт в EVM, вам
необязательно отправлять какое-либо количества эфира; вы можете вызвать его, просто отправив 0 эфира на адрес
контракта. Вжух, и теперь вы владелец! Если это не сработает, убедитесь, что контракт был загружен в тестовую сеть, и что
Mist, который вы используете для отправки транзакции с нулевым значением эфира, также подключен к тестовой сети.
Для контракта Owned активация – это вопрос с ответом “да” или “нет”. Вы можете вызвать его нулевым значением эфира или
100. В более сложных контрактах сумма, которую вы отправляете, имеет критически важное значение для того, как контракт
будет вести себя после вызова.
Owned – это просто ссылочный контракт, который может жить в EVM на протяжении многих лет, это центральный, публичный,
ресурсный контракт с большим количеством входящих связей.
Работая с небольшими смарт-контрактами, вы можете увидеть, как они используются поэтапно для компоновки полноценных
распределенных приложений, в основном с использованием шаблонного кода или экземпляров общего пользования,
позволяя программисту писать лишь наиболее кастомизируемые части функционала, сокращая пространство для ошибок.
Итоги Главы 5
В этой главе вы смогли развернуть два отдельных смарт-контракта. В процессе вы узнали о самом базовом приложении,
которое вы можете написать для EVM, о контракте токена. Вы также рассмотрели некоторые уникальные свойства
распределенных программ, экспериментируя с owned.sol. К настоящему моменту вы должны начать осознавать, насколько
мощным может быть протокол Ethereum, и насколько легко и просто разворачивать контракты, которые эффективно
используют мощь сети.
Далее, нам стоит узнать больше про то, как сетевая база данных EVM достигает консенсуса: процесса, известного как майнинг
по протоколу proof-of-work. Это тема следующей главы.
Примечания к Главе 5
1
Wikipedia, “Legality of Bitcoin by Country,” https://en.wikipedia.org/wiki/Legality_of_bitcoin_by_country , 2017.
2
ConsenSys Media, “Programmable Blockchains in Context: Ethereum’s Future,” https://medium.com/consensysmedia/programmable-blockchains-in-context-ethereu m-s-future-cd8451eb421e#.rwdqmpvu0 , 2015.
3
Nick Szabo, “Shelling Out: The Origins of Money,” http://nakamotoinstitute.org/shelling-out/ , 2002.
4
Armstrong Economics, “Money and the Evolution of Banking,” www.armstrongeconomics.com/research/monetary-history-of-theworld/historical-outl ine-origins-of-money/money-and-the-evolution-of-banking/ , 2016.

Создание децентрализованных приложений на блокчейн
Помощь в программировании искусственного интеллекта
Глава 6. Майнинг эфира
06.04.2018
Рубрика: Введение в Ethereum и Solidity
Автор: adminCraft
Содержание страницы
1 Глава 6
2 В чем смысл?
3 Источник эфира
4 Определение майнинга
5 Версии истины
6 Сложность, саморегуляция и гонка за прибылью
7 Сложность
8 Примечание
9 Факторы, необходимые для валидации блока
10 Как доказательство выполнения работы помогает регулировать время блока
11 Что происходит с DAG и Nonce?
12 Все это для более быстрых блоков?
13 Необходимые условия для работы быстрых блоков
14 Примечание
15 Что происходит с устаревшими блоками в Ethereum
16 Правила для блоков-дядь и вознаграждение
17 Бомба сложности
18 Схема выплаты выигрывающим майнерам
19 Ограничения по предкам
20 Обработка блока в деталях
21 Примечание
22 Расчет происхождения блоков и транзакций
23 Как используются деревья в Ethereum и Биткойн
24 Деревья Merkle–Patricia
25 Содержимое заголовка блока в Ethereum
26 Форкинг
27 Примечание
28 Руководство по майнингу
29 Примечание
30 Установка Geth на macOS
31 Установка Geth на Windows
32 Примечание
33 Установка Geth на Ubuntu 14.04
34 Запуск команд в EVM через консоль Geth
35 Примечание
36 Примечание
37 Запуск Geth с флагами
38 Заводим собственный майнер!
39 Примечание
40 Упражнение: добавление вашего имени в блокчейн
41 Упражнение: проверка вашего баланса
42 Майнинг в тестовой сети
43 Примечание
44 Майнинговые риги на GPU
45 Мульти-GPU майнинг в пуле
46 Итоги Главы 6
47 Примечания к Главе 6
Глава 6
Майнинг – это процесс, при помощи которого в сети Ethereum достигается консенсус насчет порядка транзакций в заданный
промежуток времени, что в свою очередь позволяет EVM совершать валидные переходы состояний.
В Главе 3 мы узнали многое о том, как работает EVM, однако одна из областей ее функционала – майнинг – заслуживает
отдельной главы. Майнинг важен, поскольку это процесс, посредством которого достигается консенсус в системе, и
посредством которого создается эфир. Биткойн также использует майнинг для достижения консенсуса, но то, как это работает
в Ethereum, немного отличается, ввиду его способности исполнять смарт-контракты.
В чем смысл?
В поиске чего-либо столь же идеалистичного, как EVM, мирового компьютера, который может использовать любой человек,
важно оставаться реалистичными в том, как оценивать его преимущества и недостатки. К настоящему моменту вы, возможно,
задумываетесь, сможет ли подобная высокотехнологичная (или сложная) сеть когда-либо преуспеть.
В данной главе описывается система, которая для некоторых читателей покажется неприменимой и ошеломляющей. Как бы то
ни было, как и в случае со множеством наших современных систем, важно понимать, какую проблему они решают. Продукты
могут изменяться, и конечно, протокол Ethereum (как и протокол Биткойн) будет адаптироваться и изменяться со временем.
Однако проблема доверия в человеческом обществе остается неизменной.
Важно также вспомнить, что создатели децентрализованных сетей являются криптографами в душе, заинтересованными в
одной цели: создании доступного, не нуждающегося в доверии мирового компьютера, который было бы гораздо труднее
разрушить, нежели чем создать. Процитируем Виталика Бутерина:
– Криптография имеет особенное значение в 21-м веке, поскольку криптография – это одно из немногих полей, где в конфликте
противоборствующих сторон сохраняется серьезное преимущество у защищающейся стороны. Философия шифропанка
фундаментально завязана на максимальном использовании этой ценной асимметрии в целях создания мира, в котором
автономия индивидуальности защищена лучшим образом, а криптоэкономика в некоторой степени является расширением этого,
за исключением того, что в этом случае она защищает безопасность и жизнеспособность комплексных систем, работающих на
принципах согласованных и совместных действий, а не только лишь целостность и конфиденциальность приватных сообщений.
Системы, которые считаются идеологическими наследниками духа шифропанка, должны поддерживать это основное свойство, и
их должно быть гораздо дороже разрушить или привести в негодность, чем они требуют для своего использования и поддержки.
Дух шифропанка связан не только с идеализмом; создание систем, которые легче оборонять, чем атаковать – это также просто
разумная инженерия.
Держа это в уме, давайте приступим к обсуждению майнинга и непосредственно выпуска эфира.
Источник эфира
Эфир считается нативным токеном Ethereum, поскольку он создается в процессе майнинга буквально из ничего, в качестве
платы за процесс майнинга, выполняемый компьютерами. Поскольку майнинг требует большого объема вычислений, он
генерирует крупные затраты на электроэнергию для вашего дома или офиса. Майнеры получают солидное вознаграждение.
Награды майнерам совершаются посредством увеличения баланса аккаунта, запрограммированного в функцию перехода
состояний EVM. Они выплачиваются любому рандомному майнеру, нашедшему блок. (Чтобы майнить, вам нужно передать
алгоритму майнинга адрес Ethereum для оплаты, чтобы он знал, чей баланс пополнять).
Давайте более детально рассмотрим это, начнем с некоторых определений.
Определение майнинга
В Ethereum под майнерами подразумевается обширная глобальная сеть компьютеров, управляемых по большей части
энтузиастами из их домов и офисов, с запущенными на них узлами Ethereum, которым выплачиваются токены эфира за работу
по исполнению смарт-контрактов и валидации канонического порядка транзакций по всему миру. Процесс майнинга
осуществляется каждой отдельной нодой, но термин также относится к коллективным усилиям сети: отдельные ноды майнят,
и можно сказать, что сама сеть защищается посредством майнинга.
Майнеры обрабатывают транзакции группами, называемыми блоками. Ранее мы определяли понятие блока, теоретически,
как подобранный набор транзакций, выполняемых в заданный промежуток времени. Однако, блок также можно определить
как объект данных, содержащий эти транзакции, хранящийся на узлах Ethereum. Каждый раз, когда узел запускается, он
должен загружать недостающие блоки, появившиеся за то время, пока он был офлайн. Каждый блок содержит определенные
метаданные от предыдущего блока, чтобы доказать свою аутентичность и достроить существующий блокчейн.
Сети трудно определять “правильный” порядок транзакций. Майнинговые узлы в различных частях мира могут получать
новые транзакции в неправильном порядке. На деле, существует гораздо больше неправильно сформированных блоков, чем
блоков с правильным порядком. Некоторые операторы узлов со злыми намерениями могут модифицировать свои машины
для внесения сфальсифицированных блоков в надежде, что на их аккаунты будет отправлен бесплатный эфир.
Таким образом, майнинг можно точно определить как выделенное вычислительное усилие для поддержания заданной версии
истории в качестве правильной. Процесс майнинга требователен к вычислительным мощностям узлов, поскольку он
включает в себя исполнение хеширующего алгоритма с интенсивным потреблением памяти, известного как алгоритм
доказательства работы. Алгоритм доказательства работы (или PoW-алгоритм) для протокола Ethereum – это Ethash, новая
функция, созданная ключевыми разработчиками с целью разрешения проблемы централизации майнинга, присущей Биткойн.
Иногда вы будете встречать, что этот алгоритм называется алгоритмом консенсуса Ethereum или механизмом консенсуса.
Блок, который выбирается в качестве канонического, это блок с наибольшим количеством доказательства работы, стоящим за
ним. Что это означает, станет понятно к концу данной главы; а сейчас давайте продолжим определение некоторых ключевых
понятий.
Количество вычислений, которое майнер может предоставить для сети, называется хеш-мощностью. Хеш-мощность отражает
компоненты и спецификации отдельных компьютеров – в частности, скорость, мощность и количество графических карт;
общее энергообеспечение системы компьютера; а также доступность достаточного уровня напряжения в электрической
розетке и электрическом щите, к которым он подключен.
Криптографическое доказательство, которое является результатом майнинга, может быть выполнено быстрее при
приложении большей хеш-мощности. По этой причине майнеры часто формируют майнинговые пулы для увеличения своих
шансов на получение награды, которую они затем распределяют между собой.
Теперь, когда мы определились с некоторой терминологией, давайте поговорим о том, почему майнинг вообще необходим, и
как в действительности он работает в Ethereum.
Версии истины
Чтобы понять, почему есть так много версий истории транзакций, давайте обратимся к Гэвину Вуду, который лучше всего
объясняет это в “Ethereum Yellow Paper”:

Поскольку система децентрализована и все части имеют возможность создать новый блок над каким-либо
предыдущим, уже существующим блоком, результирующая структура должна обязательно представлять собой дерево
блоков. Чтобы сформировать консенсус касательно того, какой путь, от корня (генезисного блока) до листа (блока,
содержащего самые последние транзакции) в этой древовидной структуре, называемой блокчейном, необходима
схема согласования.
Мы больше поговорим об этих древовидных структурах в последующих разделах. Сейчас просто запомните, что когда узлы
расходятся во мнении о том, какой путь от корня до листа является истинным блокчейном, то происходит форк состояния, и
как правило, это может привести к катастрофическим последствиям – эквивалент EVM, разделяющейся на две EVM. Мы
поговорим о форках позже в этой главе.
Сложность, саморегуляция и гонка за прибылью
Майнинг спроектирован приносить прибыль людям, которые им занимаются; им производятся выплаты за обеспечение
безопасности сети. Что в действительности привлекает тысячи IT-любителей и профессионалов собирать и запускать эти
машины за свой счет?
Первое, что необходимо знать, время – это движущая сила! Когда происходит запуск новой криптовалюты, майнеры спешат
запускать свои машины. Они зарабатывают на ранних этапах больше, учитывая меньшую конкуренцию за вознаграждение.
Более того, токены, принадлежащие полезным криптосетям, обычно вырастают в цене со временем своего существования,
поэтому зарабатывание этих токенов на ранних стадиях дает майнерам возможность получить прибыль за счет повышения их
рыночной стоимости.
Сложность
Ethereum и Биткойн – это саморегулирующиеся сети. Если сеть становится все более популярной, больше майнинговых хешмощностей присоединяется в поисках извлечения прибыли, и блоки могут находиться слишком быстро. Чтобы остаться в
диапазоне своего оптимального 15-секундного времени блока, динамически самоподстраивающееся значение под названием
“сложность” может увеличиваться. Если блоки находятся слишком быстро или медленно, система изменяет сложность, чтобы
оставаться в диапазоне своего оптимального времени блока.
В целом говоря, с течением времени, сложность сети увеличивается. При этом действительное значение сложности
высчитывается по формуле, которая включает несколько переменных. Сложность сети может снижаться или проседать, если
майнеры начинают обваливать сеть или если общая хеш-мощность уменьшается.
После атак на сеть Ethereum в октябре и ноябре 2016-го рыночная цена эфира упала, а хешрейт (вычислительная мощность)
снизился, поскольку майнеры, которые не могли зарабатывать прибыль, выключали свои машины. Через несколько месяцев
он вырос до уровня, предшествующего атакам, соизмеримого с повышением цены на эфир.
Можно считать эту переменную сложности частью структуры по стимулированию для быстрого привлечения майнеров в сеть,
а также, чтобы они оставались работать в ней в дальнейшем. Однако, у сложности есть и другое применение в EVM, это один
из нескольких факторов, используемый для определения счета блока, иногда называемого тяжестью блока. Самый тяжелый
(или с самым большим счетом) путь через структуру транзакционных данных можно назвать самым длинным, большая часть
майнеров со временем сходится на том, что это правильный путь, от корня до листьев.
Примечание
В Ethereum и Биткойн самая длинная или самая тяжелая цепочка считается канонической. Каждый раз, когда сеть находит
блок, она выбирает самый тяжелый блок с наибольшим счетом и платит майнеру, который предложил ее. Этот наибольший
счет является конечным результатом для блока, который поддерживается самым большим количеством доказательства
выполнения работы.
Факторы, необходимые для валидации блока
Каждый блок-кандидат, который каждый отдельный майнер производит и стремится валидировать, содержит четыре
фрагменты данных:
Хеш реестра транзакций для этого блока (который данная машина знает)
Корневой хеш всего блокчейна
Номер блока с момента запуска цепочки
Сложность данного блока
Если все эти элементы рассчитаны, данный блок является блоком-кандидатом на звание блока-победителя. Однако, даже при
наличии этой правильной информации майнер должен по-прежнему решить алгоритм доказательства выполнения работы.
Как вы узнаете, этот алгоритм по факту является игрой на угадывание, спроектированной таким образом, чтобы занимать
определенное количество времени, для достижения эталонного 15-секундного времени блока.
Если догадка является верной – это правильное значение, или nonce, становится конечным условием для признания блока
правильным, каноническим и валидным. Nonce считается подтверждением решения алгоритма доказательства выполнения
работы. Вспомните из Главы 3, что блоки, являющиеся валидными, но не каноническими блоками-победителями, называются
блоками-дядями.
Как доказательство выполнения работы помогает регулировать время блока
Любой, кто может отыскать оптимальное решение алгоритма доказательства выполнения работы, может находить валидные
блоки быстрее, что приведет к тому, что “дяди” будут отставать все больше и больше. В сети Биткойн небольшая группа
компаний-производителей аппаратных средств приобрела диспропорционально огромное количество власти над сетью за
счет создания “железа”, специально предназначенного для запуска алгоритма PoW в Биткойн. Централизация майнинговых
усилий высокоприбыльна в Биткойн, потому что она позволяет подобным крупным майнерам находить блоки быстрее,
получая все награды за блоки. Более медленные машины никогда не получают шанса найти блок, и в конечном итоге даже их
блоки-дяди остаются все больше и больше позади блока-победителя. В Ethereum блоки-дяди необходимы для поддержки
блока-победителя. Чем больше отстают “дяди”, тем сложнее становится для сети находить правильный блок, хотя эти
валидные “дяди” необходимы.
Перейдем к алгоритму Ethash: это защита протокола Ethereum от оптимизации “железа” под майнинг. Ethash является
производным от Dagger-Hashimoto, требовательного к памяти алгоритма, который нельзя забрутфорсить при помощи
кастомной интегральной схемы специального назначения (ASIC), типа тех, что популярны среди майнинговых ферм в Биткойн.
Причина, по которой этот алгоритм столь требователен к памяти, заключается в том, что он полагается на файл с
направленным ациклическим графом (DAG), который фактически представляет собой блок данных объемом 1Гб, создаваемый
заново каждые 125 часов или 30000 блоков. Этот период в 30000 блоков также называется эпохой.
Направленный ациклический граф – это технический термин для обозначения дерева, в котором каждому узлу разрешено
иметь несколько родителей: 10 уровней, включая корень, и общим количеством до 225 значений.
Что происходит с DAG и Nonce?
В действительности, каждый узел играет в игру на угадывание сам с собой, пытаясь угадать nonce, который валидирует
текущий блок; если он угадывает правильный nonce, то он выигрывает награду за блок. Если нет, то он продолжает угадывание
до тех пор, пока не узнает, что другой узел в сети нашел победителя. Затем он отбрасывает блок, который он майнил, загружает
новый блок и начинает майнить новый блок поверх этого блока. Но узел получает оба параметра игры на угадывание, как
новую пару игральных кубиков (условно говоря) с появлением каждого потенциального блока. Правила игры на угадывание
спроектированы подобным образом для предотвращения того, чтобы отдельные “хитроумные” узлы переигрывали систему в
погоне за большим количеством вознаграждений за майнинг.
В связи с изложенным вы можете считать DAG-файл способом нормирования времени решения алгоритма доказательства
выполнения работы. Он выравнивает поле для игры майнеров, но что более важно, помогает группировать время блоков
вокруг отметки в 15 секунд посредством обеспечения того, что – даже при наличии огромной вычислительной мощности
вы не можете угадать правильный nonce на порядок быстрее, чем ваши конкуренты.
Все данные, которые необходимы узлу для участия в игре с угадыванием, поступают из самого блокчейна. В криптографии
начальное значение шифрования (“seed”) может использоваться для того, чтобы помочь сгенерировать псевдослучайное
число, что увеличивает рандомизацию любых зашифрованных выходных данных, производимых алгоритмом Ethash. В
Ethereum и Биткойн каждый узел получает начальное значение (“seed”) из хеша последнего известного блока-победителя.
Таким образом, узел должен майнить в правильной, канонической цепочке, чтобы играть в эту игру правильно. Осуществление
доказательства выполнения работы над ошибочным блоком (скажем, блоком-дядей) не принесет блока-победителя. Это
полезно, если вы пытаетесь уменьшить несправедливое преимущество в схеме с доказательством выполнения работы,
которое может быть использовано крупным пулом майнеров для захвата и перевода сети на версию истинности, в которой
эфир всех держателей был бы переведен на аккаунты “хайджекеров”. Вот процесс, при помощи которого узел настраивает
себя для осуществления PoW-игры на угадывание:
1
От начального значения шифра (“seed”), полученного из заголовка блока, майнинговый узел создает 16 Мб
псевдослучайный кэш.
2
В свою очередь, этот кэш используется для генерации блока данных объемом более 1 Гб, который должен быть
одинаковым от узла к узлу; это DAG. Этот блок данных линейно растет со временем и хранится всеми полными узлами.
3
Угадывание nonce требует, чтобы машина подхватывала случайные подграфы блока данных DAG и хешировала их
между собой. Принцип работы похож на использование соли с функцией хеширования.
В криптографии фрагмент случайных данных, который вы запускаете в одностороннюю хеш-функцию, называется солью. Соли
похожи на nonce: они делают вещи более случайными, а следовательно, более защищенными.
Все это для более быстрых блоков?
Удивительно, но все эти модификации оригинальной парадигмы Биткойн были сделаны ради более быстрого времени блоков.
Время блоков всего лишь в 3-5 секунд может быть осуществимым с математической точки зрения.
И в Биткойн, и в Ethereum время блока – это эталонный период для сбора транзакций. Для чего это сделано? Система
работает на поддержание блоков в эталонном состоянии, насколько это возможно, почти как человеческое тело пытается
сохранять гомеостаз.
Протокол Биткойн ориентирован на 10-минутное время блоков, Ethereum на 15-секундное. Как только правильный блок
находится, некоторое время уходит на то, чтобы остальные узлы узнали об этом. До тех пор, пока они не прекратят работать с
брошенными блоками (“orphan block”) и не начнут майнить новый блок, они в действительности соревнуются с новым блоком,
вместо того, чтобы надстраивать над ним. Следовательно, усилия, затраченные на “сироту” (“orphan”, орфан), проходят
впустую. Подумайте об этом в следующем ключе: если задержка приводит к тому, что майнеры узнают:
новых блоках в среднем на одну минуту позже, а новые блоки поступают каждые 10 минут, то тогда вся сеть тратит
порядка 10% своей хеш-мощности впустую. Увеличение времени между блоками снижает эти потери. По мнению
некоторых теоретиков блокчейнов, Сатоши Накамото выбрал этот коэффициент, поскольку представлялось, что это
приведет к допустимому уровню потерь. Более быстрое время блоков в Ethereum является востребованным, так как
оно ускоряет подтверждение транзакций, но в архитектуре протокола Ethereum пришлось предусмотреть соизмеримое
ослабление в безопасности, связанное с более быстрым временем блоков, как вы узнаете далее в этой главе. Время
блока можно сравнить с расчетным временем в торговле ценными бумагами, которое в США составляет три дня после
даты совершения сделки, также известной как T+3. Комиссия по ценным бумагам и биржам США рассматривает
возможность ускорения расчетного времени до T+2.
В Биткойн, в котором нет исполнения смарт-контрактов, блоки в среднем занимают условные 10 минут, но в реальности,
транзакции обрабатываются столь быстро лишь в 63% случаев. Порядка 13% случаев для получения подтверждения
транзакции уходит более 20 минут. За это время можно обратить транзакцию в порядка 20% случаев.
В то время, как для Биткойн-энтузиастов и организаций это может быть всего лишь досаждающим фактором, эти условия
неприемлемы для платформы смарт-контрактов, предназначенной для управления распределенными программными
приложениями, поэтому Ethereum использует немного иной подход к майнингу с целью достижения более быстрого времени
блоков.
Необходимые условия для работы быстрых блоков
Мы уже обсуждали, что более быстрое время блоков желательно, если учитывать пользовательский опыт. Однако, оно может
также вызывать нежелательные эффекты.
Поскольку узлы располагаются по всему миру, для них трудно сохранять идеальную синхронизацию. Это связано с тем, что
перемещение информации от узла к узлу в Интернете занимает определенное время, также известное, как задержка.
Несмотря на то, что это время может казаться несущественным с точки зрения человека, этого достаточно для создания
коллизий в записи транзакций, в которых баланс не будет сходиться.
В среднем, занимает порядка 12 секунд, чтобы транзакция распространилась по сетям Ethereum или Биткойн; в
действительности, большая часть этого времени расходуется на загрузку транзакций на узел.
Между тем, пока узел узнает о новом найденном блоке, майнер может продолжать некоторое время работать над старым
блоком до того, как он откажется от него в пользу нового победителя. Как объяснялось в предыдущем разделе, “дяди”, над
которыми совершается майнинговая работа после того, как валидный блок уже найден где-либо еще в сети, называются
устаревшими или не имеющими наследника блоками.
Более быстрое время блоков создает более высокую вероятность устаревших блоков, а устаревшие блоки снижают
абсолютную устойчивость сети перед атаками. Что еще хуже, более высокий процент устаревших блоков облегчает
майнинговым пулам добиваться преимущества за счет эффективности в производительности по сравнению с соломайнерами, систематически переигрывая их в получении наград. В лучшем случае, это несправедливо, в худшем случае, это
снижает стоимость атаки на сеть.
Примечание
Устаревшие блоки иногда называют блоками-сиротами в Биткойн, хотя эта формулировка может приводить в
замешательство. Над подобными устаревшими блоками не надстраиваются никакие новые блоки – нет дочерних блоков – но
у них может быть полностью валидный заголовок блока. При этом, орфаны по факту имеют “родительские” блоки.
Что происходит с устаревшими блоками в Ethereum
В Ethereum, как уже было отмечено, орфаны или устаревшие блоки имеют еще одно название: их называют “дядями”, и они
засчитываются в счет или вес блока. То, как это происходит в протоколе Ethereum, похоже на скоринговую систему на базе
блокчейна, предложенную в протоколе GHOST, которая была описана в работе Авива Зохара и Йонатана Сомполинского в
декабре 2013-го года.
Виталик Бутерин объясняет, как он адаптировал идею GHOST для Ethereum, и как она отличается от Биткойн:
– Идея состоит в том, что даже несмотря на то, что устаревшие блоки на текущий момент не идут в счет общего веса цепочки,
они могли бы засчитываться; исходя из этого, они предлагают скоринговую систему на базе блокчейна, которая берет
устаревшие блоки в расчет, даже если они не являются частью основной цепочки. В результате, даже если основная цепочка
эффективна на 50% или даже на 5%, атакующему, пытающемуся реализовать атаку 51%, по-прежнему нужно будет преодолеть вес
всей сети. Это, в теории, решает проблему эффективности вплоть до 1-секундного времени блоков. Однако, есть следующая
проблема: протокол лишь включает устаревшие блоки в подсчет блокчейна; он не присваивает наград за устаревшие блоки.
Правила для блоков-дядь и вознаграждение
Ниже следуют правила для блоков-дядь:
В Ethereum-реализации GHOST “дяди”, которые валидированы вместе с блоком, получают 7/8 от статической награды
за блок, или 4,375 эфира.
Разрешено максимум два “дяди” на блок.
Эти две позиции выигрываются по принципу “первым поступил – первым зачтен”
За блоки-дяди не собирается и не выплачивается транзакционная комиссия, так как пользователи оплачивают эти
расходы один раз в валидном блоке, который в действительности исполняет их команды.
Крайне важно, чтобы быть достойным вознаграждения, блок-дядя должен иметь общего предка с правильным блоком
не далее семи последних поколений.
Данная реализация GHOST решает проблему потери в безопасности за счет включения блоков-дядь в вычисление, за каким
блоком стоит наибольшее общее доказательство выполнения работы. Награды за “дяди” предназначены для решения второй
проблемы, централизации, за счет платы майнерам, вкладывающимся в безопасность сети, даже если они не предлагают
блока-победителя.
Бомба сложности
Стоит упомянуть, что протокол GHOST (даже в том виде, в котором он адаптирован для Ethereum) является предметом
определенной критики. Несмотря на то, что его слабые места известны, в целом они рассматриваются как не представляющие
опасности. Исправление реализации GHOST в любом случае может не быть целесообразным, поскольку он станет
устаревшим, когда протокол Ethereum уйдет от доказательства выполнения работы к так называемому алгоритму консенсуса
доказательства доли владения (PoS).
Одна из причин, почему криптовалюты имеют ценность на рынке, заключается в том, что их выпуск ограничен. Сегодня 12,5
биткойнов присуждаются за блок (то есть, каждые 10 минут). Эта ставка будет сохраняться до середины 2020-го года, когда
6,25 биткойнов будут присуждаться за каждый блок. Награды уменьшаются вдвое подобным образом каждые четыре года
приблизительно до 2110-40-х годов, когда будет выпущен 21 миллион биткойнов.
Ethereum достигает своего ограничения по выпуску за счет запланированного полного завершения периода доказательства
выполнения работы. Эффективный майнинговый период в Ethereum подойдет к завершению в 2017-2018 году, когда система
Ethereum произведет переход; одно из крупнейших преимуществ доказательства доли владения (или PoS) заключается в том,
что оно не требует майнинга (и сопутствующих затрат на электроэнергию) для достижения консенсуса.
В целях выполнения данного перехода и одновременного ограничения периода выпуска эфира ключевые разработчики
создали бомбу сложности, которая делает доказательство выполнения работы все менее и менее целесообразным начиная со
второй половины 2017-го, перед тем как в итоге он станет полностью невозможным в 2021-м году.
Как будет работать эта новая система доказательства доли владения, является предметом большого количества
исследований и дебатов в сообществе. Чтобы почитать о проводимых в этой области исследованиях, перейдите к Главе 11.
Схема выплаты выигрывающим майнерам
Успешный майнер, добывший блок-победитель, получает единовременную выплату, плюс транзакционную комиссию, плюс
долю премии за все блоки-дяди, которые помогли ему в победе. Таким образом, можно сказать, что награды в протоколе
Ethereum определяются следующим образом:
1
Установленная награда за блок составляет 5 эфиров (для майнера, который находит блок-победитель)
2
Выплаты за газ, потраченный в блоке (для майнера, который находит блок-победитель)
3
1/32 эфира за блок-дядю данного блока (для майнеров, которые находят блоки-дяди)
Ограничения по предкам
Часть протокола, требующая, чтобы “дяди” находились в пределах 7 блоков от блока-победителя для получения части награды,
существует для того, чтобы “забывать” историю блоков после небольшого количества блоков (прим. переводчика: автор
расплывчато излагает свою мысль, перевод дословный, “как есть”). Число 7 было выбрано, потому что это предлагает
приемлемое количество времени для майнера на поиск блока-дяди, но не настолько большое, чтобы оно накладывало риски
централизации.
Обработка блока в деталях
Чтобы не стать блоком-дядей и превратиться в самый тяжелый блок, правильному блоку (иногда называемому
“племянником”, “nephew”) нужно пройти проверку из длинной последовательности шагов, используемую в обработке каждого
блока. Важный компонент данного процесса – это алгоритм валидатора блоков. Этот алгоритм стремится валидировать хеш,
который поступает с блоком, расположенный в заголовке блока. Этот аспект обработки блоков обеспечивает быстрое
знакомство с анатомией блока как объекта данных.
Примечание
В программировании структуры данных часто имеют заголовок, содержащий определенную обязательную информацию,
которую компьютер сначала должен прочитать. Как и в текстовых процессорах для людей, заголовок – это всего лишь
верхняя часть текста. По этой аналогии, тело текста
это блочная структура данных.
Перед тем, как завершенный блок может подвергнуться обработке и принятию всей сетью, и перед тем, как узлы смогут
начать майнинг поверх нового блока, все до единого узлы должны независимо загрузить и валидировать блок, чтобы начать
майнить поверх него. Здесь представлены все шаги, которые проходит алгоритм валидатора блоков, по порядку:
1
Проверяет, что предыдущий блок, к которому идет отсылка, существует и что он валиден.
2
Проверяет, что временная метка блока превышает временную метку предыдущего блока, на который идет отсылка, и
не превышает 15 минут в будущее.
3
Проверяет номер блока, сложность, корень транзакций, корень “дяди” и лимит газа (различные низкоуровневые
Ethereum-специфические данные) на валидность.
4
Проверяет nonce блока на валидность, доказывая наличие признаков доказательства выполнения работы
5
Вносит все транзакции в этом теперь уже валидированном блоке в состояние EVM. Если выдаются какие-либо ошибки,
или суммарный газ превышает GASLIMIT, возвращает ошибку и откатывает изменение состояния.
6
Добавляет награду за блок в финальное изменение состояния.
7
Проверяет, чтобы финальное состояние корня дерева Меркла равнялось корню финального состояния в заголовке
блока.
Только после этих семи шагов блок канонизируется как валидный и правильный!
Зачем нужно столько хлопот с заголовком блока? Для создания блокчейна теоретически возможно создать заголовки блоков,
которые бы сразу содержали данные о каждой транзакции, но это приведет к трудностям в масштабируемости и потребует
чрезвычайно мощного “железа” для работы узла.
В Биткойн и Ethereum структура данных под названием дерево Меркла используется, чтобы избежать размещения каждой
единичной транзакции в заголовке, что было бы громоздко и тяжеловесно. Ethereum добавляет структуру данных,
представляющую состояние EVM, называемую деревом состояний. Глобальное состояние представлено в блоке Ethereum
другой древовидной структурой под названием Patricia-дерево. Эти три структуры являются предметом следующего раздела.
Расчет происхождения блоков и транзакций
Чтобы понять, что находится в заголовке блока и почему содержимое заголовка блока важно для определения самой длинной,
тяжелой цепочки, нам нужно сделать шаг назад и выяснить, как компьютеры хранят данные – и как они занимаются
изменением этих данных после их сохранения.
Во-первых, роль древовидных структур заключается в том, чтобы помочь узлу верифицировать данные, которые он получает в
блоки, такие как реестр транзакций. Во-вторых, их роль в том, чтобы делать это быстро, так чтобы какие угодно компьютеры
могли считывать блокчейн быстро.
В науке о вычислениях ассоциативный массив (или словарь) – это набор пар вида ключ/значение. Вспомните концепцию пар
ключ/значение из обсуждения объектов данных в Главе 1. В ассоциативном массиве ассоциация между ключами и
значениями может изменяться. Эта ассоциация называется связыванием (“binding”).
Операции, связанные со словарями, включают следующее:
Добавление пар ключ/значение в набор
Удаление пар из набора
Модификация существующих пар
Поиск значения, ассоциированного с заданным ключом
Хеш-таблицы, деревья поиска и другие специализированные древовидные структуры являются общими решениями проблемы
словаря, где словарь – это общий термин для базы данных с записями. Решение проблем словарей включает методы по
запросу ключа (слово) и вызова его значения (определение).
Как используются деревья в Ethereum и Биткойн
В математике под деревом понимается упорядоченная структура данных, используемая для хранения ассоциативного массива
из ключей и значений. Базисное дерево (“radix tree”) – это сжатое дерево, требующее меньше памяти. В обычном базисном
дереве каждый символ в ключе описывает путь через структуру данных, по которому можно попасть к соответствующему
значению, как набор указателей.
Создание дерева Меркла требует совместного хеширования большого количества фрагментов транзакционных данных до тех
пор, пока они не превратятся в одно целое: корневой хеш. В Ethereum и Биткойн структура дерево Меркла используется для
записи реестра транзакций в каждый блок. Корень дерева Меркла хешируется с другими метаданными и включается в
заголовок последующего блока. Таким образом, можно сказать, что каждая дополнительная транзакция (внутри каждого
блока) необратимо меняет корень Меркла; даже одна ошибочная транзакция полностью изменит корневой хеш, а
следовательно, сделает его неправильным. Именно так блоки могут доказать свое законное происхождение алгоритму
валидатора блоков, который является частью общей процедуры обработки блоков.
Для клиента Биткойн определить статус отдельной транзакции очень просто – нужно просмотреть заголовок самого
последнего блока в основной цепочке. В нем клиент должен найти доказательство Меркла, демонстрирующее, что корневой
хеш блока содержит транзакцию в одном из своих деревьев Меркла. Корень Меркла – это отпечаток всех транзакций, в
правильном порядке, которые были проведены в блокчейне вплоть до заданного блока.
Деревья Merkle–Patricia
Благодаря заголовку блока узел может быстро и легко найти, прочитать и верифицировать данные блока. В Биткойн заголовок
блока – это 80-байтный фрагмент данных, включающий корень Меркла, а также пять других вещей. Заголовок блока Биткойн
содержит:
Хеш заголовка предыдущего блока
Временную метку
Значение сложности майнинга
Nonce доказательства выполнения работы
Корневой хеш дерева Меркла, представляющий транзакции в данном блоке.
Деревья Меркла идеально подходят для хранения реестров транзакций, но на этом и все. С позиции EVM одно из ограничений
дерева Меркла заключается в том, что хотя оно и может доказать или опровергнуть включение транзакций в корневой хеш,
оно не может доказать или запросить текущее состояние сети, например, средства заданного аккаунта пользователя.
Содержимое заголовка блока в Ethereum
Чтобы исправить этот недостаток и позволить EVM запускать контракты с сохранением состояний, каждый заголовок блока в
Ethereum содержит не только одно дерево (транзакций) Меркла, а три дерева для трех видов объектов:
Дерево транзакций
Дерево квитанций (данные с результатами по каждой транзакции)
Дерево состояний
Чтобы сделать это возможным, протокол Ethereum комбинирует дерево Меркла с другой структурой дерева, которую мы
упоминали ранее, дерево Patricia. Эта структура дерева полностью детерминирована: два дерева Patricia с одинаковыми
связками (ключ/значение) всегда будут иметь один и тот же корневой хеш, обеспечивая повышение производительности для
таких типовых операций баз данных, как добавление, поиск и удаление.
По этой причине клиенты Ethereum могут получать верифицируемые ответы на все виды запросов, которые они отправляют в
сеть, такие как:
Была ли транзакция X включена в блок? (обрабатывается деревом транзакций)
Сообщи мне обо всех событиях Y за последние 30 дней (обрабатывается деревом квитанций)
Каков текущий баланс аккаунта Z? (обрабатывается деревом состояний)
Больше информации о том, как эти структуры деревьев работают и почему они были выбраны, находится по адресу.
Форкинг
Как уже описывалось в этой главе ранее, сеть майнеров может быть разделена на две, если они не могут согласиться о самой
длинной, тяжелой цепочке. В криптовалютном сообществе есть множество затруднений, связанных с форкингом, поскольку
он влечет за собой разделение сообщества участников наряду с утерей консенсуса в сети машин.
На практике, появление форков случается постоянно. Иногда одна из ветвей умирает, иногда умирают обе ветви, а иногда одна
из ветвей живет до тех пор, пока не произведет “племянника”, блок-победитель. Форк происходит, когда два валидных блока
имеют одного родителя, но часть майнеров видят один из этих блоков, другая часть майнеров видят другой. На деле это
создает две версии “истинности”, что приводит к тому, что эти две группы более не находятся в одной сети.
Примечание
Форк состояния – это значительно более серьезное событие, чем форк протокола. При форке протокола никакие данные не
изменяются, но майнеры могут отрегулировать параметры или обновить код на своих узлах, чтобы они начали работать по
модифицированной спецификации, которую сообщество условилось считать всеобщим улучшением. Таким образом, форки
протоколов можно считать делом добровольным, в то время как в случае с форками состояний это необязательно так.
В Ethereum эти постоянно зарождающиеся форки разрешаются в пределах четырех блоков, для математической
достоверности, поскольку одна цепочка находит победителя, становится длиннее и начинает “подтягивать” другие узлы к нему,
создавая не только стимулы в виде вознаграждения для майнеров за поиск и добычу правильного блока, но и все
дополнительные стимулы получения наград за блоки-”дяди”.
Иногда узел будет находить “правильную” цепочку уже после получения награды за 1-3 блока. Как только узел переходит к
более хорошей, длинной, с большими шансами на победу, цепочке, эта награда за майнинг может исчезнуть. Однако, все это
происходит в пределах четырех блоков – а это одна минута – поэтому подобные небольшие ошибки считаются не очень
серьезными.
Преднамеренные форки обычно деплоятся атакующими с целью осуществления атаки двойного расходования средств: чтобы
делать деньги из ничего путем одновременной отправки одного баланса на множество аккаунтов.
По факту, любой, у кого есть более 50% хеш-мощности, может породить “вредоносный” преднамеренный форк, если так можно
выразиться. При атаке двойного расходования атакующий, управляющий парком майнеров, с большим количеством хешмощности, отправляет транзакцию с эфиром для заказа товара. После приобретения товара атакующий “помещает” в
ошибочный блок вторую транзакцию. Эта вторая транзакция пытается отправить те же самые средства обратно в адрес
атакующего. Он или она затем создает блок на уровне блока, который содержал оригинальную транзакцию, но содержащий
вторую транзакцию взамен, и выделяет всю возможную хеш-мощность на майнинг форка. Если у атакующего есть более 50%
хеш-мощности, двойное расходование будет гарантированно успешным в некоторых случаях при любой глубине блока. При
менее, чем 50% хеш-мощности вероятность успеха гораздо меньше. Но подобной атаки по-прежнему опасаются настолько, что
на практике большая часть бирж и других организаций, которые работают с эфиром, ожидают нескольких подтверждений
перед тем, как считать трансфер завершенным.
Руководство по майнингу
Майнинг – это отличный повод для того, чтобы опробовать Geth. Поскольку Geth является великолепным инструментом для
изучения и его достаточно просто установить, этот раздел содержит инструкцию по его установке на macOS, Windows и Ubuntu.
Примечание
Помимо установки, приведенные далее упражнения предполагают, что вы работаете в *nix-окружении – то есть, работаете в
приложении Терминала либо в macOS, либо в Ubuntu 14.04 (Trusty). Ссылки на документацию и учебные материалы по Geth, а
также инструкции для всех клиентов Ethereum на всех платформах, находятся по адресу.
Установка Geth на macOS
Во-первых, запустите Терминал на вашем Mac, он находится в папке “Программы”. Далее, наберите следующее в командную
строку:
brew update brew upgrade
После того, как обновление завершится и вернется командная строка, наберите следующее:
brew tap ethereum/ethereum brew install ethereum
Установка Geth на Windows
Скачайте последний стабильный билд. Извлеките geth.exe из ZIP-файла, откройте командную строку и наберите следующее:
chdir open geth.exe
Знакомство с командной строкой
После установки Geth на Ubuntu (будет описано далее), вы перейдете к нескольким упражнениям. Эти упражнения
подразумевают использование приложений Терминала macOS или Ubuntu. Команды Geth под Windows мы не будем обсуждать,
однако их можно найти по адресу.
Следующее руководство написано для людей, возможно, впервые использующих командную строку. Если это про вас, то вам
нужно сразу же обратить внимание на несколько вещей.
Когда вы впервые запускаете приложение Терминала, расположенное в папке “Программы” в macOS и Ubuntu, вы увидите
мигающий курсор. Это указывает на то, что компьютер готов к получению инструкций.
Примечание
При работе с этим интерфейсом компьютер работает “узконаправленно”. Когда вы набираете команду, для ее завершения
может потребоваться несколько секунд. За это время по экрану будет “пролетать” текст. Не волнуйтесь; это нормально. Вы не
сможете сломать свой компьютер, экспериментируя с Geth или командной строкой.
Установка Geth на Ubuntu 14.04
Для установки Geth на Ubuntu для начала запустите Терминал и наберите следующее, затем нажмите Enter:
sudo apt-get install software-properties-common
Одно предупреждение касаемо данной инсталляции, зависящее от конфигурации “железа”, заключается в том, что некоторым
пользователям Ubuntu может потребоваться установить библиотеку шрифтов, или установка Geth выдаст ошибку. Вы сможете
найти данную библиотеку по адресу: https://community.linuxmint.com/software/view/ttf-ancient-fonts или http://clients.eth.guide/.
Ошибка показана на Изображении 6-1.
Некоторые пользователи Ubuntu могут столкнуться с этой ошибкой.
Просто установите этот пакет шрифтов и дела пойдут нормально.
Далее, наберите следующее:
sudo add-apt-repository -y ppa:ethereum/ethereum
Программа предложит создать пароль. Он может не появиться на экране при вводе, возможно, это будет выглядеть так, будто
он вообще не вводится, но не обращайте на это внимания и нажмите “Enter”. Вы должны увидеть результат как на Изображении
6-2.
Введите свой пароль для завершения установки, и вы увидите следующий результат.
Подстановка sudo перед терминальной командой предназначена для запуска команд с правами пользователя root, это тип
учетной записи в Unix-архитектуре с максимально полными привилегиями, с доступом ко всем файлам и командам. Далее,
введите следующую команду и нажмите “Enter”:
sudo apt-get update
Затем наберите очередную команду и нажмите “Enter”:
sudo apt-get install ethereum
Введите пароль администратора компьютера, возможно, это тот пароль, который вы используете для авторизации во время
загрузки операционной системы. Когда программа спросит, разрешаете ли вы занять определенное место на жестком диске
для установки, нажимаете Y (“Да”) и “Enter”.
Далее, давайте запустим Geth. После завершения установки вы можете запустить Geth, набрав его название в строке с
приглашением на ввод команд:
geth
Вы увидите, что по экрану проносится какой-то код, как на Изображении 6-3.
Синхронизация Geth.
Это будет продолжаться вечно, если вы позволите. Нажмите Ctrl+C, чтобы остановить синхронизацию, и вас перекинет
обратно в командную строку. Теперь вы вышли из Geth.
Что же здесь происходит? Geth не занимается майнингом, но он синхронизируется с блокчейном, загружая последние блоки.
Это делается с целью показать вам актуальный баланс на ваших аккаунтах, а также для быстрой отправки и получения
транзакций, как в Mist. По факту, Mist также выполняет эту синхронизацию, помните? Это выглядит как на Изображении 6-4.
Когда Geth синхронизируется, он выполняет ту же операцию, что и кошелек Mist, изображенный здесь.
Однако, Geth достаточно прост; он может выполнять только одну операцию за раз: синхронизацию. Вы не сможете запустить
какой-либо EVM-код из него. Для получения определенного контроля вам нужно воспользоваться встроенной JavaScriptконсолью, которая позволяет запускать команды напрямую в EVM через Терминал на вашем компьютере. Насколько это
удобно?
Запуск команд в EVM через консоль Geth
Для запуска многих основных функций в сети Ethereum можно использовать команды Geth в Терминале. Шаблон для запуска
Geth команд следующий:
geth [параметры] команда [параметры команды] [аргументы…]
Полный список команд, параметров и аргументов можно найти по адресу.
Однако, поскольку самым главным потенциалом сети Ethereum являются по-настоящему распределенные приложения, мы
сфокусируемся на использовании Ethereum JavaScript API через консоль, которую можно запустить в Geth. Консоль в
действительности – это JSRE, или среда выполнения JavaScript, которая работает внутри Geth. Ethereum JSRE предоставляет
полноценный Web3.js JavaScript dapp API, который более подробно описывается в Главе 8. JSRE можно использовать активно
(через консоль) или без интерактивного взаимодействия (при помощи написанных скриптов).
В дополнение к dapp API, Geth также поддерживает целое множество API управления для удаленного управления вашим
Ethereum-узлом. Например, персональные и администраторские API, которые предоставляют методы для получения доступа в
файловую систему, запуска команд и удаленного мониторинга вашего узла. Эти API соответствуют тем же установленным
архитектурным требованиям, что используются в dapp API. Вы можете узнать больше об API управления по адресу.
Примечание
Одновременный запуск Geth и Mist вызовет ошибку. На одном узле можно запускать только один сетевой демон.
Чтобы запустить Geth в консольном режиме, наберите следующее:
geth console
Если у вас уже работает и синхронизируется Mist, вы можете указать Geth использовать узел Mist для подключения, запустив
Geth при помощи следующей команды. Это избавляет вас от необходимости ожидания, пока Geth синхронизирует все заново,
если на вашей машине уже локально хранится большая часть блокчейна:
geth attach
Вы можете вызывать консоли и подключать их к процессу Geth одна за другой. Почему это может пригодиться? Вы можете
начать использовать JavaScript-консоль в Geth незамедлительно, если у вас запущен полностью синхронизированный клиент
Mist. Сейчас это не имеет особого значения, но если бы вы отправляли и получали реальные транзакции в публичном
блокчейне через Geth, вам пришлось бы ожидать, пока он синхронизируется, чтобы запросы баланса возвращали корректные
результаты.
Ниже мы будем использовать некоторые вызовы JavaScript API в консоли. Полное руководство по этим вызовам здесь.
Далее, мы изучим, как работать с аккаунтами и балансами при помощи вызовов некоторых JavaScript-методов в
интерактивном режиме. Чтобы узнать больше об использовании JSRE не в диалоговом режиме, посетите страницу.
Примечание
Эти команды Geth обращаются к основной сети. Вспомните, что в тестовой сети используется ненастоящий эфир, который
можно использовать для экспериментов, в то время как для работы с основной сетью необходимо приобрести эфир в
обменнике. Намайнить его – непростой способ обзавестись эфиром в наши дни, но тем не менее, мы попробуем сделать это
ради развлечения.
Ваш клиент Geth должен работать с запущенной консолью и приглашением к вводу команд. Давайте создадим аккаунт,
используя вызов JavaScript API. Придумайте пароль. В консоли наберите следующее, затем нажмите “Enter”:
personal.newAccount(“здесь_пароль_вашего_нового_аккаунта”)
Замените текст в кавычках на выбранный пароль. Ваш основной аккаунт
это по умолчанию аккаунт 0. Вам будет возвращен открытый ключ, зеленым цветом, как показано на Изображении 6-5.
Создание нового аккаунта в JavaScript-консоли вряд ли может быть проще. Ваш новый открытый ключ отображается зеленым
цветом. Не забудьте свой пароль!
Вы можете проверить все свои аккаунты через консоль, набрав следующую команду:
personal.listAccounts
Понятно, что по запросу баланса будет возвращен ноль. Но вне зависимости от этого: закрытый ключ для этого нового
аккаунта будет храниться вместе с другими закрытыми ключами, которые вы создаете, в той же самой директории, о которой
мы говорили в Главе 2; любое значение, которое вы добавляете здесь, будет бэкапиться, когда вы бэкапите другие свои
закрытые ключи. Чтобы изучить, как этот процесс работает, перейдите по этой ссылке: http://backup.eth.guide
Вернемся к началу данного раздела, к описанию Geth JSRE как шлюза в Ethereum JavaScript API. Этот API является частью
библиотеки Web3.js, которая должна быть установлена на машину, чтобы вы могли воспользоваться множеством различных
команд. Она доступна как модуль Node Package Manager (NPM), пакет Meteor.js и в других формах. Вы можете узнать больше об
этой библиотеке по ссылке: https://github.com/ethereum/web3.js/
Полный список вызовов JavaScript Dapp API можно найти здесь: http://js.eth.guide
Или ознакомиться с Ethereum JavaScript API: https://github.com/ethereum/wiki/wiki/JavaScript-API
Для разработчиков с имеющимися навыками в области JavaScript, JS-консоль в Geth может быть более интуитивно понятна,
чем написание скриптов на Solidity с использованием глобальных переменных и функций, описанных в Главе 4. Объект web3
обеспечивает доступ ко всем видам методов, которые покажутся знакомыми JavaScript-разработчикам. Потратьте немного
времени на внимательное изучение вики по консоли, чтобы составить представление о скриптах, которые вы можете
запускать локально на вашей машине, чтобы автоматизировать действия, производимые в Geth. Далее, вы узнаете, как
попасть в тестовую сеть при помощи Geth, и наконец, вы запустите свой собственный майнер в основной сети и даже
попытаетесь намайнить в ней блок со своей собственной настраиваемой подписью.
Запуск Geth с флагами
Еще один способ работы с командной строкой Geth – это запуск Geth с определенными флагами. Полный список параметров и
соответствующие им флаги, находится здесь.
Чтобы запустить Geth для тестовой сети, наберите следующее:
geth –testnet
Вы увидите текстовый вывод, типа того, что приведен на изображении 6-6, за исключением того, что этот майнинг выполняется
в тестовой сети. Нажмите Ctrl+C, чтобы остановить его.
Быстрый доступ к параметрам CLI по данной короткой ссылке: http://cli.eth.guide
Вывод из тестовой сети.
На момент написания этой книги сложность сети была достаточно высокой, и поиск блока может занимать очень много
времени для соло-майнеров.
В следующем разделе мы начнем майнить на адрес нашего созданного кошелька, чтобы составить правильное представление
об опыте майнеров, защищающих сеть.
Заводим собственный майнер!
Geth не запускает майнинг автоматически; для старта или остановки майнинга вам нужно отдать ему команду. В следующих
примерах вы будете майнить при помощи процессора вашего ПК. Майнинг с помощью графического процессора более
эффективен, но немного более сложен, и он больше подходит для специализированных майнинговых ригов. Мы обсудим их
позже в этой главе.
Чтобы начать майнинг в основной сети, откройте окно Терминала и войдите в JavaScript-консоль, набрав команду:
geth console
Вы увидите, что узел начнет синхронизацию, но он быстро вернет приглашение командной строки, чтобы вы могли вводить
команды, поскольку Geth работает в фоне.
Примечание
Не волнуйтесь, если выводимый текст от процесса майнинга или синхронизации появляется в консоли, вклиниваясь в ваши
команды; выходные данные просто появляются подобным образом. Если вы нажмете “Enter” в консоли, то ваша команда
исполнится, как положено, даже если будет казаться, что она разбилась на несколько строк.
Чтобы получить вознаграждение за майнинг, вам нужно будет сообщить вашему узлу адрес в Ethereum для получения на него
выплат за майнинг. Помните, что поскольку EVM – это глобальная виртуальная машина, ее не волнует, был ли создан Ethereumадрес или открытый ключ, который вы вводите, на вашем локальном ПК, или что он на текущий момент связан с вашим
локальным компьютером. Для EVM все подобные вещи являются локальными.
Чтобы назначить ваш аккаунт etherbase в качестве адреса для получения выплат, наберите эту команду в консоли:
miner.setEtherbase(eth.accounts[ваш_адрес_здесь])
Чтобы наконец приступить к майнингу, наберите следующее:
miner.start()
Готово! Ваш майнер начнет работу. Если внезапно вы найдете блок, оплата будет получена на адрес, который вы установили
выше, но не удивляйтесь, если это займет дни и даже недели. Вы увидите, как узел генерирует DAG-файл и начинает
майнинговый процесс, как показано на Изображении 6-7. Почему майнинг эфира не приносит моментальную прибыль? Как вы
узнаете ниже, это во многом связано с вашим “железом”.
Майнер готовится приступить к майнингу Вы можете остановить этот процесс, набрав команду:
miner.stop()
Далее, вы будете ставить персональный тег на блоки, которые майните.
Упражнение: добавление вашего имени в блокчейн
Используя JavaScript-консоль, вы можете добавлять дополнительные данные – суммарные 32 байта, этого достаточно для
написания некоторого открытого текста или ввода некоторого шифрованного текста, чтобы кто-либо другой смог его
прочитать.
Необходимо остановить ваш майнер в консоли. Теперь наберите следующую JavaScript-команду с вашим именем или
сообщением в кавычках:
miner.setExtra(“Мое_сообщение_здесь”)
Далее, следующее:
miner.start()
Консоль вернет значение true и начнет майнинг. Если вы найдете блок, он будет помечен вашей подписью, которую вы можете
просмотреть в любом обозревателе блокчейнов, типа Etherchain.
Упражнение: проверка вашего баланса
Установите библиотеку Web3.js способом, который был описан в предыдущем разделе, чтобы поэкспериментировать с
некоторыми вызовами Ethereum JavaScript API. К ним относятся: проверка баланса, отправка транзакции, создание аккаунта и
всевозможные другие математические, связанные с блокчейном функции. Если ваш закрытый ключ от etherbase хранится на
вашей машине, к примеру, вы можете узнать баланс, набрав в консоли команду:
eth.getBalance(eth.coinbase).toNumber();
Будем надеяться, что к настоящему моменту у вас сложилось реальное представление о майнинге, и вы увидели его на деле
собственными глазами. В действительности, самый эффективный способ увидеть, как майнинг приводит в движение переход
состояний посредством исполнения транзакций, это работа с тестовой сетью.
Майнинг в тестовой сети
Одно небольшое примечание касаемо майнинга. Вспомните из Главы 5, что кошелек Mist может майнить в тестовой сети, но не
может этого делать в основной сети. Вопрос: почему?
Вообще говоря, для Mist нет необходимости майнить в основной сети и занимать ресурсы вашего компьютера, потому что
ваши контракты будут исполняться и без майнинга с вашей стороны. Так происходит, поскольку на текущий момент есть
тысячи узлов, которые уже майнят в публичной цепочке Ethereum, и за это они получают реальный эфир.
Примечание
Если ваши контракты не исполняются в тестовой сети, не злитесь! Запустите ваш майнер тестовой сети Mist или Geth, и ваши
контракты будут исполнены. Это распространенная ошибка.
На момент, когда вы тестируете свои контракты, в тестовой сети могут случайно оказаться другие майнеры, но их может и не
быть. Поскольку нет реального финансового стимула для работы майнера в тестовой сети, вы можете оказаться в затишье,
единственным, кто есть в тестовой сети. Вот почему Mist предоставляет возможность майнинга в тестовой сети и GUIинтерфейс для развертывания контрактов.
Майнинговые риги на GPU
Большая часть майнинга эфира происходит при помощи специализированных GPU-майнеров, типа тех, что представлены на
Изображении 6-8, которыми я управляю сам. На двух из этих машинах работает Claymore Dualminer, кастомная майнинговая
программа, написанная участником форума Bitcointalk.org под ником Claymore, она майнит одновременно эфир и другие
криптовалюты на мульти-GPU ригах.
Можете больше узнать о Claymore Dualminer по ссылке: https://bitcointalk.org/index.php?topic=1433925.0
Четыре Ethereum-майнера, работающие в подвале автора книги.
На третьем и четвертом ригах, изображенных на фото, запущен ethOS, дистрибутив Linux, специально созданный для ригов,
майнящих Ethereum, Zcash или Monero. Если вы создаете ферму с нуля, это гораздо более простое решение. Можете узнать об
ethOS больше по ссылке: http://ethosdistro.com
Доступны несколько программных патчей для Windows, macOS и Ubuntu, которые позволяют запустить мульти-GPU майнинг.
Однако, легче всего это сделать на Ubuntu.
Если вы работаете в Ubuntu и хотите майнить при помощи нескольких GPU, проще всего это делать с использованием
аппаратных средств AMD. После физической установки видеокарт достаточно выполнить несколько коротких команд. В
Ubuntu 14.04 запустите Терминал и наберите следующее:
sudo apt-get -y update sudo apt-get -y upgrade -f
sudo apt-get install fglrx-updates sudo amdcon g –adapter=all –initial
Затем перезагрузите систему. Далее, запустите OpenCL с помощью следующих команд в Терминале:
export GO_OPENCL=true
export GPU_MAX_ALLOC_PERCENT=100 export GPU_SINGLE_ALLOC_PERCENT=100
Можно проверить, что конфигурация работает корректно, открыв Терминал еще раз и введя команду:
aticon g –list-adapters
Теперь вы должны увидеть свои видеокарты AMD в списке. Карта, помеченная астериском или звездочкой (*), является
дефолтным видеовыводом на компьютере. Если у вас черный экран, ваш монитор, возможно, подключен к неправильной
видеокарте.
Мульти-GPU майнинг в пуле
Возможно, уже немного поздно браться за майнинг эфира в целях извлечения прибыли. В начале этой главы мы говорили о
концепции сложности сети. Как уже обсуждалось, сложность сети уже достаточно высока и период эффективного майнинга
закончится где-то в 2017 или 2018-м гг. Конкуренция за майнинговое вознаграждение значительна. Шансы вашего майнера на
нахождение блока-победителя оцениваются отношением хеш-мощности вашего майнера к сложности сети. Люди, которые
майнят ради прибыли, стремятся получить преимущество за счет использования мощных аппаратных средств, чтобы
увеличить свои шансы на вознаграждение.
С течением времени Ethereum становится все более популярным, хеш-мощность майнинга в сети увеличивается, майнинг
становится все менее и менее доступным для большинства пользователей. Однако, изучение того, как работает майнинг в
Ethereum, может по-прежнему оставаться веселым и полезным занятием, это может пригодиться и для майнинга новых
криптовалют в будущем. Если у вас есть в наличии “железо”, нет причин не поэкспериментировать с майнингом, даже если
прямая покупка эфира будет стоить дешевле, чем добыча эфира посредством майнинга в некоторых районах.
Есть несколько майнинговых пулов, можете увидеть их по ссылке: http://mining.eth.guide
Однако, в целях упрощения мы будем использовать программу под названием QtMiner для Ubuntu 14.04, которую мы можете
загрузить по ссылке: http://ethpool.org/downloads/qtminer2.tgz.
После скачивания извлеките содержимое архива и сделайте скрипт qt.miner исполняемым:
tar zxvf qtminer.tgz cd ./qtminer
chmod +x qtminer.sh
Наконец, запустите QTMiner следующей командой, в которой адрес – это Ethereum-адрес, на который вы хотите получать
награды за майнинг, а имя – это имя данного майнингового рига:
./qtminer.sh -s us1.ethermine.org:4444 -u address.name -G
Чтобы проверить заработанные средства без запуска Mist, который будет очень долго синхронизироваться, зайдите на
Ethermine.org и введите тот самый Ethereum-адрес, который вы ранее внесли в команду, в поисковую строку в верхнем правом
углу.
Итоги Главы 6
В этой главе мы разобрались с самым сложным аспектом протокола Ethereum: процессом майнинга. Вы узнали, как
происходит оплата майнерам, в каком размере, и как система обеспечивает, чтобы ни один отдельный майнинговый пул с
продвинутым оборудованием не мог доминировать в сети. Вы установили Geth и начали вызывать JavaScript-методы из
командной строки. Вы начали с малого, с майнинга в тестовой сети, и перешли к мульти-GPU майнингу в пуле.
Если вы хотите взглянуть на динамическую картину всех этих факторов в работе в живой цепочке, зайдите на
сайт: https://ethstats.net
Давайте при помощи краткого заключения свяжем изученный нами в этой главе материал с последующими главами:
Блок в Ethereum – это запись транзакций, которые совершаются в заданный 12-ти или 15-ти секундный интервал времени.
Каждый раз, когда узел синхронизируется с сетью, он загружает блоки из соседних узлов, а затем собирает их в структуру
данных, которая позволяет вычислять и верифицировать корневой хеш. Благодаря этому, узел может убедиться в том, что у
него есть точная история блокчейна, и он может спокойно приступить к майнингу новых блоков или отправке новых
транзакций. Это процесс синхронизации, который вы мельком увидели во время установки Mist и Geth.
В следующей главе вы узнаете об экономических стимулах и антистимулах, которые делают майнинг на основе
доказательства выполнения работы столь устойчивым перед атаками. Эта развивающаяся область называется
криптоэкономикой.
Примечания к Главе 6
1
Vitalik Buterin, “A Proof of Stake Design Philosophy,” https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy506585978d 51#.7n3x85gvs, 2016.
2
Gavin Wood, “Ethereum Yellow Paper,” https://github.com/ethereum/yellowpaper, 2016.
3
Ethereum Community Forum, “How Is Mining Di culty Calculated,” https://forum.ethereum.org/discussion/5002/how-is-themining-di culty-calculated-o n-ethereum, 2016.
4
Ethereum Blog, “Toward a 12-Second Block Time,” https://blog.ethereum.org/2014/07/11/toward-a-12-second-block-time/, 2014.
5
Тот же источник.
6
Тот же источник.
7
Тот же источник.
8
GitHub, “Modi ed Ghost Implementation (Ethereum White Paper),” https://github.com/ethereum/wiki/wiki/White-Paper#modi edghost-implementation, 2016.
9
Bitslog, “Uncle Mining: an Ethereum Protocol Flaw,” https://bitslog.wordpress.com/2016/04/28/uncle-mining-an-ethereumconsensus-prot ocol- aw/, 2016.
10
StackOver ow, “When Will the Di culty Bomb Make Mining Impossible?”
http://ethereum.stackexchange.com/questions/3779/when-will-the-di culty-bomb-ma ke-mining-impossible/3819#3819, 2016.
11
Ethereum Blog, “Merkling in Ethereum,” https://blog.ethereum.org/2015/11/15/merkling-in-ethereum/, 2015.
12
Ethereum Wiki, “Merkle Patricia Tree Speci cation,” https://github.com/ethereum/wiki/wiki/Patricia-Tree#merkle-patricia-treespeci cation, 2016.
Создание децентрализованных приложений на блокчейн
Помощь в программировании искусственного интеллекта
Глава 7. Исследование криптоэкономики
06.04.2018
Рубрика: Введение в Ethereum и Solidity
Автор: adminCraft
Содержание страницы
1 Глава 7
2 Как мы пришли к этому
3 Новые технологии создают новые экономики
4 Правила игры
5 Чем полезна криптоэкономика?
6 Хеширование vs Шифрование
7 Примечание
8 Шифрование
9 Недостатки шифрования
10 Хеширование
11 Для чего полезны хеши
12 Почему скорость блоков имеет значение
13 Схема выпуска эфира
14 Типовые сценарии атак
15 Социальное доказательство между машинами
16 Безопасность по мере масштабирования сети
17 Подробнее о криптоэкономике
18 Итоги Главы 7
19 Примечание к Главе 7
Глава 7
Криптоэкономика – это изучение экономической деятельности в защищенных компьютерных сетях.
Давайте отвлечемся от майнинга и развертывания и поговорим о некоторых проектных решениях, пришедших в Ethereum: в
частности, о тех, что связаны с его системой экономических стимулов и антистимулов. В общих чертах, этот аспект Ethereum
переплетается с теорией игр, наукой о рациональном, разумном выборе решений в ситуациях, содержащих конфликт и
совместную работу.
Теория игр используется в экономике, оборонном планировании, психологии, политологии, биологии и даже в изучении гэмблинга
(!) как методология по изучению, анализу и предсказанию поведения людей и компьютеров, работающих внутри заданной
системы.
Цель данной книги – понять предназначение сети Ethereum, и как начать с ней работать. К счастью, нам не нужно быть
математиками, чтобы это сделать. Если вы математик и вам хотелось бы получить больше технических разъяснений концепций из
этой короткой, но важной главы, обратитесь к “Ethereum White Paper” и “Yellow Paper”, их можно найти по следующим ссылкам:
https://github.com/ethereum/wiki/wiki/White-Paper
http://gavwood.com/paper.pdf
Как мы пришли к этому
Шифры в той или иной форме существуют тысячи лет как способ отправки зашифрованных сообщений, но наука о криптографии
стала формализованной дисциплиной лишь в течение десятилетий после Второй мировой войны. Во время этой войны союзные

державы смогли перехватывать и взламывать шифрованные сообщения, передаваемые азбукой Морзе машинами “Энигма”
гитлеровской коалиции. Генерал Дуайт Дэвид Эйзенхауэр считал этот фактор решающим в победе союзников.
Сегодня мы имеем цифровые коммуникации и нам не нужно полагаться на передачу данных через нечеткий аналоговый диапазон
частот, в котором информация может появляться и исчезать под влиянием интерференции волн. У нас есть четкие, чистые
цифровые сигналы, передающиеся между множеством устройств и протоколов. Эра цифровых коммуникаций, которую мы
сегодня наблюдаем, была положена криптоанализом, также известном как криптографический анализ. Новая область теории
информации, которая развилась благодаря криптоанализу, претворила в реальность современные компьютеры, компьютерные
языки и сети, спустя десятилетия после того, как их появление было предсказано изобретателями-футуристами.
Новые технологии создают новые экономики
Огромные возможности, предоставляемые теорией информации, связаны с обеспечением достоверности и приватности. Единицы
и нули позволяют компьютерам отправлять сигналы безошибочно; мы можем доверять компьютерам исполнение одного и того
же кода одинаковым образом раз за разом, что обеспечивает тот высокий уровень автоматизации, которым мы наслаждаемся
сегодня. Криптография позволяет сохранять содержание этих сигналов приватным для отправителя и получателя, даже когда
сообщения путешествуют по всему миру, проходя через множество сетей на своем пути – некоторые из которых могут быть
оборудованы средствами для слежки.
Для защиты информации, которую они отправляют по сетям, современные компьютеры могут шифровать информацию гораздо
более сильными методами, чем машина “Энигма” образца 1945-го года. Криптографически защищенный обмен сообщениями
можно условно определить как обмен данными в недоверенной среде, или в условиях, при которых ваша информация может быть
подвержена эксплуатации или разрушению. Война – это один из примеров, но к ним относится и промышленный шпионаж,
преследование по религиозным мотивам или даже природные катастрофы.
Экономика, как правило, изучает взаимодействие между людьми, иногда в таком неблагоприятном контексте, как война.
Развивающаяся область криптоэкономики – это изучение экономической деятельности, осуществляемой при помощи сетевых
протоколов во враждебной среде.
Предметная сфера криптоэкономики включает следующее:
Доверие онлайн
Онлайн-репутация
Криптографически защищенный обмен данными
Децентрализованные приложения
Валюта или активы как веб-сервис (если так можно выразиться)
Одноранговые финансовые контракты (смарт-контракты)
Сетевые протоколы управления базами данных на основе достижения консенсуса
Антиспам-алгоритмы и алгоритмы для защиты от атак Сивиллы
При осуществлении атаки Сивиллы атакующий переполняет одноранговую сеть огромным количеством псевдонимных
идентификаторов с целью получения диспропорционально большого влияния. Это заслуживающая внимания уязвимость
одноранговых сетей. Атака 51%, описанная в Главе 6, похожа на атаку Сивиллы. Как вы узнаете, большая часть так называемой
прикладной криптоэкономики занимается разработкой игровой системы с работоспособными положительными и
отрицательными стимулами, которые создают устойчивое напряжение, поддерживающее работу сети.
Правила игры
Люди, создающие криптоэкономические системы (разработчики публичных блокчейнов) целыми днями занимаются рядом
вопросов касаемо того, как эти сети должны работать. Большая часть их допущений основывается на практическом опыте работы
с другими криптосетевыми протоколами, прошлыми и настоящими. Их допущения следующие:
Остерегайтесь централизации: любые два человека, в руках каждого из которых сосредоточено порядка 25% хешмощности майнинга сети или непосредственно криптовалюты, находятся в опасной близости от того, чтобы получить
возможность порождения злонамеренного форка или разрушения целостности сети.

Большая часть людей рациональны: однако, в любой сети найдется определенная доля пользователей, которые ведут себя
таким образом, что их действия трудно обосновать. Некоторые из этих людей могут попытаться уронить сеть, либо
умышленно, либо в результате определенной непостижимой случайности.
В крупных сетях есть постоянная циркуляция людей: это создает приливы и отливы сетевого трафика и количества
пользователей, но некоторые пользователи остаются и поддерживают высокий уровень активности.
Цензура невозможна: контракты могут доверять тому, что они получают полные сообщения от других контрактов.
Узлы могут обмениваться данными свободно: любые два узла могут обменяться сообщениями быстро и просто.
Долговые требования и жалобы на негативную репутацию не имеют юридической силы: поскольку любой человек,
использующий публичный блокчейн, может создать новый адрес кошелька в любое время, некоторые виды сообществ
могут существовать исключительно в приватных цепочках с ограниченным выпуском адресов кошельков, управляемым
программным контрактом или централизованно.
Несмотря на то, что многие из этих допущений относятся к Биткойн, он не использует их в полной мере для решения всех
различных проблем, с которыми сталкивается человечество сегодня. Одним из примеров основной области человеческой
деятельности (долговое финансирование), для которой Биткойн, похоже, не подходит ввиду своей неповоротливости, является
создание долгосрочных долговых инструментов, таких как долговые обязательства или закладные.
Это не препятствие для Биткойн, скорее подтверждение его преимущества в качестве глобального уровня ликвидных платежей.
Это не среда для хранения информации, полезный предмет торговли или реальный атрибут благополучия. В человеческой
культуре есть множество представлений о денежной ценности, и открытие новых в некоторой степени является двигателем для
нынешнего всплеска активности вокруг криптоэкономики.
Чем полезна криптоэкономика?
Во-первых, прикладная криптоэкономика связана с разработкой уровня защиты между публичными сетями и всевозможными
атакующими. Она объединяет разработку теоретико-игровой системы, шифрование и криптографическое хеширование для
защиты широко используемого общего ресурса – в данном случае, речь о глобальной транзакционной машине состояний.
Поскольку публичные цепочки открыты, им необходимо быть устойчивыми перед атакующими с большим количеством
вычислительной мощности. Вследствие этого, сети с большим количеством узлов и большей географической распределенностью
узлов, находящихся под управлением дискретных, не связанных друг с другом владельцев, считаются более защищенными.
Майнинговые пулы приводят к централизации, вот почему любой пул, в котором сосредоточено более 25% хеш-мощности,
приближает пороговый уровень сетевой угрозы. При появлении двух подобных пулов они могут быстро получить контроль над
сетью.
За счет использования настраиваемого, устойчивого перед интегральными схемами специального назначения (ASIC) алгоритма
Ethash и проектирования такой сети, которая способна быстро увеличивать сложность, разработчики протокола обеспечили
меньшее количество стимулов для майнеров консолидироваться и переводить майнинг на профессиональную основу.
Хеширование vs Шифрование
Вспомним из Главы 1, что блокчейн состоит из трех составляющих технологий, работающих в комбинации. Вот эти технологии:
Криптографическое хеширование
Асимметричная криптография с открытым ключом
Распределенные P2P-вычисления
В предыдущей главе вы узнали, что заголовок каждого блока содержит корневой хеш целой цепочки, а также хеш транзакций в
блоке. Эти два фрагмента данных в заголовке блока используются для создания начального значения шифрования (“seed”),
которое в свою очередь генерирует DAG-файл, который достигает 1Гб и служит в качестве некоего “раскрывающегося составного
трея” для алгоритма доказательства выполнения работы, который хеширует между собой фрагменты данных из DAG с целью
определения выигрывающего значения nonce, которое валидирует блок.
Примечание

Крупные компании также выигрывают от использования публичных цепочек, поскольку они могут компенсировать огромные
затраты на защищенный, приватный уровень прикладных данных. На запуске Ethereum Enterprise Alliance 28 февраля 2017 г. в
Бруклине, Нью-Йорк, со-основатель Ethereum Джо Любин отметил, что для крупных компаний “нет смысла в разработке на базе
блокчейна, в котором отсутствует публичная составляющая, потому что с высокой долей вероятности невозможно существование
криптоэкономики, переходящей от приватного блокчейна к публичному”.
Оба процесса алгоритмичны: одна информация поступает, другая информация выходит. Но используются они в разных целях.
Шифрование
Мы уже ранее обсуждали шифрование в этой книге, но давайте вспомним: аккаунты Ethereum и Биткойн используют пару
криптографических ключей, один открытый (публичный), другой закрытый (приватный), для шифрования транзакций,
отправляемых на соответствующие виртуальные машины. (Обе сети для шифрования используют одинаковый алгоритм кривой
secp256k1). Вспомним, что это известно как шифрование с открытым ключом или асимметричное шифрование. Это отличается от
симметричного шифрования, в котором обе стороны совместно используют открытый и закрытый ключ, это очень похоже на то,
как если бы вы с вашей супругой жили по одному адресу и сделали бы копию ключей от дома.
Схема с симметричным шифрованием используется на многих серверах в наше время. Когда серверы обмениваются данными,
они часто используют одинаковый закрытый ключ для аутентификации друг друга. Это безопасно только если вы доверяете
серверу на другом конце пути транзакции хранить этот закрытый ключ, который, как можно предположить, имеет одинаковое
значение для обеих сторон и держится в тайне от любого злоумышленника.
Шифрование превращает человекочитаемую строку из букв и цифр в нечитаемый набор рандомных букв и цифр с одной важной
оговоркой. Шифротекст, получаемый в результате работы алгоритмов шифрования не имеет фиксированной длины.
Pretty Good Privacy (PGP) и Advanced Encryption Standard (AES) – это популярные алгоритмы, используемые в этих целях. Алгоритм
шифрования RSA – еще один широко используемый стандарт в IT-компаниях по всему миру. Однако, иногда открытые ключи,
сгенерированные при помощи этих популярных алгоритмов шифрования, могут быть очень длинными и громоздкими. В Ethereum
используется такой же протокол шифрования, основанный на эллиптических кривых, как и в Биткойн, он также известен как
алгоритм ECDSA, он имеет преимущества в безопасности и лаконичности: ECDSA обеспечивает уменьшенный размер ключа, что
снижает требуемые ресурсы для хранения и требования по передаче. Однако, Виталик Бутерин отметил, что протокол, скоре всего,
уйдет от текущей реализации ECDSA в будущем в направлении альтернативы, предлагающей еще большую защищенность.
Недостатки шифрования
Между тем, у шифрования также есть и слабые места. Например, известно, что оно сильно нагружает процессоры. Также,
закрытые ключи могут быть криптографически защищены, но при этом уязвимы перед человеческой глупостью. Работа с
закрытыми ключами должна быть под строгим контролем. В принципе, Национальный институт стандартов и технологий США
(NIST) предоставляет руководства по жизненному циклу криптографических ключей, основанные на критичности данных или
ключей, которые необходимо защитить, и количестве данных (или количестве пар ключей), которые должны находиться под
защитой.
Стоит отметить, что если вы не хотите, чтобы кто-либо дешифровал ваше сообщение, шифрование – не самый лучший выбор.
Существование закрытого ключа с практической точки зрения является отправной точкой для того, что однажды ваша
информация будет раскрыта, возможно, вами, либо кем-либо, кто получит этот ключ!
Хеширование
Хеширование более безопасно, чем шифрование, по крайней мере, в том плане, что не существует закрытого ключа, который
может “обратить” хеш обратно в его оригинальную, читаемую форму. Следовательно, если машине не нужно знать содержимое
набора данных, вместо него ей следует выдать хеш набора данных.
Алгоритмы хеширования принимают данные схожим образом, что и алгоритмы шифрования, но производят строку или цифру
фиксированной длины. Изменение хотя бы одного символа в крупном наборе данных приведет к выводу совершенно другого
хеша. Практически невозможно вернуть захешированные данные обратно к их оригинальному виду. Популярные алгоритмы
хеширования включают MD5, SHA-1 и SHA-2. Протоколы Ethereum и Биткойн используют SHA-256, один из самых сильных
алгоритмов хеширования.

Для чего полезны хеши
Если вам знакомы названия алгоритмов хеширования, начинающиеся с SHA, то скорее всего, вы встречали их в своих смартфонах
или сетевых интерфейсах компьютеров при подключении к Wi-Fi и вводе пароля. Поскольку хеши являются односторонними по
своей природе, они отлично подходят для сравнения двух секретных значений без их раскрытия. Следовательно, если ваш
компьютер хеширует пароль от Wi-Fi и передает его на Wi-Fi-роутер – который знает пароль – роутеру также необходимо
захешировать пароль и получить точно такой же результат. Это подтвердит, что у вас правильный пароль и вам разрешено
подключиться. Преимущество здесь в том, что любой наблюдатель в сети никогда не увидит пароль, только лишь хеш.
Почему скорость блоков имеет значение
В Главе 6 мы определили блок как период времени: 15 секунд, если быть точными. Многие подпроцессы в майнинге
спроектированы для поддержания этого времени блока. Однако, мы не перестаем задаваться вопросом, является ли это время
блока “лучше”, чем 10-минутные блоки в Биткойн, или же это всего лишь характеристика того, как работает протокол Ethereum.
Вам нужно знать о задержке между узлами Биткойн по всему миру. Порядка 95% этих узлов можно достичь за 12,6 секунд, это
было измерено группой экспертов в 2013 г.3 Эта цифра пропорциональна размеру блока, поэтому при “более быстром” времени
блока мы можем иметь сеть с более быстрым временем отклика.
Однако, быстрые блоки являются менее защищенными в краткосрочной перспективе по причинам, которые мы не будем
освещать здесь. Их плюсом является быстрое время подтверждения блоков; другими словами, они выигрывают за счет большего
разбиения информации. Отсюда следует, что хотя узлы и может быть легче обмануть на ранних стадиях, они усиленно тянутся в
направлении “правильной” цепочки в пределах нескольких поколений. Идея о том, что более быстрые блоки пропорционально
менее защищены, чем более медленные блоки, ошибочна.
Узнать больше о том, как скорость времени блоков влияет на различные характеристики сети, можно из статьи в блоге Ethereum.
Схема выпуска эфира
Эфир создается сетью для оплаты майнерам. Однако, определенное количество эфира было реализовано в предпродаже в
середине 2014 г. для раскрутки финансирования сети. Порядка 60 миллионов ETH было продано по ценам в диапазоне от 1000 до
2000 ETH за один биткойн. (Около 10% было выделено Ethereum Foundation, и еще 10% отложено в качестве резерва на время
предпродажи).
Начиная с пресейла система будет выпускать 15,6 миллионов эфира в год в виде наград, выплачиваемых майнерам. Выпуск
эфира никогда не прекращается, но количество выпускаемого эфира за год составляет все меньший и меньший процент от общего
количества. Как вы можете увидеть на Изображении 7-1, небольшое увеличение на кривой в 2014-2015 гг. свидетельствует о
периоде предпродажи.
Рост массы эфира происходит инфляционно, но это не обязательно влияет на его цену.
В этой связи, схема выпуска эфира инфляционна (в контексте количества, но не цены) до, приблизительно, 2025 года, и
дефляционна по количеству впоследствии. Цена эфира диктуется рынком и по большей части основывается исходя из

потребностей времени. Как и в случае с бензином, динамика цен больше связана с тем, как много людей водят автомобили, или с
тем, кто манипулирует ценой посредством трейдинга!
Типовые сценарии атак
Далее мы коротко обсудим, какие меры предусмотрены в протоколе Ethereum для противодействия некоторым наиболее
распространенным атакам, направленным на P2P-сети. Как описывалось в Главе 3 в контексте изучения EVM, функция перехода
состояний ограничивается определенным количеством вычислительных шагов на блок. Если исполнение длится дольше, оно
останавливается, а изменения состояния откатываются. Однако, выплаты майнерам за подобные откатываемые изменения все
равно производятся.
Смысл данного проектного решения для протокола становится понятным, если посмотреть на него через призму
криптоэкономики. “Ethereum White Paper” использует следующие примеры для демонстрации практической ценности принятой
спецификации в случае, если сеть находится под атакой:
Если атакующий отправляет майнеру контракт, содержащий бесконечный цикл, со временем он израсходует газ. Однако,
транзакция по-прежнему будет оставаться валидной в том плане, что майнер может запросить у атакующего
вознаграждение за каждый вычислительный шаг, сделанный программой.
Даже если атакующий попытается заплатить подходящее вознаграждение за работу майнера, майнер увидит, что значение
STARTGAS является чрезмерно высоким, и будет знать заранее, что вычисления займут слишком много шагов.
Представьте, что атакующий осторожен со своей платой за газ: он отправляет код контракта с газом, достаточным для
вывода средств, но не достаточным, чтобы позволить балансу аккаунта уменьшиться. Это похоже на атаку двойного
расходования, в том плане, что это создает деньги из воздуха. Однако, в Ethereum произойдет полный откат такой
транзакции, потому что она израсходует газ в середине процесса.
Социальное доказательство между машинами
Странно думать об общении машин, но с сетью из машин все действительно так: они общаются между собой. Доказательство
выполнения работы похоже на социальное доказательство между людьми. Социальное доказательство – это форма
согласованности, при которой один человек – неуверенный, как ему себя вести – эмулирует/имитирует поведение тех, кто, как ему
кажется, знает это лучше. Во многих случаях это означает подражание большинству.
Как этот феномен может потенциально защитить сеть? Что ж, в сетях Ethereum и Биткойн порядок транзакций, считающийся
“правильным”, это просто порядок, который большинство узлов приняло за правильный. Это не основано ни на чем другом. Вот
почему атака 51% является реальным феноменом: это огромная приманка для злоумышленников, которые могут собрать большое
количество майнеров и форкнуть сеть для того, чтобы приступить к выкачиванию средств. Возникновение подобной атаки
предотвращает именно ее огромная стоимость, это полное отсутствие рентабельности. Очень дорого покупать, брать в аренду или
управлять тысячами гигахешей вычислительных мощностей.
Безопасность по мере масштабирования сети
Сегодня рыночная капитализация эфира мала, но как только определенная доля глобальных веб-сервисов перейдет к его
использованию, цена эфира может вырасти в размере, превышающем его естественное снижение цены. Однако, цена эфира не
имеет значения, если эфир для вас – это ресурс, то есть топливо для платы за хостинг приложений в EVM.
Если цена увеличивается и уменьшается, это привлекает спекулянтов и маркет-мейкеров, деятельность которых еще больше
увеличивает волатильность во время повышенного объема торгов. Это в свою очередь изменяет величину прибыли майнеров,
которые могут предпочесть выключить свои узлы до тех пор, пока эфир не вернется к той цене, при которой они снова начнут
получать чистую прибыль.
Волатильность создает возможность для злонамеренных операторов узлов и финансовых маркет-мейкеров вступить в сговор:
снизить цену с целью уменьшения хеш-мощности сети, а затем запустить целую ферму майнеров, предназначенных для создания
форка цепочки и перевода ее в новое состояние – в процессе чего проводя атаку двойного расходования. К моменту написания
этой книги подобные сговоры не удавалось осуществить, и возможно, никогда не удастся. Многие крупные банки с Уолл-стрит уже
анонсировали запуск внутренних программ развития Ethereum, либо программ совместного развития Ethereum с участием
сторонних консультантов, так что сомнения относительно устойчивости сети уменьшаются с каждым днем.
Подробнее о криптоэкономике
Название этого раздела взято из поста Виталика Бутерина на Reddit, в котором он раскрывает четыре других сценария атаки, а
также высказывает мысли насчет того, как они могут быть совершены. Вы можете ознакомиться с этой информацией на

странице.
Если вас интересует культурное воздействие криптоэкономической деятельности, зацените это исследование от основателя
CoMakery Ноа Торпа.
Итоги Главы 7
Краткость этой главы является одним из признаков новизны этого подраздела экономики. Несмотря на свою новизну,
криптоэкономика неизбежно станет более сложной, поскольку каждая криптовалюта появляется со своими уникальными
параметрами выпуска.
Чтобы получить информацию на перспективу, может быть полезно обратиться к ресурсам Федерального резерва и отслеживать,
как эти проблемы будут определяться со временем. Дэвид Андольфатто из Федерального резервного банка Сент-Луиса в начале
2015 г. написал в своем блоге, что Центральный банк США рассматривает возможность создания национальной криптовалюты.
Он описал ее следующим образом:
– Представьте, что Федеральный резерв, как ключевой разработчик, сделает доступным Биткойн-подобный протокол с открытым
исходным кодом (подходящим образом модифицированный) под названием Fedcoin. Ключевой момент в следующем: Федеральный
резерв имеет уникальную возможность заслуживающим доверия образом установить курс обмена между Fedcoin и USD (обменный
курс может быть любым, но давайте предположим, что имеет место быть валютный паритет). Что подтверждает мое утверждение о
том, что у Федерального резерва есть сравнительное преимущество перед определенной частной компанией, которая выпускает
(допустим) BTC, обеспеченный USD по фиксированному/установленному обменному курсу? Проблема с подобной частной компанией
– это именно та проблема, с которой сталкиваются страны, пытающиеся в одностороннем порядке привязать свою валюту к какойлибо другой валюте. Системы с односторонним фиксированным обменным курсом являются внутренне неустойчивыми, поскольку
учреждение, устанавливающее обменный курс BTC/USD, не может заслуживающим доверие образом взять на себя обязательство не
израсходовать резервы USD, чтобы справиться с волнами выплат всех возможных размеров. По факту, структура открывает
возможность для спекулятивной атаки.
В интервью, ранее данном им во Франкфурте в том году, где он впервые озвучил подобные предположения, он упоминал систему
Fedwire. Если повезет, вы вспомните наше обсуждение системы Fedwire из Главы 3 и нашего разговора про EVM.
Далее мы вернемся к командной строке и узнаем, как разворачиваются децентрализованные приложения.
Примечание к Главе 7
1
Winterbotham, The Ultra Secret: The Inside Story of Operation Ultra, Bletchley Park and Enigma (London: Orion Publishers, 2000).
2
NIST, “Recommendations for key management,” https://www.nist.gov/node/563271, 2012.
3
Swiss Federal Institute of Technology, Zurich, “Information Propagation in the Bitcoin Network,”
www.tik.ee.ethz.ch/ le/49318d3f56c1d525aabf7fda78b23fc0/P2P2013_041.pdf, 2013.
4
MacroMania, “FedCoin: The Desirability of a Government Cryptocurrency,”
http://andolfatto.blogspot.co.uk/2015/02/fedcoin-on-desirability-of-government.html, 2015.

Создание децентрализованных приложений на блокчейн
Помощь в программировании искусственного интеллекта
Глава 8. Развертывание децентрализованных приложений
10.04.2018
Рубрика: Введение в Ethereum и Solidity
Автор: adminCraft
Содержание страницы
1 Глава 8
2 Примечание
3 Семь примеров использования смарт-контрактов
4 Модели данных контрактов в dapp
5 Примечание
6 Как бэкенд в EVM общается с JS-фронтендом
7 Примечание
8 JSON–RPC
9 Web 3 уже здесь (почти)
10 Эксперименты с JavaScript API
11 Использование Geth для развертывания dapp
12 Примечание
13 Использование Meteor с EVM
14 Установка Web3.js для создания веб-приложения, совместимого с Ethereum
15 Запуск контрактов в консоли
16 Как контракты объявляют интерфейс
17 Рекомендации для прототипирования
18 Сторонние библиотеки для развертывания
19 Итоги Главы 8
Глава 8
Как вы узнаете, развертывание децентрализованных приложений – это путешествие на передовую новой компьютерной
парадигмы.
Распределенное приложение, или dapp, разделяет те же самые идеалы, что и протокол EVM: обеспечение неизменяемости.
Dapps состоят из смарт-контрактов, которые, как уже много раз упоминалось в этой книге, исполняются всеми узлами сети
Ethereum в примерно одинаковое время.
На практике dapps – это общедоступные веб-сервисы, запущенные в EVM, но доступные для пользователей через обычный
HTML/CSS/JavaScript фронтенд, к которому они могут получить доступ при помощи своих браузеров или приложений для
смартфонов, либо при помощи браузера Ethereum, такого как Mist.
Примечание
В этой главе затрагиваются темы, предназначенные для разработчиков с уже имеющимся опытом. Если вы начинающий
программист, прочитайте эту главу полностью вплоть до Главы 9. Далее, возьмите любую книгу по JavaScript для
начинающих, чтобы улучшить ваши навыки в написании скриптов. Затем посетите страницу, на которой вы найдете другие
руководства по языку Solidity.
Запуск клиентов приложений, основанных на блокчейне, гораздо легче, чем управление клиентами в парадигме облачного
хостинга. Hub-and-spoke (топология “звезда”) веб-приложения масштабируются вертикально, в соответствии с отдельно
взятыми серверами, на которых они работают. В отличие от них, Ethereum-приложение масштабируется горизонтально – это
способ, подходящий для масштабирования облачного приложения.
Несмотря на то, что возможности по обработке транзакций в современных криптосетях действительно в значительной
степени ограничены, по мере развития других составляющих протокола эта обработка будет ускоряться.
Семь примеров использования смарт-контрактов
В основе любого dapp лежит набор смарт-контрактов. Смарт-контракты полезны в следующих сценариях, которые могут
составить интересные проблемные области для прототипирования:
Поддержание работы системы учета для чего-либо из реального мира или для других контрактов
Создание контрактов-маршрутизаторов, например, сберегательный счет, который автоматически пересылает
поступающие средства в отдельную корзину
Управление взаимоотношениями между несколькими сторонами, например, договор или расчеты с фрилансерами.
Смарт-контракт может выступать в роли программной библиотеки для других контрактов
Смарт-контракт может выступать в роли управляющего объекта для других систем или наборов контрактов
Смарт-контракт может служить в качестве логики приложения для веб-сервиса общего пользования
Смарт-контракт может служить в качестве утилиты, которую могут использовать разработчики на одноразовой
основе, например, для генератора случайных чисел.
Разработка dapp приносит с собой новые проблемы для разработчиков приложений, такие как изучение Web3 JavaScript API
и языка программирования Solidity. Будем надеяться, что вы почувствуете уверенность для работы с этими инструментами
сразу же послу прочтения этой книги!
Чтобы лучше понять, какие виды dapps разрабатываются сегодня, зайдите на: http://dapps.ethercasts.com
Этот сайт управляется EtherCasts.
Модели данных контрактов в dapp
Первое, что вам необходимо знать для развертывания рабочего контракта, это какие данные вы можете хранить в EVM и где
вы их храните.
Как мы уже обсуждали в предыдущих главах, каждый адрес контракта в сети Ethereum имеет хранилище для своих смартконтрактов. Это пространство для хранения данных не имеет ограничений, если вы готовы за это заплатить. На момент
написания этой книги пространство для хранения стоит $0.018 за килобайт.
Язык Solidity облегчает использование контрактов наподобие небольших реляционных баз данных. Чтобы упростить этот
процесс, в языке Solidity есть два известных типа данных, которые мы еще не упоминали:
Маппинги / соответствия (“Mappings”)
Структуры (“Structs”)
Чтобы узнать больше об использовании этих типов в Solidity, обратитесь к странице.
Если говорить упрощенно, пространство для хранения данных конкретного контракта является хранилищем типа ключ/
значение с 2256 возможными ключами и таким же количеством значений. Этого объема достаточно практически для любой
структуры базы данных, которую вы хотите создать.
Примечание
Вспомним, что разработчики иногда называют атрибуты объектов ключами, например, во фразах “пара ключ/значение” или
“хранилище типа ключ/значение”. В качестве понятного примера, пара ключ/значение: размер обуви = 40. Таблица,
содержащая размеры обуви всех людей на выделенном сервере, является примером хранилища типа ключ/значение. Вы
можете думать о EVM, как о гигантском хранилище типа ключ/значение, которое показывает балансы аккаунтов, поскольку
это машина с отслеживанием состояния транзакций.
Надеюсь, что к настоящему времени вы уже представляете себе виды простых структур данных, которые можно создать и
использовать в контрактах на Solidity. В следующем разделе мы приступим к разбору архитектуры распределенных
приложений.
Как бэкенд в EVM общается с JS-фронтендом
Различие между сетью Ethereum и сетью, работающей по протоколу HTTP, известной как интернет, может быть преодолено.
Допустим, клиент через традиционный браузер заказывает доставку еды на веб-сайте, работающем на базе dapp. Чтобы
успешно передать данные по заказу (сколько молочных коктейлей?) между браузером и EVM, фронтенд dapp должен
“отправить” данные в EVM в определенном формате.
Примечание
Dapps могут не нуждаться в собственном наборе контрактов; вместо этого, они могут иметь возможность вызывать
определенные публичные функции из других контрактов, чтобы реализовать свой функционал. Для каждой функции,
объявленной публичной в смарт-контракте, Solidity автоматически создает функцию доступа, так чтобы другие контракты
могли вызвать ее.
В компьютерных системах форматы обмена данными работают схожим образом, как международная почта. Несмотря на то,
что различные серверы по всему миру могут работать под управлением различных операционных систем, написанных на
различных языках, совершенно разными людьми, они должны на определенном этапе обмениваться данными с сервером,
который не похож на них.
Чтобы “трансляция” прошла корректно, программисты разрабатывают свои программы таким образом, чтобы те отправляли
информацию в адрес других программ в определенных нотациях. Обычно нотация описывает формат для целого объекта
(определенного в Главе 1 как набор атрибутов и значений).
Например, объект данных человека может состоять из роста, веса, цвета глаз, размера обуви и так далее.
JSON–RPC
В современных веб-приложениях код JavaScript может передавать информацию по вебу, используя общепринятую
объектную нотацию под названием JavaScript Object Notation (JSON). Объекты JSON могут содержать цифры, строки и
упорядоченные последовательности значений для определенных атрибутов.
Есть два важных объекта данных в Web3.js, которые можно грубо сравнить с JSON в том плане, каким образом они
передаются между фронтендом и бэкендом приложения на базе Ethereum. Они называются объектами JSON-RPC и
поставляются с библиотекой Web3.js. Ниже описывается установка Web3.js. Эти два объекта используются следующим
образом:
webeth используется специально для взаимодействия с блокчейном
webshh используется специально для взаимодействия с Whisper

Whisper – это протокол приватного обмена сообщениями, который является частью протокола Ethereum. Вы узнаете
больше о Whisper и его роли в дорожной карте в Главе 11.
Пока что можете представлять себе, что объекты JSON-RPC непрерывно перемещаются туда и обратно между фронтендом (в
HTTP-сети) и бэкендом (сеть Ethereum).
Web 3 уже здесь (почти)
JavaScript-библиотека под названием Web3.js является частью новой спецификации Web 3.
Страница на GitHub для проекта Web 3: https://github.com/ethereum/web3.js/
Web 3 – это общее понятие для децентрализованного веба, Web 2 – это веб-приложения и сервисы. Web 1 – это

оригинальная “Всемирная паутина”, в которой хостились статические страницы. С того времени протокол передачи
гипертекста HTTP дорабатывался для добавления большего количества методов и поддержки все более сложного
контента и скриптов.
Web 3 – это настоящая концепция, которая фокусируется в частности на протоколе Ethereum. Принято считать, что она
состоит из трех компонентов:
Одноранговой системы идентификации и обмена сообщениями
Совместно используемого состояния (блокчейн)
Децентрализованного хранилища файлов
Первые два пункта уже выполнены: сеть Ethereum и транзакции работают! Третья ножка стула, децентрализованное
хранилище файлов, является частью проекта Swarm, о котором вы узнаете из Главы 11.
В парадигме Web 3 нет веб-серверов. Нет кэшей, обратных прокси-серверов, балансировщиков нагрузки, сетей доставки
содержимого (CDN) и других пережитков устаревшего крупномасштабного развертывания веб-приложений. Даже
децентрализованные серверы доменных имен (DNS) станут свободными. Когда хранилище Swarm будет запущено в сеть, оно
будет дешевым, являясь составной частью Ethereum для веб-хостинга.
Для разработчиков и хакеров всех сортов Web 3 расширяет модель развертывания условно-бесплатных приложений, в
которой увеличение количества пользователей и масштаба приводит ко все более высоким счетам за хостинг. В EVM вы
можете управлять своими затратами путем написания эффективного кода, и вы можете рассчитывать на то, что любой
житель планеты сможет получить доступ к вашему приложению с момента его запуска в сеть.
Давайте вернемся к специфике разработки dapp и посмотрим, как современный веб общается с EVM.
Эксперименты с JavaScript API
В Главе 6 вы узнали, насколько легко взаимодействовать с EVM, набирая команды в JavaScript-консоль в Geth. Когда вы
делаете это, в действительности вы лишь вызываете частные методы JavaScript, которые поставляются с Ethereum JavaScript
API. Эти методы JavaScript, которые вы набираете в консоли Geth, интерпретируются JIT-подобным интерпретатором
JavaScript, разработанным специально для Geth. Это называется интерактивным использованием JSRE, или использованием
его в интерактивном режиме.
Однако, методы Ethereum JavaScript API можно также передавать обычным веб-приложениям, позволяя им обмениваться
данными с EVM.
Использование Geth для развертывания dapp
Несмотря на популярность других клиентов Ethereum, Geth (который написан на языке Go, разработанном в Google) со своим
простейшим интерпретированием JavaScript является самым быстрым способом для соединения веб-приложения с
пользовательским интерфейсом из традиционного HTTP-веба с контрактом на бэкенде в EVM.
Поскольку эти методы JavaScript интерпретируются при помощи Geth в код для EVM, имеется возможность связать их в
скрипты, а это, конечно, естественное использование JavaScript в принципе. Это называется неинтерактивным
использованием JavaScript.
Примечание
Неинтерактивное использование JavaScript API – это смысл того, что мы называем компьютерным программированием. Это,
говоря обобщенно, цель программирования или написания программ: автоматизация того, что в противном случае было бы
ручным набором команд в терминале, типа тех, что вы набирали в Geth. При выполнении сложных вычислений или
построении аналитических моделей эти строки инструкций могут становиться длинными и утомительными.
Занося строки инструкций в простой текстовый файл программист может сделать программу краткой, быстрой,
эффективной и повторяемой.
Другая цель программирования заключается в том, чтобы отделить задачи, которые вводит человек-оператор, и чтобы
выполнять их в параллельном потоке, так чтобы вся работа занимала меньше времени. Как вы видели во время первого
запуска Geth, вы не могли ничего сделать в этом окне для ввода команд, пока он синхронизировался, и конечно, этот поток
не остановился бы, пока Geth запущен.
Надстроив консоль поверх Geth, разработчики Ethcore дали возможность вам, оператору консоли, давать команды в
процессе синхронизации Geth в фоновом режиме, в другом потоке на вашей локальной машине.
Далее вы узнаете об идеальных фреймворках для веб-разработки, которые можно использовать для подключения к бэкенду
на стороне EVM.
Использование Meteor с EVM
Если вы JavaScript-разработчик, то, возможно, слышали о Meteor.js, библиотеке, которая позволяет вам писать реактивные
веб-приложения, которые запускают симметричный код на сервере и клиенте.
Этот полностековый фреймворк отлично подходит для разработки веб-приложений реального времени, но он полезен и для
разработки фронтенда под Ethereum, поскольку он особенно пригоден для написания одностраничных приложений, или SPA.
Вот причины, по которым так много Ethereum-разработчиков любят Meteor:
Он полностью написан на JavaScript, как и инструменты
Вы получаете полноценную среду разработки “из коробки”
Развертывание супер-простое
Интерфейсы полностью реактивны (похоже на Angular.js)
Использует модель данных NoSQL под названием MiniMongo, которая может автоматически сохраняться в локальное
хранилище смарт-контракта.
Чтобы узнать больше о разработке приложений под Ethereum с помощью Meteor.js, обратитесь к странице.
Этот URL также указан в списке на: http://tutorials.eth.guide
Далее вы узнаете об установке библиотеки Web3.js на машину для разработки, так чтобы вы смогли поиграться с
контрактами локально.
Установка Web3.js для создания веб-приложения, совместимого с Ethereum
Библиотека Web3.js обменивается данными с локальным узлом посредством RPC. Библиотека работает с любым узлом
Ethereum, если он предоставляет свой уровень RPC. Для запуска вашего фронтенд-приложения вам нужно будет установить
эту библиотеку на вашу локальную машину для разработки и на ваш веб-сервер.
Даже если вы не запускаете собственную цепочку в Geth при помощи соответствующей команды, для приватных цепочек эта
библиотека используется по умолчанию.
По сути, можете считать свой узел Ethereum слоем без операционной системы, открывающим доступ в EVM через его RPCслой. Этот RPC-слой может отправлять и получать объекты web3.eth и web3.shh с помощью веб-сервера, на котором также
работает Web3.js.
Чтобы установить Web3.js в вашей среде разработки, откройте Терминал и используйте наиболее удобный для вас способ
установки:
npm: npm install web3
bower: bower install web3
meteor: meteor add ethereum:web3
vanilla: link the dist./web3.min.js
Далее вам нужно создать инстанс Web3 и установить ваш localhost в качестве провайдера. Чтобы продолжить изучение, как
работать с Web3.js, перейдите к странице.
Далее вы узнаете, как запускать JavaScript-файлы из консоли Geth.
Запуск контрактов в консоли
Полное руководство по развертыванию dapps заняло бы много страниц и могло бы быть реализовано множеством
способов. Вместо этого данный раздел фокусируется на быстром старте.
Вы можете загрузить файлы с вашим смарт-контрактом напрямую в Geth, отправляя их в транзакции в адрес EVM простым
добавлением аргумента
–exec, и затем писать JavaScript-код, ссылающийся на локальный скрипт.
Например:
$ geth –exec loadScript(“/Desktop/test.js”)
По факту, вы можете даже запустить код JavaScript, находящийся на другой машине, если на ней запущен Geth:
$ geth –exec loadScript(“/Desktop/test.js”) attach https://100.100.100.100:8000
В следующем разделе описывается архитектура приложений, совместимых с Ethereum, а также их отличия от традиционной
веб-архитектуры.
Как контракты объявляют интерфейс
При использовании JavaScript dapp API, вызов контракта посредством уровня абстракции, такого как функция eth.contract(),
вернет обратно объект со всеми функциями, с которыми контракт, вызванный на JavaScript, может работать.
Чтобы стандартизировать этот интроспективный функционал, протокол Ethereum поставляется с двоичным интерфейсом
приложения, также известном, как Ethereum Contract ABI. ABI исполняет роль API, создавая стандартный синтаксис для
контрактов, чтобы их могли вызывать приложения.
ABI предписывает контракту возвращать массив, который описывает заданную сигнатуру вызова и доступные функции
контракта.
Некоторые разработчики могут удивиться, особенно те из них, кто пришли из среды разработки Apple, что нет фреймворков,
“поставляемых с” Ethereum для упрощения написания компонентов типовых приложений.
Несмотря на то, что протокол Ethereum может в целом не иметь возможностей для этого, по-прежнему сохраняется
необходимость в создании контрактов, взаимодействие с которыми в типовых сценариях использования будет происходить
предсказуемым образом. Эти сценарии включают в себя: валютные единицы, регистрацию названий и трейдинг на биржах.
ABI используется для подобных сценариев.
ABI содержит двоичный код, потому что в EVM ниже прикладного уровня находится уровень, на котором работает байткод
EVM.
Вы можете найти эту спецификацию по адресу.
Или здесь: http://abi.eth.guide
Стандарты для смарт-контрактов обычно состоят из наборов сигнатур функций для некоторых типовых методов, таких как:
отправка, получение, регистрация, удаление и так далее.
Рекомендации для прототипирования
Первое, что необходимо знать о прототипировании контрактов на Solidity, это то, что вам необязательно иметь узел Ethereum
для тестирования ваших контрактов. Вы можете использовать симулятор контрактов виртуальной машины Ethereum
(Ethereum VM Contract Simulator): https://github.com/EtherCasts/evm-sim/
Этот симулятор позволяет разработчикам тестировать контракты изолированно, когда отсутствует доступ к тестовой сети,
например, при работе с нетбука.
Ниже представлен ряд практических рекомендаций для прототипирования, когда вы приступаете к тестированию с
использованием реального эфира:
Не используйте слишком много эфира на контракт, и где это возможно, программируйте верхние пределы того,
сколько контракты будут хранить. Это хорошая защита на случай сбоев, при которых в результате бага блокируются
ваши средства. Просто не используйте слишком много при тестировании с применением реального эфира.
Сохраняйте свои контракты модульными и легкими для понимания. Когда это возможно, абстрагируйте функционал в
библиотеки, которые можно протестировать в индивидуальном порядке. Ограничивайте количество переменных и
длину функций. Документируйте все.
Используйте паттерн “Проверки-Эффекты-Взаимодействия” (“Checks-Effects-Interactions”). Это означает, что вам не
следует писать программы, которые ожидают возвращаемых данных от другого контракта для того, чтобы
продолжить свою работу; это приведет к тайм-аутам. В целом говоря, вы можете избежать этого при помощи
проверок данных, которые вы получаете обратно, перед изменением состояния.
Пишите свои собственные посредники. Поскольку EVM – это платформа, не прощающая ошибок, она обязывает вас
создавать такие механизмы для ваших программ, которые будут работать безотказно.
Как упоминалось в Главе 5, в руководстве по контракту токена, разработчики стремятся использовать стандарты для
определенных типов контрактов. Вы можете зарегистрировать свои контракты при помощи стороннего сервиса,
такого как Etherchain, чтобы другие люди могли использовать их. Вы можете увидеть публично доступные контракты
по адресу: https://etherchain.org/contracts
Тестируйте, тестируйте и еще раз тестируйте! Ресурсы для тестирования представлены по адресу: http://test.eth.guide
Вы познакомились с несколькими контрактами, которые были написаны для демонстрационных целей. Какие простые
смарт-контракты вы можете создать в сервисе реальных децентрализованных приложений? Какой есть лучший способ для
их развертывания? Это предмет последнего раздела в данной главе.
Сторонние библиотеки для развертывания
Развертывание более сложных смарт-контрактов и подключение их к вебу находится за рамками данной книги – в
частности, потому что это область быстрой разработки и постоянных изменений. Также, это достаточно сложная задача,
которая требует терпения.
Инструменты для разработки – это важнейшая область, которая активно прорабатывается в сообществе Ethereum. Ведущие
группы разработчиков создали инструменты, чтобы облегчить создание контрактов и развертывание dapps. Вот некоторые
проекты, о которых вам следует знать:
Руководства и контракты на Solidity от Monax (https://monax.io/docs/)
Смарт-контракты от OpenZeppelin
Среда для развертывания, тестирования и создания активов Tru e
Dapple, среда разработки для сложных систем контрактов
Populus, фреймворк для разработки контрактов, написанный на Python
Embark, фреймворк для разработки dapps, написанный на JavaScript
Ether Pudding, сборщик пакетов
Solium, инструмент статического анализа кода на Solidity
Есть множество других руководств, практических рекомендаций и тестовых проектов, которые нельзя уместить в этой книге.
Вы сможете найти актуальные ссылки для всех этих инструментов и библиотек, а также многое другое, по ссылке.
Вдобавок, по этой ссылке вы можете найти подборку каналов в Gitter, где можно получить помощь в разработке и
развертывании: http://help.eth.guide.
Итоги Главы 8
В этой главе вы узнали о видах контрактов, для написания которых может пригодиться Ethereum, а также об их
развертывании. Также были раскрыты способы, при помощи которых смарт-контракты могут обмениваться данными с
фронтендом приложения.
Разработка dapps для Ethereum – непростой процесс, но он становится все более и более доступным с каждым днем.
Подпишитесь на каналы Gitter или присоединитесь к своим местным сообществам разработчиков. На момент написания
книги в 450 митапах, посвященных Ethereum, приняло участие 81424 участников и 2257 заинтересованных людей по всему
миру – в 218 городах и 57 странах. Чтобы найти митапы, проводимые рядом с вами, поищите на Meetup (www.meetup.com).
В следующей главе вы развернете ваш собственный приватный блокчейн для лучшего понимания того, как работают
цепочки.
1
Создание децентрализованных приложений на блокчейн
Помощь в программировании искусственного интеллекта
Глава 9. Создание приватных цепочек
10.04.2018
Рубрика: Введение в Ethereum и Solidity
Автор: adminCraft
Содержание страницы
1 Глава 9
2 Приватные цепочки и цепочки с контролируемым доступом
3 Настройка локальной приватной цепочки
4 Примечание
5 Опциональные флаги для новых цепочек
6 Использование приватных блокчейнов на продакшене
7 Итоги Главы 9
8 Примечание к Главе 9
Глава 9
Вопреки доводам сторонников публичных цепочек, приватные цепочки стоит использовать в качестве инструмента для
обучения, который безусловно имеет применение для крупных компаний, государственных учреждений или
неправительственных организаций (NGO). Однако, следует отметить, что блокчейны не обязательно лучше подходят для всех
баз данных и сетей.
В нескольких предыдущих главах мы уделили внимание развертыванию смарт-контрактов, dapps и токенов. В этой главе мы
коротко обсудим использование блокчейнов в качестве баз данных, чтобы глубже понять, как происходит развертывание
цепочек.
Приватные цепочки и цепочки с контролируемым доступом
Приватная цепочка – это просто облачная база данных, реализованная с помощью однорангового протокола Ethereum: это
хранилище, которым вы управляете и доступ к которому можете предоставить.
Следует понимать отличие приватной цепочки от блокчейна с контролируемым доступом, в котором, по аналогии с
корпоративным программным обеспечением, определены роли с ограничениями, которые могут быть установлены главным
администратором.
В целом, приватные цепочки ничем не лучше облачных баз данных. На практике, ценность протокола Ethereum заключается в
том, что можно объединять неравноправные группы вместе для совместного использования защищенной инфраструктуры, не
дублируя усилия. На сегодняшний день сеть Ethereum полностью работоспособна, однако, она не была масштабирована до
того уровня, при котором существующие провайдеры веб-приложений смогли бы мигрировать в нее. Но это ситуация всего
лишь по прошествии двух лет разработки, и как вы узнаете из Главы 11, намеченные этапы развития по-настоящему
потрясающи, их достижение идет согласно графику дорожной карты.
В сравнении с Ethereum, HTTP-веб разрабатывается с 1989 г. Децентрализованное облачное хранение данных, пространства
имен и другие общие элементы HTTP-веба по-прежнему должны быть воссозданы в сети Ethereum, и они будут в скором
времени. Давайте двигаться дальше, и мы создадим собственный настраиваемый блокчейн, чтобы получше понять, как это
работает.
Настройка локальной приватной цепочки

Приватная цепочка имеет ограничения в применении, как было доказано в Главе 6 и Главе 7, безопасность цепочки
пропорциональна количеству узлов, которые майнят в ней. Когда вы создаете свою цепочку, единственным майнером в ней
будете вы.

Однако, запуск локальной приватной цепочки – это отличный способ создания тестовой сети в учебном окружении,
позволяющий обучающимся майнить и, следовательно, исполнять свои собственные транзакции и смарт-контракты.
Как только вы узнаете, насколько это просто, вы по достоинству оцените высокую универсальность сущности EVM.
Содержимое совпадает с полем ‘genesis’, представленном в ‘con g’:
(прим. переводчика: автор неожиданно вставляет рандомную копипасту из официальной документации Ethereum Homestead:
http://ethdocs.org/en/latest/network/test-networks.html https://github.com/ethereum/homestead–
guide/blob/master/source/network/test–netw orks.rst
Непонятно, как начинающие должны интерпретировать подобную информацию…)
Поскольку у вас уже установлен Geth, и вы знаете, как использовать командную строку, вам потребуются всего три вещи для
создания приватной цепочки:
Настраиваемый генезисный JSON-файл
Настраиваемый ID сети (число)
Директория, в которой хранится файл с ID сети
Вы можете придумать ID сети; это не могут быть цифры 1 или 2, которые уже заняты тестовой сетью (2) и основной сетью (1).
Теперь мы перейдем к настраиваемому генезисному файлу.
Создание вашего собственного генезисного файла Genesis для блокчейна
Любой блокчейн должен брать свое начало с чего-либо, и в этом вашем собственном Эдемском саду вы должны посадить
зерно, которое превратится в приватную цепочку. Блок 0 не имеет отсылки к предшествующему блоку, и следовательно, не
похож на любой другой блок в цепочке. Протокол обеспечивает, чтобы ваша цепочка принимала только те блоки, которые
могут указать на свои корни вплоть до этого генезисного блока при помощи корневого хеша в заголовке блока.
Вот способ создания настраиваемого генезисного файла Genesis.
Во-первых, откройте текстовый редактор. Вам нужно будет создать сеть под названием 765, поэтому вы установите 765 в
качестве значения nonce. Это должно быть ненулевое число. Вы можете найти код по адресу.
Или под заголовком “Глава 9” на сайте: http://eth.guide
Вставьте в текстовый редактор следующий текст:
{
“nonce”: “0x0000000000000765”,
“timestamp”: “0x0”, “parentHash”:
“0x00000000000000000000000000000000000000000000000000000000000 00000”,
“extraData”: “0x0”, “gasLimit”: “0x4c4b40”, “di culty”: “0x400”, “mixhash”:

“0x00000000000000000000000000000000000000000000000000000000000 00000”,
“coinbase”: “0x0000000000000000000000000000000000000000”,
“alloc”: {
}
Сохраните этот файл к себе на рабочий стол и назовите его genesis765.json.
Чтобы открыть вашу новую цепочку при помощи JavaScript-консоли, типа той, которую вы использовали в Главе 6, откройте
Терминал и затем наберите следующие семь элементов в одной строке:
geth
console
–networkid
–genesis
Путь до генезисного файла Genesis
–datadir
Директория данных для хранения вашей новой цепочки
Вы создадите скрытую директорию под названием ∼/.ethereum/chain765 для хранения своей цепочки. Ваша полная команда
для Терминала должна выглядеть следующим образом:
geth console –networkid 765 –genesis
∼/Desktop/genesis765.json –datadir ∼/.ethereum/chain765
Примечание
Наберите eth в консоли вашей новой цепочки, чтобы увидеть список доступных JavaScript-методов. В групповом тестовом
окружении вы можете использовать команды типа net.peercount, чтобы увидеть, сколько людей майнят в вашей цепочке, а
также многое другое.
На этом все! Ваша новая цепочка полностью готова к работе, и вы можете использовать консоль точно таким же образом, как
вы делали это в Главе 6. Помните, что вам нужно включить свой майнер в консоли при помощи команды miner.start() перед
тем, как ваши контракты начнут исполняться в этой тестовой сети.
Опциональные флаги для новых цепочек
Вы можете использовать другие флаги в процессе создания новой цепочки для настройки окружения вашей тестовой сети:
–nodiscover: это предотвращает случайное подключение к вашей цепочке посторонних людей с таким же генезисным
файлом и ID сети
–maxpeers 0: если вы знаете, какому количеству пиров вы хотите разрешить подключиться к вашему узлу (допустим, у
вас есть учебная аудитория с ограниченным количеством обучающихся), при помощи этого флага вы можете
ограничить количество участников для вашей цепочки
–-rpcapi “db,eth,net,web3”: разрешает использование RPC и различных Webjs API, доступ к которым осуществляется
через RPC
–rpcport “8080”: дефолтный порт для Geth: 8080, но вы можете выбрать другой номер порта при помощи этого флага
–rpccorsdomain “http://eth.guide/”: используйте этот флаг для определения доменов серверов, которым разрешается
подключаться к вашему узлу и делать RPC-вызовы

–identity “TestnetMainNode”: это позволяет дать вашей цепочке читаемое имя, что облегчает ее идентификацию в списке
пиров.
Использование приватных блокчейнов на продакшене
В этой главе я представил концепцию приватных блокчейнов, в которой они используются в качестве “песочницы” для
изучения Solidity и парадигмы развертывания смарт-контрактов Ethereum. Однако, некоторые люди достаточно серьезно
нацелены на изменение роли приватных блокчейнов в качестве тестовой сети и их использование для корпоративных нужд,
то есть для создания реальных веб-сервисов.
Это прямо противоположно модели безопасности, которую разработчики Ethereum держали в уме в процессе создания
протокола. На практике, ваша приватная цепочка не представляет особого интереса для хакеров, чтобы ее компрометировать.
Не стоит забывать, что ценность токенов, добытых в вашей цепочке (или любой другой цепочке, собственно говоря),
определяется тем, сколько другие люди готовы заплатить за них.
Остановитесь и подумайте об этом на мгновение! Основная сеть, сеть, которую мы считаем публичным блокчейном Ethereum,
не отличается от любой другой цепочки. Тестовые сети и основная сеть технически неотличимы, за исключением уровня
участия, который они получают, и того факта, что сообщество принимает одну из них в качестве основной публичной цепочки.
Если вы удивлены, то это значит, что вы забыли ключевую мантру Ethereum: обобщать все и сохранять протокол
однообразным.
Что делает основную сеть основной, это тот факт, что она была запущена (и позже подвержена форку) Виталиком Бутериным и
частью команды разработчиков Ethereum Core. Люди продолжают использовать основную цепочку лишь благодаря доверию,
интересу и любопытству.
Внутренняя гибкость и изменчивость делают сеть устойчивой. Подобная гибкость имеет важное значение сегодня, на раннем
этапе развития сети, но она будет становиться все менее и менее привлекательной по мере роста сети, пользователи будут
искать большего уровня предсказуемости и надежности. Со временем станет практически невозможно реализовать форки
состояния из-за огромного размера сети, и вероятность появления другой цепочки Ethereum все более снижается.
Безусловно, Ethereum необходимо претерпеть сильное развитие, чтобы на его базе можно было запускать крупные, критически
важные контракты, заточенные под определенную бизнес-логику. Тем не менее, если говорить о невероятной простоте в
использовании, легко понять, почему Ethereum и подобные ему сети рано или поздно заменят закостенелый и устаревший
протокол передачи гипертекста HTTP.
Итоги Главы 9
Зачем вообще нужна публичная цепочка, если есть приватные блокчейны и блокчейны с контролируемым доступом с их
простотой и гарантиями? Почему крупные компании попросту не запустят крупные сети из узлов в своих офисах,
расположенных по всему миру, создавая свои собственные приватные сети Ethereum?
Короткий ответ в том, что крупным компаниям легче и дешевле разрабатывать свои решения в распределенной
инфраструктуре, в которой им не нужно платить за разработку и поддержание работы. Более того, им не нужно платить за ее
защиту; сеть сама по себе становится все более защищенной по мере того, как организации добавляют свои узлы.
В действительности, публичная цепочка заслуживает полного доверия для особо важных транзакций, потому что только
публичная цепочка защищается таким количеством доказательства выполнения работы. Пользователи приватного или
контролируемого инстанса EVM должны понимать, что он был изменен каким-либо образом, что делает его несправедливым
или не заслуживающим доверия. В случае с публичной цепочкой форки протокола должны быть инициированы всеми
майнерами, чтобы они смогли вступить в силу по всему миру.
В следующей главе мы обсудим, что именно отдельные люди или компании могут разработать на базе публичной цепочки.
Примечание к Главе 9
1. Wikipedia, “Hypertext Transfer Protocol,” https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol, 2016.

Создание децентрализованных приложений на блокчейн
Помощь в программировании искусственного интеллекта
Глава 10. Сценарии использования
10.04.2018
Рубрика: Введение в Ethereum и Solidity
Автор: adminCraft
Содержание страницы
1 Глава 10
2 Цепочки повсюду
3 Интернет вещей Ethereum
4 Примечание
5 Ритейл и электронная коммерция
6 Общественное и государственное финансирование
7 Человеческое и организационное поведение
8 Примечание
9 Финансовые и страховые приложения
10 Системы управления запасами и учета
11 Разработка программного обеспечения
12 Игры, гэмблинг и инвестирование
13 Итоги Главы 10
14 Примечания к Главе 10
Глава 10
Доказательство выполнения работы, децентрализация, деревья Меркла и Patricia, асимметричная криптография, смарт-контракты…
Что можно создать из этих компонентов?
Ethereum полезен и, безусловно, открывает новые горизонты, однако лучше всего его оценивать по тем же параметрам, что и другие
сетевые протоколы. Прошло много времени с того момента, как Тед Нельсон ввел в употребление понятие “гипертекст” в своем
проекте Xanadu в 1965 г., легко забыть, почему людям понравился HTTP и его потомок, HTML. Они использовали одинаковый метод,
GET, с помощью которого запрашивалась страница с веб-сервера. Единственным принимаемым ответом была HTML-страница.
Во многих отношениях сеть Ethereum сегодня находится на том же уровне развития, что и протокол передачи гипертекста и язык
гипертекстовой разметки в далеком 1989 году. Одно лишь ее существование можно считать чудом, в сравнении с тем, что было до
нее, хотя первая итерация сети начинает казаться ограниченной.
Последующие итерации продемонстрируют, что при помощи этой кажущейся скудной спецификации можно создавать чрезвычайно
продвинутое программное обеспечение. В этой главе будут продемонстрированы виды приложений, которые появятся в ближайшем
будущем.
Цепочки повсюду
По мнению многих апологетов криптовалют, будущее будут наполнено блокчейнами, которые заменят любую другую
технологическую парадигму. Возможно, это никогда не произойдет – поскольку традиционные базы данных отлично работают в
большинстве случаев – однако благодаря этим сетям с сохранением состояний станут возможны новые виды взаимодействия, о
которых разработчики и проектировщики программного обеспечения даже и не подозревают сегодня. И в эти взаимодействия буду
вовлечены не только люди, но и машины, работающие с беспрецедентной свободой выбора. В будущем вы сможете повстречать
фоновую работу протокола Ethereum во многих ежедневных технологических взаимодействиях, с которыми вы сталкиваетесь. Мы
поговорим о возможном развитии подобного будущего в последующих разделах.
Интернет вещей Ethereum
Для крупных производителей “железа” трудно дается согласование промышленных стандартов для Интернета вещей (IoT). Ethereum

предлагает защищенный, никому не принадлежащий протокол, который может быть использован кем угодно. Благодаря этому его
часто рассматривают как большую находку для IoT. В числе примеров IoT-взаимодействий в сети Ethereum содержатся следующие:
Платежные политики “от устройства к устройству” (“device-to-device”): допустим, вы хотите разрешить своему телефону
тратить до $5 без необходимости спрашивать вашего на то разрешения. Подобное соглашение может быть представлено по
типу лицензионного соглашения с конечным пользователем (EULA), которое используется в современных мобильных
приложениях, однако сегодняшние EULA не наделены возможностью перемещать денежные средства. При использовании
смарт-контракта условия соглашения можно настроить, ваш телефон будет знать, какие вещи вам нужны и сможет их
покупать. Например, вы израсходовали лимит трафика на вашем тарифе LTE; телефон может доплатить за дополнительную
скорость и даже договориться о цене, не требуя вашего вмешательства для “подтверждения” покупки.
Кодирование стоимости или финансовых контрактов для объектов розничной торговли: трудно продавать объекты
интеллектуальной собственности, такие как музыка или видео, когда нет возможности поместить товар на фотографию или
полку в магазине. Тоже самое касается финансовых продуктов, которые тяжелы для рынка ввиду своей абстрактной
сущности. Объекты по типу подарочных карт любых размеров и форм можно использовать для продажи финансовых
продуктов и сервисов в розничном секторе, путем простого нанесения или кодирования адреса контракта на каждом
отдельном предмете.
Аппаратные кошельки: вы наверное встречали небольшие устройства, похожие на компьютеры, которые продаются на
рынке в качестве аппаратных кошельков для биткойнов или эфира. Аппаратные кошельки – это USB-устройства, которые
подключаются к вашему компьютеру и используют его интернет-соединение для доступа к блокчейну. Как и любой другой
узел, аппаратный кошелек создает себе адрес и хранит закрытый ключ (в зашифрованном виде, конечно) прямо на своем
“железе”. Если хранить их в условиях безопасности, аппаратные кошельки являются революционным открытием в сфере
управления активами, поскольку позволяют вам самостоятельно хранить произвольно большое количество криптоактивов
безопасным образом.
Примечание
Аппаратные кошельки в целом более безопасны, чем хранение монет на вашем смартфоне или ПК, когда вы можете забыть о них и
случайно потерять – например, вследствие форматирования жесткого диска без предварительного создания резервной копии
вашего закрытого ключа. Эти устройства также достаточно износоустойчивые. Еще более важно то, что они обычно разработаны на
основе проверенных спецификаций и открытого исходного кода, так что вы можете быть уверенными в том, что ваши монеты
хранятся под защитой от малвари, которая теоретически может заразить ваш компьютер или телефон.

Ознакомиться с примерами аппаратных кошельков и другого розничного оборудования, работающего с Ethereum, можно на
странице со списком решений: http://wallets.eth.guide
Ритейл и электронная коммерция
Блокчейны Ethereum и Биткойн также способны изменить процесс покупки обычных розничных товаров.
Одноранговые рыночные эскроу-контракты: эскроу-контракты используются на рынке, где покупатель и продавец не знают
или не доверяют друг другу. В эскроу-контракте и покупатель, и продавец конкретного товара предоставляют залог в том же
размере, что и стоимость покупки. Залог должен иметь ценность и храниться по доверенности, чтобы защитить транзакцию
в обязательном порядке. Только после того, как покупатель подтвердит, что товар был доставлен, залог будет возвращен
обратно к покупателю и продавцу. Это обеспечивает, что если какая-либо из сторон попытается обмануть другую, то
полученные в результате обмана средства будут примерно равняться сумме залога, поэтому мошенничество станет
достаточно бессмысленным!
Машиночитаемые паттерны в общественных местах: в программировании есть концепция запроса на принятие изменений,
согласно которой один из участников коллективной работы делает запрос администратору проекта на мердж кода, который
он написал. Можете представить себе, что счет на оплату – это запрос на принятие изменений по платежу. Если поместить
машиночитаемые коды на одежду или бирки, то это позволит посетителям торговых пространств взаимодействовать с
продуктами или сервисами, а также выставлять счета в пассивном режиме, с гарантией (возможно, в виде обеспеченного
смарт-контракта), что счета на оплату будут выставлены.
Общественное и государственное финансирование
Финансовые механизмы всего, начиная от ипотечных кредитов до государственных долгов, могут радикально измениться в
результате применения смарт-контрактов. В США проекты на базе Ethereum могут воспользоваться преимуществами Закона о

финансировании стартапов JOBS Act, принятом в 2012 г., для ослабления ограничений по финансированию малых предприятий.
Поправка Title III к этому закону, известная как CROWDFUND Act (Закон о краудфандинге), дает компаниям возможность
использовать краудфандинг для привлечения средств, она была принята 16 мая 2016 г.
Краудфандинг: поскольку криптовалюты столь ликвидны (их можно быстро и легко отправлять с одного аккаунта на другой),
они стали популярным способом приема пожертвований в краудфандинговых кампаниях. Если будут созданы законы о
долевом краудфандинге в США, мы сможем увидеть использование смарт-контрактов Ethereum для создания различных
систем стимулов, выплат и дивидендов для инвесторов, которые принимают участие в новом проекте. Краудфандинговая
кампания самого проекта Ethereum, которая собрала
$18 млн. в биткойнах, положила начало неслыханной до тех пор стратегии по популяризации и финансовому обеспечению протокола
с открытым исходным кодом и управлению некоммерческим фондом. Легко представить, как схожая краудфандинговая парадигма
может быть использована для финансирования локальных общественных работ, таких как строительство мостов и парков.
Выпуск национальной валюты: центральные и розничные банки по всему миру выразили интерес к выпуску цифровых
валют. Вполне возможно, что государства победят негосударственные виды валют, если запустят цепочку, которая будет
майниться на федеральном уровне, и выпустят нативную фиатную монету в этой сети.
Человеческое и организационное поведение
Люди за пределами крупных организаций также могут извлечь преимущества от Ethereum в следующих областях:
Наем фрилансеров: благодаря тому, что фактически Ethereum – это сервис учета, он идеально подходит для управления
командами из удаленных фрилансеров. Более того, можно использовать контракты для формирования новых команд или
объединения работы двух имеющихся групп, без необходимости в изменении организационной структуры бизнеса.
Управляемая приватная передача: становится легко и дешево оплачивать незнакомцам за райдшеринг, аренду жилья и
велосипедов, а также другие сервисы, неважно, кто является администратором группы. Нет нужды в построении
полноценной системы оценки репутации, поскольку участники группы используют одни и те же адреса кошельков неделя за
неделей, месяц за месяцем.
Примечание
В первый год существования сети Ethereum было множество трудностей вокруг концепции децентрализованной автономной
организации или DAO. Любой консультант по менеджменту из компании, входящей в рейтинг Fortune 500, может рассказать вам, что
компании любых размеров уже высоко автоматизированы. Возможно, однажды эта автоматизация будет реализована при помощи
Ethereum, но до тех пор мы примем к сведению эту аббревиатуру (DAO) и перейдем к более практическим вопросам.
Опросы мнения клиентов и персонала: идея опроса мнения заключается в следующем: регулярное общение с участником
проекта, мнение которого вам важно, чтобы убедиться, что дела идут как надо. И персонал, и клиенты могут выиграть от
регулярных опросов, но это трудная задача. В случае с клиентами, это маркетинговая задача; трудно получить пространство
на экранах их смартфонов без знания номера телефона или установленного на их устройствах мобильного приложения. Для
HR-департаментов проблема еще более хитроумна; персонал может целыми днями работать в офисе и никогда не говорить
откровенно о происходящем. Ethereum-совместимые кошельки в качестве приложений – это троянские кони для любых
видов обмена сообщениями. Их можно использовать для множества субвалют и сообществ, превратив в виртуальные
пространства с высоким трафиком, в которых люди смогут отправлять и получать информацию, такую как платежи, токены и
валюты.
Маленькие компании делают большие вещи: в прошлом банки, страховые компании и другие организации старались
вырасти настолько сильно, насколько это возможно в попытке максимально увеличить свою репутацию и авторитет. Если
множество сервисов – возможно, даже государственных – будут представлены в EVM, смысл иметь дело с неизвестными
предпринимателями будет естественным образом отпадать. Почему бы не проинвестировать и не поучаствовать в
краудфандинговой кампании, если отсутствует риск того, что потенциальные мошенники скроются с вашими деньгами? В
мире, где мошенничество и присвоение чужих средств практически невозможно ввиду прозрачной, предсказуемой и
публичной природы смарт-контрактов в публичных цепочках, становится намного проще предоставлять денежную
поддержку людям, которые в ней нуждаются.

Финансовые и страховые приложения
Малые предприятия смогут взять на себя некоторые из функций, осуществляемых банками, при помощи сети Ethereum.
Все, чем занимаются банки, разделенное на отдельные компоненты, которые поставляются как услуги в виде чистого
программного обеспечения: отдельные финансовые услуги включают в себя дополнительные валюты, сберегательные счета,
эскроу-счета, доверительное управление, завещания и различные финансовые контракты, такие как свопы, деривативы и
хеджинговые контракты.
Полуфинансовые приложения, в которых работа осуществляется за деньги: если компьютер сможет определить
доказательство результата работы персонала (скажем, за счет проверки учета продаж работника в базе данных),
приложения смогут предоставить доказуемо справедливые бонусные системы с динамическими параметрами, чего нет в
устаревшей системе выплаты заработной платы. Подобные системы смогут обращаться к контрактам найма, которые также
будут являться смарт-контрактами.
Страхование урожая: трейдеры на товарно-сырьевых рынках любят торговать фьючерсами и другими деривативами,
основанными на сельскохозяйственных культурах в качестве базового актива. Данные, которые можно отслеживать на
научной основе, такие как температура, атмосферное давление и влажность, могут собираться независимыми автономными
датчиками, подключенными к сети Ethereum, что предоставит точные результаты метеорологических данных, это может быть
использовано в качестве триггера, по которому контракт осуществит платеж тем или иным образом.
Доверие сообщества: сберегательный банк, написанный в виде чистого программного обеспечения, в который клиент может
вложить средства, может быть не требующим доверия образом запущен при помощи смарт-контракта, наделенного правом
собирать залоги и даже платежи по кредиту с аккаунта. Multisignature-адреса (мультиподписные) могут обеспечить
отвечающее всем требованиям утверждение транзакции, принимаемое посредниками в случае, если это кастодиальный счет
или в других особых ситуациях.
Системы управления запасами и учета
Когда речь идет о цепочке поставок, хранение неизменяемого учета запасов может стать еще одной сферой, где могут пригодится
публичные цепочки:
Представление упорядоченных активов, например, золота, хранящегося в хранилище: если вы храните золото в банковском
хранилище, как вы сможете проверить через год, что оно действительно там находится? Поскольку многие банки выдают
вклады только лишь из частичных резервов, было бы удобно знать, что ваши валюты или драгоценные металлы находятся
там. Если инвентаризировать золото, серебро и другие инструменты в блокчейне, это позволит владельцам быть
уверенными в том, что их капитал не будет утерян вследствие “реструктуризации долговых обязательств” в случае, если банк
становится неплатежеспособным.
Доказательство происхождения товаров: если компоненты промышленных товаров проинвентаризированы в блокчейнах
всеми оригинальными производителями оборудования, или OEM-производителями, появляется возможность выяснить,
является ли конкретный продукт оригинальным оборудованием, или он был подменен/отремонтирован.
Токен-системы, которые производят простые учетные операции: одним из простых способов учета операций для
намечающегося события (например, крупнейшей в мире распродажи выпечки) может быть создание токена, выступающего в
роли временного средства платежа для совершения покупок на мероприятии. На входе терминал, работающий на базе смартконтракта, будет выдавать каждому потенциальному клиенту определенное количество токенов для траты на распродаже
выпечки в обмен на эфир. По завершению события общее количество капкейков, которое вы купили, будет записываться с
каждой покупкой, совершенной по контракту, что позволит операторам распродажи выпечки легко понять, получили ли они
прибыль.
Разработка программного обеспечения
Несомненно, самый революционный потенциал Ethereum заключается в его способности хостить программное обеспечение и
сервисы.
Облачные вычисления: когда в EVM появится возможность децентрализованного хранения данных (конец 2017 г.), сеть
наконец станет похожа на полноценную среду для хостинга веб-приложений. Протоколы распределенного консенсуса

позволяют создавать отличные платформы облачных вычислений благодаря своей архитектуре, не требующей доверия: нет
нужды беспокоиться о том, что ваша сложная сетевая конфигурация сможет хранит данные безопасно или сможет
справляться с интенсивным трафиком. Подобная система может не подходить для всех видов приложений, но подойдет для
распараллеленного программного обеспечения.
Долгосрочный хостинг приложений: некоторые финансовые контракты создаются как “капсулы времени”. Но как вам
обеспечить, чтобы компьютерная программа смогла запуститься через 50 или 100 лет? Один из способов – разработать ее в
качестве публичного сервиса; люди могут хостить документы и быть уверенными, что сеть по-прежнему будет работать, даже
если их давно уже не будет.
Дешевый, отказоустойчивый, свободный от цензуры хостинг общедоступных документов: важнейшие документы, такие как
свидетельства о рождении, налоговые декларации, судебные документы, иммиграционные формы, медицинские карты и
прочие неструктурированные данные могут быть легко зашифрованы и помещены на хранение в блокчейн, третьи стороны
смогут находить их в случае необходимости. Частные организации сегодня отвечают за проверку биографических данных и
кредитных историй. Это, мягко говоря, проблематичный процесс; публичная цепочка может обеспечить “перманентный веб”,
в котором можно хостить подобные документы для будущих поколений.
Игры, гэмблинг и инвестирование
Разработчики блокчейнов уже запустили ряд доказуемо справедливых азартных игр, чтобы продемонстрировать возможности сети.
В будущем подобное применение блокчейнов может быть перенесено на следующие сценарии:
Одноранговый гэмблинг: независимо от законов, создание географически масштабных гэмблинговых сетей является
трудной задачей, потому что немногие люди доверяют своим букмекерам хранение крупных сумм денег. Создание ставок в
чистом программном обеспечении – задача проще простого для Ethereum. Представьте, к примеру, контракт на ставку, в
котором ставка делается на значение nonce или какое-либо другое подобное рандомное событие, которое обязательно
произойдет при достижении консенсуса в цепочке.
Рынки предсказаний: рынки предсказаний пытаются использовать крупномасштабные рынки ставок для определения
реального исхода событий. Правительство, которое принимает решения исходя из данных, полученных на предиктивных
рынках, и пытающееся автоматизировать свою работу и усовершенствовать свою эффективность, называется футархией
(“futarchy”).
Криптоактивы с устойчивой ценностью: общеизвестно, что криптовалюты волатильны. Поскольку при обмене криптовалют
нет третьих сторон, участвующих в роли посредника, нет и возможности оспаривания транзакций. Это делает криптовалюты
идеальной средой, в которой динамичные маркетмейкеры могут проглатывать менее опытных трейдеров. Создание
стабильного актива, который люди будут держать, сохранять и даже передавать свои детям – это задача, с которой не
справился пока что ни один финансовый институт.
Это хороший обзор вещей, которые вы можете создать при помощи смарт-контрактов и dapps в сети Ethereum, но это далеко не
исчерпывающий список.
Итоги Главы 10
Мы видим лишь зарождение нового мира разработки приложений, ставшего возможным благодаря распределенными
приложениям. Вы сможете найти больше примеров dapps и идей на странице: http://dapps.eth.guide
И наконец, в следующей главе будет описано, что ждет сеть Ethereum: грядущие компоненты и дорожная карта, согласно которой
идет их разработка.
Примечания к Главе 10
1
W3.org, “W3 History,” www.w3.org/History/19921103-hypertext/hypertext/WWW/Protocols/HTTP.html, 2016.

Создание децентрализованных приложений на блокчейн
Помощь в программировании искусственного интеллекта
Глава 11. Продвинутые концепции
10.04.2018
Рубрика: Введение в Ethereum и Solidity
Автор: adminCraft
Содержание страницы
1 Глава 11
2 Кто возглавляет разработчиков ПО на пути к децентрализации?
3 Лучшие технические публикации Виталика в блоге Ethereum
4 График релизов Ethereum
5 Whisper (обмен сообщениями)
6 Swarm (адресация по содержимому)
7 Перспективы
8 Другие интересные инновации
9 Полная дорожная карта Ethereum
10 Релиз “Frontier” (2015)
11 Релиз “Homestead” (2016)
12 “Metropolis” (2017)
13 “Serenity” (2018)
14 Итоги Главы 11
15 Примечания к Главе 11
Глава 11
Книга для начинающих по Ethereum и Solidity была бы неполной без упоминания о зарождающемся культе личности,
формирующемся вокруг Виталика Бутерина, создателя Ethereum и участника ряда других заметных блокчейн-проектов
Кто возглавляет разработчиков ПО на пути к децентрализации?
Пожалуй, наилучшее описание Бутерина содержится в статье, опубликованной о нем весной 2014 г. автором Морганом
Пеком в блоге Backchannel. В статье описывается первое знакомство автора с со-основателем Ethereum:
– Бутерин был единственным, кто проснулся. Он сидел на улице в шезлонге и усиленно работал. Я не стал его отвлекать, но и
он меня не поприветствовал. Однако, я помню чувство, которое он произвел на меня в тот момент. Этот чрезвычайно худой,
19-летний парень, кожа да кости, нависал над своим ноутбуком как богомол, наносящий проворные, смертельные удары с
невероятной скоростью.
– Оказалось, что все участники мероприятия прибыли туда лишь ради него. Двумя месяцами позже он опубликовал “Белую
книгу”, в которой была описана немыслимо амбициозная технология, которая расширяла миссию Биткойн по созданию
неостановимых, осуществляемых без посредников цифровых платежей, и представляла платформу для автономного
программного обеспечения всех видов.
В центре этого движения вокруг свободного, опенсорсного сетевого протокола интеллектуальное лидерство Бутерина не
имеет себе равных. Возможно, наиболее удивительным в этом является не только ошеломляющее устремление проекта
заменить HTTP-веб на что-то более лучшее, но и скорость, с которой это происходит.
Проект Ethereum был запущен в 2014 г., введен в эксплуатацию в 2015 г. и стал криптовалютной сетью номер два после
Биткойн к 2016 г. Текущий список все участников фонда Ethereum Foundation можно найти по ссылке.
В 2017 г. команда ключевых разработчиков планировала выкатить другие компоненты, благодаря которым Ethereum
достигнет уровня, сравнимого с веб-приложениями, которые мы знаем и любим сегодня – но с потрясающим новым
набором возможностей, наподобие тех, что были описаны в предыдущих главах.

Оставшаяся часть этой главы описывает дорожную карту Ethereum, а также ряд других пока еще недоработанных и
не созданных компонентов.
Если вы хотите углубиться в аспекты математики, экономики и коммерческого обоснования, лежащими в основе сети
Ethereum, в том виде, в котором она работает сегодня, то вряд ли можно найти что-либо лучшее, чем углубленные статьи в
блоге Ethereum, где Бутерин излагает свои мысли касаемо некоторых ключевых концепций протокола.
Лучшие технические публикации Виталика в блоге Ethereum
Несколько интересных статей для изучения:
https://blog.ethereum.org/2015/06/06/the-problem-of-censorship/
https://blog.ethereum.org/2015/04/13/visions-part-1-the-value-of-blockchain-te chnology/
https://blog.ethereum.org/2015/04/27/visions-part-2-the-problem-of-trust/
https://blog.ethereum.org/2015/01/10/light-clients-proof-stake/
https://blog.ethereum.org/2015/01/23/superrationality-daos/
Более детальный список людей и компаний, участвующих в разработке экосистемы Ethereum:
http://ecosystem.eth.guide
График релизов Ethereum
Современные серверные приложения хорошо справляются с тремя вещами: они проводят вычисления и выполняют
программы, они запоминают наши данные, и они обеспечивают возможность взаимодействия с человеком. Сегодня
виртуальная машина Ethereum может проводить вычисления, но не может хранить большие объемы данных, и также она не
может служить посредником в обмене сообщениями между людьми.
Кстати говоря, две последних составляющие находятся в разработке к моменту написания книги. Краткосрочная дорожная
карта Ethereum включает три основных компонента:
EVM: децентрализованное состояние (выполнено!)
Swarm: децентрализованное хранение
Whisper: децентрализованный обмен сообщениями
Whisper (обмен сообщениями)
Whisper – это распределенная система обмена сообщениями, являющаяся частью протокола Ethereum, и которая станет
доступной для веб-приложений, использующих EVM в качестве бэкенда. В отличие от информации, данной в предыдущих
главах, когда под сообщением понимается объект данных, передаваемый от одного смарт-контракта другому, в случае с
Whisper мы используем понятие “сообщение” традиционным образом: один человек общается с другим человеком или
группой людей посредством сетевого протокола.
Swarm (адресация по содержимому)
Swarm – это протокол учета с адресацией по содержимому. Он работает с неизменяемыми данными, распределяет и
хранит их в распределенной сети таким образом, чтобы приложение могло легко запросить их. Цель Swarm – достичь
способности находить различные версии файла по одному адресу памяти, имитируя доменные пути в современных URL, с
их структурой каталогов.
Важно отметить, что этот протокол адресации не зависит от аппаратного обеспечения. Он просто используется для
индексирования, какие фрагменты данных куда сохраняются. Этот сценарий с использованием хранилища BLOB-объектов
часто используется для децентрализованных систем, а Swarm еще больше упростит его благодаря ряду инноваций, у
истоков которых стоял протокол BitTorrent. Если вы не хотите ждать Swarm, изучите существующий протокол
распределенного хранения файлов под названием Межпланетная Файловая Система, или IPFS, который также можно
использовать для работы с Ethereum dapps.
Предположим, что наступил 2020-й год, и вы запускаете Ethereum-приложение в браузере Mist. Давайте представим, что к
тому времени уже существует система человекочитаемого пространства имен; Ethereum находится полностью на равных
условиях с Вебом, со своей собственной системой поиска доменных имен. Вот как будет выглядеть процесс поиска данных
при помощи dapp, работающего по протоколу Swarm:
1.1. Переходим к приложению в Mist. Вводим доменное имя Ethereum.
2.2. Домен транслируется в Swarm-хеш.
3.3. Swarm извлекает HTML/CSS/JS-файлы, связанные с этим хешем.
4.4. Запрашивает новые файлы, связанные с этим хешем, загружает новые данные по мере их поступления.
Пользовательский опыт не будет сильно отличаться от того опыта, что есть при работе с существующими вебприложениями. Однако, задача здесь – обратиться к P2P-хранилищу, устойчивому перед DDoS, которое обеспечивает 100%
аптайм и к которому могут получить программный доступ различные виды клиентов, запрашивающие файлы из
различных сетей хранения данных.
Вы можете узнать больше о Swarm из White Paper по адресу.
Перспективы
Весной 2016 г. Бутерин выпустил новый документ с шутливым названием “Mauve Paper” (“Лиловая бумага”). В этом
документе он изложил семь важнейших основных задач для оставшейся дорожной карты Ethereum:
Переход от алгоритма достижения консенсуса “доказательство выполнения работы” к алгоритму “доказательство
доли владения”. Доказательство выполнения работы, как система достижения консенсуса, эффективно, но
дорогостояще с точки зрения энергопотребления. Защита консенсуса без майнинга снизит пустую трату
электроэнергии, а также необходимость в использовании инфляционной схемы выпуска.
Результатом использования доказательства доли владения должно стать более быстрое время блока, что приведет
к большему уровню грануляции данных и эффективности без потери безопасности и риска централизации.
Экономическая завершенность. Как описывалось в Главе 3, потенциал Ethereum для корпоративного сегмента
заключается в создании децентрализованной системы, в которой будет достигаться завершенность расчетов по
транзакциям. Системы на основе доказательства доли владения могут включать в себя роли для узловвалидаторов, которые полностью подтвердили блок, но если они вступили в преступный сговор для объявления
ошибочного блока, то они теряют свой баланс ETH (а это могут быть миллионы долларов).
Масштабируемость – это проблема, связанная с уровнем вычислительных ресурсов, которые требуются для
работы полных узлов сегодня. Крупный блокчейн, с 1 Гб DAG, и высокие требования к CPU или GPU делают
смартфоны и другие маломощные устройства бесполезными для работы демонов узла Ethereum. Документ о
масштабируемости:
https://github.com/vbuterin/scalability_paper/blob/master/scalability.pdf
Другая насущная статья о масштабируемости, посвященная использованию так называемых chain bers (“волокна
цепочки”):
www.reddit.com/r/ethereum/comments/31jm6e/new_ethereum_blog_post_by
_dr_gavin_wood/
Шардинг данных блокчейна и обеспечение возможности кросс-шардингового обмена данными – это еще один
критически важный элемент масштабирования. Шардинг – это процесс разделения отдельного фрагмента данных
на несколько баз данных таким образом, что он может быть собран обратно по необходимости. Блокчейны сами по
себе не шардят. Однако, должна иметься возможность позволить различным частям состояния EVM храниться на
различных узлах, а также разрабатывать приложения, которые смогут обращаться к ним на этих узлах.
Устойчивость перед цензурой, в контексте попыток узлов-валидаторов при работе по схеме доказательства
выполнения работы вступать в сговор по всем шардам (сегментам) с целью блокирования достижения
завершенности определенных транзакций. Эта возможность уже существует в Ethereum0, но она будет улучшена в
последующих релизах.
“Лиловый документ” находится по адресу: http://vitalik.ca/ les/mauve_paper.html
Другие интересные инновации
В то время, как команда Ethereum работает согласно своей концепции развития EVM, сообщество разработчиков Ethereum
продолжает экспериментировать со своими собственными решениями. Некоторые перспективные технические
инновации, которые привлекли к себе внимание:
Каналы состояния: канал состояния, наподобие каналов микроплатежей, является связкой между двумя базами
данных, работающими на основе блокчейна, при которой реестры синхронизируются и обновляются без
необходимости в ожидании, пока основная цепочка обработает транзакцию. Прочитать о том, как это работает,
можно по ссылке.
Легкие клиенты: легкие клиенты позволят смартфонам и другим маломощным компьютерам использовать дерево
Merkle-Patricia – или его часть – для создания доказательства, подтверждающего, что определенная транзакция
действительно содержится в блоке. Это позволит отказаться от необходимости в загрузке и синхронизации целого
блокчейна, но сохранит возможности валидации, отправки и приема транзакций. О том, как могут работать легкие
клиенты, можно прочитать по ссылке.
Рынок вычислительных услуг Ethereum: рынок вычислений станет одним из способов разрешить некоторым
транзакциям проводиться вне цепочки, а впоследствии синхронизироваться с публичной цепочкой. Один из
проектов, экспериментирующий с подобным подходом, можно найти на Гитхабе:
https://github.com/pipermerriam/ethereum-computation-market
Полная дорожная карта Ethereum
Несмотря на то, что разработка программного обеспечения может быть непредсказуемым процессом, разработчики
Ethereum прекрасно справляются с прохождением контрольных точек в плане развития. Вот те из них, что уже пройдены, а
также те, которые еще предстоит преодолеть, по состоянию на время выхода книги:
Релиз “Frontier” (2015)
Версия Ethereum “Frontier” имела несколько основных целей, все из которых были выполнены согласно запланированному
графику. На этой стадии все в Ethereum делалось посредством командной строки. В числе приоритетов на тот момент были
следующие:
Запуск операций майнинга (по заниженному коэффициенту вознаграждения)
Вывод эфира на криптовалютные биржи
Создание live-среды для тестирования dapps
Создание песочницы и кранов для получения эфира
Дать возможность людям загружать и исполнять контракты
Релиз “Homestead” (2016)
Релиз “Homestead” привлек гораздо больше мейнстримовых криптовалютных энтузиастов с выходом браузера Mist. Его
характеристики:
Коэффициент вознаграждения за майнинг эфира вырос на 100%
Нет остановок в работе сети
Практически бета-версия
Больше документации по командной строке и Mist
“Metropolis” (2017)
На момент написания книги велась работа над “Metropolis”, второй стадией разработки протокола Ethereum. Этот релиз
станет настоящим выходом в свет для Mist, который при реализации полноценного функционала станет похож на что-то
среднее между Chrome и iOS App Store. Он будет содержать ряд тяжеловесных сторонних приложений. К этому моменту
Swarm и Whisper станут готовы к работе.
“Serenity” (2018)
Эта стадия названа “Serenity” ввиду запланированного перехода от доказательства выполнения работы на что-либо менее
обременительное: в идеале, какую-либо форму алгоритма доказательства доли владения.
К моменту написания книги предварительное кодовое название для механизма достижения консенсуса в Ethereum,
основанного на POS, это “Casper”.
Хотя никто еще не довел до совершенства подобную систему достижения консенсуса, прогресс идет с каждой неделей.
Математики и специалисты в области вычислительных систем, работающие в этой области, уверены в том, что прорыв уже
рядом. Два поста, в которых есть справочный материал на тему этих исследований:
https://blog.ethereum.org/2015/12/24/understanding-serenity-part-i-abstraction/
https://blog.ethereum.org/2015/12/28/understanding-serenity-part-2-casper/
Итоги Главы 11
Каким станет мир ко времени выхода “Serenity”, а майнинг на основе доказательства выполнения работы будет прекращен?
Тяжело предсказать. Но Ethereum, Биткойн и другие криптосети будут иметь определенное предсказуемое влияние на
корпоративные информационные технологии.
Один из величайших экономистов 20-го века, Рональд Коуз, известен благодаря своей догадке о том, что фирмы
существуют в первую очередь для того, чтобы предотвратить “трансакционные издержки”, возникающие в результате
постоянного поиска работников. Фирмы заключают долгосрочные соглашения о найме, которые повышают
эффективность. Но эти же самые бюрократические процессы, что повышают эффективность в рядах нескольких десятков
работников, могут стать препятствием при масштабировании, делая крупные фирмы медленными и
неконкурентоспособными. В результате они пытаются найти точку равновесия, в которой минимальное количество
бюрократии создает максимум эффективности.
За последние 20 лет технологии увеличили скорость бизнеса, поскольку корпорации совершенствовали опыт в
крупномасштабных программных системах. В последнее время значительные усилия прикладываются для того, чтобы
сделать эти системы более искусными в работе с подрядчиками, консультантами и фрилансерами. Компании получают
возможность быстро собирать команды из подобных временных работников при возникновении потребности, а затем
расформировывать их без необходимости увольнять штатных сотрудников. Границы современной компании становятся
более размытыми. Согласно исследованию, проведенному компанией “Intuit”, разрабатывающей программное
обеспечение, порядка 40% американской рабочей силы станут “работниками, нанятыми по нестандартной схеме занятости”
к 2020 году.
Ethereum обеспечивает поддержку этого тренда. Когда весь мир сможет работать внутри глобального транзакционного
синглтона, который способен запускать не требующие доверия приложения, границы офисного здания (или виртуальной
частной сети, или непосредственно компании) становятся все менее и менее важными. Когда компенсационные пакеты
могут быть легко сформированы из наборов условных операторов “if-then” в смарт-контракте, разница между заработной
платой и бонусом станет расплывчатой. Размер, возраст и местоположение компании больше не будут нести в себе
культурных коннотаций касаемо ее благонадежности или важности. Эпоха пожизненной занятости и работников,
преданных компании, возможно, подходит к завершению.
Подобные перемены можно встретить на высших уровнях власти и банкинга. 18 января 2017 г. главе Федерального
Резерва Джанет Йеллен был задан вопрос на тему перспективности блокчейн-технологии во время беседы,
проводившейся в калифорнийском клубе Содружества. Вот ее ответ:
– Мы исследуем ее перспективы в сравнении с некоторыми технологиями, которые мы непосредственно используем, и
многие финансовые институты также изучают ее. Эта технология может очень сильно изменить то, как проводится клиринг и
расчет по сделкам в глобальной экономике.
Смена парадигмы может быть на подходе: во-первых, период перемен, когда физические лица и бизнес разберутся со
свободой договоров, некоторые из которых даже будут долгосрочными, при небольшой потребности в контрагентах и
небольшом внимании к корпоративным или даже государственным границам. Сделки на несколько миллионов долларов
могут по-прежнему совершаться при помощи ручки и бумаги, но какое количество контрактов на суммы от $1 до $100000
может быть обработано машинами Ethereum, работающим по шаблонным стратегиям? Сколько долларов и рабочих часов
может быть сэкономлено? Скольких противоречий удастся избежать? Сколько деловых соглашений могли бы стать более
справедливыми и защищенными? Множество, вне всякого сомнения. По большему счету, это многообещающее будущее
Ethereum.
Примечания к Главе 11
1
Backchannel, “The Uncanny Mind That Build Ethereum,” https://backchannel.com/the-uncanny-mind-that-built-ethereum9b448dc9d14f#.ct4n 4b561, 2016.
2
Ethereum Blog, “Introducing Casper, the Friendly Ghost,” https://blog.ethereum.org/2015/08/01/introducing-casper-friendlyghost/, 2015.
3
Intuit, “The Intuit 2020 Report,” http://about.intuit.com/futureofsmallbusiness/, 2010.
4
YouTube, Janet Yellen interview, www.youtube.com/watch?v=ktBgb4xHKGY, 2016.
Download