Смарт-контракты лежат в основе концепции Ethereum

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

Хорошо, но что именно это означает?

Что ж, Биткойн имеет ограниченную поддержку смарт-контрактов, потому что его язык сценариев не является полным по Тьюрингу, отчасти из-за отсутствия циклов. Это означает, что существует множество приложений, которые разработчики могут программировать на Ethereum, но не на Bitcoin. С технической точки зрения Ethereum с самого начала разрабатывался как платформа для развертывания и исполнения смарт-контрактов.

Полнота по Тьюрингу

Что означает полный по Тьюрингу?

Полный по Тьюрингу язык Ethereum изначально основан на концепции Алана Тьюринга об универсальной машине Тьюринга (UTM).

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

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

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

Хорошо, но нам еще нужно понять, что такое смарт-контракт!

Смарт-контракты

Давайте быстро взглянем на определение смарт-контракта:

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

Вы все понимаете с теоретической точки зрения? Отлично, теперь приступим к делу.

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

Учебное пособие по смарт-контракту

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

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

Вы готовы? Давайте начнем!

1. Подготовка: установите необходимые инструменты.

Для начала нам понадобятся некоторые базовые инструменты. Скачиваем Node.js версии 8.9.4 или выше. Я предполагаю, что мы используем Windows, Linux или Mac OS X. Когда мы будем готовы, мы открываем нашу оболочку и запускаем эту команду:

npm i -g truffle

Truffle требует, чтобы у нас был запущен клиент Ethereum, который поддерживает стандартный JSON RPC API (а это почти все из них). Мы будем использовать Ganache, часть пакета Truffle, персональный блокчейн для разработки Ethereum, который работает на настольном компьютере. Вы можете скачать это здесь".

Поскольку мы не хотим устанавливать полный узел, в конечном итоге мы будем использовать Infura в качестве размещенного кластера узлов Ethereum. Это позволяет пользователям запускать и развертывать свои приложения без необходимости настраивать собственный узел Ethereum.

Создайте простую бесплатную учетную запись на Infura и создайте новый проект. Измените конечную точку в настройках проекта на Rinkeby и скопируйте и сохраните URL-адрес конечной точки для Rinkeby в любом месте по вашему выбору.

Теперь мы готовы развернуть смарт-контракт. Конечно, сначала мы должны написать…

2. Создайте смарт-контракт с использованием библиотеки OpenZeppelin.

Создаем новый каталог для нашего проекта Truffle:

mkdir TestERC20Contract
cd TestERC20Contract
truffle init

В данном руководстве мы просто воспользуемся библиотекой OpenZeppelin для разработки смарт-контрактов. Мы можем установить OpenZeppelin, выполнив следующие команды:

npm init -y
npm i [email protected]

Примечание. Мы используем определенную версию OpenZeppelin из-за проблем с совместимостью с трюфелями.

В каталоге contracts/ нашего проекта Truffle создайте файл TestERC20Contract.sol и добавьте следующее содержимое:

pragma solidity ^0.5.0;
import "../node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
contract TestERC20Contract is ERC20 {
uint256 public initialSupply = 1000;
constructor() public {
  _mint(msg.sender, initialSupply);
}
}

3. Разверните смарт-контракт на Ganache (ваш личный блокчейн).

Теперь давайте развернем разработанный выше смарт-контракт на локально работающий блокчейн Ganache. Откройте Ganache и выберите проект быстрого запуска Ethereum. Параметры RPC-сервера и идентификатор сети можно увидеть в шапке проекта:

В файле truffle-config.js настройте эти параметры. Мы также настраиваем версию компилятора для использования версии 0.5.0, потому что контракт написан в этой конкретной версии Solidity.

host: "127.0.0.1", // Localhost (default: none)
port: 7545, // Standard Ethereum port (default: none)
network_id: "5777", // Any network (default: none)
compilers: {
 solc: {
  version: "0.5.0", // Fetch exact version from solc-bin (default:       truffle’s version)
 }
}

В каталоге migrations/ создайте файл 2_deploy_contracts.js и добавьте следующее содержимое:

var TestERC20Contract = artifacts.require("../contracts/TestERC20Contract.sol");
module.exports = function(deployer) {
 deployer.deploy(TestERC20Contract);
};

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

truffle compile

После завершения компиляции мы развертываем контракт в блокчейне:

truffle migrate

Теперь вернемся к блокчейну Ganache и нажмем «Транзакции». Поздравляем, мы локально развернули наш первый смарт-контракт.

Это ни в коем случае не конец истории. Наша следующая цель - развертывание общедоступной тестовой сети Rinkeby.

4. Разверните смарт-контракт в общедоступной тестовой сети (например, Rinkeby).

Для начала нам нужно установить пакет @truffle/hdwallet-provider:

npm i @truffle/hdwallet-provider

Затем мы редактируем файл truffle-config.js, чтобы настроить hdwallet-provider и подключение к сети Rinkeby. Мы предоставляем ссылку на нашу мнемонику, которая создает учетную запись на MetaMask и включает URL-адрес конечной точки Infura для Rinkeby (см. Выше). В конце концов, мы гарантируем, что в нашей учетной записи достаточно Rinkeby Ether для проведения развертывания. Для этого мы можем использовать эфирный кран.

var HDWalletProvider = require("@truffle/hdwallet-provider");
var mnemonic = "orange apple banana … ";
module.exports = {
 networks: {
  development: {
   host: "127.0.0.1",
   port: 8545,
   network_id: "*"
  },
  rinkeby: {
   provider: function() {
    return new HDWalletProvider(mnemonic,    "https://rinkeby.infura.io/v3/<INFURA_Access_Token>");
   },
   network_id: 4,
   gas: 4500000,
   gasPrice: 10000000000,
  }
 }
};

Мы также меняем файл 2_deploy_contracts.js следующим образом:

var TestERC20Contract = artifacts.require("../contracts/TestERC20Contract.sol");
module.exports = function(deployer, network, accounts) {
 deployer.deploy(TestERC20Contract, {from: accounts[0]});
};

Если он еще не скомпилирован, скомпилируйте его, запустив truffle compile. Наконец, мы развертываем его в тестовой сети Rinkeby:

truffle migrate --network rinkeby

Теперь мы становимся профессиональными! Теперь мы можем проверить наш смарт-контракт на Etherscan, используя адрес контракта. Но подождите - когда мы нажимаем на вкладку Контракт, мы видим огромную кучу букв и цифр.

Чтобы обеспечить взаимодействие смарт-контрактов, нам нужно убедиться, что мы действительно являемся создателем контракта. Если мы добьемся успеха, куча букв и цифр исчезнет, ​​и мы сможем вызывать функции смарт-контракта.

5. Проверьте код смарт-контракта.

Нажмите «Подтвердить и опубликовать» и просто следуйте инструкциям:

Еще раз поздравляем, мы проверили наш первый смарт-контракт!

6. Взаимодействие со смарт-контрактом через простой пользовательский интерфейс Etherscan.

Щелкните еще раз на вкладке «Контракт» и переключитесь на «Написать контракт», и вы увидите, что с развернутым смарт-контрактом становится легко взаимодействовать. Все, что нам нужно сделать, это подключиться к нашей учетной записи MetaMask, и мы можем начать утверждать или передавать токены и так далее. Мы прошли долгий путь!

Последним шагом является развертывание точно такого же смарт-контракта в основной сети Ethereum.

7. Разверните смарт-контракт в основной сети Ethereum.

Для окончательного развертывания нам нужно получить настоящий эфир на нашей учетной записи MetaMask. Кроме того, мы меняем network_id в файле truffle-config.js на 1 и корректируем URL-адрес Infura со ссылкой на основную сеть.

Вот и все! Мы снова готовы к развертыванию. Теперь мы профессионалы в области умных контрактов!

Предупреждение: если вы отправите эфир на любую учетную запись, созданную с помощью мнемоники Ganache по умолчанию, вы потеряете все это!

Ясно, что я не углублялся во многие спецификации, которые имеют решающее значение на практике (например, модульные тесты). Тем не менее, я надеюсь, что пробудил ваше любопытство и побудил вас узнать больше о смарт-контрактах и ​​их приложениях. До скорого!