【以太坊开发】利用Oraclize开发一个投注合约(一):原理介绍

智能合约的作用很多,但是很多数据还是要基于互联网,那么如何在合约中获取互联网中的数据?Oraclize就是为了这个目的而诞生的。

本篇介绍如何利用Oraclize开发一个投注智能合约,开始coding之前,这一节讲述一下理论。

工作原理:

智能合约通过对Oraclize发布一个合约之间的调用请求来获取数据,指定数据源和参数。Oraclize根据收到的请求获取数据,利用callBack函数返回结果。

Oraclize的数据源列表如下:

URL:互联网中的连接。

WolframAlpha:WolframAlpha是开发计算数学应用软件的沃尔夫勒姆研究公司开发出的新一代的搜索引擎,能根据问题直接给出答案的网站,于 2009年5月15日晚7点(美国中部当地时间,北京时间5月16日上午8点)提前上线,用户在搜索框键入需要查询的问题后,该搜索引擎将直接向用户返回答案,而不是返回一大堆链接。

·blockchain:其他区块链的数据

·IPFS:文件传输系统中的数据

·nested:nested数据源是一个元数据源,它不提供访问其他服务的权限。它用来提供简单相加逻辑,允许单个查询在任何可用数据源的基础上进行子查询,并产生一个单独字符串作为结果。

·computation:它允许抓取应用的链下执行结果。在退出前,该应用必须在最后一行打印查询结果(在标准输出栏)

真实性:

Oraclize提供了的TLSNotary  Proof来证明返回的结果是没有经过任何人修改的。TLS是一个网络传输协议,利用可信机构颁发的CA来保证传输正确。TLSNotary是TLS的改进,能够证明Oraclize提供给合约的数据就是某个特点时间点的正确数据。

服务费:

合约第一次对Oraclize的调用都是免费的。

第二个调用开始需要支付以太币,合约之间的支付,具体多少取决于调用的数据源和证明类型。

API简介:

1.证明API

需要Proof证明数据正确性:

oraclize_setProof(proofType_TLSNotary|proofStorage_IPFS)

第一个参数是证明类型,第二个是proof存储的位置,现在唯一的是存储在IPFS上。

不需要Proof证明:

oraclize_setProof(proofType_NONE)

2.查询API:oraclize_query

oraclize_query函数至少需要两个实参:数据源,输入值(查询条件)

类似这样:

oraclize_query("URL","http:XX//id=XX");

如果第一个参数是字符串,那么就认定是数据源。第二个参数就是查询条件。

如果有三个参数,则是一个POST请求,那么第三个参数就是POST请求的参数。

oraclize还可以做预约查询:

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

上述代码的参数是60,是一个整数,那么接口默认是一个预约查询的请求,预定60s以后执行查询。上面的目的是调用WolframAlpha数据源查询0到100的随机数,这也是很多时间solidity随机数不安全的解决方案之一。

3.自定义gas

调用oraclize的时候需要支付一定的费用,这个费用除了oraclize自己收取之外还用于回调的时候支付的gas。默认是200000gas。用户可以指定callback函数的gasLimit,但是如果用户发送给oraclize的gas过高,那么超过gasLimit的部分将会返回给oraclize。如果gas过低,可能永远不会收到回调。

oraclize_query("WolfameAlpha","random betwwen 0 and 100",500000);

第三个参数如果是整数就表示gas费用,这个值不能小于默认的200000.

4.回调

oraclize获取数据以后会调用合约地址的下面三个方法中的一个:

1._callback(bytes32 myid,string result)“.”Myid都是一个独特的ID。这个ID由oraclize_query方法返回。如果合约里有多个oraclize_query调用,则将这用于匹配该结果的查询。

2.如果需要TLSNortary的proof,则结果为_callback(bytes32 myid,string result,bytes proof)

3.没有其他方法  调用 匿名函数 function()

5.解析助手

oraclize还提供了一些利于解析页面的工具,类似于一些爬虫库封装的解析html页面的简单方法。

6.获取查询价格

如果在实际查询之前想知道查询需要多少费用,可以使用Oraclize.getPrice()函数获取所需的wei的数量。第一个实参是数据源,第二个实参是可选项,即自定义gas。一个常见的使用示例是,当以太币余额不足以进行查询时,通知客户端向合约添加以太币

加密查询

为了满足一些场景:比如用户不想暴露自己的查询地址,参数等信息。Oraclize提供了一个加密查询的方法。用python写的:https://github.com/Oraclize/encrypted-queries。只有客户端能解密。

这就是oraclize理论的介绍,下一章介绍投注APP的代码实现。

原文地址:https://www.cnblogs.com/gzhlt/p/10052362.html

时间: 2024-07-28 19:20:34

【以太坊开发】利用Oraclize开发一个投注合约(一):原理介绍的相关文章

深入了解以太坊虚拟机第5部分——一个新合约被创建后会发生什么

在该系列文章的前部分,我们学了EVM汇编基础,也学了ABI编码是如何允许外部程序与合约进行通信的.在本文中,我们将会学习一个合约是如何从零创建的. 本系列的相关文章(按照顺序): EVM汇编代码的介绍(第1部分) 固定长度数据类型的表示方法(第2部分) 动态数据类型的表示方法(第3部分) ABI编码外部方法调用的方式(第4部分) 我们目前所见的EVM字节码都是比较清晰明朗的,就是EVM从上往下的执行指令,没有什么隐藏的魔法.合约创建的过程更有意思一些,它将数据和代码之间的界限模糊化. 在学习合约

虚拟币钱包以太坊代币技术开发

虚拟币钱包以太坊代币技术开发156-3841-3841 然而自2018年以来,比特币价格开始下跌,特别是在近期上演"大跳水".11月20日,比特币重挫逾16%,跌破4100美元,为去年10月以来的最低水平.比特币的暴跌,也引发其他加密货币大幅下挫.CoinMarketCap数据显示,目前整个加密货币市场价值已跌至约1500亿美元左右,与今年初时的8500亿美元规模相比严重缩水.市场的大幅波动,引发人们对"加密货币能否成为可靠保值手段"的质疑. 有业内人士认为,此次比

以太坊编程涉及那些开发语言?

智能合约编程语言 Solidity Solidity是第一批的描述智能合约的语言.当前是最流行的语言,因此也有最多的例子,文档,和教程.你应该学习这个,除非你有要学习其它的理由. 你可以使用基于浏览器的Remix IDE来进行快速验证. 下面是一个Solidity的合约: pragma solidity ^0.4.11; contract BasicToken { mapping(address => uint256) balances; function transfer(address _t

win7下以太坊基于truffle+ganache开发环境搭建以及智能合约的部署调用

上一篇介绍的是以太坊下基于geth+remix-ide智能合约环境的搭建和部署运行,本篇介绍的是基于truffle+ganache. ganache相当于是geth的图形化操作界面,相对于纯指令操作的geth较为简单易上手,并且运行交易和生成区块的过程一目了然. [前期准备] 1.Node.js安装(这一点在上一篇文章中提到过,所以此处不做展示) 2.指令输入: npm install -g solc(安装智能合约) npm install -g ganache-cli (安装ganache开发

以太坊去中心化淘宝智能合约案例

篇文章我们来介绍一个简易的区块链电商系统的核心功能,10多年来,我们习惯了淘宝的电商模式,淘宝为电商在中国普及做出了突出贡献,值得肯定,也完成了历史使命. 淘宝模式的核心是什么? 免费是一方面,我认为最核心的是解决了网上交易买卖家的信任问题,通过支付宝作为资金中介,使买卖家可以放心的交易. 但是,淘宝迅速崛起为巨头后,交易环节出现了很多不好的现象:刷信誉.巨大经济利益带来的内部腐败等等.因此,淘宝虽然成为了电商巨头,但是却没有真正的解决电商产业的信誉问题.这个问题其实不是淘宝特有,是一种社会现象

以太坊智能合约项目-Token合约开发与部署

修订日期 姓名 邮箱 2019-09-05 brucefeng [email protected] 一. 钱包环境安装 以太坊钱包顾名思义,就是管理以太坊地址,存储以太坊Token的工具,再简单点说,任何区块链网络都需要我们有自己的账户,管理账户的软件可称之为钱包,无论是炒币的还是研究以太坊开发的,钱包都是必不可少的. 1.钱包分类 1.1 Mist 说到以太坊钱包,第一个要说的当然就是Ethereum官方钱包+浏览器 Mist.Mist是一个全节点钱包(全节点钱包通俗的来说就是同步了全部的以太

以太坊是什么 - 以太坊开发入门指南

很多同学已经跃跃欲试投入到区块链开发队伍当中来,可是又感觉无从下手,本文将基于以太坊平台,以通俗的方式介绍以太坊开发中涉及的各晦涩的概念,轻松带大家入门. 以太坊是什么 以太坊(Ethereum)是一个建立在区块链技术之上, 去中心化应用平台.它允许任何人在平台中建立和使用通过区块链技术运行的去中心化应用. 对这句话不理解的同学,姑且可以理解为以太坊是区块链里的Android,它是一个开发平台,让我们就可以像基于Android Framework一样基于区块链技术写应用. 在没有以太坊之前,写区

solidity开发以太坊代币智能合约

智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发主要包括两大部分: 智能合约的开发 用户界面的开发 在本文中,我们将介绍智能合约的开发语言solidity. 让我们先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. contract SimpleStorage { uint storedData; functi

web3j开发以太坊智能合约快速入门(特别适合java和android开发者)

web3j简介 web3j是一个轻量级.高度模块化.响应式.类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成. 可以通过它进行以太坊区块链的开发,而无需为你的应用平台编写集成代码. 可以快速启动dmeo示例 想要快速启动的话,有一个Web3j demo示例项目可用,演示了通过Web3j开发以太坊的许多核心特征,其中包括: 连接到以太网网络上的节点 加载一个以太坊钱包文件 将以太币从一个地址发送到另一个地址 向网络部署智能合约 从