Web3js
使用 Node-js 部署智能合約
我想用 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
返回一個Promise
objcet,您需要解析它才能獲得實際值(例如,return await gasEstimate=web3.eth.estimateGas(...)
從函式內部使用async
)。
我在您的程式碼中看到了幾個錯誤:
- 不要使用絕對路徑,例如
fs.readFileSync('E:/Deploy/contracts/Deploy.sol','utf8');
但開始使用相對路徑,因為當您更改項目路徑或從其他設備執行它時,項目將無法執行。- 您正在循環遍歷所有契約,
contract_compiled.contracts
在循環完成後,您將如何將哪個契約 abi 保存在變數中contract_abi
?您只需要為這樣的所需契約採用 abi 定義contract_compiled.contracts[<NAME>]
。- 此外,您可能想在創建合約實例時傳遞地址參數
new web3.eth.Contract(contract_abi, <CONTRACT_ADDRESS>)
。