Compiler

試圖編譯執行:’node compile.js’,但得到錯誤:“assert.js:350 throw err;”在d和米是′CompleteDevelopersGuid和′C哦,你的_在d和米是′C這米pl和噸和D和在和l這p和rsG在一…

  • June 22, 2021

這是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(最新版本將與課程完美配合,您只需對部署腳本進行一些小調整。

我已經完成了那門課程,我可以自信地說這是一門很棒的課程。如果沒有這麼好的參考資料,你將迷失在區塊鏈的狂野世界中。

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