Насколько я понял, в блокчейне «нельзя» взаимодействовать с веб-сервисами вне блокчейна. Это должно быть сделано с помощью оракулов, чтобы убедиться, что запрос безопасен, а изменение состояния может быть выполнено в блокчейне. Пожалуйста, поправьте меня, если я ошибаюсь.
В настоящее время я работаю с Testrpc, Truffle и React, чтобы протестировать свой смарт-контракт. Теперь я хочу интегрировать oraclize.it в свою среду. Как лучше всего это сделать?
Я попытался скопировать testexamples в папку с контрактом, но в контракте есть эта ссылка:
import "github.com/oraclize/ethereum-api/oraclizeAPI.sol";
Как я могу интегрировать эту ссылку в свою структуру папок?
Я попытался скопировать следующие файлы в папку с контрактом:
https://github.com/oraclize/ethereum-api/
Но у меня есть пара ошибок.
Как лучше всего реализовать Oraclize с помощью Truffle и Testrpc/Ganache?
Вполне возможно использовать сервис 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, который генерируется мостом.
testrpc --mnemonic "my test example" --accounts 50
Поскольку создается 50 учетных записей, индекс последнего адреса равен 49.
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
}
Эти инструкции работают (сценарий моста работает нормально), но когда я действительно звоню, я получаю сообщение об ошибке «ключ не найден в базе данных».
ДенисМ
Дэниел Кобе
node -a 49
, я получаю другой адрес для OAR, чтобы поместить его в мой конструктор. Также как я могу тестировать запросы, которые будут выполняться в будущемДенисМ
ДенисМ
--dev
флагом при использовании testrpc, что позволяет обойтиmyid was triggered, but it was already seen before, skipping event...
ошибку, в случае воспроизведения журналов, что может произойти с экземпляром testrpc, использующим моментальные снимки и т. д.амиткумар