Contract-Design
無效的 JSON RPC 響應
我正在嘗試將我的智能合約與 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 呼叫對我來說成功通過。祝你好運!