【问题标题】:How to compile solidity using solc 0.5如何使用 solc 0.5 编译solidity
【发布时间】:2019-06-22 01:35:06
【问题描述】:

编译.js:

const path = require('path');
const solc = require('solc');
const fs = require('fs-extra');

const buildPath = path.resolve(__dirname, 'build');
fs.removeSync(buildPath);

const campaignPath = path.resolve(__dirname, 'contracts', 'Campaign.sol');
const source = fs.readFileSync(campaignPath, 'utf8');

var input = {
    language: 'Solidity',
    sources: {
        'Campaign.sol': {
            content: source
        }
    },
    settings: {
        outputSelection: {
            '*': {
                '*': [ '*' ]
            }
        }
    }
}

const output = solc.compile(input, 1).contracts;

fs.ensureDirSync(buildPath);

for(let contract in output){
    fs.outputJSONSync(
        path.resolve(buildPath, contract+'.json')
    );
}

Campaign.sol:

pragma solidity ^0.5.3;

contract FactoryCampaign {
    . . .
}

contract Campaign {
    . . . 
}

Solidity 在混音编辑器中完美运行,solc 版本为 0.5.3

solc 0.4 版允许我直接在“源”上调用 solc.compile,但更高版本会抛出此错误

AssertionError [ERR_ASSERTION]:指定的回调无效。

【问题讨论】:

    标签: javascript ethereum solidity smartcontracts


    【解决方案1】:

    使用 Solidity 编译器版本 >= 0.5.0,调用 solc.compile 的语法已更改。

    你会想要使用这样的东西:

    const buildPath = path.resolve(__dirname, 'build');
    const output = JSON.parse(solc.compile(JSON.stringify(input)));
    
    if(output.errors) {
        output.errors.forEach(err => {
            console.log(err.formattedMessage);
        });
    } else {
        const contracts = output.contracts["Campaign.sol"];
        for (let contractName in contracts) {
            const contract = contracts[contractName];
            fs.writeFileSync(path.resolve(buildPath, `${contractName}.json`), JSON.stringify(contract.abi, null, 2), 'utf8');
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-11
      • 2022-07-12
      • 2020-03-07
      • 2022-08-11
      • 1970-01-01
      • 2017-02-18
      • 2021-12-16
      • 1970-01-01
      • 2022-11-25
      相关资源
      最近更新 更多