以太坊不存在"不确定"因数。从协议上说,所有的状态变动都是通过确定的算法(即所谓"状态转换函数")计算出来的。比如:各种哈希值。区块的难度值,甚至是工作量证明算法Eehhash的出的nonce和时间戳。
以太坊产生随机数的方式,主要借助“预言机(Oracle)”服务来达成。
-
链外服务在链上会有一个用于注册服务请求的智能合约,我们称之为智能合约S;
-
当某个智能合约A希望获取随机数,它可以向智能合约S的特定函数F发起一个消息调用,F的参数会规定一些必要的输入,比如请求服务的类型,要求的返回格式或者数据范围、条件等;
-
智能合约S的特定函数F会产生一个特定的事件(Event),其中将注册者的服务请求参数通过日志数据输出,提供这种链外服务的程序会监视(watch)这个事件,从事件参数中获得具体的请求数据;
-
链外服务程序根据请求数据的要求生成或者获取必要的返回结果,然后将返回结果作为参数来调用智能合约S的请求结果处理函数R;
-
函数R会调用智能合约A的特定函数B,将某个请求的结果数据返回给智能合约A;