Создание и развертывание смарт-контрактов с надежностью
1. обзор
Возможность запускатьsmart contracts - вот что сделало блокчейн Ethereum таким популярным и разрушительным.
Прежде чем мы объясним, что такое смарт-контракт, давайте начнем с определенияblockchain:
Блокчейн является публичной базой данных, которая ведет постоянный учет цифровых транзакций. Он работает как доверенная транзакционная система, в которой отдельные лица могут совершать одноранговые транзакции без необходимости доверять третьей стороне или друг другу.
Давайте посмотрим, как мы можем создавать смарт-контракты на Ethereum сsolidity:
2. Ethereum
Ethereum - это платформа, которая позволяет людям создавать децентрализованные приложения с использованием технологии блокчейна.
Децентрализованное приложение (Dapp) - это инструмент для людей и организаций, находящихся на разных сторонах взаимодействия, используемый для объединения без какого-либо централизованного посредника. Ранние примеры Dapps включают BitTorrent (обмен файлами) и Bitcoin (валюта).
Мы можем описать Ethereum как блокчейн со встроенным языком программирования.
2.1. Виртуальная машина Ethereum (EVM)
С практической точки зрения EVM можно рассматривать как большую децентрализованную систему, содержащую миллионы объектов, называемыхaccounts, которые могут поддерживать внутреннюю базу данных, выполнять код и взаимодействовать друг с другом.
Первый тип учетной записи, вероятно, наиболее знаком для обычного пользователя, который использует сеть. Его имя -EOA (внешняя учетная запись); он используется для передачи значения (например,Ether) и управляется закрытым ключом.
С другой стороны, есть еще один тип учетной записи -contract.. Давайте посмотрим, о чем идет речь:
3. Что такое смарт-контракт?
smart contract - это автономный скрипт, обычноwritten in Solidity and compiled into binary or JSON and deployed to a specific address on the blockchain. Точно так же, как мы можем вызвать конкретную конечную точку URL-адреса RESTful API для выполнения некоторой логики черезHttpRequest, мы можем аналогичным образом выполнить развернутыйsmart contract в конкретномaddress, отправив правильные данные вместе с необходимым Ethereum для вызова развернутой и скомпилированной Solidityfunction.
С точки зрения бизнесаit means that smart contract functions can be inherently monetized (аналогично функции AWS Lambda, которая позволяет пользователям платитьper compute cycle, а неper instance). Важно отметить, что для запускаsmart contract functions не нужно платить за Ethereum.
Проще говоря, мы можем рассматриватьsmart contract как набор кода, хранящегося в сети блокчейн, который определяет условия, с которыми соглашаются все стороны, использующие контракт.
Это позволяет разработчикам создавать вещи, которые еще не были изобретены. Подумайте об этом на секунду - посредник не нужен, а риск контрагента также отсутствует. Мы можем создавать новые рынки, хранить реестры долгов или обещаний и быть уверенными, что у нас есть консенсус сети, которая проверяет транзакции.
Любой может развернуть интеллектуальный контракт в децентрализованной базе данных за плату, пропорциональную размеру хранилища содержащего кода. Узлы, желающие использовать умный контракт, должны как-то указывать результат своего участия для остальной части сети.
3.1. основательность
Основным языком, используемым в Ethereum, являетсяSolidity - это язык, подобный Javascript, разработанный специально для написания смарт-контрактов. Солидность статически типизирована, поддерживает наследование, библиотеки и сложные определяемые пользователем типы среди других функций.
Компилятор солидности превращает код в байт-код EVM, который затем может быть отправлен в сеть Ethereum в качестве транзакции развертывания. Такие развертывания требуют более значительных комиссионных за транзакции, чем умные контрактные взаимодействия, и должны быть оплачены владельцем контракта.
4. Создание смарт-контракта с Solidity
Первая строка в договоре о солидности устанавливает версию исходного кода. Это сделано для того, чтобы контракт не стал неожиданно вести себя иначе с новой версией компилятора.
pragma solidity ^0.4.0;
В нашем примере имя контрактаGreeting, и, как мы видим, его создание похоже на класс в Java или другом объектно-ориентированном языке программирования:
contract Greeting {
address creator;
string message;
// functions that interact with state variables
}
В этом примере мы объявили две переменные состояния:creator иmessage. В Solidity мы используем тип данных с именемaddress для хранения адресов учетных записей.
Далее нам нужно инициализировать обе переменные в конструкторе.
4.1. Конструктор
Мы объявляем конструктор с помощью ключевого словаfunction, за которым следует имя контракта (как в Java).
Конструктор - это специальная функция, которая вызывается только один раз, когда контракт впервые развернут в блокчейне Ethereum. Мы можем объявить только один конструктор для контракта:
function Greeting(string _message) {
message = _message;
creator = msg.sender;
}
Мы также вводим начальную строку_message в качестве параметра в конструктор и устанавливаем ее в переменную состоянияmessage.
Во второй строке конструктора мы инициализируем переменнуюcreator значением с именемmsg.sender. Причина, по которой нет необходимости вводитьmsg в конструктор, заключается в том, чтоmsg - это глобальная переменная, которая предоставляет конкретную информацию о сообщении, такую как адрес отправившей его учетной записи.
Мы могли бы потенциально использовать эту информацию для реализации контроля доступа для определенных функций.
4.2. Методы Setter и Getter
Наконец, мы реализуем методы установки и получения дляmessage:
function greet() constant returns (string) {
return message;
}
function setGreeting(string _message) {
message = _message;
}
Вызов функцииgreet просто вернет текущий сохраненныйmessage.. Мы используем ключевое словоconstant, чтобы указать, что эта функция не изменяет состояние контракта и не запускает никаких записей в цепочку блоков. .
Теперь мы можем изменить значение состояния в контракте, вызвав функциюsetGreeting. Любой может изменить значение, просто вызвав эту функцию. Этот метод не имеет возвращаемого типа, но принимает в качестве параметра типString.
Теперь, когда мы создали наш первый смарт-контракт, следующим шагом будет его развертывание в блокчейне Ethereum, чтобы каждый мог его использовать. Мы можем использоватьRemix, лучшую онлайн-среду IDE на данный момент, и ее легко использовать.
5. Взаимодействие со смарт-контрактом
Для взаимодействия со смарт-контрактом в децентрализованной сети (блокчейн) нам необходим доступ к одному из клиентов.
Сделать это можно двумя способами:
-
подключиться к удаленному узлу с помощью службы типаInfura.
Infura - самый простой вариант, поэтому мы запросимfree access token. После регистрации нам нужно выбрать URL-адрес тестовой сети Rinkeby:“https://rinkeby.infura.io/<token>”.
Чтобы иметь возможность совершать транзакции со смарт-контрактом из Java, нам нужно использовать библиотеку под названиемWeb3j. Вот зависимость Maven:
org.web3j
core
3.3.1
И в Градле:
compile ('org.web3j:core:3.3.1')
Перед тем, как начать писать код, нужно кое-что сделать в первую очередь.
5.1. Создание кошелька
Web3j позволяет нам использовать некоторые его функции из командной строки:
-
Создание кошелька
-
Управление паролем в кошельке
-
Перевод средств с одного кошелька на другой
-
Генерация умных контрактных функций Solidity
Инструменты командной строки можно получить в виде zip-файла / tarball со страницыreleases в репозитории проекта, в разделе загрузок или для пользователей OS X через homebrew:
brew tap web3j/web3j
brew install web3j
Чтобы создать новый кошелек Ethereum, просто введите в командной строке следующее:
$ web3j wallet create
Он попросит у нас пароль и место, где мы можем сохранить наш кошелек. Файл в формате Json, и главное, что нужно иметь в виду, это адрес Ethereum.
Мы будем использовать его на следующем шаге, чтобы запросить эфир.
5.2. Запрос эфира в тестовой сети Rinkeby
Мы можем запросить бесплатный эфирhere. Чтобы злоумышленники не исчерпали все доступные средства, они просят нас предоставить общедоступную ссылку на один пост в социальной сети с нашим адресом в Эфириуме.
Это очень простой шаг, почти мгновенно они предоставляют эфир, чтобы мы могли запустить тесты.
5.3. Создание оболочки смарт-контракта
Web3j может автоматически генерировать код оболочки интеллектуального контракта для развертывания и взаимодействия с интеллектуальными контрактами, не покидая JVM.
Чтобы сгенерировать код оболочки, нам нужно скомпилировать наш умный контракт. Мы можем найти инструкцию по установке компилятораhere. Оттуда мы вводим следующее в командной строке:
$ 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();
Все транзакции, совершенные с контрактом, можно увидеть в URL: «https://rinkeby.etherscan.io/address/<contract_address>”.
С другой стороны, мы можем изменить значение смарт-контракта, выполняющего транзакцию:
TransactionReceipt transactionReceipt = contract.setGreeting("Hello again").send();
Наконец, если мы хотим просмотреть сохраненное новое значение, мы можем просто написать:
String newValue = contract.greet().send();
7. Заключение
В этом руководстве мы увидели, чтоSolidity - это язык программирования со статической типизацией, предназначенный для разработки смарт-контрактов, запускаемых в EVM.
Мы также заключили прямой контракт с этим языком и увидели, что он очень похож на другие языки программирования.
smart contract - это просто фраза, используемая для описания компьютерного кода, который может облегчить обмен ценностями. При работе на блокчейне смарт-контракт становится самодействующей компьютерной программой, которая автоматически выполняется при выполнении определенных условий.
В этой статье мы увидели, что способность запускать код в блокчейне является основным отличием в Ethereum, поскольку позволяет разработчикам создавать приложения нового типа, которые выходят далеко за пределы того, что мы видели раньше.
Как всегда, образцы кода можно найтиover on GitHub.