以太坊Oracle系列一: Human Oracle
智能合約如何取得外界資料。
智能合約是在EVM (Ethereum Virtual Machine)中執(zhí)行的,它是個(gè)封閉的環(huán)境,所有執(zhí)行過(guò)程都離不開(kāi)EVM,換句話說(shuō),合約沒(méi)辦法由EVM內(nèi)部向外界取得任何資料。以下圖來(lái)解釋,外部帳號(hào)A1可以呼叫合約C1所提供的功能,合約C1執(zhí)行的過(guò)程中,可以傳送ether給外部帳號(hào)A2,或是再呼叫合約C2,但是不管執(zhí)行過(guò)程如何複雜,就是離不開(kāi)EVM。
黃色圈表示外部帳號(hào)(也就是一般的使用者帳號(hào)),綠色圈表示合約帳號(hào)這個(gè)特性大大限制了Dapp的發(fā)展,舉一個(gè)最經(jīng)典的例子『骰子遊戲』,由於Solidity並沒(méi)有random number generator功能,所以這遊戲就做不下去了。這時(shí)有人引入了Oracle的概念,讓智能合約能夠透過(guò)Oracle取得外部資料。Oraclize就是提供這類服務(wù)的公司,如下圖,透過(guò)他們的服務(wù)就可以讓合約呼叫外部Web API取得所需資料。
Oraclize看起來(lái)非常神奇,直覺(jué)上好像辦不到,因?yàn)檫`反了EVM的設(shè)計(jì),到底是如何辦到的呢?接下來(lái)我們將實(shí)作一個(gè)簡(jiǎn)單版本且需要人為操作的HumanOracle智能合約,來(lái)示範(fàn)如何取得外界資料。
其實(shí)訣竅很簡(jiǎn)單,這跟看魔術(shù)一樣,知道原理之後就會(huì)有喔~~~原來(lái)如此的想法,然後覺(jué)得什麼嘛一點(diǎn)也不神奇XD。不過(guò)要將Oracle做的好用其實(shí)不容易,這道理也跟變魔術(shù)一樣。
訣竅就是:透過(guò)Event來(lái)跟外界Oracle聯(lián)繫,再由Oracle主動(dòng)將資料拋回EVMOracle可以透過(guò)監(jiān)聽(tīng)特定Event來(lái)接收合約所發(fā)出的Query,處理完成之後,再由Oracle主動(dòng)呼叫合約的 callback function將資料回傳即可。
本範(fàn)例的系統(tǒng)架構(gòu)與執(zhí)行流程如下圖,總共有三個(gè)角色
- A1: 一般的使用者帳號(hào)
- C1: 智能合約,裏面實(shí)作Event以及callback等f(wàn)unction
- Human Oracle: 這邊是工人智慧,需要手動(dòng)操作的部分,你也可以寫(xiě)一支程式來(lái)自動(dòng)化處理。
首先是合約內(nèi)容,為了支援multi-query,所以每次query要給一個(gè)特定id,這邊簡(jiǎn)單算出一個(gè)hash值當(dāng)作id來(lái)使用。query可以接收bytes,也就是說(shuō)可以傳入字串,如:?"Hello"?再依據(jù)Human Oracle的規(guī)則回傳response data
這邊使用Parity的Kovan網(wǎng)路來(lái)測(cè)試,透過(guò)他的UI來(lái)部署合約
部署合約成功產(chǎn)生合約接著使用user帳號(hào)執(zhí)行?query("Hello")
現(xiàn)在假設(shè)我自己就是Human Oracle本人,在交易成功之後,我可以看到有個(gè)Event被傳出來(lái),帶著_id與_query字串,將?0x2248656c6f22?轉(zhuǎn)換成ascii就是Hello透過(guò)QueryEvent可以取得必要的資訊接著我將?"Oracle"?字串透過(guò)?_queryCallback()?回傳給合約,記得複製_id當(dāng)成參數(shù)一併傳入。
這邊_id顯示有問(wèn)題,其實(shí)是有輸入的最後User使用?getResponse?取回?0x224f7261636c6522?就是 Oracle的字串
這樣就完成簡(jiǎn)單的Oracle示範(fàn)。
不過(guò)這個(gè)版本的合約存在一個(gè)致命的缺點(diǎn),因?yàn)镋vent是所有人都可以監(jiān)聽(tīng)的,可能會(huì)有其他人故意亂回覆,所以需要再加入指定responder是誰(shuí)的功能,而且只有合約的擁有者可以設(shè)定,這樣就可以確保Human Oracle就是我自己啦!
將合約更新如下:
下一篇將介紹如何寫(xiě)出類似Oraclize一樣的服務(wù)架構(gòu),可以讓其他合約使用,而不是單機(jī)版,敬請(qǐng)期待。
原文地址:https://medium.com/taipei-ethereum-meetup/oracle%E7%B3%BB%E5%88%97%E4%B8%80-human-oracle-cb7ed8268030
總結(jié)
以上是生活随笔為你收集整理的以太坊Oracle系列一: Human Oracle的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 以太坊Oracle系列二:My Orac
- 下一篇: 以太坊智能合约生命周期(Ethereum