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

oracle智能合约与oracle服务之间的交互,oracle,events,blockchain,smartcontracts,web3js,Oracle,Events,Blockchain,Smartcontracts,Web3js,我想使用此代码恢复温度并将结果返回到智能合约 contract CMCOracle { // Contract owner address public owner; // BTC Marketcap Storage uint public btcMarketCap; // Callback function event CallbackGetBTCCap(); function CMCOracle() public { owner

我想使用此代码恢复温度并将结果返回到智能合约

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合同=要求(‘块菌合同’)
var Web3=需要('Web3');
var web3=new web3(new web3.providers.HttpProvider('https://localhost:8545'));
//块菌抽象与我们的
//部署合同
var oracleContract=合同(oracleContract);
oracleContract.setProvider(web3.currentProvider);
//肮脏的黑客web3@1.0.0对localhost testrpc的支持
//看https://github.com/trufflesuite/truffle-contract/issues/56#issuecomment-331084530
if(oracleContract.currentProvider.sendAsync的类型!=“函数”){
oracleContract.currentProvider.sendAsync=函数(){
返回oracleContract.currentProvider.send.apply(
oracleContract.currentProvider,参数
);
};
}
//从web3 web3.eth.getAccounts获取帐户((错误,帐户)=>{
oracleContract.deployed()。然后((oracleInstance)=>{
//观察事件并对事件作出反应
//使用回调函数
oracleInstance.CallbackGetBTCCap()的
.watch((错误,事件)=>{
//获取数据
//并将其更新到合同中
fetch.fetchUrl('https://api.coinmarketcap.com/v1/global/“,(呃,m,b)=>{
const cmcJson=JSON.parse(b.toString());
const btcMarketCap=parseInt(cmcJson.总市值/市值/美元);
//将数据发送回链上的合同
setbtcap(btcMarketCap,{from:accounts[0]});
})
})
}).catch((err)=>{console.log(err)});
但我不明白如何更改代码

  • 智能合约如何将一个我想知道其温度的城市传递给oracle服务
  • oracle服务使用什么API从外部源获取温度
  • 我应该如何更改此代码
资料来源:

  • 智能合约不会与API交互,而是与Oracle本身交互。通常,它应该是两个不同的合约,就像其中一个合约应该与外部世界分离一样。Oracle合约是区块链的API,它基本上位于区块链中。您可以通过合约包装的方式接触到该合约每个库(web3j、ethereumj)
  • 合约包装器将以JSON的形式从API中获取数据。然后应用程序将数据转换为Solidity语言中定义的原始数据。完成后,只要应用程序从API获取数据,数据将通过发射事件函数持续发送到区块链。最后,您将获得一个d永久的数据库源,以便您可以复制此源并按原样转移到另一个位置
  • 例如,您可以更改名为
    的API端点https://api.coinmarketcap.com/v1/global/“
    ”api.openweathermap.org/data/2.5/weather“
    和数据结构(链接:)
  • 智能合约不会与API交互,而是与Oracle本身交互。通常,它应该是两个不同的合约,就像其中一个合约应该与外部世界分离一样。Oracle合约是区块链的API,它基本上位于区块链中。您可以通过合约包装的方式接触到该合约每个库(web3j、ethereumj)
  • 合约包装器将以JSON的形式从API中获取数据。然后应用程序将数据转换为Solidity语言中定义的原始数据。完成后,只要应用程序从API获取数据,数据将通过发射事件函数持续发送到区块链。最后,您将获得一个d永久的数据库源,以便您可以复制此源并按原样转移到另一个位置
  • 例如,您可以更改名为
    的API端点https://api.coinmarketcap.com/v1/global/“
    ”api.openweathermap.org/data/2.5/weather“
    和数据结构(链接:)