Compiler
試圖編譯執行:’node compile.js’,但得到錯誤:“assert.js:350 throw err;”在d和米是′CompleteDevelopersGuid和′C哦,你的_在d和米是′C這米pl和噸和D和在和l這p和rsG在一…
這是Udemy 課程的第一份契約。
嘗試通過執行進行編譯:“node compile.js”,但出現以下錯誤:
iii@iii:~/inbox$ node compile.js assert.js:350 throw err; ^ AssertionError [ERR_ASSERTION]: Invalid callback object specified. at runWithCallbacks (/home/iii/Digital Ledger/inbox/node_modules/solc/wrapper.js:97:7) at compileStandard (/home/iii/Digital Ledger/inbox/node_modules/solc/wrapper.js:207:14) at Object.compileStandardWrapper [as compile] (/home/iii/Digital Ledger/inbox/node_modules/solc/wrapper.js:214:14) at Object.<anonymous> (/home/iii/Digital Ledger/inbox/compile.js:9:6) at Module._compile (internal/modules/cjs/loader.js:689:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10) at Module.load (internal/modules/cjs/loader.js:599:32) at tryModuleLoad (internal/modules/cjs/loader.js:538:12) at Function.Module._load (internal/modules/cjs/loader.js:530:3) at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
這是我的“compile.js”程式碼:
const path = require('path'); const fs = require('fs'); const solc = require('solc'); const inboxPath = path.resolve(__dirname, 'contracts', 'inbox.sol'); const source = fs.readFileSync(inboxPath, 'utf8'); module.exports = solc.compile(source, 1);
和簡單的契約:
pragma solidity ^0.4.17; contract Inbox { string public message; function Inbox(string iniMess) public { message = iniMess; } function setMess(string newMess) public { message = newMess; } }
這是文件結構:
-inbox -node_modules -contracts -inbox.sol -package.json -package-lock.json -compile.js
感謝您的任何幫助 :)
該課程已過時,solidity 版本 0.6.6 已發布,您最好將程式碼更新到該版本。如果你不是一個優秀的程序員,你最好退還那門課,因為你以後會遇到很多問題,你會看到使用元遮罩和 Web3 的一些錯誤。這門課程教給你很多東西,所以我真的建議你繼續學習這門課程,並在整個課程中不斷更新自己。這是第一個問題,更新版本的解決方案就是這個。
這將是您的“inbox.sol”程式碼:
pragma solidity ^0.6.6; contract Inbox{ string public message; constructor (string memory initialMessage) public{ message = initialMessage; } function setMessage(string memory newMessage) public{ message = newMessage; } }
這將是您的“compile.js”程式碼:
const path = require('path'); const fs = require('fs'); const solc = require('solc'); const inboxpath = path.resolve(__dirname, 'Contracts', 'Inbox.sol'); const source = fs.readFileSync(inboxpath, 'UTF-8'); var input = { language: 'Solidity', sources: { 'Inbox.sol' : { content: source } }, settings: { outputSelection: { '*': { '*': [ '*' ] } } } }; var output = JSON.parse(solc.compile(JSON.stringify(input))); exports.abi = output.contracts['Inbox.sol']['Inbox'].abi; exports.bytecode = output.contracts['Inbox.sol']['Inbox'].evm.bytecode.object;
在新的solidity中,與舊編譯器相比,編譯器將為您提供另一個版本的編譯程式碼,因此您需要將json文件傳遞給您的編譯器,並且為了訪問abi(介面)和字節碼,您需要像我一樣做在這裡做了。
@Anurag 的回答是正確的。您只需要檢查您的版本,請注意該課程中某些庫的版本已過時。一個重要的例子是“web3”。講師會告訴您安裝特定版本,但您必須使用命令安裝最新版本
npm install --save web3
除此之外,truffle-hdwallet-provider 也被棄用了。因此,請確保安裝最新版本,我相信它是 @truffle/hdwallet-provider(最新版本將與課程完美配合,您只需對部署腳本進行一些小調整。
我已經完成了那門課程,我可以自信地說這是一門很棒的課程。如果沒有這麼好的參考資料,你將迷失在區塊鏈的狂野世界中。