智能合约中生成较安全的随机数(3)

用 Oraclize 在合约中获得随机数

Oraclize 提供可证明的预言机服务。可以使用 Oraclize 提供的数据源类型(URL, WolframAlpha, random),来生成随机数。

我分别用这三种数据源类型写了三个合约,做了个简单的 Dome 调取合约。线上版本效果图如下:

Demo

环境准备

  1. Remix,或 oraclize 的 IDE。要把编译合约的版本改为 0.4.25。

  2. 把 Environment 切换到 JavaScript VM

  3. 到 Settings 把 Oraclize 的插件打开

智能合约编写

三种方法的合约内容大同小异,以下是三种方法的对比:

用外部接口

速度:时快时慢,用时 00:01-2:00

可以用 Remix 部署合约

要进行真实性验证

Oraclize 关键代码

bytes32 queryId =  oraclize_query("URL", "json(https://randomapi.com/api/?key=PZFO-VK8M-XV6H-H92P&ref=y5kkh9i8).results[0].numeric");
validIds[queryId] = true;

用 Oraclize 的 random 生成器

速度:用时 00:30-2:00

不能用 Remix 和 Oraclize 的 IDE 部署合约

要进行真实性验证

Oraclize 关键代码

uint N = 7; // number of random bytes we want the datasource to return
uint delay = 0; // number of seconds to wait before the execution takes place
uint callbackGas = 200000; // amount of gas we want Oraclize to set for the callback function
bytes32 queryId = oraclize_newRandomDSQuery(delay, N, callbackGas); // this function internally generates the correct oraclize_query and returns its queryId

用 Oraclize 的 WolframAlpha(问人工智能)

速度:用时 00:30-2:00

可以用 Remix 部署合约

Oraclize 关键代码

oraclize_query("WolframAlpha", "random number between 0 and 100");

总结

生成随机数的流程是:调用 Oraclize 的api (oraclize_queryoraclize_newRandomDSQuery)=> 转 0.04 ETH 到 Oraclize 的账户(0xcbf…)=> 等得到随机数后,Oraclize 调用 _callback,发送方是(0xdc8…),返回随机数。


参考链接

觉得文章不错就支持一下呗~

打赏二维码