节点:断言:400 抛出错误; ^ AssertionError [ERR_ASSERTION]:指定的回调对象无效

Posted

技术标签:

【中文标题】节点:断言:400 抛出错误; ^ AssertionError [ERR_ASSERTION]:指定的回调对象无效【英文标题】:node:assert:400 throw err; ^ AssertionError [ERR_ASSERTION]: Invalid callback object specified 【发布时间】:2021-12-23 03:41:53 【问题描述】:

试图运行 node compile.js 但它抛出了我上面提到的错误和想法我做错了什么

我的收件箱.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"
  

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

【问题讨论】:

【参考方案1】:

只需在 '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;

【讨论】:

【参考方案2】:

它将适用于 solc 版本 0.4.17。

【讨论】:

【参考方案3】:

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

【讨论】:

我的solidity版本有什么问题 它也没有用【参考方案4】:

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

函数收件箱(字符串内存初始消息)... 和 函数 setMessage(string memory newMessage)...

【讨论】:

根本不工作

以上是关于节点:断言:400 抛出错误; ^ AssertionError [ERR_ASSERTION]:指定的回调对象无效的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 toThrow 和 Jest 断言异步方法抛出错误

cv2.imshow() 函数抛出断言错误

在发布中抛出断言但不是调试 - 一定是编译器错误?

Assert断言

CV2(cv2.imwrite)- Python 不断抛出“断言失败”错误

当抛出的任何错误都没有冒泡时,如何在 Promise 中进行断言?