智能合约中生成较安全的随机数(3)
用 Oraclize 在合约中获得随机数
Oraclize 提供可证明的预言机服务。可以使用 Oraclize 提供的数据源类型(URL, WolframAlpha, random),来生成随机数。
我分别用这三种数据源类型写了三个合约,做了个简单的 Dome 调取合约。线上版本效果图如下:
环境准备
-
用 Remix,或 oraclize 的 IDE。要把编译合约的版本改为 0.4.25。
-
把 Environment 切换到 JavaScript VM
-
到 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_query
,oraclize_newRandomDSQuery
)=> 转 0.04 ETH 到 Oraclize 的账户(0xcbf…)=> 等得到随机数后,Oraclize 调用 _callback
,发送方是(0xdc8…),返回随机数。
参考链接
觉得文章不错就支持一下呗~