Создание и развертывание смарт-контрактов с надежностью

Создание и развертывание смарт-контрактов с надежностью

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 - самый простой вариант, поэтому мы запросим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.