1. 程式人生 > >【以太坊開發】利用Oraclize開發一個投註合約(一):原理介紹

【以太坊開發】利用Oraclize開發一個投註合約(一):原理介紹

tween 協議 簡單方法 type callback 使用 抓取 獲取 num

智能合約的作用很多,但是很多數據還是要基於互聯網,那麽如何在合約中獲取互聯網中的數據?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的代碼實現。

【以太坊開發】利用Oraclize開發一個投註合約(一):原理介紹