Ethereum Development 101: Урок 3: как импортировать внешний код в ваши смарт-контракты

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

Цели обучения. К концу этого урока вы сможете импортировать внешние смарт-контракты и библиотеки в Solidity.

Обзор

Начало работы в мире разработки смарт-контрактов может быть ошеломляющим. Часто существует множество предполагаемых знаний, которые нигде толком не объясняются. Например, импорт внешних контрактов и библиотек в ваши смарт-контракты.

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

В первые годы я помню, как копировал и вставлял код библиотеки в мои файлы .sol в качестве обходного пути.

В этой статье объясняется, как импортировать любой внешний контракт или библиотеку в ваши смарт-контракты.

Ваша среда разработки

Первые шаги, которые вы делаете в разработке смарт-контрактов, скорее всего, используют Remix online IDE. Это фантастический инструмент для быстрого и легкого доступа к компилятору Solidity, чтобы вы могли выучить язык как можно быстрее.

Как только вы почувствуете уверенность в использовании Solidity, у вас, естественно, появится желание разрабатывать в локальной среде, в настольной IDE. Наличие кода в каталоге проекта, работающего локально, обеспечивает быструю разработку и позволяет использовать контроль версий и открытый исходный код.

Здесь на помощь приходит Truffle Suite.

Среда разработки мирового класса для блокчейн DApps (децентрализованных приложений) и смарт-контрактов. — Trufflesuite.com

Он хранит весь ваш код в одном месте без особой настройки, а кривая обучения, чтобы заставить что-то базовое работать, очень неглубокая.

В следующий раз, когда вы захотите создать новый проект, содержащий смарт-контракты, начните с Truffle. Давай сделаем это…

Начиная

Узел

Truffle работает на Node.js, поэтому, если вы еще не установили его, зайдите на их сайт и следуйте инструкциям по установке.

Трюфель

Используйте Node Package Manager (npm) для установки Truffle, запустив:

npm install -g truffle

Текстовый редактор

Убедитесь, что у вас установлена ​​актуальная версия текстового редактора. Я использую VS Code.

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

mkdir my-project
cd my-project/
truffle init

Откройте новый каталог проекта в текстовом редакторе. Структура вашей папки должна выглядеть так, как показано на рисунке 1. Там должно быть три подкаталога: contract/, migrations/ и test/; и файл: truffle-config.js.

  • contract/ — это место, где хранится наш код смарт-контракта Solidity. Truffle знает, что здесь нужно искать .sol файлов для компиляции и переноса в блокчейн.
  • migrations/ — это место, где находится наша логика миграции. Здесь мы можем описать шаги, необходимые при развертывании наших контрактов, чтобы они были правильно развернуты.
  • test/ — это место, где мы будем писать для наших смарт-контрактов, чтобы убедиться, что они работают должным образом.
  • truffle-config.js содержит информацию о сетях, компиляторах, расположении файлов и других пользовательских конфигурациях, чтобы платформа Truffle знала, где находятся наши вещи. Пока не беспокойтесь об этом файле.

Установка и импорт

OpenZeppelin — это золотой стандарт многоразового репозитория для смарт-контрактов Ethereum. В этом проекте мы собираемся установить репозиторий контрактов в качестве зависимости, а затем импортировать контракт Ownable, чтобы мы могли ограничить доступ к определенным функциям.

Возможно, вы видели или использовали подобный шаблон раньше. При инициализации контракта адрес msg.sender сохраняется в переменной состояния, указывающей владельца контракта. Используя пользовательский модификатор _onlyOwner, некоторые функции ограничивают доступ, требуя, чтобы msg.sender был равен владельцу.

В корне репозитория запустите:

npm install @openzeppelin/contracts --save

После завершения вы должны увидеть новую папку в корне с именем node_modules/ (если вы использовали Node или npm до того, как узнали об этом).

Внутри node_modules npm загрузил репозиторий OpenZeppelin/contracts, в котором находятся все контракты и библиотеки, которые может предложить OpenZeppelin. Найдите минутку, чтобы просмотреть то, что предлагается.

Мы будем использовать контракт Ownable, который в корне проекта лежит в @openzeppelin-solidity/contracts/access/Ownable.sol.

В папке contracts/ создайте новый файл Solidity, который будет импортировать контракт Ownable. Я назову своего TestContract.sol.

Первое, что нужно сделать, это объявить версию компилятора Solidity, мы используем 0.6.0; затем нам нужно импортировать контракт Ownable, используя найденный нами путь; и, наконец, нам нужно объявить контракт и то, что он простирается от Ownable.

Рисунок 2показывает основу контракта после того, как мы все это сделали.

Не поверите, но это так!

При написании новых функций в этом контракте мы можем добавить модификатор onlyOwner сразу после модификаторов public, private, internal или external, чтобы объявить, что функция должна выполняться только владельцем.

Вот простой пример:

// This function has no restrictions on who can call it
function noRestrictions() public { ... }// This function is restricted only to the owner. Anyone else
// who tries to call it will result in a reverted transaction
function restrictedFunction() public onlyOwner { ... }

Чтобы убедиться, что контракт скомпилирован, когда вы добавили свои новые ограниченные функции, запустите:

truffle compile

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



Или вернитесь на страницу курса Ethereum Development 101, чтобы выбрать другой урок: