Contract-Debugging

帶有 Truffle 和 Testrpc 的 Oracle (oraclize.it)

  • April 13, 2018

正如我在區塊鏈中所理解的那樣,“不可能”與區塊鏈之外的 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 的範例合約的名稱是 named myContract,繼承方法應該看起來像

contract myContract is usingOraclize {
   // your code
}

下一步是讓您的私有 testrpc 鏈能夠與 Oraclize 服務通信,使其能夠發送請求並接收返回結果。為此,您將需要ethereum-bridge。Git 將該儲存庫複製到某處的單獨文件夾中。顧名思義,這座橋的作用是在 Oraclize 服務和您的區塊鏈執行時為您建立一座橋樑。

一旦正確設置了 ethereum-bridge,testrpc 應該配置為使用一組靜態地址,因為橋將依賴於指定的地址來在您的私有 testrpc 鏈上部署其所需的合約,因此,如果您希望這些地址保持不變,在 testrpc 執行之間,您應該使用一些可重用的地址執行 testrpc。您可以通過--mnemonic在啟動它時添加標誌並在重新啟動 testrpc 時使用相同的助記詞來執行此操作,以確保它生成相同的 Oraclize OAR (OraclizeAddressResolver),您將需要在下一步中使用它。

現在,我們需要找出網橋生成的 OAR。

  1. 使用特定的助記詞啟動 testrpc,並記下最後一個可用帳戶的索引,(您可以為此使用 any,但我建議使用最後一個,因為它是一個不應該在測試中使用的帳戶,也使確實生成了足夠多的其他帳戶供您進行測試使用)。這是一個範例啟動參數:

testrpc --mnemonic "my test example" --accounts 50

由於生成了 50 個帳戶,因此最後一個地址的索引為 49。

  1. 執行 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
}
  1. 現在您已準備好開始在 truffle 上進行編譯並進行所需的任何測試,只需確保始終使用相同的參數執行第 1 步和第 2 步,並且您不必從合約中更改 OAR!(請記住在生產之前從您的建構子中刪除 OAR 變數,這只是為了測試,在生產中它會根據您正在執行它的鏈自動獲取 OAR,目前是 Mainnet、Ropsten 和 browser-solidity VM 環境支持。)

這些說明似乎有效(橋接腳本執行正常),但是當我實際撥打電話時,我收到“在數據庫中找不到密鑰”錯誤。

引用自:https://ethereum.stackexchange.com/questions/11383