[英]Solidity (solc) compile challenge
我正在嘗試利用我認為非常好的代碼,我發現另一個答案允許我一次編譯目錄中的多個.sol 文件,同時在 /build 目錄中生成 .json 文件。
我已經為此花了好幾天的時間……但無法突破。 從下面的代碼和控制台日志語句中可以看出,我知道 compile.js 是:
讀取 /contracts 文件夾中的所有 contract.sol 文件......其中有 7 個。(它們都很短。只有其中一個被編碼。rest 只有 pragam 聲明以及合同名稱聲明) .
它正在刪除 /build 文件夾及其內容並在編譯之前重新創建它。
它在 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' ]
它進入了 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.