Полная версия
Разработка смарт-контрактов в Ethereum
Тимур Машнин
Разработка смарт-контрактов в Ethereum
Ethereum. Причины возникновения Ethereum
Когда в 2008 году появился Биткойн, он был полностью революционным.
Количество концепций, которые собрались при этом вместе, информатика, криптография и экономические стимулы, было удивительным.
Когда в 2009 году была запущена реальная сеть Bitcoin, многие думали, что этот проект потерпит неудачу.
Чтобы гарантировать работу сети, язык скриптов биткойна был преднамеренно предельно ограничительным.
На самом деле у Биткойна не совсем язык скриптов, он использует стек с операторами скриптов.
Язык скриптов в биткойне важен, потому что это то, что делает биткойн «программируемыми деньгами».
В рамках каждой транзакции биткойн есть возможность написать небольшую программу.
В результате вы можете автоматически переводить деньги с помощью компьютерного кода, и каждый может видеть правила, по которым эти деньги перемещаются, и знать, что эти правила будут соблюдаться.
До сих пор сеть Биткойна успешно развивается, и ее капитализация растет.
Однако все приложения, которые создаются в Биткойне – это инфраструктурные приложения, такие как кошельки и биржи.
Причина этого в ограниченности языка скриптов Биткойна.
Проект Ethereum взял этот ограниченный набор операторов и развил его в полноценный язык программирования.
Эфириум никогда бы не существовал без Биткойна в качестве предтечи.
При этом Ethereum во многом опережает Биткойн.
Язык программирования Ethereum позволяет делать гораздо больше, чем биткойн.
Язык скриптов Bitcoin намеренно ограничивает. В результате, в биткойн вы можете делать только основные вещи.
Этот язык также трудно понять и использовать.
Вместо большинства современных языков программирования, где код легко читается, скрипты биткойна выглядят как непонятный машинный код.
Напротив, языки программирования Ethereum (Solidity для тех, кто любит Javascript, и Serpent для тех, кто любит Python), позволяют делать практически все, что позволяет вам продвинутый язык программирования.
При этом, эти языки простые в использовании.
Эта комбинация полной функциональности программирования и простоты использования очень важна.
Люди делают вещи в Эфириуме, которые сейчас невозможны в Биткойне.
Эфириум создал новое поколение разработчиков, которые никогда не работали с Bitcoin, но заинтересованы в Ethereum.
Биткойн мог бы иметь эту расширенную функциональность, но через создание многочисленных надстроек, которые бы работали с протоколом биткойнов, в то время как Ethereum предоставляет эту функциональность из коробки.
Помимо радикального различия в языках скриптов, в Ethereum намного лучше инструменты разработчика.
У Биткойна никогда не было полноценного набора инструментов для разработчиков, хотя он очень нужен, потому что работать с Bitcoin намного сложнее.
Эфиреум сделал жизнь разработчика намного проще.
Он имеет домашнюю страницу для разработчиков и собственную среду разработки (Mix IDE) среди прочих других.
Есть и другие преимущества Эфиреума, о которых достаточно написано.
Являются ли Bitcoin и Ethereum конкурентами или дополняют друг друга?
Это еще предстоит выяснить.
Возможно, биткойн останется протоколом, с помощью которого люди будут хранить свои деньги, потому что он более стабилен и надежен.
Это позволило бы Ethereum продолжать рисковать, позволяя разворачивать приложения в своей сети.
В этом случае Bitcoin будет являться скорее сетью денежных расчетов, в то время как Ethereum будет использоваться для запуска децентрализованных приложений.
Так что Bitcoin и Ethereum могут дополнять друг друга.
Что такое Эфириум?
Согласно веб-сайту Ethereum, «Ethereum – это децентрализованная платформа, на которой работают умные контракты».
Биткойн же можно охарактеризовать как цифровые деньги.
Биткойн используется для перевода денег от одного человека другому.
И он обычно используется в качестве хранилища денег и является основой для понимания обществом концепции децентрализованной цифровой валюты.
Ethereum отличается от Bitcoin тем, что он позволяет использовать смарт-контракты, которые можно охарактеризовать как высоко программируемые цифровые деньги.
Представьте, что вы автоматически отправляете деньги от одного человека другому, но только тогда, когда выполняется определенный набор условий.
Например, человек хочет купить дом у другого человека.
Традиционно в обмене участвуют несколько третьих сторон, в том числе юристы и агенты условного депонирования, что делает процесс излишне медленным и дорогостоящим.
С помощью Ethereum код может автоматически передать покупателю собственность и средства продавцу после того, как сделка будет одобрена без необходимости участия третьей стороны.
Потенциал для этого невероятный.
Подумайте о многочисленных приложениях, которые выступают в качестве третьей стороны, чтобы связать вас с другими на основе определенной логики (например, Uber и eBay).
Многие из централизованных систем, которые мы используем сегодня, можно было бы децентрализовать на Эфириуме.
Децентрализация важна, так как устраняет точки отказа или контроля.
Децентрализованные платформы удаляют посредников, что в конечном итоге приводит к снижению затрат для пользователя.
Bitcoin vs Ethereum
Давайте еще раз обсудим, чем отличается Эфериум от Биткойна.
Если кратко, Биткойн – это первый известный блокчейн.
А Ethereum – это блокчейн следующего поколения.
Биткойн был первоначально создан как одноранговая электронная платежная система, где валюта торгуется между адресами.
Ethereum был создан с идеей быть не только одноранговой денежной системой, а представлять одноранговую базу данных и распределенный виртуальный компьютер, компьютер, который манипулирует тем, что называется состоянием.
Вы можете думать о состоянии как о текущих значениях всех переменных в системе, согласованных всеми узлами посредством консенсуса.
Состояние в Ethereum изменяется в результате транзакций и работы виртуальной машины Ethereum.
В то время как у Биткойна есть упрощенный язык скриптов, одной из наиболее примечательных особенностей Ethereum является виртуальная машина, которая способна выполнять полноценный код.
Весь код, который запускается виртуальной машиной, может быть сохранен как часть цепочки блоков.
И вы можете программировать довольно сложные приложения, чья логика будет работать на цепочке блоков.
Из-за этого существует огромное сообщество разработчиков, растущее вокруг Ethereum, которые создают множество приложений и развивают экосистему Ethereum.
У системы Ethereum, как и у Биткойна, есть проблемы с масштабированием.
Например, вся система в настоящее время может обрабатывать только 17 транзакций в секунду.
Потому что вся сеть должна запускать каждое вычисление на каждом компьютере, а это значит, что вся система может работать настолько быстро, насколько быстро в ней работают самые медленные компьютеры.
Доказательство работы неэффективно, и сам блокчейн продолжает расти.
Сообщество пытается решить эти проблемы масштабирования с помощью нескольких подходов: доказательстве ставки, каналов состояний, Sharding и Plasma.
Переход на доказательство ставки вместо доказательства работы уменьшит значительную вычислительную нагрузку на сеть.
Вместо того, чтобы добывать блоки, ища допустимо низкое значение хэша, сеть будет создавать блоки путем распределения разрешения на их создание пропорционально доле валюты, предоставленной узлом в качестве ставки, а не исходя из количества вычислительной мощности, которое узел может иметь.
Эфериум предлагает свой вариант доказательства ставки по названием Casper.
Casper реализует процесс, с помощью которого можно наказывать вредоносные узлы в сети.
Последняя версия протокола представляет собой гибрид алгоритмов доказательства работы и доказательства ставки.
Для создания блоков по-прежнему используется работа майнеров, а для фиксации контрольных точек блокчейна применяется «доказательство ставки».
Доказательство ставки создаёт дополнительную прослойку безопасности поверх результатов доказательства работы.
Для этого участники доказательства ставки или валидаторы отправляют личные монеты в пул валидаторов.
И блок будет считаться найденным только в том случае, если предложение поддержат две трети участников.
Если голоса не набираются, цепь продолжает работу на усилиях майнеров.
Каналы состояний обеспечивают своего рода кластеризацию транзакций в сети.
Это уменьшит количество отдельных транзакций, которые сеть должна будет обрабатывать сама.
Следующий подход для решения проблемы масштабирования, это Sharding – это идея разделения сети на более мелкие части, которые работают независимо.
И наконец, Plasma – это серия смарт контрактов, запущенная на вершине основного блокчейна.
В Plasma все данные обрабатываются в дочерних блокчейнах, и только результаты отправляются в основной блокчейн.
Если сравнивать Биткойн и Эфериум,
Биткойн был открытием, окном в технологию blockchain, за что мы должны поблагодарить и Сатоши Накамото, псевдонима, который создал протокол биткойна.
Примерно через девять лет академических исследований консенсусных алгоритмов, одноранговой сети, криптографических токенов и, что наиболее важно, виртуальной машины, Ethereum захотел взять тот же принцип одноранговой связи и применить его к любому типу программного приложения.
Таким образом, в основе как Ethereum, так и Bitcoin, лежат одни и те же принципы блокчейна, одноранговой сетевой инфраструктуры и архитектуры, криптографии и консенсуса.
Основное различие между Bitcoin и Ethereum заключается в наличии виртуальной машины Эфериума, которая по сути является мировым компьютером и для которой мы можем программировать приложения.
Таким образом, хотя Биткойн и Эфириум работают на принципе распределенного реестра и криптографии, у них есть множество технологических отличий.
Например, язык программирования, используемый Ethereum, является полным, в то время как у биткойна язык программирования стековый.
Другие отличия состоят во времени создания блока и подтверждения транзакции, транзакция Ethereum подтверждается в течении секунд по сравнению с минутами биткойна.
Кроме того, Ethereum использует алгоритм хэширования Ethash, в то время как Bitcoin использует алгоритм хэширования, SHA-256.
Также Ethereum использует доказательство работы, устойчивое к ASIC.
В алгоритме майнинга Эфериума, майнеры должны извлекать случайные данные из состояния, вычислять некоторые случайно выбранные транзакции из последних N блоков в цепочке блоков и возвращать хэш результата.
Это имеет два важных преимущества.
Во-первых, контракты Ethereum могут включать в себя любые вычисления, поэтому ASIC для Ethereum должен быть, по существу, ASIC для общих вычислений, т. е. процессором.
Во-вторых, для добычи требуется доступ ко всей цепочке блоков, заставляя майнеров хранить весь блок-цепочку.
Таким образом, применение ASIC для Эфериума, по сути, бесполезно, потому что это просто общие вычисления.
И, в довершение всего, в блокчейн могут быть записаны контракты, которые специально предназначены для усложнения работы ASIC.
Еще одна интересная вещь, заключается в том, что так как майнеры работают с состоянием, память должна быть быстрой.
И стандартная DRAM на самом деле не справляется с этой задачей, поэтому для майнинга используются RAM графических процессоров.
Подытоживая, с общей точки зрения, у Биткойн и Эфириум разные предназначения.
В то время как биткойн создавался как альтернатива традиционным деньгам и, таким образом, является средством оплаты и сохранения стоимости, Ethereum разрабатывался как платформа для выполнения одноранговых контрактов и приложений.
И основная цель эфира – не быть альтернативой традиционным деньгам, в отличие от биткойнов, а облегчать и монетизировать работу сети Ethereum.
В целом, Bitcoin и Ethereum – это разные реализации технологии blockchain с разными целями.
Масштабирование
Давайте сравним децентрализованные системы блокчейна с централизованными системами.
Блокчейн взял на себя роль посредника в виде проверки, подтверждения и регистрации транзакций и, конечно же, выполнения консенсусного процесса для обеспечения целостности цепочки.
Все эти функции требуют времени и приводят к значительным накладным расходам по сравнению с централизованной системой.
Транзакции в Ethereum, например, обрабатываются на всех узлах и обрабатываются последовательно, а не параллельно.
В соответствии с порядком, определенным майнером.
Майнеры предпочитают сначала обрабатывать транзакции с более высокой комиссией.
После того, как блок добыт, этот порядок закреплен навечно. Этот порядок называется индексом транзакции.
И каждый полный узел хранит всю цепочку блоков.
Все это препятствует масштабируемости приложений blockchain.
Скорость обработки транзакций в блокчейне не является удовлетворительной по сравнению с централизованной обработкой.
Что такое масштабируемость?
Масштабируемость – это способность системы удовлетворительно работать на практических всех уровнях нагрузки.
Нагрузка в контексте блокчейна может быть транзакциями, количеством узлов, количеством участников и количеством аккаунтов и других атрибутов blockchain.
В случае блокчейна наиболее важной характеристикой является скорость транзакций или количество транзакций в секунду.
Это критическая характеристика для многих приложений, начиная от платежной системы и до управления цепочками поставок, чтобы система могла хорошо работать.
Например, для биткойна, в 2017 году, средняя комиссия сети достигла 15–20 долларов США, а скорость подтверждения транзакции стала доходить до нескольких дней.
Таким образом, можно сказать, что количество транзакций в секунду является показателем масштабируемости блокчейна.
Наиболее очевидным способом увеличения скорости транзакций является увеличение количества транзакций на блок.
Биткойн пытался сделать это двумя способами: с помощью вилки Segregated Witness и с помощью увеличения максимально разрешенного размера блока.
В Segregated Witness транзакции и подписи разделяются для обеспечения большего количества транзакций на блок.
Цифровая подпись занимает до 60 % пространства в транзакции.
И SegWit – это процесс, с помощью которого размер блока увеличивается путем удаления данных подписи из транзакций. Когда определенные части транзакции удаляются, это освобождает пространство для добавления дополнительных транзакций в блок.
Таким образом, подписи и скрипты выделяются в обособленную структуру, именуемую отдельным свидетелем.
И теперь, чтобы проверить все транзакции, узлу нужно загружать расширенный блок – это основной блок + отдельный свидетель.
Это была мягкая вилка, которая была реализована в 2017 году.
Она работает в текущей версии блокчейна биткойна.
Однако ограничение размера блока все равно фиксируется на одном мегабайте.
Второе предложение по увеличению масштабируемости состояло в том, чтобы помимо отдельного свидетеля, еще увеличить предел размера блока до большего размера в два мегабайта.
И это улучшение называется Segregated Witness 2X.
Это была запланированная жесткая вилка, которая должна была состояться в ноябре 2017 года, но не прошла из-за отсутствия поддержки сообщества.
Однако при этом часть сообщества, не приняв SegWit2x, произвела жесткий форк сети биткойна, увеличив размер блока биткойна до 8 Мб.
И свою ветку они назвали Bitcoin Cash.
15 мая 2018 года был обновлён протокол сети Bitcoin Cash с целью увеличения размера блока до 32 МБ.
Теперь давайте рассмотрим, как Ethereum относится к размеру блока.
В Ethereum размер блока может меняться и ограничен лимитом газа, указанным в заголовке блока.
Лимит газа на блок – это максимально допустимое количество газа в блоке для определения того, как много транзакций может поместиться в блок.
Например, у нас есть 5 транзакций, и каждая транзакция имеет лимит газа в 10, 20, 30, 40 и 50. Если лимит газа на блок – 100, тогда первые 4 транзакции могут поместиться в блок.
И майнеры решают какие транзакции поместить в блок.
Если попытаться включить транзакцию, которая использует больше газа, чем текущий лимит газа на блок – она будет отвергнута сетью и ваш Эфириум клиент выдаст вам сообщение “Транзакция превышает лимит газа на блок”.
Протокол позволяет майнеру блока регулировать лимит газа на блок на 0.0976 % в любом направлении.
Кто в Ethereum решает какой будет лимит газа на блок? – Майнеры. Отдельно от регулируемого протокола, стратегия с лимитом газа около 5,000,000 стоит по умолчанию в большинстве клиентов.
Майнеры могут изменить это, но многие этого не делают и оставляют настройки по умолчанию.
Этот размер переменного блока улучшил транзакционную скорость.
Ожидается, что он еще больше улучшится, когда Ethereum перейдет к доказательству ставки.
Мы только что обсудили сетевое решение для повышения скорости транзакций.
Теперь давайте обсудим механизм проведения транзакций вне сети.
Одним из решений для увеличения скорости транзакций является выгрузка некоторых транзакций из сети.
Это осуществляется между доверенными сторонами.
И эта функция в биткойне называется платежным каналом.
Платежные операции могут осуществляться с минимальными комиссиями со значительно более высокой скоростью между доверенными лицами.
В типичном платежном канале в цепочку блоков добавляются только две транзакции, но между участниками может быть сделано неограниченное или почти неограниченное количество платежей.
И примером такого решения служит сеть Lightning Network.
Сеть Lightning Network состоит из узлов и двунаправленных платежных каналов.
Платежный канал устанавливается между двумя узлами сети.
Каждый из двух узлов платежного канала блокирует в блокчейне Биткоина некоторую сумму средств для канала.
В дальнейшем пропускная способность канала будет определяться суммой заблокированных узлами средств.
Решение Ethereum расширяет эту концепцию платежного канала до смарт-контрактов.
Каналы состояния – это расширение концепции платежного канала для любой транзакции на уровне приложения.
Механизм называется State Channel, поскольку состояние узла в основной цепочке блокируется при транзакции вне сети и периодически синхронизируется с соответствующими обновлениями с основной цепочкой.
Каналы состояния работают путем «блокировки» некоторой части состояния блокчейна в многосегментный контракт, контролируемый определенным набором участников.
Состояние, которое «блокировано», называется депозитом состояния.
Это может быть определенное количество эфира или токенов.
После того, как депозит заблокирован, участники канала используют обмен сообщениями вне сети, чтобы обменивать и подписывать действительные транзакции ethereum, не развертывая их в цепочку. Это транзакции, которые могут быть добавлены в цепочку в любое время.
Обновление состояния канала всегда осуществляется единогласным решением сторон.
Все стороны подписывают и сохраняют свои собственные копии каждой транзакции вне сети.
Поскольку эти транзакции происходят полностью вне блокчейна, они имеют нулевые транзакционные сборы, и их скорость ограничена только их базовым протоколом связи.
Примером реализации такого протокола служит сеть Raiden Network, работающая поверх Эфериума.
Еще один подход к увеличению скорости обработки транзакций называется Sharding.
В настоящее время каждый отдельный узел, работающий в сети Ethereum, должен обрабатывать каждую транзакцию, проходящую через сеть.
Это дает блокчейну высокую степень безопасности из-за тотальной валидации, но в то же время это означает, что весь блокчейн так же быстр, как его отдельные узлы, но не сумма этих узлов.
То есть скорость блокчейна ограничивается скоростью отдельного узла сети.
В настоящее время транзакции Эфериума обрабатываются не параллельно, и каждая транзакция выполняется последовательно в глобальном масштабе.
Поэтому подход заключается в blockchain sharding, где мы разбиваем все состояние сети на кучу разделов, называемых shards, которые содержат свою собственную независимую часть состояния и историю транзакций.
В этой системе определенные узлы обрабатывают транзакции только для определенных shards, тем самым в целом увеличивая пропускную способность транзакций.
Sharding является перспективным механизмом для масштабирования блокчейна.
Однако при таком подходе требуется решить такие сложные задачи, как меж shards коммуникация и общая безопасность такого разделенного блокчейна.
Децентрализованные приложения
Для понятия децентрализованного приложения может быть не одно определение.
Тем не менее, у децентрализованных приложений есть общие черты:
Это открытый исходный код. В идеале код должен быть самоподдерживаемым и все изменения в коде должны определяться консенсусом или большинством его пользователей. И код должен быть доступен для проверки.
Децентрализация. Все записи о работе приложения должны храниться в общедоступной и децентрализованной цепочке блока.
Валидаторы цепочки блоков должны поощряться.
Протокол. Сообщество приложения должно согласовать криптографический алгоритм, чтобы показать доказательство ценности.
Например, Bitcoin использует Proof of Work (PoW), и Ethereum в настоящее время использует Proof of Work с планами гибридного Proof of Work/Proof of Stake (PoS) в будущем.
Если мы придерживаемся вышеприведенного определения, первым децентрализованным приложением был фактически сам биткойн.
Биткойн – это самоподдерживающийся публичный журнал, который позволяет эффективные транзакции без посредников и централизованных органов.
Чтобы запустить проект децентрализованного приложения необходимо:
Создать технический документ белые страницы или белую книгу.
Ваш технический документ должен обозначить задачу, которую вы хотите решить.
Он должен четко указать намерения и цели приложения.
Опишите план распределения токенов и как вы собираетесь это делать.
Определите механизм достижения консенсуса и наймите свою команду менеджеров и разработчиков.
Будьте честны с любыми техническими трудностями, которые вы предвидите, и четко изложите свои технические требования.
Откройте дискуссию по своему плану и сформируйте сообщество.
Получите обратную связь и соответствующим образом переработайте свой план.
После того, как приложение наберет достаточный импульс, определите дату продажи токенов.
Веб-сайт продажи токенов должен иметь всю информацию, которая может понадобиться инвесторам.
Начните разработку и приветствуйте новых разработчиков.
Децентрализованное приложение нуждается в первоначальном предложении монет или Initial Coin Offering (ICO).
Появление нового приложения в сообществе blockchain называется ICO.
ICO является мероприятием по сбору средств, которое основано на продаже токенов, которые потенциально могут принести в будущем прибыль для хорошо осведомленных и смелых инвесторов.
В ICO цена токена произвольно определяется командой, запускающей приложение.
После того, как токен регистрируется на бирже, его цена затем корректируется торгами.