Ethereum язык программирования

Ethereum язык программирования Крипта

This article is about the programming language. For the state of matter, see Solid.

Solidity is available on:

The developers community often cites Solidity requiring much of third party interfaces and APIs, and it’s inability to create critical information intensive smart contracts.

Время на прочтение

Технология блокчейна завладела умами. Покупаются фермы, ICO собирают миллионы долларов. Наша компания тоже захотела приобщиться. Решили начать с малого. В серии статей будет описан наш путь от новичков в сфере блокчейна до общепризнанных гуру. На момент написания этих слов мы все еще на этапе новичков, предлагаем следить за нашим развитием и развиваться с нами.

Ethereum язык программирования

Язык для создания смарт-контрактов.

В продолжении темы блокчейна и криптовалюты поговорим о языках, которые применяются в этой отрасли. Большинство из них — общеизвестные представители: Java, C/C++, Python, Ruby и т.д. С их помощью описываются общие интерфейсы и протоколы. Однако есть узкоспециальные задачи, где использование популярных языков неэффективно. Примером являются смарт-контракты и язык Solidity для платформы Ethereum.

Введение в Ethereum

Эта статья не расчитана на тех, кто совсем не знаком с Ethereum (или технологией блокчейн вообще), поэтому объяснений базовых вещей вроде блоков, транзакций или контрактов здесь не будет. Я подразумеваю, что вы хотя бы чуть-чуть в курсе происходящего. В противном случае полистайте статьи из списка ниже, а потом возвращайтесь 🙂

P.S. Я работаю под Ubuntu 16.04, так что весь процесс установки, разработки и деплоя будет описан под эту ОС. Тем не менее все используемые инструменты кроссплатформенны (скорее всего, не проверял), так что при желании можете поэкспериментировать на других ОС.

Сегодня платформа Ethereum стала одним из самых узнаваемых брендов блокчейн сферы, вплотную приблизившись по популярности (и капитализации) к Bitcoin. Но из-за отсутствия «полноценного» рускоязычного гайда, отечественные разработчики все еще не очень понимают, что это за зверь и как с ним работать. Поэтому в данной статье я попытался максимально подробно охватить все аспекты разработки умных контрактов под Ethereum.

Я расскажу про инструменты разработки, сам ЯП, процесс добавления UI и еще много интересного. В конечном итоге мы получим обычный сайт-визитку, но «под капотом» он будет работать на умных контрактах Ethereum. Кого заинтересовало — прошу под кат.

Ethereum язык программирования

// SPDX-License-Identifier: GPL-3.0

// The keyword «public» makes variables
// accessible from other contracts

balances

// Events allow clients to react to specific
// contract changes you declare

// Constructor code is only run when the contract
// is created

minter

// Sends an amount of newly created coins to an address
// Can only be called by the contract creator

minter
balancesreceiver amount

// Errors allow you to provide information about
// why an operation failed. They are returned
// to the caller of the function.
error InsufficientBalance

// Sends an amount of existing coins
// from any caller to an address

amount balances
revert InsufficientBalance
requested amount
available balances

balances amount
balancesreceiver amount
emit Sent receiver amount

Синтаксис

В сравнении с JS есть пара существенных отличий:

Однако с поставленными задачами Solidity справляется, а визуально это все тот же ECMAScript:

Эфир и смарт-контракт

Эфириум — децентрализованная платформа, виртуальная машина для размещения онлайн-сервисов. Базируется она на технологии блокчейна, её преимущество в замене стандартных юридических сделок смарт-контрактами.

Смарт-контракт — договор, описанный математическими методами, не предполагающий двоякой трактовки. Таким образом, неисполнение одной из сторон условий контракта неизбежно приводит к штрафным санкциям без возможности перевести дело в правовое поле.

Теперь перейдем непосредственно к языку.

Чем хорош блокчейн?

Судя из названия блокчейн — это цепочка блоков. Так и есть. Но что дает эта цепочка? По сути это технология децентрализованного хранения данных с особой структурой, позволяющей быть уверенным, что манипуляции с данными происходили в рамках четко заданных правил. Обеспечивается эта уверенность тем, что массив данных хранится сразу у всех, кто подключился к сети блокчейна — это значит, что недостаточно будет просто подменить весь массив в одном месте. А еще каждая следующая порция данных, так называемый блок, содержит в себе хэш предыдущего блока, это дает два плюса:

Ethereum язык программирования

Дерево Меркла — дерево хешей, в данном случае используется для независимого подтверждения валидности отдельных транзакций. Транзакции — это и есть данные в блокчейне

Работу по добавлению блоков обеспечивают сами участники сети. Кому будет предоставлено право добавления следующего блока определяется специальным механизмом. Самые распространенные из таких механизмов — это Proof-of-Work и Proof-of-Stake. В первом блоки добавляют майнеры — участники сети, решающие вычислительно сложные задачи, конкурируя друг с другом за право создания блока на основе своего решения, а в награду за успешное создание блока получающие некоторое количество валюты этой сети. В Proof-of-Stake блоки добавляют валидаторы — участники сети, конкурирующие не за счет производительности, а на основе количества внутренней валюты этой сети на их аккаунте. Получают они при этом меньше, но и работы от них требуется меньше. В обоих случаях логика в том, что злоумышленнику для добавления поддельного блока придется потратить больше, чем удастся заработать. В первом случае — на оборудование для майнинга, соизмеримое по мощности с остальными майнерами вместе взятыми. Во втором случае — на покупку 50% валюты сети.

Создаем контракт-визитку

Самое время создать наш контракт. В конечном итоге это будет приложение-визитка, на которую мы поместим само «резюме»:

Первый шаг

Первым делом создадим шаблон контракта и функцию-конструктор. Она должна называться также как и сам контракт и вызывается лишь однажды — при загрузке контракта в блокчейн. Мы будем использовать ее для инициализации одной единственной переменной — address owner. Как вы уже наверное догадались, в нее будет записан адрес того, кто залил контракт в сеть. А использоваться она будет для реализации функций администратора контракта, но об этом позже.

Базовая информация

Следующим шагом добавим возможность указывать базовую информацию об авторе — имя, почту, адрес и так далее. Для этого будем использовать самый обычный mapping, который нужно объявить в начало контракта:

Для того, чтобы иметь возможность «получать» от контракта эти данные, создадим следующую функцию:

Здесь все просто, стоит только отметить модификатор constant — его можно (и нужно) использовать для тех функций, которые не изменяют state приложения. Главный плюс таких функций (sic!), в том что их можно использовать как обычные функции.

Администрирование

Теперь стоит задуматься о наполнении своего резюме контентом. В самом простом случае мы могли бы обойтись функцией вроде

Но в этом случае любой при желании смог бы изменить, например, наше имя, вызвав setBasicData(«name», «New Name»). К счастью, есть способ всего в одну строку пресечь любые такие попытки:

Так как нам еще не раз придется использовать подобную конструкцию (при добавлении нового проекта, например), то стоит создать специальный модификатор:

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

Модульность

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

Для этого в той же директории создадим новый файл structures.sol и библиотеку Structures. А уже внутри нее опишем каждую из структур:

Теперь осталось только импортировать полученный файл

Unimplemented feature (/src/libsolidity/codegen/ExpressionCompiler.cpp:105): Accessors for mapping with dynamically-sized keys not yet implemented.

BTW На всякий случай отмечу, что кроме локального файла, Remix умеет импортировать .sol файлы по ссылке на Github и даже с помощью протокола Swarm (это что-то вроде распределенного хранилища для Ethereum, подробнее здесь)

Загружаем и удаляем данные

Думаю многие из вас уже сами догадались, как стоит реализовать работу с новыми данными. Покажу на примере списка публикаций, в остальных случаях все аналогично:

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

Отдаем данные

Заметьте, что мы не можем сравнить две строки привычным способом ‘aaa’ == ‘bbb’. Причина все та же, string — это динамический тип данных, работа с ними довольно болезненна. Так что остается либо сравнивать хэши, либо использовать функцию для посимвольного сравнения. В этом случае можете использовать популярную библиотеку stringUtils.sol, в ней есть такая функция.

Деплой

В разных средах разработки процесс компиляции и деплоя разумеется отличается, поэтому я ограничусь Remix, как самым популярным.

Сначала, само собой, заливаем весь код (финальную версию можете найти в репозитории проекта). Далее в выпадающем списке Select execution environment выберите Javascript VM — пока что протестируем контракт на JS эмуляторе блокчейна, чуть позже научимся работать и с настоящим. Если с контрактом все в порядке, то вам будет доступна кнопка Create — нажимаем и видим:

Ethereum язык программирования

Теперь, когда контракт залит в блокчейн (его эмуляцию, но не суть), можем попробовать вызвать какую-нибудь функцию и посмотреть, что из этого выйдет. Например можно сохранить в контракте email — для этого найдите функцию setBasicData, заполните поле и нажмите кнопку с именем функции:

Ethereum язык программирования

Функция ничего не возвращает, поэтому result: 0x. Теперь можно запросить у контракта email: ищем функцию getBasicData и пробуем:

Ethereum язык программирования

С остальными функциями предлагаю вам поэксперементировать самим.

Среды разработки и редакторы

Несмотря на узкий профиль применения, Solidity доступен для большого числа IDE и редакторов. Вот список:

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

Инструменты

Клиент написан на Go, устанавливается стандартным способом:

sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum

Сам Geth не имеет GUI, но работать с ним из терминала довольно приятно. Здесь описан весь набор аргументов командной строки, я же опишу несколько самых популярных.

Parity

Geth довольно хорош, но в последнее время все чаще можно встретить другой клиент — Parity, написанный на Rust. Главным его отличием от Geth является встроенный web интерфейс, на мой взгляд, самый удобный среди всех ныне существующих. Установка:

sudo <(curl https://get.parity.io -Lk)

По окончании загрузки запустите в консоли parity и по адресу localhost:8180 можете найти сам кошелек.

Ethereum язык программирования

Еще один плюс: Parity быстрее своих конкурентов. По крайней мере так утверждают авторы, но по моим ощущениям это действительно так, особенно в плане синхронизации блокчейна.

Единственный нюанс — своей консоли в parity нет. Но можно без проблем использовать для этих целей Geth:

$ parity —geth # Run parity in Geth mode
$ geth attach console # Attach Geth to the PArity node (Do it in another window)

TestRPC

Установка — npm install -g ethereumjs-testrpc.

Ethereum язык программирования

Mist

Ethereum язык программирования

Remix

Самая популярная IDE для разработки контрактов. Работает в браузере по адресу ethereum.github.io/browser-solidity/, поддерживает огромное число функций:

При этом нет автокомплита, что очень печально.

Ethereum язык программирования

Cosmo

Еще одна IDE для разработки умных контрактов, написана на Meteor, работает из коробки. Для начала откройте новый терминал и поднимите ноду с включенным RPC интерфесом geth —rpc —rpcapi=»db,eth,net,web3,personal» —rpcport «8545» —rpcaddr «127.0.0.1» —rpccorsdomain «localhost» console. После этого можете запускать саму IDE:

$ git clone http://github.com/SilentCicero/meteor-dapp-cosmo.git
$ cd meteor-dapp-cosmo/app
$ meteor

Далее открываете localhost:3000 и можете начинать работать:

Ethereum язык программирования

Etheratom

Последний на сегодня инструмент для ускорения разработки умных контрактов. Это плагин для редактора Atom, устанавливается с помощью apm install atom-ethereum-interface. Штука удобная, сам пользуюсь. Позволяет работать c JS EVM или подключиться к ноде через RPC. Компилирует контракт на CTRL + ALT + C, деплоит в сеть на CTRL + ALT + S. Ну и предоставляет неплохой интерфейс для работы с самим контрактом.

Ethereum язык программирования

Если вам не нужен такой навороченный функционал внутри редактора, то для Atom есть отдельный плагин с подсветкой синтаксиса Solidity — language-ethereum. Последний по сути является плагином под Sublime text, только конвертированный для работы в Atom.

Как изучать

Официальных книг по Solidity пока не выходило, поэтому обучаться языку лучше всего по официальному релизу. Также есть платный образовательный 3-часовой курс на Udemy.

Для тех, кто пока не силен в английском, но очень хочет быть в теме, дорога одна — на Хабрахабр (1, 2, 3). Также есть подробный туториал на проекте Голос, правда, пока только один урок.

Кроме того, тема привлекает всё новых авторов, вебинары и статьи в личных блогах появляются достаточно часто. Периодически проверяйте популярные платформы и будете в курсе развития и применения языка.

DApp

DApp — Decentralized Application или децентрализованное приложение. В идеале пишется как ĐApp, но мы будем использовать упрощенное написание. Приложение может быть построено на разных технологиях, но среди них есть и блокчейн со смарт контрактами. Можно сказать, что на данный момент DApp — это логика на смарт контрактах плюс некий пользовательский интерфейс. Хранение более-менее объемных данных и обмен сообщениями в идеальном DApp тоже должны быть децентрализованными, однако эти технологии только начинают появляться и заслуживают отдельной статьи. Блокчейн же обеспечивает хранение текущего состояния и реализует бизнес-логику через смарт-контракты.

Ethereum язык программирования

Идеал, к которому стремится развитие децентрализованных приложений. Картинка позаимствована отсюда

Используя DApp, пользователь может получить доступ к блокчейну напрямую на своем компьютере, установив специальное ПО. Блокчейн также может использоваться для каких-то отдельных операций на стороне сервера привычных нам мобильных и веб приложений. Выбор зависит от конкретной задачи. Упрощенный вариант DApp можно представить в таком виде:

Ethereum язык программирования

Картинка взята и переведена из презентации Игоря Баринова

Фронтенд и бэкенд в данном случае это классические элементы приложения, а функциональность с задействованием блокчейна выполняется на виртуальной машине EVM. Пользователю доступны стандартные функции виртуальной машины — такие как отправка транзакции или просмотр баланса аккаунта, — а также функции, описанные в смарт контрактах, например на языке solidity. Доступ к этой виртуальной машине предоставляется через RPC интерфейс.

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

Ссылки

Как только у вас на аккаунте будет какое-то количество эфира — можно начинать эксперименты со смарт контрактами. Язык, на котором пишутся контракты — Solidity, — напоминает С++ и JavaScript. Есть и другие языки, но Solidity самый популярный, активно поддерживаемый и хорошо документированный, поэтому рекомендуем использовать именно его. Рассмотрим простой контракт, единственная цель которого — хранить и обеспечивать возможность менять единственную строку.

Строка pragma solidity ^0.4.10 означает, что минимальный требуемый компилятор для данного контракта — 0.4.10, а символ ^ запрещает использование компилятора начиная с 0.5.0. Это актуально, так как Solidity развивающийся язык и несмотря на желание разработчиков сохранять совместимость — это не всегда возможно.

Для начальных экспериментов с контрактами очень удобна Remix IDE. Достаточно скопировать приведенный код контракта и вставить его в окошко для кода. В правой панели нажать Create — создастся контракт без публикации в блокчейн. Увидите следующее.

Ethereum язык программирования

Синим отмечаются геттеры (getString), красным — сеттеры (setString). Показано сколько расходуется газа.

Для задания строки в поле setString не забудьте поставить кавычки, иначе получите ошибку

Как другим пользователям увидеть этот контракт? Контракт определяется двумя составляющими: адрес и интерфейс ABI. Все это можно узнать на странице контракта в Mist, по кнопкам “Copy address” и “Show Interface”. Адрес — это такое же 20-байтное шестнадцатеричное число, например в нашем случае это 0x65cA73D13a2cc1dB6B92fd04eb4EBE4cEB70c5eC. А интерфейс — JSON-текст, для нашего смарт контракта он выглядит следующим образом:

Ethereum язык программирования

Интерфейс генерируется автоматически из кода контракта и не должен меняться после деплоя, адрес контракта возвращается после деплоя и указывает на бинарный код контракта. Mist сохраняет эти данные и предоставляет интерфейс для их получения только если деплой выполнялся через него. Кстати список выполненных/выполняемых транзакций Mist тоже хранит локально и только если они совершались через его интерфейс.

Этот пример описывает настоящее распределенное приложение, где каждый клиент скачивает на компьютер весь блокчейн, что не очень удобно в реальности, хоть и обеспечивает отсутствие посредников (на самом деле Mist тоже посредник, хоть и надежный). В реальности приходится идти на компромисс: например узел блокчейна разворачивается у третьей стороны, пользователю предоставляется веб-интерфейс. Или в браузер устанавливается специальный плагин (такой как Metamask), который использует ключ пользователя для подписи транзакций. В любом случае возникает проблема доверия к посреднику. Надеемся в будущем эта проблема решится или за счет реализации протокола легкого клиента, которому не требуются данные целиком, или каким-то еще способом. А пока приходится работать с тем что есть.

В следующей статье мы подробнее рассмотрим как это работает.

Добавляем UI

Ниже я расскажу про самый распостраненный способ добавить UI к вашему контракту. Он позволяет с помощью JS и HTML создавать интерфейсы любой сложности, достаточно иметь доступ к рабочей ноде Ethereum (или ее аналогам).

Web3

This is the Ethereum compatible JavaScript API which implements the Generic JSON RPC spec. It’s available on npm as a node module, for bower and component as an embeddable js and as a meteor.js package.

Это JS библиотека, позовляющая использовать API Ethereum с помощью обычного JS. По сути с ее помощью вы просто подключаетесь ноде и у вас появляется что-то вроде консоли geth в браузере. Устанавливается через npm или bower:

$ sudo npm install web3
$ bower install web3

Вот пример работы с web3 через node.js (предварительно запустите testrpcили любую другую ноду с RPC интерфейсом):

Ethereum язык программирования

То есть мы уже на этом моменте можем запустить ноду, синхронизировать ее с текущей цепочкой и останется только сверстать наше приложение. Но тут есть два тонких момента: во-первых, вам нужно синхронизировать блокчейн Ethereum, а вы этого скорее всего до сих пор не сделали.

Второй нюанс — RPC не имеет никакого встроенного механизма авторизации, поэтому любой желающий может узнать адрес вашей ноды из исходников JS и пользоваться ей в свое удовольствие. Тут конечно можно писать какую-нибудь обертку на Nginx с простейшей HTTP basic auth, но это как-нибудь в другой раз.

Metamask

Поэтому сейчас мы воспользуемся плагином Metamask (увы, только для Chrome). По сути это и есть та прослойка между нодой и браузером, которая позволит вам использовать web3 в браузере, но без своей ноды. Metamask работает очень просто — в каждую страницу он встраивает web3.js, который автоматически подключается к RPC серверам Metamask. После этого вы можете использовать Ethereum на полную катушку.

После установки плагина, в левом верхнем углу выберите Testnet и получите несколько эфиров на кране Metamask. На этом моменте вы должны получить что-то вроде такого (с чистой историей разумеется):

Ethereum язык программирования

Deploy with Metamask

С Metamask задеплоить контракт в сеть так же просто, как и в случаем с JS EVM. Для этого снова открываем Remix и в списке Select execution environment выбираем пункт Injected Web3 (скорее всего он выбран автоматически). После этого нажимаем Create и видим всплывающее окно:

Ethereum язык программирования

Ethereum язык программирования

Пример

Теперь дело за малым — надо научиться получать данные от контракта через Web3. Для этого, во-первых, надо научиться определять наличие web3 на странице:

Внутри startApp() я определелил всю логику работы с контрактом, тем самым избегая ложных срабатываний и ошибок.

Ethereum язык программирования

Итог

Теперь, когда вы со всем разобрались, можно браться за верстку и JS. Я использовал Vue.js и Spectre.css, для визуализации навыков добавил Google Charts. Результат можете увидеть на pavlovdog.github.io:

Ethereum язык программирования

Краткая справка

Solidity — JavaScript-подобный объектно-ориентированный язык для разработки смарт-контрактов. Является кроссплатформенным, но на практике используется преимущественно на Ethereum.

Был создан в 2014 году командой программистов под руководством Кристиана Райтвизнера на основе идеи Гевина Вуда. Похожесть синтаксиса на JavaScript — расчет на быструю адаптацию разработчиков, которые до этого на нем разрабатывали подобные протоколы. Solidity поддерживает наследование, в том числе множественное, в том числе с С3 линеаризацией.

В рейтинге TIOBE язык появился лишь в прошлом месяце, стартовав со 167 места.

Перспективы

Solidity — один из четырех языков для EVM (три других: Serpent, LLL и Mutan) и, пожалуй, самый проработанный. Капитализация Ethereum достигла 4 миллиардов долларов США всего за 2 года. Исходя из этих фактов, Solidity ждёт светлое будущее, как для самого языка, так и для разработчиков, которые его изучат.

Solidity

Возможно, вы слышали про то, что можно писать контракты не только на Solidity, но и на других языках, например Serpent (внешне напоминает Python). Но последний комит в develop ветке ethereum/serpent был примерно полгода назад, так что, по-видимому, язык, увы, deprecated.

Поэтому писать будем только на Solidity. Пока что язык находится на относительно раннем этапе развития, так что никаких сложных конструкций или уникальных абстракций в нем нет. Поэтому отдельно рассказывать про него я не вижу смысла — любой человек с опытом в программировании сможет свободно писать на нем после 20 минут чтения документации. На случай, если у вас такого опыта нет, — ниже я довольно подробно прокомментировал весь код контракта.

Для самостоятельного обучения есть несколько очень хороших примеров с максимально подробными описаниями:

Еще раз отмечу (отличную!) документацию языка, местами даже переведена на русский язык.

Первое подключение к блокчейну

Чтобы хоть как-то увидеть что значит быть участником сети мы скачали Mist (на момент написания последняя версия под номером 0.9.0) — кошелек Ethereum. Кошельком Mist называется потому, что в нем можно управлять своими аккаунтами и балансом на них. Основная валюта — ether (эфир), но можно выпускать собственные токены, они также будут отображаться в кошельке. Но Mist — это не только кошелек, а еще и браузер DApp для Ethereum-блокчейна. Он позволяет выкладывать и использовать смарт контракты, а также пользоваться DApp-приложениями.

Для наглядности работы с блокчейном рекомендуем использовать пару клиентов на разных компьютерах: можно будет увидеть, что создаваемые данные доступны не только локально — но это не обязательно.

1. Во время запуска Mist предлагает выбрать сеть — Main network или Test network. Выбираем Test network.

Ethereum язык программирования

Ethereum язык программирования

Приватный ключ хранится на линуксе в папке ~/.ethereum/testnet/keystore/ для Ropsten, ~/.ethereum/rinkeby/keystore/ — для Rinkeby. Обратите внимание, что для разных сетей создаются отдельные ключи и если вы собираетесь использовать Ropsten, как и мы, то потребуется создать еще один аккаунт. Имя состоит из даты и времени создания и адреса. Под адресом понимается шестнадцатеричная строка в 20 байтов вида 0xe03269461f7672494fb0dbbe89c00614601b5d24. В названии файла начальный 0x опущен. Адрес используется для идентификации вашего аккаунта в блокчейне, на него можно отправлять ether с других аккаунтов.

3. Как уже говорилось, требуется синхронизация локальной базы, на это для testnet Ropsten может уйти пару часов и больше, но необходимо дождаться завершения процесса. Иначе есть вероятность получить рассинхронизированную базу.

Ethereum язык программирования

По крайней мере в нашем случае была ситуация, что при запущенном майнинге эфир начал набираться чересчур быстрыми темпами, но при этом его невозможно было использовать — все операции не были видны другим участникам сети. Проблема выяснилась следующим образом — в Mist в левом нижнем углу отображается номер последнего блока (либо сколько блоков остается до окончания синхронизации, в этом случае все нормально и нужно лишь дождаться окончания процесса). Номер последнего блока в локальной копии можно сравнить с реальным значением для данного блокчейна например на ropsten.etherscan.io можно узнать последние номера блоков для сети Ropsten. Если ваше значение намного отличается в меньшую сторону — возможно ваша база не синхронизирована. Итак, что делать если синхронизация в mist дошла до конца, но номер блока неправильный? Мы решали эту проблему удалением данных и скачиванием их заново. Данные на Линуксе для сети Ropsten лежат в папке ~/.ethereum/testnet, нам помогло удаление всего из подпапки chaindata. После чего запустили mist и уже на этот раз терпеливо дождались окончания синхронизации.

Ethereum язык программирования

Эфир нужен для любых операций по изменению данных, им оплачивается так называемый gas — абстрактная единица измерения, которая служит для оценки требующейся работы по выполнению транзакции. Она нужна для независимости этой оценки от текущей рыночной стоимости эфира. При отправке транзакции можно задать сколько эфира вы платите за каждую единицу газа и максимальное количество газа, которое вы готовы оплатить. Чем больше вы выделяете — тем более приоритетна ваша транзакция для потенциальных майнеров. Ведь по сути плата за gas — это оплата работы майнеров по выполнению вашей транзакции и включению ее в очередной блок. Поэтому при майнинге кроме фиксированной платы за найденный блок — на момент написания это 5 эфиров, — майнер также получает плату за транзакции, как правило это несколько сотых эфира. Количество газа за транзакцию зависит от вычислительной сложности операций над данными. Пример того как расходуется и оценивается газ мы приведем в следующей статье.

Smart Contracts

Манипулирование данными в блокчейне обеспечивается так называемыми умными контрактами (smart contracts). Они описывают какие данные хранить на блокчейне и набор функций для операций над ними. Выполнение функций и получение доступа к данным осуществляется через предоставляемый каждым контрактом интерфейс. Этот интерфейс генерируется из исходного кода отдельно от компиляции и позволяет выполнять бинарный код. Данные для участников сети открыты, и чтение их ничего не стоит, ведь как уже было сказано, данные хранятся у всех участников сети. Изменение данных происходит посредством транзакций. Каждую транзакцию можно представить структурой следующего вида:

Что такое газ из пунктов 5 и 6 будет рассказано в следующих пунктах и еще более подробно рассказано в отдельной статье.

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

Вместо заключения

Например, мы используем чей-то шлюз (я про Metamask), вместо того, чтобы работать со своей нодой. Это удобно, но технология блокчейн в первую очередь — децентрализация и отсутствие посредников. У нас же всего этого нет — мы доверяем парням из Metamask.

Другая, не такая критичная проблема, — мы забыли про стоимость деплоя контрактов и транзакций к ним. На практике, стоит десять раз подумать, прежде чем использовать string вместо bytes, потому как такие вещи прежде всего влияют на затраты при работе с контрактом. Опять же, в примере я использовал Testnet, так что никаких денег мы не потратили, но при работе с Main net не стоит быть такими расточительными.

В любом случае, я надеюсь что статья оказалась полезной, если есть вопросы — задавайте в комментариях или пишите мне на почту.

Оцените статью
CoinName
Добавить комментарий