Solidity

web3 合約實例化

  • October 4, 2018

我正在嘗試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 會做的事情:)

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