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

【以太坊開發】利用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的程式碼實現。