Blockchain code Metaverse VR

SmartContract×VR×Crypto(613)

スポンサーリンク

//tips

//smart contract

Oracleの流れの確認。

先ではoracleのアドレスを変数化して関数にていつでも設定し直すことができるようにした。

ただ、現段階ではpublicにより関数を実行できるため実行者に制約を持たせるためにmodifierを使う。onlyOwnerが適切であろう。

Publicはかなりセキュリティホールになりやすそうなので自身のコントラクトでは入念にチェックした方が良い場所のよう。

public onlyOwner{で解決した。実行に際して通知を行わせるためにイベントの発行も組み込まれている。

pragma solidity 0.5.0;
import "./EthPriceOracleInterface.sol";
import "openzeppelin-solidity/contracts/ownership/Ownable.sol";

contract CallerContract is Ownable {
EthPriceOracleInterface private oracleInstance;
address private oracleAddress;
event newOracleAddressEvent(address oracleAddress);

function setOracleInstanceAddress (address _oracleInstanceAddress) public onlyOwner{
oracleAddress = _oracleInstanceAddress;
oracleInstance = EthPriceOracleInterface(oracleAddress);

emit newOracleAddressEvent(oracleAddress);
}
}

これでスマートコントラクトからoracleのコントラクトを呼ぶことができるようになったので、ethの価格の取得に移る。

getLatestEthPriceで最新のethの価格を取得したい。ただ、現実にはそちらの対応は難しいため、ethの価格の代わりにリクエストに対するunique idを返す。

その後にoracleがBinance API などから価格を取得し、スマートコントラクトに取得価格を返すことになる。

つまり、依頼から情報取得までに時差が発生する。 非同期対応であり、いつ情報が得られるかがわからないので、requestのステータスを追跡できるようにしておく必要がある。

このステータスの追跡はmappingで行う。

mapping(uint256=>bool) myRequests;

これを反映してboolで状態管理する関数を組み込んだのが下記。

contract CallerContract is Ownable {
EthPriceOracleInterface private oracleInstance;
address private oracleAddress;
mapping(uint256=>bool) myRequests;
event newOracleAddressEvent(address oracleAddress);
event ReceivedNewRequestIdEvent(uint256 id);

function setOracleInstanceAddress (address _oracleInstanceAddress) public onlyOwner {
oracleAddress = _oracleInstanceAddress;
oracleInstance = EthPriceOracleInterface(oracleAddress);
emit newOracleAddressEvent(oracleAddress);
}

function updateEthPrice() public {
uint256 id = oracleInstance.getLatestEthPrice();
myRequests[id] = true;

emit ReceivedNewRequestIdEvent(id);

}

ここまでの理解はそこまで難しくない。

updateEthPrice()を実行した後にその応答を受け取るのはcallback関数となる。最新のeth情報であることがtrueで確認されたら、callbackで受け取った値をethPriceとして格納し、リクエストと状態をdelete処理する。

ontract CallerContract is Ownable {

uint256 private ethPrice;
EthPriceOracleInterface private oracleInstance;
address private oracleAddress;
mapping(uint256=>bool) myRequests;

event newOracleAddressEvent(address oracleAddress);
event ReceivedNewRequestIdEvent(uint256 id);
event PriceUpdatedEvent(uint256 ethPrice, uint256 id);

function setOracleInstanceAddress (address _oracleInstanceAddress) public onlyOwner {
oracleAddress = _oracleInstanceAddress;
oracleInstance = EthPriceOracleInterface(oracleAddress);
emit newOracleAddressEvent(oracleAddress);
}
function updateEthPrice() public {
uint256 id = oracleInstance.getLatestEthPrice();
myRequests[id] = true;
emit ReceivedNewRequestIdEvent(id);
}
function callback(uint256 _ethPrice, uint256 _id) public onlyOracle {
require(myRequests[_id], "This request is not in my pending list.");
ethPrice = _ethPrice;
delete myRequests[_id];
emit PriceUpdatedEvent(_ethPrice, _id);
}

 

 

 

人気の記事

1

皆さん、ついに、エアラインでも、サブスクリプションが始まったのはご存じですか? まだ実験段階ですが、ANAが、定額全国住み放題サービスを提供する「ADDress」と組んで、国内線を4回まで定額利用可能 ...

2

無料でネットショップを開けるアプリとして多くの人に驚きを与えたBASE株式会社が、2019年10月25日東証マザーズに上場しました。2020年2月時点で90万店を超えるショップを抱えるまでに成長してい ...

3

2011年にサービスを開始してから圧倒的な成長率を誇るインテリア通販サイト 【FLYMEe/フライミー】を皆さんご存じでしょうか。 「自分のイメージするインテリア、本当に欲しいインテリアがどこにあるの ...

4

ついに、noteの月間アクティブユーザー数が4400万人(2020年3月時点)に到達しました。 そもそも、「note」とは、クリエイターが、文章やマンガ、写真、音声を投稿することができ、ユーザーはその ...

5

ボードゲームカフェが1日2回転で儲かるという記事をみつけたので興味を持ち、調べてみました。 まずは、需要がどれくらいあるのか、市場のようすからみていきましょう。 世界最大のボードゲーム市場はドイツで、 ...

-Blockchain, code, Metaverse, VR
-, ,

Copyright© BUSINESS HUNTER , 2023 All Rights Reserved Powered by AFFINGER5.