Solidity (solc) 编译挑战

Posted

技术标签:

【中文标题】Solidity (solc) 编译挑战【英文标题】:Solidity (solc) compile challenge 【发布时间】:2021-03-11 05:56:24 【问题描述】:

我正在尝试利用我认为非常好的代码来找到另一个答案,该答案允许我一次编译目录中的多个 .sol 文件,同时在 /build 目录中生成 .json 文件。

我已经为此花费了几天的时间……但无法突破。从下面的代码和控制台日志语句中可以看出,我知道 compile.js 是:

    读取 /contracts 文件夹中的所有 contract.sol 文件...其中有 7 个。(它们都很短。只有一个被编码。其余的只有 pragam 声明和合同名称声明)。

    它正在删除 /build 文件夹及其内容并在编译之前重新创建它。

    它在 solc.compile 行和控制台日志上收到以下错误,根据以下错误输出 '/////// 输出是 - '。

    错误:[ '解析输入 JSON 时出错:* 第 1 行,第 1 列\n' + ' 语法错误:需要值、对象或数组。\n' + '* 第 1 行,第 1 列\n' + ' 有效的 JSON 文档必须是数组或对象值。\n' ]

    它进入了 for 循环...但似乎除了错误.json 文件中 /build 目录中的错误之外没有输出任何内容。

我的程序都是 pragma ^0.4.25,我的 package.json 文件中的 solc 编译器版本也是如此。

我非常希望有经验的人能够看到问题并帮助我完成这个编译步骤。

我知道很多人会建议使用 Truffle,但这是一个预先存在的 React 应用程序,并且 a) 我不想从头开始 b) 我真的很想了解这个关键的 solc.compile 步骤和以下代码在 for 循环中!

附:合约可以在 Remix 中干净地编译、部署和工作。

但我需要访问 React 应用程序中的接口和字节码,以便我可以启动许多不同的以太坊交易。

谢谢。

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

// Pointing path to build folder so that we can delete everything in it.
// Fetch path of build
const buildPath = path.resolve(__dirname, "build");

// Removes folder build and every file in it
fs.removeSync(buildPath);

// Fetch all Contract files in Contracts folder
const contractsPath = path.resolve(__dirname, "contracts");
const fileNames = fs.readdirSync(contractsPath);

// console.log("buildPath - ", buildPath);
// console.log("contractsPath - ", contractsPath);
// console.log("fileNames is - ", fileNames);

// Gets ABI of all contracts into variable input
const input = fileNames.reduce(
    (input, fileName) => 
        const filePath = path.resolve(__dirname, "contracts", fileName);
        const source = fs.readFileSync(filePath, "utf8");
        return  sources:  ...input.sources, [fileName]: source  ;
    ,
     sources:  
);

console.log("input contains these SCs - ", input);

// Re-Create build folder for output files from each contract
fs.ensureDirSync(buildPath);

console.log("Recreated the directory...");

// Compile all contracts
// const output = solc.compile(input, 1).contract;
var output = solc.compile(JSON.stringify(input).sources);

console.log("//////// OUTPUT is - ", output);

// Output contains all objects from all contracts
// Write the contents of each to different files
for (let contract in output) 
    console.log("In the for loop...");
    fs.outputJsonSync(
        path.resolve(buildPath, contract.replace(":", "") + ".json"),
        // path.resolve(buildPath, contract.split(":")[1] + ".json"),
        output[contract]
        );
    console.log("/// Interface - ", output[contract].interface);
    console.log("/// Bytecode - ", output[contract].bytecode);



// ----------------------------------------------
// const bytecode = output.contracts[0].bytecode;
// const abi = JSON.parse(output.contracts[0].interface);

// console.log('\nBytecode: ', bytecode, '\nABI: ', abi);
**strong text**

【问题讨论】:

【参考方案1】:

试试:

var output = JSON.parse(solc.compile(JSON.stringify(input).sources)));

【讨论】:

以上是关于Solidity (solc) 编译挑战的主要内容,如果未能解决你的问题,请参考以下文章

HPB44:Solidity编译器和简单调试

以太坊区块链 Solidity solc是什么

Py-solc 和 Solidity 导入

使用编译器——Solidity中文文档

solidity数据类型storage memory calldata modifier前置条件 继承 接口合约 导入库 using...for solc编译

Mac geth中不能编译Solidity代码解决方案