Oracle (oraclize.it) с Truffle и Testrpc

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

В настоящее время я работаю с Testrpc, Truffle и React, чтобы протестировать свой смарт-контракт. Теперь я хочу интегрировать oraclize.it в свою среду. Как лучше всего это сделать?

Я попытался скопировать testexamples в папку с контрактом, но в контракте есть эта ссылка:

import "github.com/oraclize/ethereum-api/oraclizeAPI.sol";

Как я могу интегрировать эту ссылку в свою структуру папок?

Я попытался скопировать следующие файлы в папку с контрактом:

https://github.com/oraclize/ethereum-api/

Но у меня есть пара ошибок.

Как лучше всего реализовать Oraclize с помощью Truffle и Testrpc/Ganache?

Ответы (2)

Вполне возможно использовать сервис Oraclize с testrpc вместе с truffle.

Во-первых, вам нужно следовать соглашению об именах контрактных имен файлов в truffle. Согласно их документам:

Truffle ожидает, что ваши файлы контрактов будут определять контракты, которые точно соответствуют их именам файлов.

Поэтому вам следует скачать Oraclize API из репозитория Oraclize на github, вот конкретная ссылка на файл oraclizeAPI_0.4.sol . Загрузите его в папку трюфельных контрактов вашего рабочего каталога и переименуйте файл в usingOraclize.sol. Это необходимо, чтобы во время компиляции truffle знал, какой конкретный контракт компилировать из файла. Другой вариант — напрямую вставить весь API в требуемый контракт, но добавление и переименование самого API, вероятно, является самым элегантным решением, которое мне известно на данный момент.

Теперь вы сможете импортировать API в другие ваши контракты в этой папке, включив import "usingOraclize.sol"их в начало, а затем указав его наследование в соответствующем контракте внутри, предполагая, что имя примера контракта, в котором вам нужен API, называется name myContract, метод наследования должен выглядеть так

contract myContract is usingOraclize {
    // your code
}

Следующий шаг — сделать так, чтобы ваша приватная цепочка testrpc могла взаимодействовать со службой Oraclize, давая ей возможность отправлять запросы и получать результаты обратно. Для этого вам понадобится ethereum-bridge . Git клонирует этот репозиторий в отдельную папку. Что будет делать мост, так это, как следует из его названия, настроить для вас мост между сервисом Oraclize и вашей цепочкой блоков во время его работы.

Как только ethereum-bridge правильно настроен, testrpc должен быть настроен на использование статического набора адресов, так как мост будет зависеть от указанного адреса для развертывания необходимых контрактов в вашей частной цепочке testrpc, поэтому, если вы хотите, чтобы эти адреса оставайтесь постоянными, между запусками testrpc вы должны запускать testrpc с некоторыми повторно используемыми адресами. Вы можете сделать это, добавив --mnemonicфлаг при его запуске и используя ту же мнемоническую фразу при перезапуске testrpc, чтобы убедиться, что он генерирует тот же OAR (OraclizeAddressResolver), который вам нужно будет использовать на следующем шаге.

Теперь нам нужно найти OAR, который генерируется мостом.

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

testrpc --mnemonic "my test example" --accounts 50

Поскольку создается 50 учетных записей, индекс последнего адреса равен 49.

  1. Запустите eth-bridge и получите OAR, сгенерированный с помощью этой цепочки testrpc. Я предполагаю, что testrpc работает на хосте RPC по умолчанию: порт localhost: 8545, в противном случае вам понадобятся дополнительные параметры. Перейдите в корневой каталог, где находится ethereum-bridge, и выполните следующую команду в терминале.

node bridge -a 49

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

Теперь подождите, пока не увидите строку:

Please add this line to your contract constructor:

OAR = OraclizeAddrResolverI(0x145437eac36aeacee0c135c9015fff316ba938ed);

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

contract myContract is usingOraclize {
    function myContract() {
        OAR = OraclizeAddrResolverI(0x145437eac36aeacee0c135c9015fff316ba938ed);
        // rest of your constructor code
    }
    // your code
}
  1. Теперь вы готовы приступить к компиляции трюфеля и проведению любых необходимых тестов, просто убедитесь, что вы всегда выполняете шаги 1 и 2 с одними и теми же параметрами, и вам не придется менять OAR из контрактов! (Не забудьте удалить переменную OAR из вашего конструктора перед производством, это только для тестирования, в производстве он будет автоматически извлекать OAR в зависимости от цепочки, в которой вы его запускаете, в настоящее время это Mainnet, Ropsten и браузерная среда виртуальной машины. поддерживаются.)
Кроме того, как только все это будет запущено и запущено; для успешного выполнения запроса без недопустимого исключения перехода (выброса) контракт, выполняющий запрос оракула, должен иметь достаточный положительный баланс эфира. Это требование даже в тестовых сетях, поскольку ethereum-bridge эмулирует его как производственную среду, поэтому ожидает, что будет достаточно эфира для адреса обратного вызова, чтобы фактически покрыть обратный вызов после поступления запроса!
Каждый раз, когда я запускаю node -a 49, я получаю другой адрес для OAR, чтобы поместить его в мой конструктор. Также как я могу тестировать запросы, которые будут выполняться в будущем
Если вы используете новейшую версию ethereum-bridge, она всегда должна быть одной и той же постоянной OAR, даже без постоянной мнемонической фразы, используемой для testrpc. Обратите внимание: если вы перезапускаете ethereum-bridge по какой-либо причине, вы должны перезапустить testrpc вместе с ним или вернуть его к чистому снимку.
ПРИМЕЧАНИЕ . Рекомендуется запускать мост с --devфлагом при использовании testrpc, что позволяет обойти myid was triggered, but it was already seen before, skipping event...ошибку, в случае воспроизведения журналов, что может произойти с экземпляром testrpc, использующим моментальные снимки и т. д.
@DenisM Мне нужно, чтобы приложение узла ethereum-bridge работало после того, как контракт OAR был развернут в моей сети?

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

Эта ошибка была побочным эффектом реверсии testrpc/ganache, и ответ здесь: ethereum.stackexchange.com/a/42868/5819