Солидность 0.5.0 слишком много переменных - PullRequest
0 голосов
/ 10 января 2019

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

Compiling ./contracts/PartProduction.sol...

InternalCompilerError: Stack too deep, try using fewer variables.
Compilation failed. See above.
Truffle v5.0.1 (core: 5.0.1)
Node v11.6.0

Исходный код смарт-контракта, написанного с использованием Solidity 0.5.0:

pragma solidity 0.5.0;

contract PartProduction {

    enum State {
        productionRequested,
        parametersObtained,
        manufacturerObtained,
        productionForwardedToManufacturer,
        printing,
        printed,
        postProcessing,
        postProcessed,
        qualityChecking,
        qualityChecked,
        productionFinished
    }

    enum Priority {
        low,
        normal,
        high
    }

    struct Company {
        address vehicleEthAddress;
        address myWebService;
    }

    struct Manufacturer {
        string id;
        string location;
        address productionMachine1;
        address productionMachine2;
        address productionMachine3;
    }

    struct Production {
        string productionParameters;
        string designParameters;
        State state;
        Priority priority;
        string partNumber;
        uint256 cost;
        uint256 productionForwardedTime;
        uint256 productionStartTime;
        uint256 productionEndTime;
        address partID;
        string myIdentifier;
        string location;
    }

    Company public company;
    Manufacturer public manufacturer;
    Production public production;

    constructor(

        address _vehicleEthAddress,
        string memory _myIdentifier,
        string memory _vehicleLocation,
        string memory _partNumber,
        Priority _priority)internal {

        company.myWebService = msg.sender;
        company.vehicleEthAddress = _vehicleEthAddress;
        production.partID = address(this);
        production.state = State.productionRequested;
        production.partNumber = _partNumber;
        production.priority = _priority;
        production.myIdentifier = _myIdentifier;
        production.location = _vehicleLocation;
    }

    function setParameters(string calldata _designParametersHash, string calldata _productionParametersHash) external {
        require(msg.sender == company.myWebService);
        require(production.state == State.productionRequested);
        production.designParameters = _designParametersHash;
        production.productionParameters = _productionParametersHash;
        production.state = State.parametersObtained;
    }

    function setManufacturer(string calldata _manufacturerId, string calldata _manufacturerLocation) external {
        require(msg.sender == company.myWebService);
        require(production.state == State.parametersObtained);
        manufacturer.id = _manufacturerId;
        manufacturer.location = _manufacturerLocation;
        production.state = State.manufacturerObtained;
    }

    function forwardProductionData(uint256 _productionForwardedTime) external {
        require(msg.sender == company.myWebService);
        require(production.state == State.manufacturerObtained);
        production.state = State.manufacturerObtained;
        production.productionForwardedTime = _productionForwardedTime;
    }

    function registerproductionMachine1(address _productionMachine1) external {
        require(msg.sender == company.myWebService);
        manufacturer.productionMachine1 = _productionMachine1;
    }

}

Я хотел бы знать, есть ли способ понять и идентифицировать часть, в которой число переменных превышает. Должен ли я все превратить в отображение? Компилятор не предоставляет мне дополнительную информацию.

Кроме того, я нашел этот вопрос , он похож, но я не уверен, что это та же проблема, минусы - это сохранение переменных в памяти (ключевое слово memory), когда вы делаете получить, другой, чтобы установить их. Является ли использование картирования единственно возможной альтернативой для решения этой проблемы? Кроме того, смарт-контракт не заключен, многие другие части будут добавлены позже.

1 Ответ

0 голосов
/ 18 января 2019

Насколько я вижу, ваш стек слишком глубок для структуры production , вы можете использовать хитрость здесь, чтобы решить эту проблему, создать отдельный умный контракт с именем Production, определить структуру там и импортный контракт в этот умный контракт. Это поможет вам как сократить потребление газа при развертывании контракта, так и это слишком сложная проблема. Это вы можете сделать и для других структур, если хотите. Единственное, о чем вам нужно позаботиться, - это сопоставление при реализации для сопоставления структуры с конкретным контрактом. Что касается каждого контакта, он будет считаться отдельной картой. Дайте мне знать, если вам понадобится дополнительная помощь. Я надеюсь, что вы попробуете это решение, надеюсь, это сработает.

...