预言机智能合约与预言机服务的交互

Posted

技术标签:

【中文标题】预言机智能合约与预言机服务的交互【英文标题】:interaction between the oracle smart contract and the oracle service 【发布时间】:2021-04-07 10:21:07 【问题描述】:

我想用这段代码恢复温度并将结果返回给智能合约

contract CMCOracle 
    // Contract owner   address public owner;
    // BTC Marketcap Storage   uint public btcMarketCap;
    // Callback function   event CallbackGetBTCCap();

    function CMCOracle() public 
        owner = msg.sender;
    

    function updateWe() public 
        // Calls the callback function
        CallbackGetBTCCap();
    

    function setBTCCap(uint cap) public 
        // If it isn't sent by a trusted oracle
        // a.k.a ourselves, ignore it
        require(msg.sender == owner);
        btcMarketCap = cap;
    

    function getBTCCap() constant public returns (uint) 
        return btcMarketCap;
    

var fetch = require('fetch')
var OracleContract = require('./build/contracts/CMCOracle.json')
var contract = require('truffle-contract')

var Web3 = require('web3');
var web3 = new Web3(new Web3.providers.HttpProvider('https://localhost:8545'));

// Truffle abstraction to interact with our
// deployed contract
var oracleContract = contract(OracleContract);
oracleContract.setProvider(web3.currentProvider);

// Dirty hack for web3@1.0.0 support for localhost testrpc
// see https://github.com/trufflesuite/truffle-contract/issues/56#issuecomment-331084530
if (typeof oracleContract.currentProvider.sendAsync !== "function") 
    oracleContract.currentProvider.sendAsync = function() 
        return oracleContract.currentProvider.send.apply(
            oracleContract.currentProvider, arguments
        );
    ;
 

// Get accounts from web3 web3.eth.getAccounts((err, accounts) => 
oracleContract.deployed().then((oracleInstance) => 
    // Watch event and respond to event
    // With a callback function
    oracleInstance.CallbackGetBTCCap()
    .watch((err, event) => 
        // Fetch data
        // and update it into the contract
        fetch.fetchUrl('https://api.coinmarketcap.com/v1/global/',(err, m, b)=> 
            const cmcJson = JSON.parse(b.toString());
            const btcMarketCap = parseInt(cmcJson.total_market_cap_usd);

            // Send data back contract on-chain
            oracleInstance.setBTCCap(btcMarketCap, from: accounts[0]);
        )
    )
).catch((err) =>  console.log(err) );

但我不明白如何更改代码。

智能合约如何将我想知道温度的城市传递给预言机服务? oracle 服务使用什么 API 从外部来源获取温度? 我应该如何更改此代码?

来源:https://kndrck.co/posts/ethereum_oracles_a_simple_guide/

【问题讨论】:

【参考方案1】:
    智能合约不与 API 交互,而是与 Oracle 本身交互。通常,它应该是两个不同的合约,就像其中一个合约应该与外部世界分开。 Oracle 合约是区块链的 API,它基本上驻留在区块链中。您可以通过合约包装库(web3j、ethereumj)访问合约 合约包装器将从 API 获取数据作为 JSON。然后应用程序会将数据转换为已在 Solidity 语言中定义的原始数据。一旦完成,只要应用程序从 API 获取数据,数据就会通过发射事件函数连续发送到区块链。最后,您将拥有一个确定性的数据库源,以便您可以复制此源并按原样转移到另一个地方。 例如,您可以将名为 "https://api.coinmarketcap.com/v1/global/" 的 API 端点更改为 "api.openweathermap.org/data/2.5/weather" 和数据结构(链接:https://openweathermap.org/current)。

【讨论】:

以上是关于预言机智能合约与预言机服务的交互的主要内容,如果未能解决你的问题,请参考以下文章

关于oracle预言机

项目评级 | OracleChian欧链为智能合约提供数据服务

基于 sCrypt 智能合约的预言机作弊惩罚

区块链 | 预言机从零开始使用Chainlink预言机- 智能合约中使用更安全的随机数-代码实战

ADAMoracle预言机连接链下数据实现智能合约数据接收

从 sCrypt 智能合约中访问区块链数据(无需预言机)