首页 > 解决方案 > 编译solidity代码时出现ParserError

问题描述

我是新来的。这是我执行 node compile.js 时的第一个简单项目,我收到以下错误:

我的错误:

{
contracts: {},
  errors: [
    ":7:16: ParserError: Expected identifier, got 'LParen'\n" +
      '    constructor(string initialMessage) public{\r\n' +   
      '               ^\n'
  ],
  sourceList: [ '' ],
  sources: {}
}

我的 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');

console.log(solc.compile(source,1));

我的收件箱.sol

pragma solidity ^0.4.17;

contract Inbox {
    
    string public message;
    
    constructor(string initialMessage) public{
        message = initialMessage;
    }
    
    function setMessage(string newMessage) public{
        message = newMessage;
    }
}

标签: node.jssolidity

解决方案


我不确定您为什么尝试使用 node.js 本地编译您的智能合约。这是一种相当繁琐的方法(尽管它可以完成,尽管您需要做更多的工作),尤其是当为此目的已经存在工具时。

首选方法是使用诸如最新构建的truffle之类的工具(这是一个 CLI 工具,可通过 NPM 以 NodeJS 包的形式提供,用于编译、部署和测试智能合约),而不是使用 NodeJS 进行编译。

只需使用以下命令从控制台将松露安装为全局包:

npm install -g truffle

然后导航到您的项目根目录并运行:

truffle init

这将生成一个准系统项目结构,其中包含所需的一切(例如合同和迁移的目录)。

项目启动后,打开 truffle -config.js文件并添加项目所需的配置:

module.exports = {
    networks: {
        //Configuration for localhost private dev network for testing code
        development: {
            host: "127.0.0.1",
            port: 8545,
            network_id: "*" //Match any network id
        }
        //Connecting to the main, live ethereum network requires different config
        //and should NOT be used for development purposes.
        //Only after your contracts have been thoroughly tested and audited should you deploy a production ready project to the main net.
    },
    compilers: {
        solc: {
            version: "0.6.2"
        }
    }
};

您可以指定适合您需要的任何编译器版本,但是,现在大多数合约应该针对0.6.0 及更高版本以获取最新功能。

在此处了解有关自定义 Truffle 配置的更多信息!

现在,这允许您指定要部署到的网络和特定的 Solidity 编译器(如果系统上不存在 truffle 将自动下载正确的版本)以在编译项目时运行。

完成后,您可以使用以下命令轻松编译您的合约:

truffle compile --all --network development

请注意, --network 的参数必须与 truffle -config.js的网络对象中的条目匹配(尽管仅用于编译,但不必指定网络,仅用于部署)。

那么你去吧!你已经编译了你的第一个智能合约。

但是,有一个警告

此时,您没有要部署到的本地测试网络。

部署合约时,重要的是要注意在测试和审计之前不要将未经测试的代码部署到实时主网络。

由于对区块链的任何更改都是永久性的,因此无法撤消将有缺陷的合约部署到实时区块链,并且任何错误都可以并且将被恶意代理无限期地利用。

为了解决这个问题,trufflesuite 团队还提供了ganache-cli(以及其他各种有用的工具),用于在 localhost 上运行私有测试网络。这个包也可以通过 NPM 获得,但是这超出了这个答案和你的问题的范围。

希望能帮助你入门,祝你好运!


推荐阅读