Получение курсов фиатных валют из внешних источников (оракул)

Тема в разделе "Solidity", создана пользователем admin, 26 окт 2017.

  1. admin

    admin Administrator Команда форума

    Добрый день, господа разработчики


    В настоящее время мы делаем оракула, который позволит вашим смарт-контрактам получать курсы криптовалют к фиатным валютам в рамках одной транзакции. Например, курс ETH/USD или BTC/RUB и т.д.

    Для чего это нужно?
    Например, для проведения ICO где стоимость токена привязана к фиату

    Мы бы хотели предложить вам потестировать данный сервис

    Мы создали смарт-контракт в тестовой сети rinkeby, который возвращает курс ETH/USD.
    Курс обновляется приблизительно 1 раз в 3-7 минут на основании API Etherscan

    Ниже расположен пример смарт-контракта, обращающийся к нашему сервису:

    Код:
    pragma solidity ^0.4.13;
    
    contract AbstractDRate {
     
        function getUSDRate() payable returns(uint);
    }
    
    contract Test2DRate {
        uint public USDRate;
     
     
      function test() payable returns(uint) {
        address  addressOfDRate = 0x0F196688e8289ceB6f3cF0A3F3e67f1e2B0F5E55;
      
        USDRate = 0;
     
        AbstractDRate my_DRate;
        my_DRate = AbstractDRate(addressOfDRate);
        USDRate = my_DRate.getUSDRate.value(msg.value)(); // 0.01 ETH minimum
      }
    }
    

    В ваш смарт-контракт вам необходимо добавить абстрактный класс контракта:

    Код:
    contract AbstractDRate {
    
        function getUSDRate() payable returns(uint);
    }
    
    Далее в коде вашего контракта вы создаете объект:

    Код:
    AbstractDRate my_DRate;
    my_DRate = AbstractDRate(addressOfDRate);
    
    где addressOfDRate это адрес нашего контракта в тестовой сети rinkeby (0x0F196688e8289ceB6f3cF0A3F3e67f1e2B0F5E55)

    Далее вы можете обращаться к методу getUSDRate, который будет возвращать вам курс ETH/USD в центах
    Вызов данного метода метода требует оплаты 0.01 ETH (тестовый эфир в rinkeby)

    То есть вся строка вызова выглядит следующим образом:

    Код:
    my_DRate.getUSDRate.value(msg.value)();
    
    где msg.value это сумма в ETH, которая будет отправлена. Её вам надо передать при вызове функции test данного смарт-контракта


    Хотелось бы услышать ваши комментарии и замечания, а также интересен ли вам подобный сервис в основной сети Ethereum?
     
    Последнее редактирование: 3 ноя 2017