0

/buildディレクトリに.jsonファイルを生成しながら、ディレクトリ内の多数の.solファイルを一度にコンパイルできる別の答えを見つけたかなり良いコードだと思ったものを活用しようとしています。

私はこれに数日間しっかりと費やしました...しかし、突破することはできません. 以下のコードとコンソール ログ ステートメントからわかるように、compile.js は次のとおりです。

  1. /contracts フォルダー内のすべての contract.sol ファイルを読み取ります... そのうち 7 つあります。 .

  2. /build フォルダーとその内容を削除し、コンパイルを行う前に再作成しています。

  3. solc.compile 行で次のエラーが発生し、「/////// Output is - 」の下のエラーに従って出力されるコンソール ログが出力されます。

    エラー: [ '入力 JSON の解析エラー: * 行 1、列 1\n' + ' 構文エラー: 値、オブジェクトまたは配列が必要です。\n' + '* 行 1、列 1\n' + ' 有効な JSON ドキュメント配列またはオブジェクト値のいずれかでなければなりません。\n' ]

  4. for ループに入りますが、errors.json ファイルの /build ディレクトリにあるエラー以外は出力されないようです。

私のプログラムはすべて pragma ^0.4.25 であり、package.json ファイルの solc コンパイラ バージョンも同様です。

経験豊富な目が問題を見て、このコンパイル手順を完了するのを手伝ってくれることを切望しています。

多くの人が Truffle の使用を提案することは知っていますが、これは既存の React アプリであり、a) ゼロから始めたくありません。b) この重要な solc.compile ステップと for の次のコードを本当に理解したいです。ループ!

PS コントラクトは、Remix でクリーンにコンパイル、デプロイ、および動作します。

しかし、さまざまな Ethereum トランザクションを開始できるように、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**
4

1 に答える 1

-1

試す:

var output = JSON.parse(solc.compile(JSON.stringify(input).sources)));
于 2021-01-28T08:13:56.340 に答える