Контракты Ethereum Oracle: настройка и ориентация

Опубликовано: 2022-03-11

Смарт-контракты Ethereum — это больше, чем просто «горячая новинка». Я считаю, что они (или что-то связанное с ними) готовы изменить то, как люди ведут бизнес друг с другом в грядущую новую эру Интернета. Время покажет, так ли это.

Это первая из трех частей статьи о разработке смарт-контрактов Ethereum с Solidity, в которой особое внимание уделяется использованию контрактов с так называемыми «оракулами», которые в основном представляют собой контракты, передающие данные в блокчейн для использования другими смарт-контрактами.

  • Часть 1. Введение в разработку с помощью Truffle и настройка проекта для дальнейших экспериментов.
  • Часть 2. Изучаем код для более глубокого изучения
  • Часть 3: Концептуальное обсуждение оракулов со смарт-контрактами

Цель этой, первой части серии, состоит не в том, чтобы углубиться в концепцию контрактов оракула, лежащую в их основе философию или даже очень глубоко в то, что они из себя представляют; цель этой части нашего учебника по оракулу Ethereum состоит в том, чтобы:

  • Настройте создание смарт-контрактов с помощью Truffle.
  • Создайте проект смарт-контракта, который будет служить нам в частях 2 и 3.
  • Представьте несколько концепций, связанных со смарт-контрактами Ethereum и кодированием смарт-контрактов.
  • Внедрите цикл компиляции/запуска/отладки с помощью Truffle и смарт-контрактов.

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

Первая часть этой статьи будет состоять из настройки всех предварительных условий. Затем мы создадим один контракт Ethereum и протестируем его с помощью Truffle. Наконец, мы отделим оракул от клиента и протестируем их совместно.

Требования к программному обеспечению

  • Любая основная ОС будет работать, хотя некоторые установки и настройки, конечно, будут отличаться в разных системах. Я сделал все это на Ubuntu Linux (16.04). У меня также не было проблем с настройкой среды в Windows. Я не пробовал Mac, хотя я знаю, что это обычное дело и на Mac.
  • Нет необходимости запускать полный узел eth; мы будем использовать Truffle, у которого есть собственная тестовая сеть. Если вы немного разбираетесь в том, что делаете, вы можете использовать любую другую тестовую сеть по вашему выбору; Локальная тестовая сеть Truffle — самая простая и доступная для целей этого руководства.

Требования к знаниям

  • Базовые знания о том, как работает блокчейн
  • Понимание того, что такое смарт-контракт на основе блокчейна
  • Некоторый базовый опыт разработки смарт-контрактов будет полезен, но не обязателен, если вы умны и амбициозны. (И я знаю, что вы!)

Эта серия статей может служить первым введением в смарт-контракты, но она очень быстро переходит к более продвинутым концепциям. Если это ваш первый учебник по смарт-контрактам eth, будьте готовы быстро подняться на высоту. Если вы чувствуете себя уверенно, отлично; если нет, не стесняйтесь сначала получить более простой учебник типа «Hello World» или два под своим поясом. Для начала ознакомьтесь с одной или предыдущими статьями об Ethereum и Cryptozombies.

Предостережение: пространство смарт-контрактов, будучи таким новым, быстро меняется. Возможности синтаксиса Solidity, которые были новыми на момент написания этой статьи, могут оказаться устаревшими к моменту, когда вы читаете эту статью. Версии Geth могли появляться и исчезать. Solidity всегда добавляет новые языковые функции и отказывается от старых. Многие новые функции в настоящее время находятся в разработке. Итак, будьте готовы при необходимости адаптировать информацию в этой статье к новому ландшафту будущего; если вы серьезно относитесь к изучению разработки смарт-контрактов, то я верю в вас.

Описание примера приложения

Вариант использования: пользователи делают ставки на боксерские поединки.

  • Пользователь может получить список боксерских поединков, на которые можно делать ставки.
  • Пользователь может выбрать матч и сделать ставку на победителя.
  • Пользователь может поставить любую сумму выше указанного минимума.
  • Если выбор пользователя проигрывает, пользователь теряет всю сумму ставки.
  • Если выбор пользователя побеждает, пользователь получает часть банка в зависимости от размера своей ставки и общей суммы ставки на проигравшего в матче после того, как дом (владелец контракта) заберет небольшой процент от выигрыша. .

Что такое оракул Ethereum?

Смарт-контракты все еще являются чем-то новым; им еще только предстоит стать мейнстримом, и многие аспекты их работы еще не проработаны и не стандартизированы. Я кратко объясню, что стоит за идеей «оракула» — и наберитесь терпения; мы рассмотрим это более подробно в последующих частях.

Разработка блокчейн-контракта отличается от программирования клиент-серверного приложения. Одно важное отличие состоит в том, что данные, с которыми взаимодействует контракт, уже должны быть в блокчейне. Нет вызова из блокчейна. Это не поддерживается не только языком, но и парадигмой блокчейна. Контракт может принимать ставки в виде валюты на основе Ethereum, хранить их в контракте и переводить на правильные адреса кошелька в соответствии с формулой, когда объявляется победитель матча. Но как контракт узнает победителя? Он не может запрашивать REST API или что-то в этом роде. Он может использовать только те данные, которые уже находятся в блокчейне! Многие варианты использования смарт-контрактов сталкиваются с аналогичной проблемой — они серьезно ограничены, если не могут взаимодействовать с миром за пределами блокчейна.

Если контракт может взаимодействовать только с данными в блокчейне, очевидным решением будет внедрение необходимых данных в блокчейн. Вот что такое оракул. Оракул — это еще один контракт, который вводит данные в блокчейн, позволяя другим контрактам использовать их. Хотя это может вызвать вопросы о доверии и недоверии, просто примите на данный момент, что это и есть оракул. В третьей части этой серии мы обсудим эти нюансы. В нашем примере использования оракул будет контрактом, который вводит данные в блокчейн относительно (а) доступных совпадений и (б) того, кто выиграл эти совпадения после принятия решения.

Настройка среды разработки Ethereum

Для базовой настройки мы установим:

  • Гет (пока необязательно)
  • Трюфель
  • Ganache CLI (необязательно)
  • Среда разработки (необязательно)

В этой статье недостаточно места, чтобы стать полным руководством по настройке среды, но она служит лишь грубым руководством. Это нормально, потому что уже есть много более полных руководств по настройке для вашей конкретной ОС, и Интернету действительно не нужно новое. Поэтому я быстро проведу вас по пути и укажу вам на некоторые ресурсы для получения более подробной информации по мере необходимости. Будьте готовы установить требования и предварительные требования в соответствии с требованиями вашей системы и указаниями Google.

Иллюстрация процесса контрактов Oracle

Установите Geth (необязательно)

Скриншот установки Geth Нажмите, чтобы увидеть полноразмерное изображение.

Geth — это Go-ethereum, основное программное обеспечение Ethereum; хотя в этом упражнении это совсем не обязательно, любому потенциальному разработчику Ethereum надлежит иметь его и быть знакомым с ним. Это будет необходимо, если вы когда-нибудь собираетесь развернуть свой смарт-контракт в действующей сети Ethereum.

  • http://www.talkcrypto.org/blog/2018/01/23/what-is-geth/
  • https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Ubuntu
  • https://github.com/ethereum/go-ethereum/wiki/Инструкции по установке для Windows

Установить трюфель

Скриншот установки Truffle Нажмите, чтобы увидеть полноразмерное изображение.

Truffle — это основное, что мы собираемся использовать для разработки, и это обязательное требование для этого руководства. Найдите и следуйте инструкциям для вашей ОС по установке Truffle. Ниже приведены некоторые ссылки, которые, мы надеемся, помогут вам.

  • https://truffleframework.com/docs/truffle/getting-started/installation
  • https://github.com/trufflesuite/трюфель
  • https://truffleframework.com/tutorials/how-to-install-truffle-and-testrpc-on-windows-for-blockchain-development

Установите Ganache CLI (необязательно)

Скриншот установки Ganache CLI Нажмите, чтобы увидеть полноразмерное изображение.

Я рекомендую установить Ganache CLI, чтобы использовать его в качестве еще одного инструмента тестирования, хотя на самом деле мы не будем использовать его в нашем руководстве. Это необязательно.

https://github.com/trufflesuite/ganache-кли

Среда разработки Ethereum

Было бы более чем возможно выполнить весь этот урок с помощью любого простого текстового редактора, такого как Notepad++, gedit, vi или любого текстового редактора или IDE по вашему выбору. Лично я использую код Visual Studio со следующими расширениями:

  • Солидность
  • Прочность расширена
  • Тема значка материала

Примечание. Расширения не требуются — они просто улучшают среду кодирования.

Настройка кода

Настройка проекта

Truffle — очень удобный инструмент для составления смарт-контрактов, переноса их в блокчейн, а также предоставляет утилиты для разработки и отладки. Для интеграции с Truffle потребуется некоторая настройка проекта. Теперь настроим оболочку для нашего проекта, как в Truffle, так и в структуре каталогов. Просто откиньтесь на спинку кресла, следуйте инструкциям робота и наслаждайтесь.

Создайте каталог для размещения всего кода; назовите это oracle-example .

Внутри корневого каталога создайте два подкаталога, потому что в итоге проект будет состоять из двух подпроектов. Создайте каталоги:

  • /оракул-пример/клиент
  • /оракул-пример/оракул

Зайдите в папку клиента, потому что это первый проект, который мы собираемся разработать. Откройте окно терминала (командной строки) в папке /oracle-example/client .

Запустите команду truffle init .

Обратите внимание, что среди многих созданных файлов есть truffle-config.js и truffle.js . Оба они нам не нужны, поэтому удалите truffle-config.js (просто во избежание путаницы и беспорядка).

Нам нужно отредактировать truffle.js , чтобы указать Truffle в правильном направлении для тестирования. Замените содержимое truffle.js следующим:

 module.exports = { networks: { development: { host: "localhost", port: 8545, network_id: "*" // Match any network id } } };

https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/truffle.js

Обратите внимание, что Truffle init создал каталог с именем миграции ( oracle-example/client/migrations ). Внутри этой папки должен быть файл с именем 1_initial_migration.js .

Добавьте еще один файл в каталог миграции и назовите его 2_deploy_contracts.js со следующим содержимым:

 var BoxingBets = artifacts.require("BoxingBets"); module.exports = function(deployer) { deployer.deploy(BoxingBets); };

https://github.com/jrkosinski/oracle-example/tree/part1-step1

Добавление кода

Теперь, когда простая настройка завершена, мы готовы начать кодирование. Помните, что эта часть статьи по-прежнему является введением и настройкой, поэтому мы довольно быстро пройдемся по коду. Мы рассмотрим более подробные объяснения кода во второй части и более подробно обсудим архитектуру и концепцию в части 3. Тем не менее, мы быстро коснемся некоторых основных концепций, очевидных в коде. Следите внимательно, чтобы не отставать.

Полный код этого шага процесса доступен на GitHub: https://github.com/jrkosinski/oracle-example/tree/part1-step1.

Контракты в Solidity

«Контракт» в Solidity примерно аналогичен классу в других объектно-ориентированных языках. Сам язык сравнивают, в частности, с Golang и JavaScript. Некоторые другие языковые конструкции в Solidity — примеры которых мы рассмотрим позже — это модификаторы, библиотеки и интерфейсы. Для контрактов поддерживается наследование (включая множественное наследование). Файлы контрактов Solidity имеют расширение .sol.

Интерфейс оракула

Добавьте этот файл в свой проект: /oracle-example/client/contracts/OracleInterface.sol

https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/contracts/OracleInterface.sol

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

Обычно интерфейс оракула был бы именно интерфейсом. Для этой самой первой итерации это просто простой класс, содержащийся в проекте Solidity, пока что в качестве заполнителя. Мы переместим его на следующем этапе, после того как успешно скомпилируем и запустим контракт на Truffle. После того, как мы позже преобразуем это в фактический интерфейс, реализации функций будут пустыми.

Клиентский договор

Добавьте этот файл в свой проект: /oracle-example/client/contracts/BoxingBets.sol

https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/contracts/BoxingBets.sol

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

Компиляция и запуск

Вот сейчас и посмотрим, все ли у нас получилось с первого раза!

Скомпилируйте и перенесите контракт

Откройте терминал в папке /oracle-example/client/

Скомпилируйте код с помощью этой команды:

 truffle compile 
Скриншот компиляции и переноса контракта Нажмите, чтобы увидеть полноразмерное изображение.
Второй скриншот компиляции и миграции контракта Нажмите, чтобы увидеть полноразмерное изображение.

Альтернативный вариант: используйте мой сценарий оболочки recompile.sh (https://github.com/jrkosinski/oracle-example/tree/part1-step1/client/recompile.sh).

Обратите внимание, что вы увидите много предупреждений, потому что наш код еще не в окончательном виде!

Откройте консоль разработки Truffle:

 truffle develop

Теперь в консоли разработчика Truffle перейдите в тестовую сеть:

 truffle(develop)> migrate

Запустить контракт

В командной строке консоли разработки введите следующую строку кода:

 truffle(develop)> BoxingBets.deployed().then(inst => { instance = inst })

Теперь «экземпляр» — это переменная, которая ссылается на контракт BoxingBets и может использоваться для вызова его общедоступных методов.

Протестируйте его с помощью следующей команды:

 truffle(develop)> instance.test(3, 4)

Обратите внимание, что мы включили общедоступную функцию «тестирования» в BoxingBets.sol . Он складывает любые два числа, которые вы ему передаете, просто чтобы продемонстрировать, что контракт выполняет код и что мы можем вызвать его из консоли разработки Truffle. Если мы получим разумно выглядящий ответ (см. ниже), то наша работа здесь выполнена (по крайней мере, на данный момент).

Отделить Ethereum Oracle

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

Схема контрактных процессов оракула ethereum

  • Создайте его по адресу блокчейна.
  • Динамически изменить адрес оракула, который клиентский контракт использует для ссылки на оракул.

Короче говоря, что мы собираемся сделать сейчас, так это разделить оракула и клиента на два отдельных объекта контракта блокчейна и заставить их общаться друг с другом. Клиент создаст экземпляр оракула по адресу и вызовет его.

Клиентский договор

Во-первых, мы собираемся изменить клиентский контракт (клиент), чтобы он ссылался на динамический интерфейс к оракулу, а не на конкретный класс. Затем мы удостоверимся, что он создает экземпляр оракула из внешнего контракта.

Перейдите в /oracle-example/client/contracts/OracleInterface.sol . Как мы отмечали ранее, в настоящее время это не интерфейс, но мы собираемся сделать его таковым. Замените то, что там, содержимым:

https://github.com/jrkosinski/oracle-example/tree/part1-step2/client/contracts/OracleInterface.sol

 pragma solidity ^0.4.17; contract OracleInterface { enum MatchOutcome { Pending, //match has not been fought to decision Underway, //match has started & is underway Draw, //anything other than a clear winner (eg cancelled) Decided //index of participant who is the winner } function getPendingMatches() public view returns (bytes32[]); function getAllMatches() public view returns (bytes32[]); function matchExists(bytes32 _matchId) public view returns (bool); function getMatch(bytes32 _matchId) public view returns ( bytes32 id, string name, string participants, uint8 participantCount, uint date, MatchOutcome outcome, int8 winner); function getMostRecentMatch(bool _pending) public view returns ( bytes32 id, string name, string participants, uint participantCount, uint date, MatchOutcome outcome, int8 winner); function testConnection() public pure returns (bool); function addTestData() public; }

В BoxingBets.sol мы собираемся заменить эту строку:

 OracleInterface internal boxingOracle = new OracleInterface();

С помощью этих двух строк:

 address internal boxingOracleAddr = 0; OracleInterface internal boxingOracle = OracleInterface(boxingOracleAddr);

Теперь нам нужен способ установить адрес оракула динамически и функцию, которую мы можем вызвать, чтобы узнать текущий адрес оракула. Добавьте эти две функции в BoxingBets.sol :

 /// @notice sets the address of the boxing oracle contract to use /// @dev setting a wrong address may result in false return value, or error /// @param _oracleAddress the address of the boxing oracle /// @return true if connection to the new oracle address was successful function setOracleAddress(address _oracleAddress) external onlyOwner returns (bool) { boxingOracleAddr = _oracleAddress; boxingOracle = OracleInterface(boxingOracleAddr); return boxingOracle.testConnection(); } /// @notice gets the address of the boxing oracle being used /// @return the address of the currently set oracle function getOracleAddress() external view returns (address) { return boxingOracleAddr; }

И, наконец, для проверки соединения между клиентом и оракулом мы можем заменить тестовую функцию в BoxingBets на функцию для проверки соединения с оракулом:

 /// @notice for testing; tests that the boxing oracle is callable /// @return true if connection successful function testOracleConnection() public view returns (bool) { return boxingOracle.testConnection(); }

Собственный

Обратите внимание, что за определением setOracleAddress следует модификатор onlyOwner . Это ограничивает вызов этой функции кем-либо, кроме владельца контракта, даже если функция является общедоступной. Это не особенность языка. Это обеспечивается контрактом Ownable, который взят из библиотеки OpenZeppelin контрактов общего назначения Solidity. Мы подробно расскажем об этом во второй части, но чтобы упростить использование модификатора onlyOwner , нам нужно внести несколько изменений:

Скопируйте Ownable.sol из https://github.com/jrkosinski/oracle-example/tree/part1-step2/client/contracts/Ownable.sol в /oracle-example/client/contracts/ .

Добавьте ссылку на него вверху BoxingBets.sol , например:

 import "./Ownable.sol";

(Вы можете добавить его прямо под строкой import OracleInterface.sol .)

Измените объявление контракта BoxingBets, чтобы оно наследовалось от Ownable, от этого:

 contract BoxingBets {

К этому:

 contract BoxingBets is Ownable {

И мы должны быть готовы. Полный код здесь на случай, если вы заблудились: https://github.com/jrkosinski/oracle-example/tree/part1-step2/client/contracts.

Контракты Оракула

Настраивать

Теперь, когда контракт BoxingBets пытается сослаться на совершенно отдельный контракт (который является оракулом) по адресу, наша следующая задача — создать этот контракт оракула. Итак, теперь мы собираемся создать отдельный проект, который будет содержать контракт оракула. По сути, это та же самая настройка, которую мы уже сделали для проекта клиентского контракта; то есть настроить Truffle для компиляции и разработки.

У вас уже должна быть папка с именем /oracle-example/oracle/ , которую мы создали на предыдущем шаге (или, если нет, создайте этот пустой каталог сейчас). Откройте терминал в этом каталоге.

  • Запустите команду truffle init .
  • Удалите /oracle-example/oracle/truffle-config.js .
  • Отредактируйте /oracle-example/oracle/truffle.js следующим образом:
 module.exports = { networks: { development: { host: "localhost", port: 8545, network_id: "*" // Match any network id } } };

См. пример здесь: https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/truffle.js.

Внутри /oracle-example/oracle/migrations/ создайте файл с именем 2_deploy_contracts.js со следующим содержимым:

 var BoxingOracle = artifacts.require("BoxingOracle"); module.exports = function(deployer) { deployer.deploy(BoxingOracle); };

См. пример здесь: https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/migrations/2_deploy_contracts.js

Код оракула

Для этого шага просто скопируйте следующие три файла с https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/contracts/ в папку /oracle-example/oracle/contracts/ :

  • BoxingOracle.sol: основной контракт оракула.
  • Ownable.sol: только для функций владельца, как мы уже использовали в клиентском контракте.
  • DateLib.sol: библиотека дат. Мы рассмотрим его более подробно во второй части этой серии.

Тестирование Оракула

Теперь, в текущей итерации проекта, нам действительно нужно тщательно протестировать наш оракул смарт-контракта, так как это будет нашей основой, на которой мы будем строить остальную часть проекта. Итак, теперь, когда мы настроили проект оракула и скопировали код, нам нужно:

  • Скомпилируйте оракул.
  • Убедитесь, что оракул работает.
  • Запустите несколько функций в консоли Truffle, чтобы убедиться, что оракул работает должным образом.

Скомпилируйте и перенесите Oracle

Все еще в терминале, открытом для /oracle-example/oracle/ , выполните следующие команды. Опять же, эти шаги идентичны тому, что мы уже сделали для компиляции и переноса клиентского контракта.

 truffle compile

Альтернативный вариант: используйте мой сценарий оболочки recompile.sh (https://github.com/jrkosinski/oracle-example/tree/part1-step2/oracle/recompile.sh).

Откройте консоль разработки Truffle:

 truffle develop

Перейдите в тестовую сеть:

 truffle(develop)> migrate

Запустите и протестируйте Oracle

Находясь в консоли разработки Truffle, введите это, чтобы захватить пригодный для использования указатель на контракт оракула:

 truffle(develop)> BoxingOracle.deployed().then(inst => { instance = inst })

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

 truffle(develop)> instance.testConnection() ... truffle(develop)> instance.getAllMatches() ... truffle(develop)> instance.addTestData() ... truffle(develop)> instance.getAllMatches() ...

На этом этапе вам рекомендуется просмотреть код оракула, посмотреть, какие общедоступные методы доступны, прочитать комментарии в коде и придумать несколько собственных тестов для запуска (и запустить их здесь, в консоли, как показано выше).

Тестирование и отладка

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

  • Скомпилируйте и запустите контракт оракула
  • Скомпилируйте и запустите клиентский контракт
  • Получить адрес контракта оракула
  • Установите адрес оракула в контракте клиента
  • Добавьте тестовые данные в контракт оракула
  • Проверьте, можем ли мы получить эти данные в клиентском контракте.

Откройте два окна терминала:

  • Один в /oracle-example/client/
  • А другой в /oracle-example/oracle/

Я предлагаю вам держать открытым файл /oracle-example/client/ слева, а файл /oracle-example/oracle/ справа и внимательно следить за ним, чтобы избежать путаницы.

Скомпилируйте и запустите контракт Oracle

Выполните следующие команды в терминале /oracle-example/oracle/ :

 bash recompile.sh truffle develop truffle(develop)> migrate truffle(develop)> BoxingOracle.deployed().then(inst => { instance = inst })

Скомпилируйте и запустите клиентский контракт

Выполните следующие команды в терминале /oracle-example/client/ :

 bash recompile.sh truffle develop truffle(develop)> migrate truffle(develop)> BoxingBets.deployed().then(inst => { instance = inst })

Получить адрес контракта Oracle

Выполните следующую команду для Truffle в терминале /oracle-example/oracle/ :

 truffle(develop)> instance.getAddress()

Скопируйте адрес, который является выходом этого вызова; и используйте его на следующем шаге.

Установите адрес Oracle в клиентском контракте

Выполните следующую команду для трюфеля в терминале /oracle-example/client/ :

 truffle(develop)> instance.setOracleAddress('<insert address here, single quotes included>')

И протестируйте его:

 truffle(develop)> instance.testOracleConnection()

Если вывод true , то все готово.

Проверьте, можем ли мы получить эти данные в клиентском контракте.

Выполните следующую команду для трюфеля в терминале /oracle-example/client/ :

 truffle(develop)> instance.getBettableMatches()

Он должен вернуть пустой массив, потому что тестовые данные еще не были добавлены на сторону оракула.

Выполните следующую команду для трюфеля в терминале /oracle-example/oracle/ , чтобы добавить тестовые данные:

 truffle(develop)> instance.addTestData()

Выполните следующую команду для трюфеля в терминале /oracle-example/client/ , чтобы посмотреть, сможем ли мы получить недавно добавленные тестовые данные от клиента:

 truffle(develop)> instance.getBettableMatches()

Теперь, если вы возьмете отдельные адреса из массива, возвращаемого getBettableMatches() , и вставите их в getMatch() .

На этом этапе вам рекомендуется просмотреть клиентский код, посмотреть, какие общедоступные методы доступны, прочитать комментарии в коде и придумать несколько собственных тестов для запуска (и запустить их здесь, в консоли, как над).

Заключение первой части

Наши результаты от этого упражнения ограничены, но такими же были и наши цели, чтобы сохранить реалистичный темп. У нашего клиента пока нет возможности принимать ставки, распоряжаться денежными средствами, делить выигрыши и т. д. Что у нас есть, помимо полученных знаний и опыта, так это:

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

И это не так уж плохо для короткой статьи.

Во второй части этой серии мы углубимся в код и рассмотрим некоторые функции, уникальные для разработки смарт-контрактов, а также некоторые языковые функции, характерные для Solidity. Многое из того, что было упущено в этой части, будет объяснено в следующей.

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

Дальнейшие необязательные шаги

Сольные эксперименты — хороший способ учиться. Вот несколько простых предложений, если вы думаете о том, как расширить этот учебник для получения дополнительных знаний (ни одно из следующего не будет рассмотрено в частях 2 и 3):

  • Разверните контракты в Ganache (ранее testrpc) и запустите те же тесты для проверки работоспособности.
  • Разверните контракты в тестовых сетях ropsten или rinkeby и запустите те же тесты для проверки работоспособности.
  • Создайте интерфейс web3js либо для оракула, либо для клиента (или для обоих).

Удачи, и, пожалуйста, не стесняйтесь обращаться ко мне с любыми вопросами. Я не могу гарантировать быстрый ответ обязательно, но я сделаю все возможное.