1. Обзор
Возможность запускать смарт-контракты – это то, что сделало блокчейн Ethereum таким популярным и разрушительным.
Прежде чем мы объясним, что такое смарт-контракт, давайте начнем с определения блокчейна :
Блокчейн-это общедоступная база данных, которая ведет постоянный учет цифровых транзакций. Он работает как система транзакций без доверия, структура, в которой люди могут совершать одноранговые транзакции без необходимости доверять третьей стороне или друг другу.
Давайте посмотрим, как мы можем создавать смарт-контракты на Ethereum с солидностью:
2. Эфириум
Ethereum-это платформа, которая позволяет людям эффективно писать децентрализованные приложения с использованием технологии блокчейн.
Децентрализованное приложение ( Dapp ) – это инструмент для людей и организаций, находящихся по разные стороны взаимодействия, который используется для объединения без какого-либо централизованного посредника. Ранние примеры приложений включают BitTorrent (общий доступ к файлам) и Биткойн (валюта).
Мы можем описать Ethereum как блокчейн со встроенным языком программирования.
2.1. Виртуальная машина Ethereum (EVM)
С практической точки зрения EVM можно рассматривать как большую децентрализованную систему, содержащую миллионы объектов, называемых учетными записями , которые могут поддерживать внутреннюю базу данных, выполнять код и общаться друг с другом.
Первый тип учетной записи, вероятно, наиболее знаком обычному пользователю, использующему сеть. Его имя EOA (Учетная запись, принадлежащая извне); он используется для передачи значений (таких как Эфир ) и управляется закрытым ключом.
С другой стороны, существует еще один тип учетной записи, который является контрактом . Давайте продолжим и посмотрим, в чем дело:
3. Что такое Смарт-контракт?
Смарт-контракт представляет собой автономный скрипт, обычно написанный в Солидности и скомпилированный в двоичный или JSON и развернутый по определенному адресу в блокчейне . Таким же образом , как мы можем вызвать определенную конечную точку URL-адреса RESTful API для выполнения некоторой логики через HttpRequest , мы можем аналогичным образом выполнить развернутый смарт-контракт по определенному адресу , отправив правильные данные вместе с необходимым Ethereum для вызова развернутой и скомпилированной функции Солидности .
С точки зрения бизнеса это означает, что функции смарт-контрактов могут быть по своей сути монетизированы (аналогично функции AWS Lambda, которая позволяет пользователям платить за цикл вычислений , а не за экземпляр ). Важно отметить, что функции смарт-контрактов не должны стоить Ethereum для запуска.
Проще говоря, мы можем рассматривать смарт-контракт как набор кода, хранящегося в сети блокчейн, который определяет условия, с которыми согласны все стороны, использующие контракт.
Это позволяет разработчикам создавать вещи, которые еще не были изобретены. Подумайте об этом на секунду – нет необходимости в посреднике, а также нет риска контрагента. Мы можем создавать новые рынки, хранить реестры долгов или обещаний и быть уверенными в том, что у нас есть согласие сети, которая проверяет транзакции.
Любой желающий может развернуть смарт-контракт в децентрализованной базе данных за плату, пропорциональную размеру хранилища, содержащего код. Узлы, желающие использовать смарт-контракт, должны каким-то образом указать результат своего участия остальной части сети.
3.1. Прочность
Основным языком, используемым в Ethereum, является Solidity – язык, подобный Javascript, разработанный специально для написания смарт-контрактов. Солидность статически типизирована, поддерживает наследование, библиотеки и сложные пользовательские типы, среди прочих функций.
Компилятор solidity превращает код в байт-код виртуальной машины, который затем может быть отправлен в сеть Ethereum в качестве транзакции развертывания. Такие развертывания требуют более значительных комиссий за транзакции, чем взаимодействие с смарт-контрактами, и должны оплачиваться владельцем контракта.
4. Создание Смарт – Контракта С Солидностью
В первой строке контракта на надежность указывается версия исходного кода. Это делается для того, чтобы контракт внезапно не повел себя по-другому с новой версией компилятора.
pragma solidity ^0.4.0;
В нашем примере имя контракта Приветствие и, как мы видим, его создание похоже на класс в Java или другом объектно-ориентированном языке программирования:
contract Greeting { address creator; string message; // functions that interact with state variables }
В этом примере мы объявили две переменные состояния: создатель и сообщение . В Солидности мы используем тип данных с именем адрес для хранения адресов учетных записей.
Далее нам нужно инициализировать обе переменные в конструкторе.
4.1. Конструктор
Мы объявляем конструктор с помощью ключевого слова function , за которым следует имя контракта (точно так же, как в Java).
Конструктор-это специальная функция, которая вызывается только один раз, когда контракт впервые развертывается в блокчейне Ethereum. Мы можем объявить только один конструктор для контракта:
function Greeting(string _message) { message = _message; creator = msg.sender; }
Мы также вводим начальную строку _message в качестве параметра в конструктор и устанавливаем ее в переменную состояния сообщение .
Во второй строке конструктора мы инициализируем переменную creator значением msg.sender . Причина, по которой нет необходимости вводить msg в конструктор, заключается в том, что msg является глобальной переменной, которая предоставляет конкретную информацию о сообщении, такую как адрес учетной записи, отправляющей его.
Потенциально мы могли бы использовать эту информацию для реализации контроля доступа к определенным функциям.
4.2. Методы установки и получения
Наконец, мы реализуем методы setter и getter для сообщения:
function greet() constant returns (string) { return message; } function setGreeting(string _message) { message = _message; }
Вызов функции приветствие просто вернет сохраненное в данный момент сообщение. Мы используем ключевое слово constant , чтобы указать, что эта функция не изменяет состояние контракта и не запускает никаких операций записи в блокчейн.
Теперь мы можем изменить значение состояния в контракте, вызвав функцию установить приветствие . Любой может изменить значение, просто вызвав эту функцию. Этот метод не имеет возвращаемого типа, но принимает в качестве параметра тип String .
Теперь, когда мы создали наш первый смарт-контракт, следующим шагом будет его развертывание в блокчейне Ethereum, чтобы каждый мог его использовать. Мы можем использовать Remix , которая в настоящее время является лучшей онлайн-средой разработки, и ее легко использовать.
5. Взаимодействие с Смарт-Контрактом
Для взаимодействия со смарт-контрактом в децентрализованной сети (блокчейн) нам необходимо иметь доступ к одному из клиентов.
Есть два способа сделать это:
- запустите клиента сами
- подключитесь к удаленному узлу с помощью такой службы, как Инфра .
Infra-самый простой вариант, поэтому мы запросим токен бесплатного доступа . Как только мы зарегистрируемся, нам нужно выбрать URL-адрес тестовой сети Rinkeby: “https://rinkeby.infura.io/<токен>”.
Чтобы иметь возможность совершать транзакции с помощью смарт-контракта с Java, нам нужно использовать библиотеку под названием Web3j . Вот зависимость Maven:
org.web3j core 3.3.1
И в Gradle:
compile ('org.web3j:core:3.3.1')
Прежде чем начать писать код, есть некоторые вещи, которые нам нужно сделать в первую очередь.
5.1. Создание кошелька
Web3j позволяет нам использовать некоторые из его функций из командной строки:
- Создание кошелька
- Управление паролями кошелька
- Перевод средств с одного кошелька на другой
- Создание оболочек функций смарт-контрактов солидности
Инструменты командной строки можно получить в виде zip-файла/tar-файла со страницы релизы репозитория проекта в разделе загрузки или для пользователей OS X через homebrew:
brew tap web3j/web3j brew install web3j
Чтобы сгенерировать новый кошелек Ethereum, мы просто наберем в командной строке следующее:
$ web3j wallet create
Он запросит у нас пароль и место, где мы можем сохранить ваш кошелек. Файл в формате Json, и главное, что нужно иметь в виду, – это адрес Ethereum.
Мы будем использовать его на следующем шаге, чтобы запросить эфир.
5.2. Запрос эфира в тестовой сети Ринкеби
Мы можем запросить бесплатный эфир здесь . Чтобы предотвратить исчерпание злоумышленниками всех доступных средств, они просят нас предоставить общедоступную ссылку на один пост в социальных сетях с нашим адресом Ethereum.
Это очень простой шаг, почти мгновенно они предоставляют эфир, чтобы мы могли провести тесты.
5.3. Создание оболочки Смарт-контракта
Web3j может автоматически генерировать код оболочки смарт-контрактов для развертывания и взаимодействия со смарт-контрактами, не выходя из JVM.
Чтобы сгенерировать код оболочки, нам нужно скомпилировать наш смарт-контракт. Мы можем найти инструкцию по установке компилятора здесь . Оттуда мы наберем в командной строке следующее:
$ solc Greeting.sol --bin --abi --optimize -o/
Последний создаст два файла: Greeting.bin и Greeting.abi. Теперь мы можем сгенерировать код оболочки с помощью инструментов командной строки web3j:
$ web3j solidity generate /path/to/Greeting.bin /path/to/Greeting.abi -o /path/to/src/main/java -p com.your.organisation.name
Теперь у нас будет класс Java для взаимодействия с контрактом в нашем основном коде.
6. Взаимодействие с Смарт-Контрактом
В нашем основном классе мы начинаем с создания нового экземпляра web3j для подключения к удаленным узлам в сети:
Web3j web3j = Web3j.build( new HttpService("https://rinkeby.infura.io/"));
Затем нам нужно загрузить файл нашего кошелька Ethereum:
Credentials credentials = WalletUtils.loadCredentials( "", "/path/to/ ");
Теперь давайте развернем наш смарт-контракт:
Greeting contract = Greeting.deploy( web3j, credentials, ManagedTransaction.GAS_PRICE, Contract.GAS_LIMIT, "Hello blockchain world!").send();
Развертывание контракта может занять некоторое время в зависимости от работы в сети. После развертывания мы можем захотеть сохранить адрес, по которому был развернут контракт. Мы можем получить адрес таким образом:
String contractAddress = contract.getContractAddress();
Все транзакции, совершенные с контрактом, можно увидеть по адресу: ” https://rinkeby.etherscan.io/address/<адрес_контракта>”.
С другой стороны, мы можем изменить значение смарт-контракта, выполняющего транзакцию:
TransactionReceipt transactionReceipt = contract.setGreeting("Hello again").send();
Наконец, если мы хотим просмотреть сохраненное новое значение, мы можем просто написать:
String newValue = contract.greet().send();
7. Заключение
В этом уроке мы увидели, что Solidity -это статически типизированный язык программирования, предназначенный для разработки смарт-контрактов, работающих на EVM.
Мы также создали простой контракт с этим языком и увидели, что он очень похож на другие языки программирования.
Смарт-контракт – это просто фраза, используемая для описания компьютерного кода, который может облегчить обмен ценностями. При запуске на блокчейне смарт-контракт становится самостоятельной компьютерной программой, которая автоматически выполняется при выполнении определенных условий.
В этой статье мы увидели, что возможность запускать код в блокчейне является основным отличием Ethereum, поскольку она позволяет разработчикам создавать приложения нового типа, которые выходят далеко за рамки всего, что мы видели раньше.
Как всегда, примеры кода можно найти на GitHub .