Запуск контракта Solidity приводит к ошибке «ENOENT: нет такого файла или каталога» - PullRequest
0 голосов
/ 01 октября 2018

Я практикую написание умных контрактов в Solidity, и выполнение приведенного ниже кода не приводит к такой ошибке файла или каталога.

Ошибка: ENOENT: нет такого файла или каталога, откройте 'C: \ kickstart \ ethereum \build: Campaign.json '

Это контракт типа Kickstarter с несколькими участниками и менеджером (владельцем контракта).Пользователи могут пожертвовать средства.Менеджер - единственный, кто может снять деньги, но для этого типа действия необходимо разрешение другого пользователя.

 **Campaign.sol**
    pragma solidity ^0.4.20;

contract CampaignFactory {
    address[] public deployedCampaigns;


    function createCampaign(uint minimum) public {
     address newCampaign = new Campaign(minimum, msg.sender);
     deployedCampaigns.push(newCampaign);
    }

    function getDeployedCampaigns() public view returns(address []) {
        return deployedCampaigns;
    }

}
contract Campaign {
    struct Request {
        string description;
        uint value;
        address recipient;
        bool complete;
        uint approvalCount;
        mapping(address => bool) approvals;
            }

Request[] public requests;
address public manager;

uint public minimumContribution;
//address[] public approvers; mapping has a constant time lookup
mapping(address => bool) public approvers;
uint public approversCount;

modifier restricted() {
    require(msg.sender == manager);
    _;
}

constructor (uint minimum, address creator) public {
    manager = creator;
    minimumContribution = minimum;
}

function contribute() public payable {
    require(msg.value > minimumContribution);

  approvers[msg.sender] = true;  
  approversCount++;

}

function createRequest(string description, uint value, address recipient) public restricted {
    Request memory newRequest = Request({
        description: description,
        value:value,
        recipient: recipient,
        complete: false,
        approvalCount:0
    });

    requests.push(newRequest);
     }

     function approveRequest(uint index) public {
         Request storage request = requests[index];

         require (approvers [msg.sender]);
         require(!request.approvals[msg.sender]);

         request.approvals[msg.sender] = true;
         request.approvalCount++;



     }

     function finalizeRequest(uint index) public restricted {
     Request storage request = requests[index];

     require(!request.complete);
     request.complete = true;

     }
 }

**compile.js**
const path = require("path");
const solc = require("solc");
//file system on local compuiter
const fs = require("fs-extra");

const buildPath = path.resolve(__dirname, "build");
// file removal in fs-extra version
fs.removeSync(buildPath);
//path to the file
const campaignPath = path.resolve(__dirname, "contracts", "Campaign.sol");
//get a content of file
const source = fs.readFileSync(campaignPath, "utf8");
// output from the compiler
const output = solc.compile(source, 1).contracts;

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

Ответы [ 3 ]

0 голосов
/ 05 марта 2019

Если вы хотите убедиться, что ваш файл compile.js правильно настроен, добавьте « console.log (solc.compile (source, 1)); » перед циклом for и проверьте вывод.

Об этой проблеме вы можете заменить: path.resolve (buildPath, contract + '.json') , path.resolve (buildPath, contract.replace (':',' ') +' .json ') ,

Надеюсь, это поможет!

0 голосов
/ 15 апреля 2019

Я столкнулся с той же проблемой.Проблема в том, что Windows недовольна наличием специальных символов в имени файла, в данном случае это двоеточие ":".

Таким образом, удаляйте двоеточие при выводе результата следующим образом:

for (let contract in output) {
  fs.outputJSONSync(
    path.resolve(buildPath, contract.replace(':', '') + ".json"),
    output[contract]
  );
}
0 голосов
/ 04 октября 2018

Ответ на ваш вопрос: Campain.json находится в папке сборки и содержит выходные данные для всех экземпляров контракта Campaign.

Мне удалось исправить ошибку, выполнив следующие шаги:

  • Полное удаление папки node_modules в проекте
  • Запуск команды очистки npm cache --force
  • Запуск установки npm

Пожалуйста, найдите ссылку напроект ниже: https://github.com/StephenGrider/EthereumCasts

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...