Solidity
web3 合約實例化
我正在嘗試
contract
使用 web3 創建一個對象。var contract_abi = result['contracts']['Test']["interface"]; //[{"constant":false,"inputs":[],"name":"inc","outputs":[],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"odd","type":"bool"},{"indexed":false,"name":"x","type":"uint256"}],"name":"Incremented","type":"event"}]; var contract = new web3.eth.Contract(contract_abi);
但是我不斷收到錯誤消息:
Uncaught Error: You must provide the json interface of the contract when instantiating a contract object.
但是,如果我複制我的 contract_abi 控制台輸出並直接創建一個變數,如下所示:
var contract_abi = [{"constant":false,"inputs":[],"name":"inc","outputs":[],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"odd","type":"bool"},{"indexed":false,"name":"x","type":"uint256"}],"name":"Incremented","type":"event"}];
有用。這是怎麼回事?謝謝
我不確定您的 abi 是否正確。但我正在編寫與智能合約互動並從原始碼生成 abi 的方式。
從原始碼生成 abi:
- 將您的程式碼粘貼到remix-online solidity 編譯器中。
- 點擊開始編譯以編譯您的程式碼。
- 如果你的程式碼編譯成功。點擊
Details
右上角的選項卡- 您將列出包括 abi 在內的屬性,從那裡複製 abi。
使用 web3 訪問合約:
- 初始化 web3 實例
- 使用以下程式碼獲取合約實例。
//For web3 versions 0.20.x var contract = web3.eth.contract(contractAbi).at(contractAddress); //For web3 1.0.x var contract = new web3.eth.Contract(contractAbi,contractAddress);
希望這可以幫助!
我剛剛遇到了這個問題,並且能夠通過在介面結果上執行 JSON.parse() 來解決它,所以在你的情況下它會是這樣的:
var contract_abi = JSON.parse(result['contracts']['Test']["interface"])
複製命令行的輸出並將其設置為變數的原因是因為當您複製它時,從技術上講,您將其從字元串更改為對象,這就是 JSON.parse 會做的事情:)