帶有 Truffle 和 Testrpc 的 Oracle (oraclize.it)
正如我在區塊鏈中所理解的那樣,“不可能”與區塊鏈之外的 Web 服務進行互動。這必須通過預言機完成,以驗證請求是否安全,並且可以在區塊鏈中完成狀態更改。請糾正我,如果我錯了。
我目前正在使用 Testrpc、Truffle 和 React 來測試我的智能合約。現在我想將 oraclize.it 集成到我的環境中。做這個的最好方式是什麼?
我試圖將testexamples複製到我的 Contract 文件夾中,但在契約中有這個參考:
import "github.com/oraclize/ethereum-api/oraclizeAPI.sol";
如何將此引用集成到我的文件夾結構中?
我試圖將以下文件複製到我的契約文件夾:
https://github.com/oraclize/ethereum-api/
但我有幾個錯誤。
用 Truffle 和 Testrpc/Ganache 實現 Oraclize 的最佳方法是什麼?
非常有可能將 Oraclize 服務與 testrpc 和 truffle 一起使用。
首先,您需要遵循 truffle 中合約文件名的命名約定。根據他們的文件:
Truffle 希望你的合約文件定義與其文件名完全匹配的合約
因此,您應該從 Oraclize github repo 下載 Oraclize API,這裡是文件oraclizeAPI_0.4.sol的特定連結。將其下載到工作目錄的 truffle contracts 文件夾,並將文件重命名為
usingOraclize.sol
. 這是必需的,因此在編譯時,truffle 知道要從文件中編譯哪個特定合約。另一種選擇是將所有 API 直接粘貼到所需的契約中,但添加和重命名 API 本身可能是我目前所知道的最優雅的解決方案。現在,您將能夠在該文件夾中的其他合約上導入 API,
import "usingOraclize.sol"
方法是在它們的開頭包含它們,然後在其中的適當合約上指定其繼承,假設您需要 API 的範例合約的名稱是 namedmyContract
,繼承方法應該看起來像contract myContract is usingOraclize { // your code }
下一步是讓您的私有 testrpc 鏈能夠與 Oraclize 服務通信,使其能夠發送請求並接收返回結果。為此,您將需要ethereum-bridge。Git 將該儲存庫複製到某處的單獨文件夾中。顧名思義,這座橋的作用是在 Oraclize 服務和您的區塊鏈執行時為您建立一座橋樑。
一旦正確設置了 ethereum-bridge,testrpc 應該配置為使用一組靜態地址,因為橋將依賴於指定的地址來在您的私有 testrpc 鏈上部署其所需的合約,因此,如果您希望這些地址保持不變,在 testrpc 執行之間,您應該使用一些可重用的地址執行 testrpc。您可以通過
--mnemonic
在啟動它時添加標誌並在重新啟動 testrpc 時使用相同的助記詞來執行此操作,以確保它生成相同的 Oraclize OAR (OraclizeAddressResolver),您將需要在下一步中使用它。現在,我們需要找出網橋生成的 OAR。
- 使用特定的助記詞啟動 testrpc,並記下最後一個可用帳戶的索引,(您可以為此使用 any,但我建議使用最後一個,因為它是一個不應該在測試中使用的帳戶,也使確實生成了足夠多的其他帳戶供您進行測試使用)。這是一個範例啟動參數:
testrpc --mnemonic "my test example" --accounts 50
由於生成了 50 個帳戶,因此最後一個地址的索引為 49。
- 執行 eth-bridge,並獲取使用此 testrpc 鏈生成的 OAR。我假設 testrpc 在預設的 RPC 主機:localhost:8545 的埠上執行,如果不是,您將需要額外的參數。轉到 ethereum-bridge 所在的根目錄,然後在終端中執行以下命令。
node bridge -a 49
步驟 2 的以下部分僅需要在您的首次執行時完成
現在等待,直到你看到這條線:
Please add this line to your contract constructor: OAR = OraclizeAddrResolverI(0x145437eac36aeacee0c135c9015fff316ba938ed);
您的地址當然應該不同,因為您將使用不同的助記詞。在建構子的開頭添加該特定行,
myContract
使其如下所示:contract myContract is usingOraclize { function myContract() { OAR = OraclizeAddrResolverI(0x145437eac36aeacee0c135c9015fff316ba938ed); // rest of your constructor code } // your code }
- 現在您已準備好開始在 truffle 上進行編譯並進行所需的任何測試,只需確保始終使用相同的參數執行第 1 步和第 2 步,並且您不必從合約中更改 OAR!(請記住在生產之前從您的建構子中刪除 OAR 變數,這只是為了測試,在生產中它會根據您正在執行它的鏈自動獲取 OAR,目前是 Mainnet、Ropsten 和 browser-solidity VM 環境支持。)
這些說明似乎有效(橋接腳本執行正常),但是當我實際撥打電話時,我收到“在數據庫中找不到密鑰”錯誤。