Web3js

使用 Node-js 部署智能合約

  • April 12, 2020

我想用 Node-js 部署一個智能合約。我遵循了本指南,但是在我努力實例化我的智能合約時發生了錯誤。

應用程序.js:

var Web3=require('web3');
var fs=require('fs');
var solc=require('solc');

var web3=new Web3('ws://127.0.0.1:8545');
var address="0x7c028611F45a40a0ef035416B6bFc405F190990c";
var contract_sol=fs.readFileSync('E:/Deploy/contracts/Deploy.sol','utf8');
var contract_compiled=solc.compile(contract_sol);
for (let contractName in contract_compiled.contracts) {
var contract_byteCode=contract_compiled.contracts[contractName].bytecode;
var contract_abi=JSON.parse(contract_compiled.contracts[contractName].interface);
}
var gasEstimate=web3.eth.estimateGas({data:contract_byteCode});
var gasResult;
var contract=new web3.eth.Contract(contract_abi);

在最後一行發生錯誤:

Error: You must provide the json interface of the contract when instantiating a contract object.

可能contract_compiled.contracts[contractName]沒有名為 的欄位interface

這意味著contract_compiled.contracts[contractName].interface == undefined.

我相信你正在尋找的領域叫做_jsonInterface.

但無論哪種情況,請幫自己一個忙:

console.log(JSON.stringify(contract_compiled.contracts[contractName], null, 4));

找出該欄位的真實名稱並使用它。


另請注意,它web3.eth.estimateGas返回一個Promiseobjcet,您需要解析它才能獲得實際值(例如,return await gasEstimate=web3.eth.estimateGas(...)從函式內部使用async)。

我在您的程式碼中看到了幾個錯誤:

  1. 不要使用絕對路徑,例如fs.readFileSync('E:/Deploy/contracts/Deploy.sol','utf8');但開始使用相對路徑,因為當您更改項目路徑或從其他設備執行它時,項目將無法執行。
  2. 您正在循環遍歷所有契約,contract_compiled.contracts在循環完成後,您將如何將哪個契約 abi 保存在變數中contract_abi?您只需要為這樣的所需契約採用 abi 定義contract_compiled.contracts[<NAME>]
  3. 此外,您可能想在創建合約實例時傳遞地址參數new web3.eth.Contract(contract_abi, <CONTRACT_ADDRESS>)

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