node:assert:400 抛出错误; ^ AssertionError [ERR_ASSERTION]: 指定的回调对象无效

node:assert:400 throw err; ^ AssertionError [ERR_ASSERTION]: Invalid callback object specified

尝试 运行 节点 compile.js 但它让我想到了上面提到的错误和我正在做的错误的想法

我的inbox.sol

pragma solidity ^0.8.9;

contract Inbox{
    string public message;

    function Inbox(string intialMessage) public {
        message = intialMessage;
    }

    function setMessage(string newMessage) public {
        message = newMessage;
    }
}

我的package.json

{
  "dependencies": {
    "ganache-cli": "^6.12.2",
    "mocha": "^9.1.3",
    "solc": "^0.8.9",
    "web3": "^1.6.0"
  }
}

我是这项技术的初学者,感谢您的宝贵时间

只需在函数参数中出现的两个字符串后添加内存即可。

函数收件箱(字符串内存initialMessage)... 和 function setMessage(string memory newMessage)...

该课程已过时,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(接口) 和字节码你需要像我在这里做的那样。

它将与 solc 版本 0.4.17 一起使用。

只需在 'compile.js' 中像这样重写代码。即使在 0.8.0 版本的 solidity 中也能正常工作

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)));

// console.log(output.contracts['Inbox.sol']['Inbox']);

// exports.abi = output.contracts['Inbox.sol']['Inbox'].abi;
// exports.bytecode = output.contracts['Inbox.sol']['Inbox'].evm.bytecode.object;