主頁(yè)
歡迎閱讀Provable文檔,該文檔的內(nèi)容主要可以分為以下這幾部分:
1.背景:Provable預(yù)言機(jī)模型背后的原理
2.普遍概念:主要的概念背后的Provable
3.數(shù)據(jù)源:關(guān)于Provable支持的數(shù)據(jù)源的類(lèi)型信息
4.集成:如何將區(qū)塊鏈應(yīng)用程序與Provable集成
5.開(kāi)發(fā)工具:用以輔助開(kāi)發(fā)集成Provable的智能合約的工具列表
6.安全性深入研究:Provable的真實(shí)性證明是如何工作的
7.定價(jià):生產(chǎn)使用的定價(jià)模型的信息
8.教程:關(guān)于集成Provable的教程
背景
Provable是一個(gè)面向智能合約和區(qū)塊鏈應(yīng)用的領(lǐng)先的預(yù)言機(jī)服務(wù),每天在以太坊、Rootstock、R3 Corda、Hyperledger Fabric和EOS等平臺(tái)上,處理數(shù)千個(gè)請(qǐng)求。
在區(qū)塊鏈?zhǔn)澜缰?,預(yù)言機(jī)是提供數(shù)據(jù)的一方。對(duì)這些數(shù)據(jù)的需求,來(lái)源于如下真實(shí)案例:
區(qū)塊鏈上的應(yīng)用程序,比如比特幣腳本和智能合約無(wú)法直接訪(fǎng)問(wèn)和獲取它們所需要的數(shù)據(jù):資產(chǎn)和金融應(yīng)用的價(jià)格提要;點(diǎn)對(duì)點(diǎn)保險(xiǎn)的與天氣相關(guān)的信息;賭博的隨機(jī)數(shù)生成。
但是,如果依賴(lài)于一個(gè)新的可信中介,也就是預(yù)言機(jī),那這將違背區(qū)塊鏈應(yīng)用程序的安全性和低信任模型:這就是區(qū)塊鏈應(yīng)用程序變得有趣和有用的首要原因。
有一種解決方案是接受來(lái)自多個(gè)不受信任或部分受信任方的數(shù)據(jù)輸入,然后只在多個(gè)不受信任的數(shù)據(jù)輸入方,提供了相同的答案,或提供了滿(mǎn)足某些約束條件的答案的前提之下,才執(zhí)行使用該數(shù)據(jù)的操作。這一類(lèi)型的系統(tǒng)可被認(rèn)為是分權(quán)式預(yù)言機(jī)系統(tǒng)。但是這一類(lèi)型的系統(tǒng)有嚴(yán)重的局限性:
1.它需要一個(gè)預(yù)定義的數(shù)據(jù)格式標(biāo)準(zhǔn)
2.它本質(zhì)上是低效的:所有參與方都需要一筆費(fèi)用,而且對(duì)于每一個(gè)請(qǐng)求,在得到足夠數(shù)量的答案之前都需要等待一段時(shí)間。
反之,Provable這個(gè)解決方案是,證明從原始數(shù)據(jù)源獲取的數(shù)據(jù)是真實(shí)的、未被篡改的。這是通過(guò)將返回的數(shù)據(jù)與一個(gè)稱(chēng)為真實(shí)性證明的文檔一起完成的。真實(shí)性證明可以建立在不同的技術(shù)之上,比如可審計(jì)的虛擬機(jī)和可信的執(zhí)行環(huán)境。
在真實(shí)性證明部分提供了Provable真實(shí)性證明的更詳細(xì)的闡述。
這個(gè)解決方案優(yōu)雅地解決了預(yù)言機(jī)的問(wèn)題:
1. 區(qū)塊鏈應(yīng)用程序的開(kāi)發(fā)者,以及區(qū)塊鏈應(yīng)用程序的用戶(hù),不必信任Provable;安全模型得到維護(hù)。
2. 數(shù)據(jù)提供者不必為了兼容區(qū)塊鏈協(xié)議而修改他們的服務(wù)。智能合約可以直接訪(fǎng)問(wèn)Web網(wǎng)站或APIs的數(shù)據(jù)。
Provable引擎可以非常簡(jiǎn)易地,與不同協(xié)議的私有區(qū)塊鏈和公有區(qū)塊鏈實(shí)例相集成。
在構(gòu)建服務(wù)時(shí),Provable團(tuán)隊(duì)已經(jīng)意識(shí)到真實(shí)性證明的概念比最初設(shè)想的適用性要廣泛得多。例如,Provable隨機(jī)數(shù)據(jù)源甚至可以被傳統(tǒng)的賭博應(yīng)用程序使用,以確保用戶(hù)操作的持續(xù)公平性。
普遍概念
Provable可以與許多區(qū)塊鏈協(xié)議集成,而且其服務(wù)對(duì)非區(qū)塊鏈應(yīng)用程序也是有用的和可訪(fǎng)問(wèn)的。在下一部分中,我們將解釋適用于所有集成的普遍概念。
Provable引擎
Provable引擎可以為基于區(qū)塊鏈和非基于區(qū)塊鏈的應(yīng)用程序均提供服務(wù)。在內(nèi)部復(fù)制一個(gè)“If This Then That”的邏輯模型。這意味著,如果滿(mǎn)足其他一些給定的條件,它將執(zhí)行給定的操作集。例如,它可以重復(fù)驗(yàn)證一個(gè)條件,并且只有在條件滿(mǎn)足時(shí)才返回?cái)?shù)據(jù)或執(zhí)行操作。這種靈活性使得Provable引擎能夠在許多不同的方式和上下文中被利用,甚至可以在區(qū)塊鏈上下文之外。
通過(guò)本地區(qū)塊鏈集成或HTTP API向Provable發(fā)出的有效數(shù)據(jù)請(qǐng)求,應(yīng)當(dāng)指定以下參數(shù):
1.數(shù)據(jù)源的類(lèi)型
2.具體的查詢(xún)
3.一個(gè)真實(shí)性證明類(lèi)型,可選
數(shù)據(jù)源類(lèi)型
數(shù)據(jù)源是受信任的數(shù)據(jù)提供者。它可以是一個(gè)網(wǎng)站或web API,如Reuters、Weather.com、BBC.com,或者運(yùn)行在硬件中的、強(qiáng)制的可信執(zhí)行環(huán)境(TEE)上的安全應(yīng)用程序,或者運(yùn)行在云提供商中的可審計(jì)、鎖定的虛擬機(jī)實(shí)例。Provable目前提供以下類(lèi)型的原生數(shù)據(jù)源:
1.URL:允許訪(fǎng)問(wèn)任何網(wǎng)頁(yè)或HTTP API端點(diǎn)
2.WolframAlpha:允許本機(jī)訪(fǎng)問(wèn)WolframAlpha計(jì)算引擎
3.IPFS:提供對(duì)存儲(chǔ)在IPFS文件中的任何內(nèi)容的訪(fǎng)問(wèn)
4.隨機(jī):提供來(lái)自安全應(yīng)用程序的未被篡改的隨機(jī)字節(jié)運(yùn)行在賬本Nano S上。
5.計(jì)算:提供任意計(jì)算的結(jié)果
此外,還有一些元數(shù)據(jù)源,如:
1.嵌套:允許組合不同類(lèi)型的數(shù)據(jù)源或使用同一數(shù)據(jù)源的多個(gè)請(qǐng)求,并返回唯一的結(jié)果
2.標(biāo)識(shí):它返回查詢(xún)
3.解密:它解密一個(gè)加密到Provable私鑰的字符串
查詢(xún)
一個(gè)查詢(xún)是一個(gè)參數(shù)數(shù)組,為了完成一個(gè)特定的數(shù)據(jù)源類(lèi)型請(qǐng)求,需要對(duì)其進(jìn)行評(píng)估:
query: [ parameter_1, parameters_2, ...];
第一個(gè)參數(shù)是主要參數(shù),它通常是強(qiáng)制性的。例如,對(duì)于URL數(shù)據(jù)源類(lèi)型,第一個(gè)參數(shù)是資源所在的預(yù)期URL。如果只有第一個(gè)參數(shù)存在,那么URL數(shù)據(jù)源就假定請(qǐng)求為HTTP GET。第二個(gè)參數(shù)是可選的,它應(yīng)該包含HTTP POST請(qǐng)求的數(shù)據(jù)有效參數(shù)。
可能需要解析查詢(xún)的中間結(jié)果:例如,在JSON API響應(yīng)中提取精確的字段。因此,查詢(xún)還可以指定要應(yīng)用的解析助手程序。
解析助手
Provable提供了JSON、XML、XHTML和二進(jìn)制的解析助手。下面是例子:
1.JSON解析:要從JSON文檔中提取特定元素的值,可以使用我們內(nèi)置的JSON解析器。一個(gè)示例使用案例,從Kraken API中提取ETH/USD價(jià)格字段,將其作為JSON文檔提供,是通過(guò)使用helper將API端點(diǎn)包圍起來(lái),如下所示:
json(https://api.kraken.com/0/public/Ticker?pair=ETHUSD).result.XETHZUSD.c.0.
2.XML解析器:要從XML文檔中提取特定元素的值,可以使用我們內(nèi)置的XML解析器。從作為XML文檔提供服務(wù)的API中提取柴油價(jià)格的一個(gè)示例使用案例是,使用如下的助手圍繞有問(wèn)題的API端點(diǎn):
xml(https://www.fueleconomy.gov/ws/rest/fuelprices).fuelPrices.diesel
3.HTML解析器:對(duì)HTML抓取很有用。所需的XPATH可以指定為XPATH(..)的參數(shù),如示例所示:
html(https://twitter.com/oraclizeit/status/671316655893561344).xpath(//*[contains(@class, 'tweet-text')]/text())
4.Binary Helper:使用slice(offset,length)操作符提取二進(jìn)制中間結(jié)果的部分非常有用。第一個(gè)參數(shù)是預(yù)期的偏移量,第二個(gè)參數(shù)是返回片的長(zhǎng)度。例如,
binary(https://www.sk.ee/crls/esteid/esteid2015.crl).slice(0,300)
返回鏈接的證書(shū)撤銷(xiāo)列表中第一個(gè)證書(shū)的原始字節(jié)。Binary helper必須與slice選項(xiàng)一起使用,并且只接受原始的二進(jìn)制輸入。
注意:Provable 'json()' 和 'xpath()' helpers分別支持JSONPATH和XPATH標(biāo)準(zhǔn)。JSONPATH實(shí)現(xiàn)是與FlowCommunications JSONPATH 0.3.4完全兼容的,可以通過(guò)這個(gè)外部網(wǎng)站進(jìn)行輕松的測(cè)試。我們使用的XPATH實(shí)現(xiàn)與XPATH 1.0標(biāo)準(zhǔn)是完全兼容的。
請(qǐng)注意,Provable測(cè)試查詢(xún)頁(yè)面工具對(duì)于利用解析幫助程序測(cè)試任何Provable查詢(xún)都很有用。更多細(xì)節(jié)請(qǐng)參見(jiàn)“開(kāi)發(fā)工具測(cè)試查詢(xún)”一節(jié)。
真實(shí)性證明
Provable的目的是充當(dāng)一個(gè)不可信的中介。可選地,Provable請(qǐng)求可以指定一個(gè)真實(shí)性證明。并非所有的證明都與所有數(shù)據(jù)源類(lèi)型兼容。關(guān)于真實(shí)性證明的更多細(xì)節(jié)可以在“安全性深入研究”這一部分中找到。
在處理真實(shí)性證明時(shí),總是使用https://調(diào)用,否則您的請(qǐng)求可能會(huì)在過(guò)程中被篡改(MITM攻擊),并且無(wú)法檢測(cè)到這種攻擊。
如果“Provable”由于技術(shù)原因無(wú)法生成真實(shí)性證明,在大多數(shù)情況下,它將返回沒(méi)有要求的證明的結(jié)果。由開(kāi)發(fā)人員決定如何在其應(yīng)用程序中處理這種情況:Provable建議丟棄結(jié)果并創(chuàng)建一個(gè)新的查詢(xún)。
數(shù)據(jù)隱私
某些環(huán)境,例如公有區(qū)塊鏈上的智能合約,可能需要一定程度的隱私來(lái)保護(hù)數(shù)據(jù)免受公眾審查。開(kāi)發(fā)人員可以通過(guò)使用Provable公鑰加密整個(gè)查詢(xún)或其部分參數(shù)來(lái)生成加密的Provable查詢(xún)。更多信息可以在加密查詢(xún)部分找到。
數(shù)據(jù)源
下面列出的是您在使用預(yù)言機(jī)服務(wù)時(shí)可以選擇的數(shù)據(jù)源。
請(qǐng)注意數(shù)據(jù)源選擇是不區(qū)分大小寫(xiě)的。

URL
URL數(shù)據(jù)源類(lèi)型允許訪(fǎng)問(wèn)因特網(wǎng)上的任何API或web頁(yè)面。它同時(shí)支持HTTP GET和HTTP POST請(qǐng)求。如果在查詢(xún)中只指定了一個(gè)參數(shù),該服務(wù)將默認(rèn)執(zhí)行HTTP GET請(qǐng)求。如果指定了第二個(gè)參數(shù),則服務(wù)將執(zhí)行HTTP POST請(qǐng)求,將第二個(gè)參數(shù)作為請(qǐng)求的參數(shù)數(shù)據(jù)進(jìn)行發(fā)布。注意,如果第二個(gè)參數(shù)是有效的JSON,那么它將作為JSON發(fā)布。URL數(shù)據(jù)源類(lèi)型支持TLSNotary證明和Android證明。更高級(jí)的HTTP功能,如基本身份驗(yàn)證或OAuth,可以通過(guò)利用“計(jì)算”這種數(shù)據(jù)源類(lèi)型來(lái)構(gòu)建。
由于可以證明是一個(gè)遠(yuǎn)程服務(wù),它要求“URL”數(shù)據(jù)源也可以遠(yuǎn)程訪(fǎng)問(wèn)。如果開(kāi)發(fā)人員可能希望使用一個(gè)API只能本地網(wǎng)絡(luò),他們可能會(huì)使用“l(fā)ocaltunnel”工具,通過(guò)npm的揭露他們的本地端口,通過(guò)一個(gè)公開(kāi)訪(fǎng)問(wèn)的URL(這是作為查詢(xún)參數(shù),在localhost:8080或127.0.0.1)。有關(guān)該實(shí)用程序的更多信息,請(qǐng)?jiān)L問(wèn):https://localtunnel.github.io/www/
WolframAlpha
WolframAlpha數(shù)據(jù)源類(lèi)型支持直接訪(fǎng)問(wèn)WolframAlpha知識(shí)引擎API。此數(shù)據(jù)源期望將應(yīng)該傳遞給WolframAlpha的字符串作為唯一參數(shù)。它將以字符串的形式返回結(jié)果。
開(kāi)發(fā)人員應(yīng)該通過(guò)Provable的測(cè)試頁(yè)面來(lái)測(cè)試查詢(xún)的有效性,以確保您的語(yǔ)法對(duì)Wolfram的引擎有意義。
這個(gè)數(shù)據(jù)源不支持真實(shí)性證明,因?yàn)榉祷卣麄€(gè)API響應(yīng)違背了WolframAlpha服務(wù)條款。因此,Provable建議僅在測(cè)試時(shí)使用此數(shù)據(jù)源類(lèi)型。
IPFS
IPFS數(shù)據(jù)源類(lèi)型可用于檢索IPFS網(wǎng)絡(luò)上文件的內(nèi)容。
該數(shù)據(jù)源期望查詢(xún)中的IPFS multihash作為唯一參數(shù)。例如,文件
QmT78zSuBmuS4z925WZfrqQ1qHaJ56DQaTfyMUF7F8ff5o
將返回“hello world\n”。
如果Provable未能在20秒內(nèi)獲取IPFS內(nèi)容,則請(qǐng)求將失敗。
計(jì)算
計(jì)算數(shù)據(jù)源通過(guò)利用沙箱Amazon Web服務(wù)虛擬機(jī),支持應(yīng)用程序或腳本的可審計(jì)執(zhí)行。
應(yīng)用程序必須在標(biāo)準(zhǔn)輸出上打印計(jì)算結(jié)果作為退出前的最后一行。結(jié)果最長(zhǎng)可達(dá)2500個(gè)字符。執(zhí)行上下文必須由Dockerfile來(lái)描述,在這里構(gòu)建和運(yùn)行它應(yīng)該直接啟動(dòng)主應(yīng)用程序。當(dāng)前Provable只提供一種類(lèi)型的可審核實(shí)例:t2.micro實(shí)例。Dockerfile初始化和應(yīng)用程序執(zhí)行應(yīng)盡快終止,因?yàn)閳?zhí)行時(shí)間上限為5分鐘。(當(dāng)前用于計(jì)算ds的Docker版本是1.12.1)
開(kāi)發(fā)人員可以通過(guò)創(chuàng)建存檔并將其上傳到IPFS,將應(yīng)用程序二進(jìn)制文件或腳本、它的依賴(lài)關(guān)系和Dockerfile發(fā)送給可驗(yàn)證的應(yīng)用程序。查詢(xún)期望該歸檔文件的IPFS multihash作為第一個(gè)參數(shù),而以下參數(shù)將作為環(huán)境變量傳遞給執(zhí)行環(huán)境,使應(yīng)用程序可以訪(fǎng)問(wèn)它們。
Provable可能使用Dockerfile的MAINTAINER字段中指定的電子郵件,作為任何問(wèn)題出現(xiàn)時(shí)的聯(lián)系信息。
Dockerfile必須在archive.zip的根目錄下,而非子目錄下。
隨機(jī)
這里描述的設(shè)計(jì)防止了Provable篡改來(lái)自可信執(zhí)行環(huán)境(TEE)的隨機(jī)結(jié)果,并保護(hù)用戶(hù)免受許多攻擊向量的攻擊。
真實(shí)性證明,連同結(jié)果,可以很容易地被驗(yàn)證,不僅在鏈下,甚至任何可靠的合約接收他們。這里給出的示例展示了如何集成驗(yàn)證過(guò)程,丟棄任何真實(shí)性證明未通過(guò)驗(yàn)證過(guò)程的隨機(jī)結(jié)果。
隨機(jī)數(shù)據(jù)源利用分類(lèi)帳證明來(lái)證明生成的隨機(jī)性的起源是一個(gè)真正安全的分類(lèi)帳設(shè)備。
這種安全地將脫離鏈的隨機(jī)性輸入?yún)^(qū)塊鏈的方法背后的原理在“按需、不可信的熵傳遞的可擴(kuò)展架構(gòu)”白皮書(shū)中進(jìn)行了解釋。
解密
盡管decrypt數(shù)據(jù)源可以像其他數(shù)據(jù)源一樣使用,但它是專(zhuān)門(mén)設(shè)計(jì)用來(lái)在嵌套數(shù)據(jù)源中使用的,以啟用部分查詢(xún)加密。
結(jié)果是解密的查詢(xún)字符串。請(qǐng)注意,加密特性提供的所有邏輯、限制和工具也適用于這里。
嵌套
嵌套數(shù)據(jù)源是一個(gè)元數(shù)據(jù)源,它不提供對(duì)其他服務(wù)的訪(fǎng)問(wèn)。它的設(shè)計(jì)目的是提供一些簡(jiǎn)單的聚合邏輯,使單個(gè)查詢(xún)能夠利用基于任何可用數(shù)據(jù)源的子查詢(xún),并生成單個(gè)字符串。
查詢(xún)格式可以指定一個(gè)子數(shù)據(jù)源和一個(gè)子查詢(xún),如下所示:
[datasource_name] query_content
請(qǐng)注意分隔數(shù)據(jù)源名稱(chēng)的方括號(hào)和實(shí)際子查詢(xún)的前綴空格。子查詢(xún)內(nèi)容可以用單引號(hào)或雙引號(hào)分隔。
通過(guò)使用 “${” 特殊的開(kāi)始符和 “}” 特殊的結(jié)束符作為分隔符,您可以選擇性地指定多個(gè)子查詢(xún)。
例如:
[WolframAlpha] temperature in ${[IPFS] QmP2ZkdsJG7LTw7jBbizTTgY1ZBeen64PqMgCAWz2koJBL}
集成
公有鏈
Provable原生集成了最廣泛使用的公共區(qū)塊鏈協(xié)議,如以太坊、比特幣、Rootstock、EOS主網(wǎng)和測(cè)試網(wǎng)。
可選擇的公有鏈
Provable是不斷研究新的公共區(qū)塊鏈協(xié)議,并考慮進(jìn)一步的與區(qū)塊鏈進(jìn)行集成。由于Provable引擎完全與區(qū)塊鏈無(wú)關(guān),并且可以通過(guò)HTTP API進(jìn)行交互,因此鼓勵(lì)開(kāi)發(fā)人員在以太坊-橋模型上進(jìn)行獨(dú)立的Provable開(kāi)源集成。
基于Ethereum的私有鏈
私有的、基于以太坊的鏈目前可以通過(guò)使用以太坊-橋與Provable鏈集成。包括Monax等以太坊分叉。關(guān)于如何使用以太坊橋的更多信息,請(qǐng)參閱開(kāi)發(fā)工具部分,或參考StackExchange的回答,該回答描述了如何與testrpc一起使用以太坊橋。
可選擇的私有鏈
“Provable”已經(jīng)在大多數(shù)私有鏈中使用,如果您對(duì)在尚未集成的情況下使用它感興趣,請(qǐng)與我們聯(lián)系。
非區(qū)塊鏈應(yīng)用程序
oraclize-lib通過(guò)提供一個(gè)可以解析為ProvableHTTP API的抽象層,也可以在非區(qū)塊鏈環(huán)境中使用Provable引擎功能。oraclize-lib目前還處于實(shí)驗(yàn)階段。
Ethereum
下一節(jié)專(zhuān)門(mén)介紹以太坊和Provable的集成。為了更好地從本節(jié)文檔中獲益,需要事先了解Solidity和以太坊。
Provable和以太坊智能合約之間的交互是異步的。任何數(shù)據(jù)請(qǐng)求都由兩個(gè)步驟組成:
1.首先,在最常見(jiàn)的情況下,執(zhí)行智能合約功能的事務(wù)是由用戶(hù)廣播的。該功能包含一個(gè)特殊指令,該指令顯示給Provable,Provable一直在監(jiān)視以太坊區(qū)塊鏈以獲取該指令,這是對(duì)數(shù)據(jù)的請(qǐng)求。
2.其次,根據(jù)該請(qǐng)求的參數(shù),可證明將獲取或計(jì)算結(jié)果,構(gòu)建、簽名并傳播攜帶結(jié)果的事務(wù)。在默認(rèn)配置中,這樣的事務(wù)將執(zhí)行__callback函數(shù),該函數(shù)應(yīng)由其開(kāi)發(fā)人員放置在智能合約中:因此,該事務(wù)在文檔中被稱(chēng)為Provable的回調(diào)事務(wù)。
如前幾節(jié)所述,Provable的基本特性之一是能夠?qū)?shù)據(jù)返回到智能合約,同時(shí)提供數(shù)據(jù)真實(shí)性的一個(gè)或多個(gè)證明。真實(shí)性證明的生成是可選的,它是一個(gè)合約范圍的設(shè)置,在發(fā)起數(shù)據(jù)請(qǐng)求之前,智能合約開(kāi)發(fā)人員必須對(duì)其進(jìn)行配置??勺C明總是建議在生產(chǎn)部署中使用真實(shí)性證明。
快速啟動(dòng)
這里編寫(xiě)的代碼示例的目標(biāo)是solididity 0.4,并導(dǎo)入provableAPI_0.4.25。sol是一種目標(biāo)固體度為0.4.25但兼容到0.4.22的release。建議任何新項(xiàng)目通過(guò)“github.com/provable-things/ethereum-api/provableAPI.sol”導(dǎo)入最新的API,該API應(yīng)該針對(duì)最新的穩(wěn)定可靠編譯器。
引入以太坊Provable集成的最簡(jiǎn)單方法是通過(guò)展示一個(gè)工作示例,如右邊的智能合約。該合同使用Provable從Coinbase Pro api獲取最后一個(gè)ETH/USD。每次調(diào)用updatePrice()函數(shù)時(shí),都會(huì)啟動(dòng)更新過(guò)程。這個(gè)例子展示了使用Provable的兩個(gè)重要組成部分:
1.該合約應(yīng)當(dāng)是使用Provable合約的子代
2.使用Provable合約定義在Provable api文件中,該文件可以從專(zhuān)用的ProvableGithub存儲(chǔ)庫(kù)中獲取。
如果使用Remix在任何以太坊網(wǎng)絡(luò)上編譯和部署它,示例中的代碼就是開(kāi)箱即用的:主網(wǎng)、Ropsten、Kovan和Rinkeby測(cè)試網(wǎng)。如果使用的是另一個(gè)工具,則有必要用provableAPI_0.4.25的本地導(dǎo)入替換import語(yǔ)句。由于直接從Github導(dǎo)入sol文件可能不被支持。
為了簡(jiǎn)化開(kāi)發(fā),Provable對(duì)使用默認(rèn)gas參數(shù)完成的第一次數(shù)據(jù)請(qǐng)求不收取合約費(fèi)用。連續(xù)的請(qǐng)求將要求合約支付Provable費(fèi)用和支付回調(diào)交易所需的ether。兩者都自動(dòng)從合約余額中扣除。如果合約沒(méi)有足夠的資金在他的余額中,請(qǐng)求將失敗和Provable不會(huì)返回任何數(shù)據(jù)。
只有第一個(gè)查詢(xún)是免費(fèi)的。確保合同有足夠的ETH余額支付以下查詢(xún)。契約在 'provable_query' 調(diào)用時(shí)自動(dòng)計(jì)費(fèi),但如果余額不足,則會(huì)失敗。
簡(jiǎn)單查詢(xún)
對(duì)數(shù)據(jù)的請(qǐng)求稱(chēng)為查詢(xún)。provable_query是一個(gè)函數(shù),使用Provable契約繼承自父函數(shù),它期望至少有兩個(gè)參數(shù):
1.數(shù)據(jù)源如URL,WolframAlpha,IPFS,‘Swarm’和其他列出在這里
2.給定數(shù)據(jù)源的參數(shù)。具有以下的例子:
????????1. 完整的URL,可能包括使用JSON或XML解析助手,如前面的示例所示
????????2. 或者WolframAlpha公式
????????3. 或者IPFS多散列
支持的參數(shù)的數(shù)量和類(lèi)型取決于所使用的數(shù)據(jù)源。此外,還將顯示并注釋更多的代碼示例。數(shù)據(jù)源以及選擇的真實(shí)性證明決定了合同必須支付的Provable費(fèi)用。
計(jì)劃將來(lái)的查詢(xún)
查詢(xún)的執(zhí)行可以安排在未來(lái)的日期。函數(shù)provable_query接受以秒為單位的當(dāng)前時(shí)間延遲或未來(lái)時(shí)間戳作為第一個(gè)參數(shù)作為參數(shù)。請(qǐng)注意,為了未來(lái)的Provable時(shí)間戳是接受必須在60天內(nèi)當(dāng)前UTC時(shí)間的絕對(duì)時(shí)間戳的選擇的情況下,或在一個(gè)相對(duì)時(shí)間的流逝,流逝秒必須等同于不超過(guò)60天。
遞歸查詢(xún)
通過(guò)在其__callback方法中實(shí)現(xiàn)對(duì)Provable的新調(diào)用,使用Provable的智能合約可以有效地實(shí)現(xiàn)自治。這對(duì)于實(shí)現(xiàn)某些鏈上引用數(shù)據(jù)的定期更新(如價(jià)格提要)或定期檢查某些鏈下條件非常有用。
這個(gè)修改后的版本將每60秒更新ETH/USD匯率,直到合同有足夠的資金支付Provable費(fèi)用。
謹(jǐn)慎使用遞歸查詢(xún)。一般來(lái)說(shuō),建議有目的地發(fā)送查詢(xún)。
查詢(xún)ID
每次調(diào)用函數(shù)provable_query時(shí),它都會(huì)返回一個(gè)唯一的ID,這里稱(chēng)為queryId,它取決于之前的請(qǐng)求數(shù)量和智能合約的地址。queryId標(biāo)識(shí)為Provable特定查詢(xún),并將其作為回調(diào)事務(wù)的參數(shù)返回到契約。
Provable建議智能合約開(kāi)發(fā)人員驗(yàn)證回調(diào)事務(wù)發(fā)送的queryId是否由對(duì)provable_query函數(shù)的有效調(diào)用生成,如本段附帶的示例所示。這確保每個(gè)查詢(xún)響應(yīng)只被處理一次,并有助于避免誤用智能合約邏輯。此外,它在區(qū)塊鏈重組期間保護(hù)智能合約,如本節(jié)專(zhuān)用段落所述。
queryId也可以用于在__callback函數(shù)中實(shí)現(xiàn)不同的行為,特別是當(dāng)有多個(gè)來(lái)自Provable掛起調(diào)用時(shí)。
自定義gas限制和gas價(jià)格
起源于__callback函數(shù)Provable事務(wù)向包含該事務(wù)的塊中的miner支付費(fèi)用,就像任何其他事務(wù)一樣。礦工費(fèi)用以以太形式支付,計(jì)算方法是將支付交易執(zhí)行成本的gas數(shù)量乘以選定的gas/以太價(jià)格。Provable將根據(jù)智能合約(用于合約范圍的設(shè)置)和provable_query函數(shù)(用于查詢(xún)特定的設(shè)置)中指定的參數(shù)相應(yīng)地設(shè)置這些參數(shù)。當(dāng)查詢(xún)事務(wù)執(zhí)行時(shí),回調(diào)事務(wù)的miner費(fèi)用從合約余額中提取。
如果沒(méi)有指定設(shè)置,Provable將使用默認(rèn)值200000 gas和20GWei。最后一個(gè)值目前處于定價(jià)區(qū)間的高端,但在全網(wǎng)擁堵時(shí),它有助于更快地確認(rèn)時(shí)間。
Provable回調(diào)函數(shù)gas的另一個(gè)值可以作為參數(shù)_gasLimit傳遞給provable_query函數(shù),如下面的示例所示。
回調(diào)事務(wù)的gas價(jià)格可以通過(guò)調(diào)用可provable_setCustomGasPrice函數(shù)來(lái)設(shè)置,該函數(shù)可以在構(gòu)造函數(shù)(在部署智能合約時(shí)執(zhí)行一次)中設(shè)置,也可以在單獨(dú)的函數(shù)中設(shè)置。下面是修改后的示例contract,以指定回調(diào)事務(wù)的自定義gas價(jià)格4 Gwei和自定義gas限制。
智能合約開(kāi)發(fā)人員應(yīng)該正確估計(jì)并最小化其__callback方法的成本,因?yàn)槿魏挝词褂玫膅as都將返回到Provable,并且不會(huì)有退款。
當(dāng)調(diào)用 'provable_setCustomGasPrice' 時(shí),參數(shù)類(lèi)型是uint,表示wei的數(shù)量。但是,不需要在參數(shù)中放入 'wei' 關(guān)鍵字。
真實(shí)性證明
真實(shí)性證明是Provable的預(yù)言機(jī)模型的核心。智能合約可以通過(guò)調(diào)用usingProvable合約中可用的provable_setProof函數(shù)來(lái)請(qǐng)求真實(shí)性證明及其數(shù)據(jù)。真實(shí)性證明可以直接交付到智能合約,也可以保存、上傳并存儲(chǔ)在IPFS等其他存儲(chǔ)介質(zhì)上。
當(dāng)智能合約請(qǐng)求真實(shí)性證明時(shí),它必須定義一個(gè)不同的回調(diào)函數(shù),并帶有以下參數(shù):
provable_setProof函數(shù)期望的格式如下:
proofType和proofStorage都是在usingProvable中定義的字節(jié)常量:
校樣可用的參數(shù)有:
1.proofType_NONE:所有智能合約的默認(rèn)值
2.prooftype_tlsnoary:僅在以太坊主網(wǎng)上可用
3.proofType_Android
4.proofType_Native
5.proofType_Ledger
而對(duì)于proofStorage:
1.proofStorage_IPFS
例如,provable_setProof(proofType_TLSNotary)將返回完整的TLSNotary證明字節(jié)作為回調(diào)事務(wù)中的證明參數(shù)。如果相反地使用了provable_setProof(proofType_TLSNotary | proofStorage_IPFS),那么Provable將只返回base58解碼的IPFS多哈希作為證明參數(shù)。要獲得IPFS多哈希,必須將字節(jié)編碼為base58。方法provable_setProof可以在構(gòu)造函數(shù)中執(zhí)行,成為契約范圍內(nèi)的持久設(shè)置,也可以在進(jìn)行特定查詢(xún)之前直接設(shè)置??梢酝ㄟ^(guò)調(diào)用provable_setProof(proofType_NONE)來(lái)禁用真實(shí)性證明。智能合約開(kāi)發(fā)者應(yīng)該意識(shí)到,helper方法provable_setProof是一個(gè)使用provable的內(nèi)部函數(shù),因此它必須在部署之前的編譯時(shí)包含在他們的智能合約中。下面的例子建立在我們前面的例子的基礎(chǔ)上:
可驗(yàn)證性
支持的證明可以被驗(yàn)證??墒褂玫墓ぞ甙ǎ?a target="_blank">校驗(yàn)工具。
最佳實(shí)踐
預(yù)計(jì)算查詢(xún)價(jià)格
您必須考慮到您的帳戶(hù)將被記入您的大多數(shù)Provable電話(huà)的借方。如果您的合約沒(méi)有包含足夠的ETH,查詢(xún)將失敗。根據(jù)您的契約邏輯,您可能希望在下一個(gè)查詢(xún)發(fā)送之前檢查價(jià)格。您可以通過(guò)調(diào)用provable_getPrice來(lái)實(shí)現(xiàn)這一點(diǎn),并檢查它是否高于當(dāng)前的合同余額。如果是這種情況,那么provable_query將會(huì)失敗,您可能想要優(yōu)雅地處理它。您還可以向provable_getPrice函數(shù)添加一個(gè)gaslimit參數(shù):provable_getPrice(string datasource, uint gaslimit)。確保provable_getPrice的自定義gaslimit與provable_query的gaslimit相匹配。
映射查詢(xún)id
發(fā)送的查詢(xún)的回調(diào)函數(shù)可能會(huì)被多次調(diào)用。因此,啟動(dòng)一個(gè)管理查詢(xún)id及其狀態(tài)的映射可能會(huì)很有幫助。當(dāng)查詢(xún)的回調(diào)函數(shù)被調(diào)用時(shí),require語(yǔ)句檢查當(dāng)前查詢(xún)id是否需要處理。在一次成功的迭代之后,id被刪除,以防止該特定id的進(jìn)一步回調(diào)。
高級(jí)的主題
加密的查詢(xún)
某些環(huán)境,例如公共區(qū)塊鏈上的智能合約,可能需要一定程度的隱私來(lái)保護(hù)數(shù)據(jù)免受公眾審查。開(kāi)發(fā)人員可以使用Provable公鑰加密查詢(xún)的一部分(或全部),從而生成加密的Provable查詢(xún)。想要部署公共網(wǎng)絡(luò)區(qū)塊鏈應(yīng)用程序的開(kāi)發(fā)人員可能會(huì)對(duì)加密查詢(xún)功能感興趣。例如,如果應(yīng)用程序利用了來(lái)自已驗(yàn)證API的數(shù)據(jù),那么向監(jiān)視公共鏈的人公開(kāi)API密鑰將是危險(xiǎn)的。
因此Provable提供加密的可能性中包含的參數(shù)查詢(xún)Provable公共密鑰:
044992e9473b7d90ca54d2886c7addd14a61109af202f1c95e218b0c99eb060c7134c4ae46345d0383ac996185762f04997d6fd6c393c86e4325c469741e64eca9
只有Provable能夠使用其配對(duì)的私鑰解密請(qǐng)求。
為了加密查詢(xún),Provable提供了一個(gè)CLI工具,可以在這里找到它。另外,加密任意文本字符串的CLI命令是:
python encrypted_queries_tools.py -e -p 044992e9473b7d90ca54d2886c7addd14a61109af202f1c95e218b0c99eb060c7134c4ae46345d0383ac996185762f04997d6fd6c393c86e4325c469741e64eca9 "YOUR QUERY"
這將使用默認(rèn)的Provable公鑰加密查詢(xún)。然后,可以將加密的字符串用作Provable查詢(xún)的參數(shù)。
您還可以只加密可provable_query()的一個(gè)參數(shù),而將其他參數(shù)保留為明文。
POST請(qǐng)求也可以使用加密方法:可以加密URL和POST數(shù)據(jù)字段,示例如下:
加密數(shù)據(jù)源(本例中為URL):
python encrypted_queries_tools.py -e -p 044992e94…“URL”
返回:
BEIGVzv6fJcFiYQNZF8ArHnvNMAsAWBz8Zwl0YCsy4K/RJTN8ERHfBWtSfYHt+uegdD1wtXTkP30sTW+3xR3w/un1i3caSO0Rfa+wmIMmNHt4aOS
加密參數(shù)(在本例中,我們使用JSON解析助手來(lái)檢索“狀態(tài)”):
python encrypted_queries_tools.py -e -p 044992e94…"json (https://api.postcodes.io/postcodes) .status"
返回:
BNKdFtmfmazLLR/bfey4mP8v/R5zCIUK7obcUrF2d6CWUMvKKUorQqYZNu1YfRZsGlp/F96CAQhSGomJC7oJa3PktwoW5J1Oti/y2v4+b5+vN8yLIj1trS7p1l341Jf66AjaxnoFPplwLqE=
加密JSON(第三個(gè)參數(shù),POST的數(shù)據(jù)):
python encrypted_queries_tools.py -e -p 044992e94... '{"postcodes" : ["OX49 5NU", "M32 0JG", "NE30 1DP"]}'
返回:
BF5u1td9ugoacDabyfVzoTxPBxGNtmXuGV7AFcO1GLmXkXIKlBcAcelvaTKIbmaA6lXwZCJCSeWDHJOirHiEl1LtR8lCt+1ISttWuvpJ6sPx3Y/QxTajYzxZfQb6nCGkv+8cczX0PrqKKwOn/Elf9kpQQCXeMglunT09H2B4HfRs7uuI
您還可以通過(guò)對(duì)另一個(gè)數(shù)據(jù)源(如WolframAlpha、比特幣區(qū)塊鏈或IPFS)的請(qǐng)求來(lái)實(shí)現(xiàn)這一點(diǎn)。我們的加密系統(tǒng)還允許用戶(hù)加密任何受支持的數(shù)據(jù)源選項(xiàng)。
為了防止其他用戶(hù)使用您的精確加密查詢(xún)(“重放攻擊”),第一個(gè)可證明為給定加密查詢(xún)的合約查詢(xún)成為其合法的“所有者”。任何其他使用相同字符串的合約都將收到一個(gè)空結(jié)果。因此,請(qǐng)記住,在使用加密查詢(xún)重新部署契約時(shí),始終要生成一個(gè)新的加密字符串。
上述安全保障僅在主網(wǎng)有效,測(cè)試網(wǎng)無(wú)效。欲了解更多信息,請(qǐng)聯(lián)系info@provable.xyz
為了保護(hù)明文查詢(xún),采用了橢圓曲線(xiàn)集成加密方案。加密的步驟如下:
1.橢圓曲線(xiàn)Diffie-Hellman Key Exchange(ECDH),以secp256k1為曲線(xiàn),ANSI X9.63以SHA256為密鑰推導(dǎo)函數(shù)。該算法用于從可證明的公鑰和隨機(jī)生成的開(kāi)發(fā)人員私鑰派生共享秘密。
2.共享密鑰由AES-256在Galois計(jì)數(shù)器模式(GCM)中使用,GCM是一種經(jīng)過(guò)認(rèn)證的對(duì)稱(chēng)密碼,用于加密查詢(xún)字符串。認(rèn)證標(biāo)簽的長(zhǎng)度為16字節(jié),IV被選擇為'000000000000'(96位長(zhǎng)度)。IV可以設(shè)置為零字節(jié)數(shù)組,因?yàn)槊總€(gè)共享密鑰都是一次性使用的。每次調(diào)用加密函數(shù)時(shí),都會(huì)重新生成一個(gè)新的開(kāi)發(fā)人員私鑰。最終的密文是編碼點(diǎn)(即開(kāi)發(fā)人員的公鑰)、身份驗(yàn)證標(biāo)記和加密的文本的連接。
計(jì)算數(shù)據(jù)來(lái)源
向包傳遞參數(shù)
通過(guò)向查詢(xún)數(shù)組添加參數(shù),可以將參數(shù)傳遞給包。它們可以在Docker實(shí)例中作為環(huán)境參數(shù)訪(fǎng)問(wèn)。
目前,API支持多達(dá)5個(gè)內(nèi)聯(lián)參數(shù),包括IPFS散列:
傳遞超過(guò)5個(gè)參數(shù)
如果你需要傳遞更多的參數(shù),你需要發(fā)送一個(gè)手動(dòng)設(shè)置的動(dòng)態(tài)字符串/字節(jié)數(shù)組,例如:
string[]內(nèi)存myArgs = new string[](6);
myArgs [0] = " MYIPFSHASH”;
…
myArgs[5] = "最后一個(gè)參數(shù)";
然后,查詢(xún)將像這樣:
傳遞加密參數(shù)
可以使用嵌套和decrypt元數(shù)據(jù)源傳遞加密參數(shù),如右邊的示例所示。
隨機(jī)數(shù)據(jù)來(lái)源
在使用Provable合約中,智能合約應(yīng)該使用Provable接口,增加了一些與Provable隨機(jī)數(shù)據(jù)源相關(guān)的具體功能。特別是:
Provable_newrandomdquery:正確執(zhí)行Provable隨機(jī)DS查詢(xún)的助手
1. 可provable_randomDS_setCommitment:在智能合約存儲(chǔ)中設(shè)置當(dāng)前請(qǐng)求的承諾
2. provable_randomds_gettsessionpubkeyhash:恢復(fù)連接器中出現(xiàn)的會(huì)話(huà)pub key的hash
provable_randomDS_proofVerify_main:執(zhí)行回調(diào)事務(wù)返回的證明的驗(yàn)證
1. provable_randomDS_sessionKeyValidity:驗(yàn)證信任的會(huì)話(huà)密鑰鏈?zhǔn)怯行У?,并且它的根是一個(gè)分類(lèi)賬根密鑰
2. matchBytes32Prefix:驗(yàn)證返回的結(jié)果是請(qǐng)求數(shù)據(jù)有效負(fù)載上的會(huì)話(huà)密鑰簽名的sha256
為了更好地使用隨機(jī)數(shù)據(jù)源,建議閱讀以下部分。
random datasource目前僅在以太坊主網(wǎng)和所有以太坊公共測(cè)試網(wǎng)(Rinkeby、Kovan、Ropsten-revival)上可用——它還沒(méi)有與私有區(qū)塊鏈/testrpc/remix-ide-vm集成。
兩方交互
provable_newrandomdquery可以用于不同類(lèi)型的交互,但是安全性可以通過(guò)向請(qǐng)求添加額外的承諾數(shù)據(jù)來(lái)進(jìn)一步提高。例如,對(duì)于兩方交互,可以修改provable_newRandomDSQuery,以包含發(fā)送方地址和作為承諾數(shù)據(jù)發(fā)送的值。這使得對(duì)隨機(jī)字節(jié)的請(qǐng)求更強(qiáng)烈地承諾給當(dāng)前一方,他們被認(rèn)為在合同中有利益關(guān)系,使得礦工不可能在潛在的分叉或重組當(dāng)前鏈上重放交易。
多方交互
在多黨互動(dòng)的情況下,如投票計(jì)劃或彩票,承諾數(shù)據(jù)應(yīng)該包括所有參與者的地址,以確保交易不能被一個(gè)礦工在一個(gè)分叉或重組鏈上重放,而一個(gè)參與者沒(méi)有下注。
ProofShield
ProvableProofShield是Devcon4首次引入的概念,您可以在這里觀(guān)看我們關(guān)于“可擴(kuò)展的鏈上驗(yàn)證,用于經(jīng)過(guò)驗(yàn)證的數(shù)據(jù)提要和鏈下計(jì)算”的演示。
這種防護(hù)還在試驗(yàn)階段,請(qǐng)不要在生產(chǎn)中使用。未來(lái)將推出可用于生產(chǎn)的版本。
ProofShield使智能合約能夠在鏈上驗(yàn)證Provable提供的真實(shí)性證明,這確保在繼續(xù)使用數(shù)據(jù)之前,對(duì)接收到的數(shù)據(jù)的真實(shí)性進(jìn)行驗(yàn)證。
要啟用ProofShield,只需通過(guò)provable_setProof函數(shù)設(shè)置即可,如下面的代碼所示:
一旦啟用了防屏蔽,接收到的證明將不是原始的真實(shí)性證明,而是防屏蔽證明:提供了一些功能,使防屏蔽證明可以在鏈上驗(yàn)證。為了驗(yàn)證它,你需要在__callback方法中調(diào)用函數(shù)provable_proofshield d_proofverify__returncode (queryId, result, proof)并確保它返回0。
目前,proofShield僅在所有以太坊公共測(cè)試網(wǎng)(Rinkeby、Kovan、Ropsten-revival)上可用——它還沒(méi)有與私有區(qū)塊鏈/testrpc/remix-ide-vm集成。
下面是一個(gè)代碼示例,請(qǐng)注意它的完整版本可以在這里找到:
更多的例子
更完整、更復(fù)雜的示例可以在Github專(zhuān)用存儲(chǔ)庫(kù):https://github.com/provable-things/ethereum-examples中找到。
Rootstock
Rootstock是比特幣網(wǎng)絡(luò)的第一個(gè)生產(chǎn)側(cè)鏈。它的目標(biāo)是在不損害其去中心化和抵制審查特性的情況下擴(kuò)展比特幣的能力。在Rootstock網(wǎng)絡(luò)上,參與者可以使用名為智能比特幣的令牌與智能合約進(jìn)行交互。比特幣和智能比特幣之間的聯(lián)系是由一個(gè)杰出玩家聯(lián)盟維護(hù)的,并得到了合并挖礦的支持。
RSK主網(wǎng)和公共測(cè)試網(wǎng)現(xiàn)在已經(jīng)上線(xiàn),它們都與Provable服務(wù)完全集成。
Rootstock上的智能合約由一個(gè)升級(jí)的但向后兼容的以太坊虛擬機(jī)版本執(zhí)行。這些都是使用可靠的編程語(yǔ)言編寫(xiě)的,并且完全與以太坊智能合約兼容。
經(jīng)過(guò)驗(yàn)證的Rootstock集成實(shí)際上與以太坊完全兼容,因?yàn)橐蕴恢悄芎霞s可以在Rootstock上本地編譯和執(zhí)行。有關(guān)如何在Solidity智能合約中使用可驗(yàn)證服務(wù)的更多技術(shù)細(xì)節(jié),請(qǐng)參閱本文檔的以太坊部分。
EOS
下一節(jié)將專(zhuān)門(mén)介紹與EOS的可驗(yàn)證集成。在閱讀本節(jié)之前,您必須熟悉EOS平臺(tái)的關(guān)鍵概念,如合約、事務(wù)、動(dòng)作和CPU/NET/RAM。所以如果事情變得模糊,EOSIO開(kāi)發(fā)門(mén)戶(hù)網(wǎng)站是你最好的朋友。
EOS平臺(tái)支持C和C++作為契約編程語(yǔ)言,但是目前Provable集成目前只支持C++。
Provable目前與EOSIO主網(wǎng)、公眾 “叢林” 測(cè)試網(wǎng)和公眾 “麒麟” 測(cè)試網(wǎng)集成。
Provable提供兩個(gè)獨(dú)立的EOS API:一個(gè)與CDT 1.6.1兼容,另一個(gè)與CDT 1.4.0兼容。
基本原理
Provable合同和EOS合同之間的交互是異步的。任何數(shù)據(jù)請(qǐng)求都由兩個(gè)步驟組成:
1.首先,在最常見(jiàn)的情況下,執(zhí)行合約的給定操作的事務(wù)是由用戶(hù)廣播的。該操作包含一個(gè)特殊的指令,該指令指示Provable執(zhí)行鏈外任務(wù)(比如從Web API獲取數(shù)據(jù),或者可能更多)。
2.其次,根據(jù)請(qǐng)求的參數(shù),Provable將獲取或計(jì)算結(jié)果,構(gòu)建、簽名并傳播攜帶結(jié)果的事務(wù)。在默認(rèn)配置中,該事務(wù)將執(zhí)行一個(gè)回調(diào)操作,該操作應(yīng)由其開(kāi)發(fā)人員放置在合約中:因此,該事務(wù)在文檔中被稱(chēng)為Provable回調(diào)事務(wù)。
如前幾節(jié)所述,Provable基本特征之一是將數(shù)據(jù)返回到合約的能力,以及支持?jǐn)?shù)據(jù)的一個(gè)或多個(gè)真實(shí)性證明。真實(shí)性證明的生成是可選的,必須由EOS合同開(kāi)發(fā)人員在發(fā)起數(shù)據(jù)請(qǐng)求時(shí)進(jìn)行配置。Provable總是建議在生產(chǎn)部署中使用真實(shí)性證明。
快速啟動(dòng)
包括ProvableAPI
在開(kāi)始之前,需要包含eos_api.hpp頭文件。這個(gè)文件包含了我們將使用Provable所有輔助函數(shù)。頭文件可以從eos-api github存儲(chǔ)庫(kù)中下載。強(qiáng)烈建議始終使用最新版本。
介紹EOS <-> Provable集成,是通過(guò)展示一個(gè)工作示例,如右邊的EOS合同。該合同使用Provable從CryptoCompare的API獲取最后的EOS/USD價(jià)格。每次調(diào)用execquery()動(dòng)作時(shí),都會(huì)啟動(dòng)更新流程。這個(gè)例子展示了使用Provable的兩個(gè)重要組成部分:
1.合約應(yīng)包括Provable頭文件
2.oraclize_query函數(shù)和回調(diào)操作處理EOS合約和Provable之間的所有通信
示例中的代碼在集成了Provable任何EOS網(wǎng)絡(luò)上都可以開(kāi)箱即用。
簡(jiǎn)單查詢(xún)
對(duì)數(shù)據(jù)的請(qǐng)求稱(chēng)為查詢(xún)。oraclize_query是函數(shù),在oraclize/eos_api中實(shí)現(xiàn)。hpp頭文件,它需要至少兩個(gè)參數(shù):
a.數(shù)據(jù)源如URL、WolframAlpha、IPFS、‘Swarm’和這里列出的其他數(shù)據(jù)源
b.給定數(shù)據(jù)源的參數(shù)。例如:
1. 完整的URL,可能包括使用JSON或XML解析助手,如前面的示例所示
2. 或者WolframAlpha公式
3. 或者IPFS多散列
支持的參數(shù)的數(shù)量和類(lèi)型取決于所使用的數(shù)據(jù)源。此外,還將提供代碼示例來(lái)展示這一點(diǎn)。數(shù)據(jù)源以及選擇的真實(shí)性證明決定了合同必須支付的Provable費(fèi)用。
計(jì)劃將來(lái)的查詢(xún)
查詢(xún)的執(zhí)行可以安排在未來(lái)的日期。函數(shù)oraclize_query接受以秒為單位的當(dāng)前時(shí)間(相對(duì)時(shí)間)或未來(lái)日期和時(shí)間的unix時(shí)間戳(絕對(duì)時(shí)間)延遲作為參數(shù)。請(qǐng)注意,為了未來(lái)的Provable時(shí)間戳是接受必須在60天內(nèi)當(dāng)前UTC時(shí)間的絕對(duì)時(shí)間戳的選擇的情況下,或在相對(duì)時(shí)間的情況下,經(jīng)過(guò)秒必須等同于不超過(guò)60天。
遞歸查詢(xún)
使用ProvableEOS合約可以通過(guò)實(shí)現(xiàn)一個(gè)循環(huán)查詢(xún)來(lái)實(shí)現(xiàn)Provable回調(diào)操作,從而有效地自治。這對(duì)于實(shí)現(xiàn)某些鏈上引用數(shù)據(jù)的定期更新(如價(jià)格提要)或定期檢查某些鏈下條件非常有用。
這個(gè)修改后的版本將從WolframAlpha API中得到一個(gè)隨機(jī)數(shù),而不是EOS/USD的價(jià)格,它將每10秒重新嘗試一次,直到合約收到返回的結(jié)果“6”。
謹(jǐn)慎使用遞歸查詢(xún)。一般來(lái)說(shuō),建議有目的地發(fā)送查詢(xún)。
檢查查詢(xún)ID
每次調(diào)用oraclize_query函數(shù)時(shí),它都會(huì)返回一個(gè)唯一的ID,這里稱(chēng)為queryId,它保證在給定的網(wǎng)絡(luò)執(zhí)行上下文中是唯一的。queryId標(biāo)識(shí)為Provable特定查詢(xún),并將其作為回調(diào)操作的參數(shù)返回到合約。
Provable建議EOS合約開(kāi)發(fā)人員驗(yàn)證回調(diào)動(dòng)作發(fā)送的queryId是否由對(duì)oraclize_query函數(shù)的有效調(diào)用生成,如本段所示。這確保每個(gè)查詢(xún)響應(yīng)只被處理一次,并有助于避免EOS合約邏輯的誤用。
查詢(xún)ID驗(yàn)證流程
使用eos_api.hpp中提供的方法來(lái)驗(yàn)證查詢(xún)ID是一個(gè)最佳實(shí)踐:
1. 首先,必須定義宏CONTRACT_NAME,其中它的值將是要部署的合約的名稱(chēng)。
2. 必須調(diào)用函數(shù)oraclize_queryId_localEmplace(myQueryId),將oraclize_query()返回的查詢(xún)ID作為參數(shù)傳遞。這個(gè)函數(shù)將把queryId表中的查詢(xún)ID保存為一條記錄。只需導(dǎo)入API并定義上述宏,就可以定義該表。
3. 函數(shù)oraclize_queryId_match(queryId)將執(zhí)行回調(diào)接收到的queryId與queryId表中可用的查詢(xún)ID之間的匹配。
為了說(shuō)明這一點(diǎn),checkqueryid示例重現(xiàn)了所有這些步驟。
queryId還可以用于將不同的行為實(shí)現(xiàn)到回調(diào)函數(shù)中,特別是當(dāng)有多個(gè)來(lái)自Provable掛起調(diào)用時(shí)。
資源分配
回調(diào)操作由可驗(yàn)證控制帳戶(hù)調(diào)用,該帳戶(hù)將負(fù)責(zé)為操作執(zhí)行分配資源。適用下列限制:
1.調(diào)用帳戶(hù)不會(huì)使用任何RAM,所以EOS合約開(kāi)發(fā)人員應(yīng)該注意,當(dāng)需要RAM的操作在回調(diào)函數(shù)的上下文中執(zhí)行時(shí),要定義一個(gè)合適的付款人(即:合約本身,_self)。
2.最大CPU占用率為100ms
3.最大凈使用量為100kb
當(dāng)需要額外的資源時(shí),EOS開(kāi)發(fā)者可以聯(lián)系Provable來(lái)討論不同的安排,或者他們可以使用EOS特性來(lái)推遲與不同的付款人執(zhí)行需要資源的任務(wù)。
上述限制是實(shí)驗(yàn)性的,在EOS主網(wǎng)上發(fā)布之前可能會(huì)改變。如果被濫用,一些賬戶(hù)可能會(huì)被暫時(shí)禁止使用該P(yáng)rovable服務(wù)。
真實(shí)性證明
真實(shí)性證明是Provable的預(yù)言機(jī)模型的核心。EOS合同可以通過(guò)在oraclize_query函數(shù)的最后一個(gè)參數(shù)中指定它們想要的證明來(lái)請(qǐng)求真實(shí)性證明以及它們的數(shù)據(jù)。真?zhèn)慰梢灾苯咏桓兜紼OS合同中,也可以上傳存儲(chǔ)在IPFS上。
當(dāng)一個(gè)EOS合同請(qǐng)求一個(gè)真實(shí)性證明時(shí),它將在回調(diào)動(dòng)作被調(diào)用時(shí)接收到證明,形式為std::vector<uint8_t> proof 論點(diǎn)。
oraclize_query的證明參數(shù)被設(shè)計(jì)成如下方式使用:oraclize_query(..., (proofType_ | proofStorage_))
proofType和proofStorage都是在預(yù)言機(jī)中定義的oraclize/eos_api.hpp頭文件。
校樣可用的參數(shù)有:
1.proofType_NONE:任何智能合約的默認(rèn)值
2.prooftype_tlsnoprivate:僅在EOS主網(wǎng)上可用
3.proofType_Android
4.proofType_Native
5.proofType_Ledger:僅在隨機(jī)數(shù)據(jù)源中可用
而對(duì)于proofStorage:
1.proofStorage_IPFS
例如,oraclize_query(…, (prooftype_tlsnoary)將返回完整的TLSNotary證明字節(jié)作為回調(diào)操作中的證明參數(shù)。如果oraclize_query(…, (proofType_TLSNotary | proofStorage_IPFS),則Provable將只返回base58編碼的IPFS多哈希作為證明參數(shù)。強(qiáng)烈建議始終使用真實(shí)性證明,但是可以通過(guò)將proof參數(shù)設(shè)置為proofType_NONE或簡(jiǎn)單地忽略它來(lái)禁用真實(shí)性證明。
可驗(yàn)證性
支持的證明可以被驗(yàn)證??墒褂玫墓ぞ甙ǎ?a target="_blank">校驗(yàn)工具。
高級(jí)的主題
檢查合同查詢(xún)/cbs
可以監(jiān)視給定EOS合約之間的交互,并通過(guò)使用cleos get動(dòng)作進(jìn)行驗(yàn)證。這將顯示調(diào)用契約和Provable連接器契約之間操作的高級(jí)視圖。如果您想要看到更多的細(xì)節(jié),使用——console選項(xiàng)(或-j)就足夠了:這將包括從查詢(xún)和回調(diào)操作生成的任何控制臺(tái)輸出。
test_query頁(yè)面是另一個(gè)有用的工具,用于監(jiān)視Provable查詢(xún)的處理(使用oraclize_query返回的queryId作為輸入)。
委派資源分配
當(dāng)使用oraclize_query函數(shù)時(shí),將啟動(dòng)對(duì)Provable連接器契約的EOS操作。默認(rèn)情況下,此操作的權(quán)限由EOS合同賬戶(hù)本身授予。這可以更改,例如,讓契約的用戶(hù)支付操作資源和Provable服務(wù)費(fèi)(如果有的話(huà)):在包含oraclize/eos_api之前定義一個(gè)宏ORACLIZE_PAYER就足夠了。高壓泵頭文件。
計(jì)算數(shù)據(jù)來(lái)源
向包傳遞參數(shù)
通過(guò)向查詢(xún)數(shù)組添加參數(shù),可以將參數(shù)傳遞給包。它們可以在Docker實(shí)例中作為環(huán)境參數(shù)訪(fǎng)問(wèn)。
目前,API支持5個(gè)內(nèi)聯(lián)參數(shù),包括IPFS散列:
std::vector<std::vector<unsigned char>> myquery = { string_to_vector("QmZRjkL4U72XFXTY8MVcchpZciHAwnTem51AApSj6Z2byR"), string_to_vector("_firstOperand"), string_to_vector("_secondOperand"), string_to_vector("_thirdOperand"), string_to_vector("_fourthOperand") };
oraclize_query("computation", myquery);
傳遞超過(guò)5個(gè)參數(shù)
如果你需要傳遞更多的參數(shù),你需要發(fā)送一個(gè)手動(dòng)設(shè)置的動(dòng)態(tài)字符串/字節(jié)數(shù)組,例如:
std::string myArgs[6] = { "MYIPFSHASH", ... };
然后,查詢(xún)就會(huì)像這樣:
oraclize_query("computation", myArgs);
隨機(jī)數(shù)據(jù)來(lái)源
包含在可驗(yàn)證的eos_api中。EOS合同應(yīng)該使用hpp與Provable接口,增加了一些與Provable隨機(jī)數(shù)據(jù)源相關(guān)的特定功能。特別是:
1.正確執(zhí)行Provable隨機(jī)DS查詢(xún)的助手
2.oraclize_randomDS_proofVerify:執(zhí)行回調(diào)事務(wù)返回的證明的驗(yàn)證
指定網(wǎng)絡(luò)環(huán)境
強(qiáng)烈建議開(kāi)發(fā)人員定義網(wǎng)絡(luò)上下文和將在其中運(yùn)行智能合約的合約名稱(chēng)。
對(duì)于網(wǎng)絡(luò)環(huán)境:
1.對(duì)于EOS測(cè)試網(wǎng)叢林:#define ORACLIZE_NETWORK_NAME "eosio_testnet_jungle"
2.用于EOS主網(wǎng):#define ORACLIZE_NETWORK_NAME "eosio_mainnet"
合同名稱(chēng):
1.#define CONTRACT_NAME "contractname"
定價(jià)
與EOS的可驗(yàn)證集成目前可在EOSIO主網(wǎng)和EOSIO公共“叢林”測(cè)試網(wǎng)上獲得;
Provable目前是免費(fèi)的。
我們的標(biāo)準(zhǔn)定價(jià)表可能最終適用(收取的EOS代幣等值美元價(jià)值),稍后在EOSIO主網(wǎng)上。如果發(fā)生這種情況,同樣的定價(jià)邏輯將在測(cè)試網(wǎng)上發(fā)生,以模擬功能。這將在testnet EOS中收費(fèi),所以是免費(fèi)的。合同已經(jīng)被部署在免費(fèi)期內(nèi)將遺產(chǎn),我們將繼續(xù)提供服務(wù),因?yàn)檫@是對(duì)他們來(lái)說(shuō),然而,他們featureset也會(huì)留在遺留光譜(即新特性依賴(lài)于定價(jià)模型顯然是不會(huì)的可轉(zhuǎn)移到這些)。
C? Corda
這里我們將討論P(yáng)rovable Corda積分。在閱讀本節(jié)之前,您必須熟悉Corda平臺(tái)的關(guān)鍵概念,如流、子流、合約、事務(wù)、命令、預(yù)言機(jī)等。因此,如果事情變得模糊,Corda文檔是你最好的朋友。
快速啟動(dòng)
Provable的服務(wù)非常類(lèi)似于Corda中描述的預(yù)言機(jī)模型,但是它沒(méi)有提供對(duì)query()和sign()方法的直接訪(fǎng)問(wèn),而是實(shí)現(xiàn)了一組流,當(dāng)需要來(lái)自外部的數(shù)據(jù)時(shí)可以調(diào)用這些流。看看下面的步驟,看看如何實(shí)現(xiàn)這一點(diǎn)。
查詢(xún)Provable
查詢(xún)Provable最快方法是使用OraclizeQueryAwaitFlow,它接受前面幾節(jié)中定義的參數(shù)(有關(guān)更多細(xì)節(jié),請(qǐng)參閱Provable引擎)。如右邊的代碼所示,流從指定的api獲取美元/英鎊的匯率,需要TLSNotary類(lèi)型的證明。請(qǐng)注意,json(…)解析器將準(zhǔn)確地提取我們所關(guān)心的結(jié)果。
由于流之間的通信是阻塞的,當(dāng)前的流將保持空閑,直到Provable將處理回答案。
一旦成功返回答案,就可以通過(guò)使用OraclizeUtils中定義的ProofVerificationTool輕松地驗(yàn)證證明。
為了安全檢查收到的數(shù)據(jù)的真實(shí)性,習(xí)慣上要驗(yàn)證包含在Provable答案中的證明。一旦verifyProof方法成功(返回'true'),用戶(hù)就可以確定結(jié)果既沒(méi)有被證明也沒(méi)有被其他方面篡改。這可以從加載了CorDapp的交易所涉及的各方進(jìn)行檢查。請(qǐng)注意,ProofVerificationTool是一個(gè)包含在Provable的CorDapp中的模塊,它在節(jié)點(diǎn)內(nèi)本地執(zhí)行驗(yàn)證。
如果希望將結(jié)果放入事務(wù)中,則有必要將答案與Provable節(jié)點(diǎn)公鑰一起包裝在命令中。請(qǐng)注意,Provable節(jié)點(diǎn)可以通過(guò)使用serviceHub獲得。identityService,用OraclizeUtils.getNodeName()標(biāo)識(shí)節(jié)點(diǎn)。
建立事務(wù)
現(xiàn)在我們有了建立事務(wù)的所有要素:檢查右邊的代碼,看看它是如何完成的。
注意:
1.someNotary是您選擇的一個(gè)公證員節(jié)點(diǎn),例如:
val someNotary = serviceHub.networkMapCache.notaryIdentities.first()
2.someState是一種輸出狀態(tài),通常與預(yù)言機(jī)的答案一起存在。
3.someContract是一個(gè)有效的Corda合約,它列出了I/O狀態(tài)上的所有斷言,通過(guò)requireThat閉包(參見(jiàn)下面關(guān)于該合約的更多細(xì)節(jié))。
4.someCommand是一個(gè)指定事務(wù)(包括頒發(fā)者公鑰)正在執(zhí)行的操作的命令。
簽署事務(wù)
在將事務(wù)發(fā)送給Provable進(jìn)行簽名之前,習(xí)慣上要過(guò)濾掉所有不Provable數(shù)據(jù),如右邊的函數(shù)過(guò)濾所示。
然后可以使用OraclizeSignFlow請(qǐng)求簽名,它接受前面as參數(shù)定義的FilteredTransaction。該流將檢查查詢(xún)是否在過(guò)去實(shí)際提交過(guò),然后返回一個(gè)包含Provable簽名的事務(wù)簽名。
細(xì)節(jié)
Provable答案
由Provable答案模型定義允許訪(fǎng)問(wèn)以下信息:
1.queryId:當(dāng)前答案的查詢(xún)ID
2.rawValue:實(shí)際的結(jié)果(可以是一個(gè)字節(jié)數(shù)組或字符串)
3.value:結(jié)果的字符串表示形式(如果是ByteArray,則為十六進(jìn)制字符串)
4.proof:作為字節(jié)數(shù)組的證明
5.type:指定rawValue字段類(lèi)型的字符串
????5.1. 如果是字符串則為"str"
????5.2. 如果它是一個(gè)字節(jié)數(shù)組,則使用"hex"
合約
由于答案通過(guò)命令的方式包裝在一個(gè)事務(wù)中,您可以通過(guò)使用tx.commands.requireSingleCommand<Answer>()在一個(gè)合約中輕松地訪(fǎng)問(wèn)它,并檢查答案是否滿(mǎn)足所有的要求。
在右邊,我們驗(yàn)證存儲(chǔ)在答案中的值是高于某個(gè)閾值的常數(shù),同時(shí)驗(yàn)證所請(qǐng)求的證明。如果上述斷言之一失敗,則拒絕合約并停止流。
RPC調(diào)用
也可以通過(guò)RPC使用崩潰shell(>>>)調(diào)用OraclizeQueryAwaitFlow,如圖所示。
例子
在CorDapp中,你可以找到一個(gè)現(xiàn)成的例子,如果美元/英鎊的匯率高于某個(gè)閾值,它就會(huì)自己發(fā)行指定數(shù)額的現(xiàn)金。查看corda-api存儲(chǔ)庫(kù),了解它如何工作的全部細(xì)節(jié)。
然后,您可以通過(guò)查詢(xún)?nèi)鐖D所示的保險(xiǎn)庫(kù)來(lái)檢查交易。
將CorDapp添加到項(xiàng)目中
如果你想在你的項(xiàng)目中使用Provable的CorDapp,只需要在你的build.gradle文件中放入一個(gè)依賴(lài)項(xiàng):
1.編譯 "com.github.oraclize:corda-api:linux_x86_64-SNAPSHOT"
2.編譯 "com.github.oraclize:corda-api:win32_x86_64-SNAPSHOT"
3.編譯 "com.github.oraclize:corda-api:macosx_x86_64-SNAPSHOT"
要使證明驗(yàn)證工具正確工作,有必要將正確的依賴(lài)項(xiàng)與節(jié)點(diǎn)的架構(gòu)相對(duì)應(yīng),否則證明將失敗,引發(fā)如下所示的異常。
# Fabric
下一節(jié)將專(zhuān)門(mén)介紹與Hyperledger Fabric的Provable集成。
Hyperledger Fabric平臺(tái)支持Go、Node和Java作為鏈代碼的主要編程語(yǔ)言;然而,當(dāng)前Provable集成(雖然它在內(nèi)部使用一個(gè)節(jié)點(diǎn)chaincode)的形式提供了一個(gè)API,可以通過(guò)一個(gè)包——這意味著您將能夠使用從你的輕松去chaincodeProvable,但在未來(lái)的Node / Java可以很容易地支持。
為了更好地利用本節(jié)文檔,需要具備Go、Node、Docker和Hyperledger Fabric的之前知識(shí)。
如前幾節(jié)所述,Provable基本特征之一是將數(shù)據(jù)返回到合約、Fabric空間中的鏈代碼以及支持?jǐn)?shù)據(jù)的一個(gè)或多個(gè)真實(shí)性證明的能力。真實(shí)性證明的生成是可選的,必須由chaincode開(kāi)發(fā)人員在發(fā)起數(shù)據(jù)請(qǐng)求時(shí)進(jìn)行配置。Provable總是建議在生產(chǎn)部署中使用真實(shí)性證明。
快速啟動(dòng)
介紹與Hyperledger Fabric的Provable集成的最簡(jiǎn)單方法是通過(guò)展示一個(gè)工作示例。
這個(gè)例子使用Provable從cryptocompare.com api獲取最后的歐元/美元匯率。每次發(fā)送查詢(xún)時(shí)都會(huì)啟動(dòng)更新流程。這個(gè)例子展示了使用Provable時(shí)需要的兩個(gè)重要組件,它們都可以從Github上專(zhuān)用的fabric-apiProvable存儲(chǔ)庫(kù)中獲?。?/p>
1.Provable連接器鏈代碼connector/oraclize-connector.js,需要安裝在網(wǎng)絡(luò)對(duì)等體上;
2.Go包 - oraclizeapi.go - 需要從用戶(hù)定義的go鏈代碼中使用ProvableAPI。
Provable目前可以在任何Hyperledger Fabric網(wǎng)絡(luò)中免費(fèi)使用。這將在不久的將來(lái)改變,標(biāo)準(zhǔn)定價(jià)將適用:更多細(xì)節(jié)請(qǐng)查看文檔的定價(jià)部分。付款將在Fabric網(wǎng)絡(luò)之外采取專(zhuān)用用戶(hù)帳戶(hù)持有一些預(yù)付信貸。
先決條件
文檔中描述的Provable集成假設(shè)用戶(hù)至少熟悉Hyperledger Fabric文檔提供的第一批教程中的一個(gè)。本教程可以在以下鏈接中找到:編寫(xiě)第一個(gè)應(yīng)用程序。
體系結(jié)構(gòu)概述
為了讓用戶(hù)接近Hyperledger Fabric區(qū)塊鏈,通過(guò)官方的Hyperledger來(lái)源提供了幾個(gè)示例。包含這些示例的文件夾中包含了一些基本的網(wǎng)絡(luò)配置,這對(duì)于具有清晰而簡(jiǎn)單、Provable集成非常有用。包含示例的fabric-samples文件夾可以通過(guò)執(zhí)行以下命令下載:
curl -sSL http://bit.ly/2ysbOFE | bash -s 1.2.0
該命令下載fabric-samples文件夾;具體來(lái)說(shuō),文件夾fabric-samples/basic-network是我們將要用來(lái)展示Provable集成的網(wǎng)絡(luò)?;A(chǔ)網(wǎng)絡(luò)創(chuàng)建了一個(gè)由以下實(shí)體組成的網(wǎng)絡(luò)結(jié)構(gòu):
1.一個(gè)應(yīng)用程序(cli);
2.一個(gè)對(duì)等;
3.一個(gè)開(kāi)證申請(qǐng)人;
4.一個(gè)CA。
在對(duì)等端將安裝兩個(gè)鏈碼:
1.oraclize-connector,由Provable提供的chaincode,被Provable內(nèi)部使用來(lái)執(zhí)行任何查詢(xún);
2.user-chaincode,用戶(hù)想要?jiǎng)?chuàng)建的鏈代碼,以便在Hyperledger Fabric區(qū)塊鏈中構(gòu)建一個(gè)服務(wù)。
關(guān)于這個(gè)Fabric網(wǎng)絡(luò)例子中的生態(tài)實(shí)體的圖例如下圖所示:

網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示:

交易流
在本節(jié)中,我們將分析在集成Provable基本網(wǎng)絡(luò)示例中執(zhí)行的查詢(xún)的事務(wù)流。交易流程的第3個(gè)步驟如下圖所示:

流程可分為以下過(guò)程階段:
1. 在應(yīng)用程序A中,用戶(hù)啟動(dòng)指向?qū)Φ润wP1的查詢(xún),調(diào)用Go用戶(hù)鏈碼S1的函數(shù),該函數(shù)調(diào)用一個(gè)Provable查詢(xún);
2. 用戶(hù)鏈碼S1,執(zhí)行用戶(hù)調(diào)用的函數(shù),并將Provable查詢(xún)的數(shù)據(jù)發(fā)送給Provable連接器,鏈碼S2;
3. Provable鏈碼S2,一旦結(jié)果就緒,將其連同真實(shí)性證明一起發(fā)送回用戶(hù)鏈碼S1;
4. 用戶(hù)鏈碼S1使用從Provable程序收到的結(jié)果(和真實(shí)性證明)做一些事情,并最終將響應(yīng)發(fā)送回應(yīng)用程序A。
構(gòu)建網(wǎng)絡(luò)
本小節(jié)的目標(biāo)是構(gòu)建如圖所示的網(wǎng)絡(luò)。首先,訪(fǎng)問(wèn)fabric-samples文件夾并為我們的Provable集成示例創(chuàng)建一個(gè)項(xiàng)目文件夾。在本文檔中,它的名稱(chēng)是fabric-samples/oraclize-integration。這個(gè)文件夾是應(yīng)用程序-cli端發(fā)生的所有操作的容器。在oraclize-integration文件夾中,我們會(huì)有以下文件:
1.enrollAdmin.js
2.registerUser.js
3.startFabric.sh
4.user-application-query.js
兩個(gè)文件enrollAdmin.js和registerUser.js都可以從fabric-samples/fabcar文件夾中復(fù)制。可以從fabric-samples文件夾中啟動(dòng)以下命令:
1.cp fabcar/enrollAdmin.js oraclize-integration
2.cp fabcar/registerUser.js oraclize-integration
然后,在oraclize-integration文件夾中安裝以下軟件包:
1.npm install fabric-client
2.npm install fabric-ca-client
從Github上的fabric-examples Provable repository中下載名為fabric-examples/eurusd-example/testing-utils/startFabric.sh的文件。這個(gè)腳本在右邊的代碼部分中顯示,它是用來(lái)執(zhí)行以下操作的腳本:
1. 設(shè)置環(huán)境變量;
2. 清理證書(shū)和密鑰庫(kù),刪除hfc-key-store文件夾;
3. 停止并移除所有先前的代表網(wǎng)絡(luò)實(shí)體的docker容器;
4. 移除chaincode容器;
5. 啟動(dòng)network fabric-samples/basic-network,創(chuàng)建一個(gè)docker容器:
????5.1.開(kāi)證申請(qǐng)人;
????5.2.CA;
????5.3.對(duì)等;
????5.4.cli;
????5.5.couchdb;
6. 啟動(dòng)命令行來(lái)安裝和實(shí)例化oraclize-connector和user-chaincode chaincodes,將它們作為容器啟動(dòng);
7. 安裝節(jié)點(diǎn)模塊;
8. 注冊(cè)管理調(diào)用enrollAdmin.js;
9. 注冊(cè)用戶(hù),調(diào)用registerUser.js。
請(qǐng)注意必須安裝Go,并且必須正確設(shè)置Go環(huán)境變量。
添加Provable鏈代碼
在startFabric.sh腳本中,最后兩個(gè)docker命令引用實(shí)例并安裝可驗(yàn)證的連接器鏈代碼。這個(gè)鏈代碼,在文檔中以oraclize-connector的名字引用,從cli docker容器在網(wǎng)絡(luò)對(duì)等體上實(shí)例化。
cli容器從其本地的chaincode集實(shí)例化和安裝預(yù)言機(jī)的chaincode。然而,cli從fabric-samples/chaincode文件夾獲取這個(gè)chaincode集;因此,node.js oraclize-connector和Go用戶(hù)鏈代碼必須在上述路徑中。
的oraclize-connector.js chaincode提供Provable在fabric-api/connector Provable repository on Github,并將在以下路徑fabric-samples/chaincode/oraclize-connector/node,因此,最終結(jié)果將會(huì)是:fabric-samples/chaincode/oraclize-connector/node/oraclize-connector.js。
為了正確設(shè)置oraclize-connector鏈代碼,需要安裝oraclize-connector.js文件和package.json是必要的。安裝指定的依賴(lài)項(xiàng)需要package.json,而oraclize-connector.js本身是節(jié)點(diǎn)Provable鏈代碼。
請(qǐng)注意,所提到的路徑和名稱(chēng)沒(méi)有為正確的集成而更改。
添加用戶(hù)鏈代碼
創(chuàng)建一個(gè)包含你的鏈代碼 fabric-samples/chaincode的文件夾,在這個(gè)例子中fabric-samples/chaincode/user-chaincode/go。創(chuàng)建Go chaincode,在本例中引用的名稱(chēng)是user-chaincode.go?,F(xiàn)在,為了執(zhí)行Provable查詢(xún),必須包含Provable Go包。在Github上的fabric-examples/eurusd-example/chaincode/go/ Provable 存儲(chǔ)庫(kù)中,我們提供了一個(gè)現(xiàn)成的用戶(hù)鏈代碼。在chaincode中,包含了所有需要的依賴(lài),包括oraclizeapi.go。但是,你需要在本地安裝依賴(lài),使用以下命令:
go get "github.com/oraclize/fabric-api"
請(qǐng)注意所有的go包,包括oraclizeapi.go,必須是你的chaincode文件夾fabric-samples/chaincode/user-chaincode/go的供應(yīng)商。一般來(lái)說(shuō),通過(guò)govendor提供包是一個(gè)很好的解決方案,可以在用戶(hù)鏈代碼中包含包。這個(gè)包必須出現(xiàn)在fabric-samples/chaincode/user-chaincode/go/vendor目錄下。
這個(gè)包允許使用一個(gè)Provable查詢(xún)函數(shù)來(lái)執(zhí)行數(shù)據(jù)請(qǐng)求,代碼如下:
oraclizeapi.OraclizeQuery_sync(APIstub, dataset, url, proofType)
在用戶(hù)鏈代碼中,一個(gè)函數(shù)執(zhí)行歐元/美元匯率數(shù)據(jù)調(diào)用,使用可證明的查詢(xún)顯示在右邊。本例中鏈代碼要求的證明是TLSNOTARY證明。
Provable簡(jiǎn)單查詢(xún)
對(duì)數(shù)據(jù)的請(qǐng)求稱(chēng)為查詢(xún)。OraclizeQuery_sync是一個(gè)函數(shù),在oraclizeapi中實(shí)現(xiàn)oraclizeapi.go?Go包,它需要三個(gè)參數(shù):
1. 這里列出的數(shù)據(jù)源如URL、WolframAlpha、IPFS、Swarm等
2. 給定數(shù)據(jù)源的參數(shù);例子:
????2.1. 完整的URL,可能包括使用JSON或XML解析助手,如前面的示例所示
????2.2. 或者WolframAlpha公式
????2.3. 或者IPFS多散列
3. 從oraclizeapi.go導(dǎo)入的證明類(lèi)型,可以使用以下值指定:
????3.1. NONE
????3.2. TLSNOTARY
????3.3. ANDROID
????3.4. LEDGER
????3.5. NATIVE
支持的參數(shù)的數(shù)量和類(lèi)型取決于所使用的數(shù)據(jù)源。
發(fā)送CLI查詢(xún)
為了測(cè)試fetchEURUSDviaOraclize這個(gè)從用戶(hù)鏈代碼中調(diào)用Provable查詢(xún)的示例函數(shù),你需要先啟動(dòng)網(wǎng)絡(luò)。啟動(dòng)Docker守護(hù)進(jìn)程后,在fabric-samples/oraclize-integration文件夾中運(yùn)行以下命令:
./startFabric.sh
然后,當(dāng)網(wǎng)絡(luò)完全打開(kāi)時(shí),使用所有7個(gè)容器(4個(gè)實(shí)體、2個(gè)鏈代碼、1個(gè)couchdb),運(yùn)行應(yīng)用程序查詢(xún)文件user-application-query.js,使用命令:
node user-application-query.js
歐元/美元的匯率結(jié)果返回與真實(shí)性證明指定的鏈碼方。
關(guān)于上面示例文件的完整代碼,請(qǐng)參考Github上的fabric-examples可證明存儲(chǔ)庫(kù)。
開(kāi)發(fā)工具
在本節(jié)中,開(kāi)發(fā)人員將發(fā)現(xiàn)一些工具,這些工具可以幫助他們將可證明的集成到他們的產(chǎn)品中。
測(cè)試查詢(xún)
TestQuery頁(yè)面可用于測(cè)試任何可證明的查詢(xún)。這不需要編寫(xiě)任何代碼,對(duì)于在早期開(kāi)發(fā)階段驗(yàn)證給定查詢(xún)的正確性非常有用。
網(wǎng)絡(luò)監(jiān)控
網(wǎng)絡(luò)監(jiān)控,連同證明驗(yàn)證工具,可以用來(lái)驗(yàn)證已提供的真實(shí)性證明的完整性和正確性。
獨(dú)立地驗(yàn)證這些證明是否有效是非常重要的,因?yàn)檫@是唯一的方法來(lái)驗(yàn)證,如果可證明的答案是錯(cuò)誤的。
加密
為了使用可證明的加密支持特性,開(kāi)發(fā)人員可以使用TestQuery頁(yè)面或Python加密工具。為了避免重放攻擊,加密查詢(xún)被鏈接到第一個(gè)智能合約,該智能合約使用它來(lái)執(zhí)行一個(gè)請(qǐng)求以進(jìn)行驗(yàn)證。需要重新部署相同的智能合約代碼來(lái)加密查詢(xún)。
Remix IDE Provable插件
Remix IDE與各種插件捆綁在一起,包括一個(gè)用于將Provable作為預(yù)言機(jī)服務(wù)使用的插件。這個(gè)插件是為JavaScript VM使用的,它在加載時(shí)為您的會(huì)話(huà)部署所有需要的基礎(chǔ)設(shè)施和偵聽(tīng)器。此后,您可以利用useingOraclize合約的繼承性來(lái)部署任何合約,并通過(guò)IDE側(cè)面板上的插件圖標(biāo)來(lái)跟蹤任何查詢(xún)請(qǐng)求。
關(guān)于一些合同的示例,請(qǐng)參考ethereum-examples github存儲(chǔ)庫(kù)。根目錄中的合約,如DieselPrice。索爾和KrakenPriceTicker。sol是即插即用的,因?yàn)槟梢院?jiǎn)單地在Remix中與插件一起運(yùn)行它們,它們將會(huì)工作。
插件僅適用于JavaScript VM環(huán)境對(duì)混音,對(duì)于使用web3提供者或注入環(huán)境,網(wǎng)絡(luò)問(wèn)題要么需要支持的直接可證明的,這是對(duì)公共testnets或mainnet,或在私有網(wǎng)絡(luò)的情況下,通過(guò)“ethereum-bridge”將需要手工設(shè)置。
單元測(cè)試
在移動(dòng)到正式測(cè)試網(wǎng)或生產(chǎn)使用之前,智能合約開(kāi)發(fā)的一個(gè)重要步驟是單元測(cè)試。以太坊社區(qū)已經(jīng)開(kāi)發(fā)了多個(gè)單元測(cè)試框架,如Truffle和Embark,它們可以在以太坊的私有實(shí)例上測(cè)試合約。一種常見(jiàn)的組合是在以太坊js-testrpc環(huán)境中運(yùn)行Truffle測(cè)試,該環(huán)境是在內(nèi)存中運(yùn)行的一個(gè)模擬以太坊區(qū)塊鏈實(shí)例。為了能夠與Truffle部署的智能合約進(jìn)行交互,或者啟動(dòng)test-rpc區(qū)塊鏈實(shí)例,需要安裝一個(gè)稱(chēng)為以太坊-橋的工具。這是一個(gè)nodejs模塊,它在實(shí)例中部署可驗(yàn)證的智能合約基礎(chǔ)設(shè)施,然后監(jiān)控該基礎(chǔ)設(shè)施以查看請(qǐng)求。該工具將請(qǐng)求轉(zhuǎn)換為可驗(yàn)證引擎的HTTP API調(diào)用,然后通過(guò)廣播回調(diào)事務(wù)返回結(jié)果。
EthPM
以太坊包管理是一個(gè)旨在標(biāo)準(zhǔn)化、構(gòu)建和維護(hù)基于智能合約包的公共注冊(cè)表的項(xiàng)目,以幫助智能合約開(kāi)發(fā)者??勺C明已經(jīng)在“oracle -api”包下發(fā)布并維護(hù)了以太坊的oraclizeAPI。安裝程序:“truffle install oracle -api”。
請(qǐng)注意正確的包名是' oraclize-api ',而不是 ' oraclize '。
Oraclize-lib
Oracle-lib是一個(gè)實(shí)驗(yàn)性的nodejs庫(kù),用于利用可證明來(lái)構(gòu)建非區(qū)塊鏈應(yīng)用程序。可以將其視為Provable HTTP API的一個(gè)簡(jiǎn)單抽象層。
未來(lái)
Stargate
Provable團(tuán)隊(duì)正在開(kāi)發(fā)一種工具,可以直接集成基于以太坊的鏈的任何私有部署,包括私有測(cè)試網(wǎng),而無(wú)需安裝額外的軟件。這個(gè)工具被命名為“Stargate”,目前正在積極開(kāi)發(fā)中。該工具將由開(kāi)發(fā)人員區(qū)塊鏈實(shí)例和可證明的ssh-bridge組成。更多的信息將在今年晚些時(shí)候公布。有興趣嘗試這個(gè)實(shí)驗(yàn)性功能的各方,可以聯(lián)系我們。
安全性深入研究
隨著數(shù)字技術(shù)降低了信息創(chuàng)建和發(fā)布的門(mén)檻,能夠驗(yàn)證一條信息是否來(lái)自已知的、可信的來(lái)源就變得極其重要。
在web技術(shù)的上下文中,身份驗(yàn)證是由HTTPS協(xié)議提供的,它是HTTP協(xié)議的擴(kuò)展,在客戶(hù)端和包含數(shù)據(jù)的web服務(wù)器之間創(chuàng)建一個(gè)加密和身份驗(yàn)證的通道。
在處理可用于確定不同金融交易的數(shù)據(jù)時(shí),身份驗(yàn)證就變得至關(guān)重要。不幸的是,最常用和可用的區(qū)塊鏈協(xié)議沒(méi)有直接與HTTPS交互的方法,因此無(wú)法消化經(jīng)過(guò)身份驗(yàn)證的數(shù)據(jù)。這樣看來(lái),似乎需要一個(gè)可信的服務(wù),它可以提供數(shù)據(jù)或基于數(shù)據(jù)完成操作;但這在一定程度上削弱了在沒(méi)有可信方參與的情況下使用去中心化協(xié)議交換價(jià)值的意義。
這就是為什么Provable一直在設(shè)計(jì)數(shù)據(jù)身份驗(yàn)證系統(tǒng),并將其作為其核心業(yè)務(wù)的一部分。這些系統(tǒng)被稱(chēng)為真實(shí)性證明,它可以在交付未被篡改的數(shù)據(jù)時(shí)審計(jì)預(yù)言機(jī)的服務(wù)記錄。真實(shí)性證明利用不同的認(rèn)證技術(shù):一些基于軟件,一些依賴(lài)可信的硬件技術(shù)。
真實(shí)性證明類(lèi)型
TLSNotary證明
TLSNotary證明利用了TLS 1.0和1.1協(xié)議的一個(gè)特性,該特性允許在三方之間拆分TLS主密鑰:服務(wù)器、被審計(jì)方和審計(jì)方。在這種方案中,Provable是被審核方,而特定設(shè)計(jì)的開(kāi)源Amazon機(jī)器映像的一個(gè)鎖定的AWS實(shí)例充當(dāng)審核方。TLSNotary協(xié)議是一種開(kāi)源技術(shù),由PageSigner項(xiàng)目開(kāi)發(fā)和使用。
Android證明
Android Proof是一些可證明的內(nèi)部研發(fā)工作的結(jié)果。它利用了谷歌開(kāi)發(fā)的名為SafetyNet的軟件遠(yuǎn)程認(rèn)證技術(shù),來(lái)驗(yàn)證給定的Android應(yīng)用程序是否運(yùn)行在一個(gè)安全的、沒(méi)有被Root的物理設(shè)備上,并連接到Provable的基礎(chǔ)設(shè)施。它還遠(yuǎn)程驗(yàn)證應(yīng)用程序代碼哈希值,啟用在設(shè)備上運(yùn)行的應(yīng)用程序的身份驗(yàn)證。應(yīng)用程序代碼是開(kāi)源的,因此可以對(duì)代碼哈希值進(jìn)行審計(jì)和驗(yàn)證。Android證明更進(jìn)一步,通過(guò)使用新引入的Android硬件驗(yàn)證來(lái)證明物理設(shè)備已更新到最新可用的Android版本,通過(guò)對(duì)系統(tǒng)內(nèi)的任何潛在漏洞進(jìn)行修補(bǔ),進(jìn)一步確保完整性。此外,它還驗(yàn)證設(shè)備的Root-of-Binding-Trust是否有效。這兩種技術(shù)一起有效地將物理Android設(shè)備轉(zhuǎn)變?yōu)橐粋€(gè)可證明安全的環(huán)境,在這個(gè)環(huán)境中可以啟動(dòng)到遠(yuǎn)程數(shù)據(jù)源的未篡改的HTTPS連接。與未經(jīng)授權(quán)的可證明的或外部攻擊者獲得妥協(xié)的基礎(chǔ)設(shè)施設(shè)備,生成一個(gè)錯(cuò)誤但有效的證據(jù),一個(gè)零日漏洞不知道谷歌必須由黨說(shuō),發(fā)現(xiàn)這打破了Android沙盒模型或者是一個(gè)內(nèi)核級(jí)利用,可用的最新版本的Android操作系統(tǒng)及其安全補(bǔ)丁。您可以通過(guò)閱讀關(guān)于A(yíng)ndroid證明的白皮書(shū)來(lái)獲取更多信息,并在以太坊和比特幣測(cè)試網(wǎng)上進(jìn)行試驗(yàn)。基于谷歌的更新,正在主網(wǎng)上啟用Android Proof,有效啟用了Android Nougat 硬件認(rèn)證。
賬本憑證
Ledger是一家法國(guó)公司,在生產(chǎn)硬件強(qiáng)制加密貨幣錢(qián)包方面處于領(lǐng)先地位。他們的主要產(chǎn)品是Nano和Blue賬本。這兩個(gè)設(shè)備都實(shí)現(xiàn)了一個(gè)公共平臺(tái),包括意法半導(dǎo)體安全元件、控制器和一個(gè)名為BOLOS的操作系統(tǒng)。BOLOS SDK允許開(kāi)發(fā)人員構(gòu)建應(yīng)用程序,這些應(yīng)用程序可以與加密貨幣錢(qián)包一起安裝在安全硬件上,這些應(yīng)用程序本身就是BOLOS應(yīng)用程序。BOLOS公開(kāi)了一組內(nèi)核級(jí)API,這些API可以完成一些有用的操作,比如加密操作或認(rèn)證操作。事實(shí)上,認(rèn)證是該平臺(tái)最有趣的方面之一:任何應(yīng)用程序都可以通過(guò)調(diào)用適當(dāng)?shù)腁PI,要求內(nèi)核度量其二進(jìn)制數(shù)據(jù)并生成簽名哈希。簽名由一個(gè)特殊的驗(yàn)證密鑰執(zhí)行,該密鑰由內(nèi)核控制,應(yīng)用程序開(kāi)發(fā)人員無(wú)法實(shí)現(xiàn)。認(rèn)證密鑰具有完整的信任鏈,該信任鏈的根在由賬本控制的主密鑰中,駐留在由賬本控制的HSM上。
賬本證明利用代碼證明和設(shè)備證明功能,向任何第三方證明由可證明開(kāi)發(fā)的應(yīng)用程序正在一個(gè)真正的賬本設(shè)備的TEE中運(yùn)行。賬本憑證有以下格式:

1.表示證明類(lèi)型和版本控制的前綴
2.設(shè)備的驗(yàn)證密鑰app_key_1。
3.在app_key_1上使用賬本根鍵進(jìn)行簽名
4.應(yīng)用的資料及簽名
賬本證明目前被Provable隨機(jī)數(shù)據(jù)源用于為智能合約、區(qū)塊鏈和非區(qū)塊鏈上的應(yīng)用程序提供未經(jīng)篡改的熵。
貯存和運(yùn)輸
真實(shí)性證明可以是相當(dāng)大的文件,最多可達(dá)幾千字節(jié)。直接在以太坊交易的數(shù)據(jù)負(fù)載結(jié)果中交付這種證明可能成本會(huì)非常昂貴,就EVM執(zhí)行成本而言,甚至對(duì)于更大的數(shù)據(jù)可能是不可能的。
此外,Provable努力成為區(qū)塊鏈不可知者,使證明甚至可以在比特幣和其他區(qū)塊鏈上使用。因此,證明被上傳并保存到分布式存儲(chǔ)系統(tǒng)IPFS中。在提供指向內(nèi)容的指針時(shí),IPFS使用一種稱(chēng)為multihash的自定義哈希算法。生成的地址是Base64編碼的,它是特定于文件的唯一ID,可以使用該ID對(duì)文件進(jìn)行全局訪(fǎng)問(wèn),并隨對(duì)所包含的文件的任何編輯而更改。
IPFS本身并不提供任何長(zhǎng)期的持久性保證,但是作為可證明基礎(chǔ)設(shè)施的一部分,它運(yùn)行IPFS持久性聯(lián)盟。任何人都可以加入可證明的聯(lián)盟,并通過(guò)將IPFS持久性聯(lián)盟節(jié)點(diǎn)指向以下聚合對(duì)等體來(lái)幫助保存所有證明的獨(dú)立副本:
QmSsSSfJAJwj3jsNfzbSrxtLAjhpYPjbUEsCQT8mWVgBiL
先進(jìn)的數(shù)據(jù)來(lái)源
隨機(jī)數(shù)據(jù)來(lái)源
Provable的隨機(jī)數(shù)據(jù)源利用賬本證明和自定義應(yīng)用程序來(lái)生成無(wú)偏隨機(jī)數(shù),并按需向區(qū)塊鏈和非區(qū)塊鏈應(yīng)用程序提供它們。最終應(yīng)用程序可以執(zhí)行驗(yàn)證步驟,以確定所提供的隨機(jī)性是否真的在Ledger Nano提供的安全硬件環(huán)境中生成。
本節(jié)將簡(jiǎn)要解釋自定義應(yīng)用程序的基本原理和內(nèi)部工作原理。
設(shè)計(jì)的主要目標(biāo)是:
1.Provable只能請(qǐng)求一次,對(duì)于一個(gè)特定的請(qǐng)求,給設(shè)備一個(gè)隨機(jī)數(shù)。后續(xù)請(qǐng)求將被拒絕或返回先前提取的號(hào)碼。
2.必須對(duì)隨機(jī)數(shù)進(jìn)行簽名,以驗(yàn)證設(shè)備生成的隨機(jī)數(shù)。
3.在區(qū)塊鏈應(yīng)用程序中,礦工不應(yīng)該能夠篡改訂單、有效性和投注結(jié)果
4.設(shè)計(jì)應(yīng)盡量減少在設(shè)備和鏈上使用狀態(tài)。
該體系結(jié)構(gòu)通過(guò)以下方式實(shí)現(xiàn)這些目標(biāo):
1.強(qiáng)制每個(gè)請(qǐng)求id的唯一性。設(shè)備保持一個(gè)merkelized, append-only的狀態(tài),其中看到的每個(gè)請(qǐng)求都被追加。
2.來(lái)自設(shè)備的所有數(shù)據(jù)都由應(yīng)用程序會(huì)話(huà)密鑰簽名,其公鑰存在于Provable的連接器中。請(qǐng)求可以通過(guò)一個(gè)精確的會(huì)話(huà)密鑰提交以接收結(jié)果。
3.承諾數(shù)據(jù)與請(qǐng)求一起發(fā)送,以將其錨定到特定的區(qū)塊鏈歷史記錄。承諾數(shù)據(jù)可以通過(guò)當(dāng)前塊信息(如時(shí)間戳、coinbase和以前的塊散列)以及與請(qǐng)求相關(guān)的額外信息((msg.sender,msg.value等)。
4.內(nèi)核有一個(gè)事件特性,它被用來(lái)增加應(yīng)用程序內(nèi)部計(jì)時(shí)器。請(qǐng)求可以并且應(yīng)該指定一個(gè)時(shí)間(以秒為單位),該時(shí)間必須在設(shè)備提供請(qǐng)求和返回的隨機(jī)數(shù)之前經(jīng)過(guò)。說(shuō)明符時(shí)間越長(zhǎng),針對(duì)礦工(無(wú)論是否有可證明的協(xié)作)篡改結(jié)果的安全性就越強(qiáng)。
5.使用ECDSA確定性簽名從承諾數(shù)據(jù)和會(huì)話(huà)私鑰生成隨機(jī)字節(jié);這避免了為標(biāo)記已服務(wù)的查詢(xún)而重新計(jì)算樹(shù)的代價(jià)。
這些操作的有效性由賬本證明來(lái)強(qiáng)制執(zhí)行。與隨機(jī)數(shù)據(jù)源相關(guān)的簽名和數(shù)據(jù)實(shí)際上附加到賬本證明中,并與結(jié)果一起返回。追加的數(shù)據(jù)格式如下:

1.應(yīng)用程序二進(jìn)制文件的SHA-256,由BOLOS內(nèi)核測(cè)
2.uniqueId散列
3.應(yīng)答請(qǐng)求之前所經(jīng)過(guò)的時(shí)間
4.必須返回的隨機(jī)字節(jié)數(shù)
5.由開(kāi)發(fā)人員選擇的承諾數(shù)據(jù)
6.應(yīng)用程序會(huì)話(huà)的簽名在請(qǐng)求數(shù)據(jù)上生效
7.應(yīng)用程序會(huì)話(huà)公鑰
8.驗(yàn)證密鑰app_key_1的簽名通過(guò)代碼哈希和會(huì)話(huà)公鑰
對(duì)隨機(jī)數(shù)據(jù)源的深入解釋和對(duì)攻擊場(chǎng)景的分析可以參考已發(fā)布的論文。
定價(jià)
使用Provable需要支付少量費(fèi)用,這取決于所使用的數(shù)據(jù)源類(lèi)型和所要求的真實(shí)性證明。下面列出的價(jià)格對(duì)以太坊和Rootstock都有效。查詢(xún)本身有一個(gè)基本價(jià)格。當(dāng)oraclize_query被調(diào)用時(shí),需要的ETH必須被轉(zhuǎn)移到Provable,以支付將回調(diào)事務(wù)發(fā)送回合約的費(fèi)用。
因?yàn)檫@個(gè)成本取決于代碼和首選項(xiàng)(gasprice),它可以根據(jù)兩者的不同而變化很大。為了避免不必要的成本,您應(yīng)該盡可能精確地估計(jì)和設(shè)置gas的價(jià)格和gas,以便您獲得合理的確認(rèn)時(shí)間,并使您的回調(diào)事務(wù)按照預(yù)期工作(而不會(huì)耗盡gas)。
第一次自由請(qǐng)求
為了方便測(cè)試,如果使用標(biāo)準(zhǔn)設(shè)置,從任何智能合約地址對(duì)可證明的第一次調(diào)用都是免費(fèi)的。這包括回調(diào)事務(wù)的gas成本。
Testnets政策
為了保持與部署的主網(wǎng)的兼容性,在任何測(cè)試網(wǎng)上驗(yàn)證的智能合約都需要支付與主網(wǎng)相同的費(fèi)用。由于預(yù)期的支付是在testnet Ether中,它沒(méi)有價(jià)值,對(duì)可證明的調(diào)用實(shí)際上是免費(fèi)的。經(jīng)證實(shí),保留權(quán)利停止濫用或過(guò)度使用服務(wù)。
調(diào)用費(fèi)用
oraclize_query在執(zhí)行時(shí)自動(dòng)恢復(fù)費(fèi)用。費(fèi)用由兩部分組成:
1.數(shù)據(jù)來(lái)源的美元價(jià)格和要求的真實(shí)性證明所對(duì)應(yīng)的Wei金額,使用最近的匯率
2.Provable將在gas中花費(fèi)的Wei數(shù)量用于發(fā)送回調(diào)事務(wù)

在線(xiàn)支付和離線(xiàn)支付
當(dāng)在鏈上支付時(shí),沒(méi)有可靠的向后兼容的方式來(lái)證明歸還gas“變化”。這是由于以太坊的工作方式:在交易得到確認(rèn)之前,不可能確定將使用的確切g(shù)as數(shù)量,因?yàn)樗Q于當(dāng)前狀態(tài)。之后將未用完的gas送回可能會(huì)產(chǎn)生副作用。
可證明現(xiàn)在也支持鏈下支付。當(dāng)使用該選項(xiàng)時(shí),你將得到未使用的gas,因?yàn)橘M(fèi)用發(fā)生在區(qū)塊鏈以外的預(yù)付帳戶(hù)。感興趣的人士請(qǐng)通過(guò)info@oraclize.it聯(lián)系
嵌套查詢(xún)
目前,嵌套查詢(xún)被定價(jià)為單個(gè)查詢(xún)。在不久的將來(lái),嵌套查詢(xún)的定價(jià)將是您決定使用的數(shù)據(jù)源的總和。目前,價(jià)格降至單個(gè)數(shù)據(jù)源,然而,您的智能合約應(yīng)該考慮到,在某些時(shí)候?qū)⑦m用完整的價(jià)格。
教程
在Provable的Youtube頻道,你可以找到一些有用的視頻開(kāi)始使用Provable的集成。