

# 一、需求描述  

## 1.需求背景：
　　为保证数据的公平公正性，在区块链上提供权威数据发布合约。满足以下需求：

    合约提供录入和查询接口。
    合约录入时对数据的key和value定义好标准的格式。
    合约是否要满足一定的经济模型，惩罚机制（一期可以不实现，后面再加入）

## 2.实现点：
    发布者的地址需要通过superManager添加，调用我们系统manage合约。
    数据发布的key要遵循一定的格式，比如游戏类的格式要满足一定的前缀（发布者地址+ 运营特征值+游戏类别 等）
    数据发布的时候要能输入数据来源描述（比如：数据来源于新浪体育）
    数据发布的value要根据现有的业务做一定的抽象，这块一期可以先考虑下，不用实现的很完备。 一期可以用json格式，数据提供方和开发方可以事先先约定好。
    合约对外提供查询接口供具体的应用合约调用， 具体的应用合约只查询满足条件的key，获取数据做相应的运算。
    数据的发布需要先预发布，再审核后切换成正式发布。（类似于token的预创建和完成这两步）


# 二、流程及状态机示意

## 1.流程时序图  
![Oracle流程时序图](./resource/oracle/Oracle-Seq.jpg)  

## 2.状态机图  

![Oracle状态机图](./resource/oracle/Oracle-State.jpg)  

## 3.说明　　

1.合约提供基础的数据受限发布上链的能力，通过授权特定地址，保证数据正确可靠。（运营方为自身业务持续发展考虑，会保证数据正确，并为数据失误负责）  
2.事件发布和结果发布分为两个过程，这样可以方便运营方从事件发布中获取竞猜或者菠菜的事件源，在结果出现时，提供正确结果，供菠菜合约自动开奖。  
3.事件多来自现实世界，结果可验证，如果出现结果错误，运营方需要承担责任。  
4.考虑现实世界，有些事件会因为不可抗力（自然灾害、战争等），导致事件最终未发生，没有结果，则Oracle合约提供撤销事件的接口。  
5.对于结果预发布到链上供检验，如果有问题，会有人提出来，管理员或者特定权限的地址可以撤销预发布结果。  
6.对于预发布结果确认正确无误，可由管理员或者特定权限的地址正式发布。正式发布后的结果不能修改。  
7.数据结果发布中，json格式中可以通过字段标记数据来源等必要信息。  
8.第一期合约存储数据主要是json格式，json格式的具体字段可以根据具体的事件类型来进行设计，以满足不同的菠菜、竞猜合约的需要。  
9.最终发布的结果一般来自于预发布结果，超级管理员也可以直接发布结果。  
10.该预言机合约也可以针对比特币区块链的未来区块Hash进行定期发布，比如发布一个event，是发布１０分钟以后的产生的高度为５５３３５０的区块Ｈａｓｈ，那么该区块生成后，其ｈａｓｈ可发布在Chain33上，一些博彩合约的随机数可以使用该值，且这个值不可预测，可以验证，客观公证。但由于其实时性，只可用于实时性不高的一些博彩游戏使用。该时间发布可以和比特币网络互通，做成定时发布未来区块Hash，作为一个外部引入的随机源，满足一部分业务的需要。  

