簡體   English   中英

Solidity (solc) 編譯挑戰

[英]Solidity (solc) compile challenge

我正在嘗試利用我認為非常好的代碼,我發現另一個答案允許我一次編譯目錄中的多個.sol 文件,同時在 /build 目錄中生成 .json 文件。

我已經為此花了好幾天的時間……但無法突破。 從下面的代碼和控制台日志語句中可以看出,我知道 compile.js 是:

  1. 讀取 /contracts 文件夾中的所有 contract.sol 文件......其中有 7 個。(它們都很短。只有其中一個被編碼。rest 只有 pragam 聲明以及合同名稱聲明) .

  2. 它正在刪除 /build 文件夾及其內容並在編譯之前重新創建它。

  3. 它在 solc.compile 行和控制台日志中出現以下錯誤,即 output 根據以下錯誤“/////// Output is -”。

    errors: [ 'Error parsing input JSON: * Line 1, Column 1\n' + ' Syntax error: value, object or array expected.\n' + '* Line 1, Column 1\n' + ' A valid JSON document必須是數組或 object 值。\n' ]

  4. 它進入了 for 循環......但 output 除了errors.json 文件中的/build 目錄中的錯誤之外似乎沒有任何其他內容。

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

我渴望有經驗的眼睛看到問題並幫助我完成這個編譯步驟。

我知道很多人會建議使用 Truffle,但這是一個預先存在的 React 應用程序,a)我不想從頭開始,b)我真的想了解這個關鍵的 solc.compile 步驟和 for環形!

PS 合約可以在 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**

嘗試:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM