Contract-Design

無效的 JSON RPC 響應

  • April 25, 2018

我正在嘗試將我的智能合約與 Oraclize 聯繫起來以獲取隨機數。這是我的契約程式碼:

pragma solidity ^0.4.2;

import "./usingOraclize.sol";

contract Blackjack is usingOraclize{

  uint public random;

  event Paid(address indexed _from, uint _value);

  function() external payable {
      Paid(msg.sender, msg.value);
  }

  function Blackjack() public {
      OAR = OraclizeAddrResolverI(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475);
  }

  function getRandom() public constant {
      oraclize_newRandomDSQuery(0, 4, 200000);
  }

  function __callback(bytes32 _queryId, string _result, bytes _proof) public{
       random = uint(keccak256(_result)) % 52 + 1;
  }
}

我使用 Ganache 作為私有區塊鏈 (GUI)。

呼叫 getRandom() 會在 truffle 控制台中導致以下堆棧跟踪

Error: Invalid JSON RPC response: {"id":12,"jsonrpc":"2.0"}
at XMLHttpRequest._onHttpResponseEnd (C:\Users\adimi\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\xhr2\lib\xhr2.js:509:1)
at XMLHttpRequest._setReadyState (C:\Users\adimi\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\xhr2\lib\xhr2.js:354:1)
at XMLHttpRequestEventTarget.dispatchEvent (C:\Users\adimi\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\xhr2\lib\xhr2.js:64:1)
at XMLHttpRequest.request.onreadystatechange (C:\Users\adimi\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\web3\lib\web3\httpprovider.js:128:1)
at C:\Users\adimi\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\truffle-provider\wrapper.js:134:1
at C:\Users\adimi\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\web3\lib\web3\requestmanager.js:86:1
at Object.InvalidResponse (C:\Users\adimi\AppData\Roaming\npm\node_modules\truffle\build\webpack:\~\web3\lib\web3\errors.js:38:1)

我還向合約發送了 3 個乙太幣來支付 Oraclize 呼叫。

編輯:我已經設置了 ethereum-bridge,當我收到錯誤時它正在執行。

這個過程在 macOS 上對我有用:

在您的電腦上全域安裝松露。

$ sudo npm install -g truffle

在您的電腦上安裝 ganache-cli。遺憾的是,Ganache 的 GUI 版本不再適用於我們的目的,因為它缺少乙太坊橋(解鎖帳戶)所需的功能。

$ sudo npm install -g ganache-cli

複製你的倉庫(如果你還沒有)並安裝節點包。

$ git clone <repo>
$ cd <repo>
$ npm install

我們需要安裝乙太坊網橋,它讓我們可以從我們的測試環境呼叫 Oraclize。

安裝乙太坊橋。不要在內部執行此操作

$$ repo $$目錄。

$ git clone https://github.com/oraclize/ethereum-bridge.git
$ cd ethereum-bridge
$ npm install

乙太坊橋(即將被 Stargate 取代)需要舊版本的節點。

使用此頁面上的說明安裝節點版本管理器 (nvm):https ://github.com/creationix/nvm/blob/master/README.md

確保安裝了最新版本的節點。

$ nvm install node

使用最新的節點版本(撰寫本文時為 9.x)啟動 ganache-cli。

$ nvm use node
$ ganache-cli --unlock 0 --unlock 1 --deterministic --mnemonic "candy maple cake sugar pudding cream honey rich smooth crumble sweet treat"

打開一個新的終端視窗,移動到您的乙太坊網橋目錄,並使用節點 6.9.1 啟動乙太坊網橋。完成啟動需要一段時間。

$ cd etherem-bridge
$ nvm use 6.9.1
$ node bridge -H 127.0.0.1:8545 -a 1 --dev

打開第三個終端視窗並在

$$ repo $$節點 9.x 的目錄

$ cd <repo>
$ nvm use node
$ truffle test

通過 Truffle 控制台或前端應用程序與應用程序互動。

$ cd <repo>
$ nvm use node
$ truffle deploy

我從來沒有打電話給 getRandom()。URL 呼叫對我來說成功通過。祝你好運!

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