首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >oracle智能契约与oracle服务之间的交互

oracle智能契约与oracle服务之间的交互
EN

Stack Overflow用户
提问于 2020-12-30 23:52:05
回答 1查看 61关注 0票数 1

我希望使用此代码恢复温度,并将结果返回到智能协议。

代码语言:javascript
复制
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;
    }
}
代码语言:javascript
复制
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/

EN

回答 1

Stack Overflow用户

发布于 2021-02-09 16:05:37

  1. 智能契约不与
  2. 交互,而是与Oracle本身交互。通常情况下,应该是两个不同的合同,就像其中一个合同应该与外部世界分开一样。Oracle合同是区块链的API,它基本上驻留在区块链中。您可以通过契约包装库(web3j,ethereumj)
  3. 来接触契约,契约包装器将以JSON的形式从API中获取数据。然后,应用程序将将数据转换为使用Solidity定义的原始数据。一旦完成,只要应用程序从API中获取数据,数据就会通过发射事件函数连续地发送到区块链。最后,您将拥有一个确定性的数据库源,以便您可以复制这个数据源并按原样传输另一个位置。例如,https://openweathermap.org/current).

  • 可以用"api.openweathermap.org/data/2.5/weather"和数据结构更改API端点"https://api.coinmarketcap.com/v1/global/" (链接:"https://api.coinmarketcap.com/v1/global/")。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65514992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档