Contract-Development

未創建契約的 .json 文件

  • April 10, 2022

我真的是新手,ethereumsolidity很難弄清楚如何獲得.json契約的等價物。

我有Campaign.sol里面的contractsFolder。該Campaign.sol文件有 2 個名為CampaignMgr和的契約CampaignFactory

我的 package.json 文件如下所示:

{
 "name": "kickstarter",
 "version": "1.0.0",
 "description": "",
 "main": "index.js",
 "scripts": {
   "test": "echo \"Error: no test specified\" && exit 1"
 },
 "author": "zake",
 "license": "ISC",
 "dependencies": {
   "fs-extra": "^9.0.0",
   "ganache-cli": "^6.9.1",
   "mocha": "^7.0.1",
   "solc": "^0.4.17",
   "web3": "^1.0.0-beta.26"
 }
}

我的 compile.js 程式碼是:

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


const buildPath = path.resolve(__dirname, 'build');
fs.removeSync(buildPath); //removes folder and its contains

const campaignPath = path.resolve(__dirname, 'contractsFolder', 'Campaign.sol');

const source = fs.readFileSync(campaignPath, 'UTF-8');
const output = solc.compile(source, 1).contracts;


fs.ensureDirSync(buildPath); //checks if directory exists. if not creates for us


for(let ctrct in output)
{
 fs.outputJsonSync(
   path.resolve(buildPath, ctrct+ '.json' ),
   output[ctrct]
 );
}

它應該在 build 文件夾中輸出 2 個 json 文件:CampaignMgr.json,但我從來沒有得到與契約等效的 json 文件。:CampaignFactory.json

我希望有人能準確指出我做錯了什麼。如果您需要程式碼中的其他內容,請告訴我。

Campaign.sol 文件有 2 個合約,分別命名CampaignMgrCampaignFactory

Solidity 編譯器的基本輸入單元是合約,而不是文件:

  • 如果您為每個契約創建一個文件,並且為文件和契約使用相同的名稱,那麼是的 - 每個文件都有一個工件,名稱完全相同
  • 如果您為每個契約創建一個文件,但您為文件和契約使用不同的名稱,那麼您將獲得每個文件一個工件,但使用契約的名稱
  • 如果您將多個契約放在一個文件中(並且顯然為每個契約使用不同的名稱),那麼每個契約您都會獲得一個工件,其中包含契約的名稱

正如您在所有情況下看到的那樣,Solidity 編譯器為每個合約生成一個工件,並帶有該合約的名稱;您選擇在不同文件之間拆分它們的方式在這裡沒有影響。

我自己去回答(最後感謝上帝)。

我正在提供詳細資訊,以防將來有人從中獲得幫助。

關鍵是 atom 不支持任何以 ..json開頭的文件:

因此我們要做的就是用空字元串替換它,即

path.resolve(buildPath, contract.replace(':', '') + '.json' ),

還要確保使用與.sol您在solidity程式碼中使用的版本相同的版本(例如對我來說pragma solidity ^0.4.17;

引用自:https://ethereum.stackexchange.com/questions/82235