日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

以太坊Oracle系列一: Human Oracle

發(fā)布時(shí)間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 以太坊Oracle系列一: Human Oracle 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

智能合約如何取得外界資料。

智能合約是在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)將資料拋回EVM

Oracle可以透過(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。