Oracle 预言机
区块链外信息写入区块链内的机制,一般被称为预言机(oracle mechanism)。
借助预言机外界的数据得以灌入链内, 使得DApp的玩法更多样. 比如DApp倚重的随机数, 可以考虑让一个硬件产生真随机数, 通过Oracle,定时灌入, 这将更公正和安全
1 为什么需要预言机
- 所有节点同一个事务中智能合约运行的结果必须一致
- 智能合约不应该发起网络调用
- 由于区块链的共识模式,智能合约只可以从内部调取数据,而不能直接从区块链外部(链下)获取信息。
2 应用场景
- 游戏/预测:获取链上安全的随机数,实现更公平的游戏,抽奖场景。
- 物联网:对于IOT应用,将传感器信息上链,智能合约验证并触发下一步的行为。
- 供应链金融:获取链下订单和汇率信息等。
3 按去中心化程度分
3.1 中心化预言机
靠部署机构本身来背书,比如BSN部的,都是可信的
- Oraclize:为以太坊提供中心化预言机服务
- Ontology oracle:本体链上的中心化预言机服务
3.2 去中心化预言机
区块链预言机是一个附加的基础设施,它可以帮助区块链和外部世界进行交互。但是,为了让智能合约保持去中心化,预言机也需要保持去中心化来避免任何单点故障,尤其因为预言机的输入控制着智能合约的输出。
- ChainLink:以太坊上第一个去中心化预言机解决方案
- 欧链 OracleChain:EOS 上的第一个去中心化预言机解决方案
- DOS Network:支持多条主流公链的去中心化预言机服务网络
4 按链分
4.1 公链预言机
4.1.1 ChainLink (ETH)
github
Chainlink 是区块链领域运用最广泛的预言机解决方案。Chainlink 是一个去中心化的预言机网络,为区块链智能合约解决互操性问题,并将其安全连接至链下数据源、Web API 和传统银行支付系统。
通过事务事件来广播对外部数据的需求,然后,侦听此类事件的外部方会收到请求通知,并获取所请求的数据,最后通过以下方式将其发送到链中:通过交易调用智能合约。
4.1.2 OracleChain (EOS)
4.2 联盟链预言机
4.2.1 Truora (Fisco / BSN)
- 指定要获取数据的URL(权威的,支持Https的)
- 云数据库
- IPFS
- 引入的可信数据源
- 多数据源
- 数据聚合
- 链上聚合:通过智能合约对多数据源进行 求和,求平均,求中位数等
- 链下聚合:多个数据源的预言机对数据进行门限签名(BLS),减少相同的数据重复上链
- 数据聚合
- 回写到链上
- 硬件:TEE(可信执行环境)
- 软件:TLS技术
4.2.2 ChainLink (Kaleido)
4.2.3 蚂蚁BAAS的外部预言机
https://cloud.tencent.com/developer/article/1415307
外部数据源服务会在智能合约平台部署一个外部数据源服务合约,用户合约通过调用该服务合约发送外部数据源请求,链下的 TEE 外部数据源服务对接该服务合约,监听用户的请求,然后去对应的外部数据源取数据,最后将结果返回给用户合约。
5 关键技术探讨
5.1 基干TLS自证清白
-
预言机得将与目标URL建立TLS过程中的握手连接细节上链,链上验证确实是从目标URL获取数据的
-
TLS改造,向应用层暴露TLS握手连接的细节
需要证明确实是到目标URL获取的数据,request与response都需要证明
5.2 TSL介绍
5.3 TLS证明技术
TLS-Notary
https://tlsnotary.org/index.html
主要基于安全传输层协议TLS 1.1,TLS用于在两个通信应用程序之间提供保密性和数据完整性,最大优势就在于独立于应用协议,更高层协议可以透明地分布在 TLS 协议上面
- 三方握手 - 涉及三方密钥交换
- 在整个传输中,TLS的master key可以分成三个部分:服务器方、受审核方和审核方;在整个流程中,互联网数据源作为服务器方,预言机(oracle)作为受审核方,一个专门设计的,部署在云上的开源实例作为审核方,每个人都可以通过这个审计方服务对预言机(oracle)过去提供的数据进行审查和检验,以保证数据的完整性和安全性。
- TLS中客户端的会议密钥由受审核方和审核方共同产生
- 需要审核方的参与,受审核方才能恢复出服务器方的response信息
弊端:
TLS-N
类似 默克尔树
DECO
用到三方DH握手, 两方安全计算,零知识证明
6 使用预言机的流程
预言机的工作流程,即用户的智能合约把请求给链上 Oracle 合约,通过链下的 API 接口获得外部数据,更确切的说是外部把数据给链上的 Oracle 合约,然后 Oracle 合约再把数据给用户的智能合约。
-
用户方
- ConsumerOracle是用户的合约,继承具有Oracle功能的FiscoOracleClient合约父类即可,实现接口
- 用户向ConsumerOracle合约传入URL
-
服务方
- 部署一个OracleCore合约
- 部署一个后台服务OracleService(Java)
- 监听链上OracleCore事件
- 解析参数
- 调用URL从互联网获取数据
- 回写到OracleCore
- OracleCore再回写到用户合约(通过父类的抽你接口回调子类)
本质就是:事件监听和合约回调
-
往期精彩回顾:
- 区块链知识系列
- 密码学系列
- 零知识证明系列
- 共识系列
- 公链调研系列
- BTC系列
- 以太坊系列
- EOS系列
- Filecoin系列
- 联盟链系列
- Fabric系列
- 智能合约系列
- Token系列