Переменная состояния состояния сброса сбрасывается в значение по умолчанию внутри функции - PullRequest
0 голосов
/ 27 июня 2018

Для этого проекта я пишу умные контракты для Ethereum, используя Solidity.

В следующем коде переменная numCertificates должна изначально быть 1. Тем не менее, newCertificateId равен 0 при назначении. Согласно отладчику (я использую remix.ethereum.org), по какой-то причине numCertificates становится равным 0, как только достигается строка, которой назначен newCertificateId.

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

Мои попытки понять это заставляют меня поверить, что когда я получаю доступ к numCertificates, я не получаю доступ к общедоступной переменной состояния, а что-то еще.

Почему этот код имеет эту проблему и как ее можно решить?

pragma solidity ^0.4.21;

contract MyToken {
    // ... lots of irrelevant stuff here
    mapping (uint64 => Certificate) public certificates;
    uint64 numCertificates = 1;

    // ... lots of irrelevant stuff here

    function MyToken() public {
      // ... likely irrelevant code
    }

    function produceCertificate(
      // ... likely irrelevant parameters
      ) public {
        // Create the certificate in memory
        numCertificates;// only for debbuging
        Certificate storage newCertificate = constructCertificate(meterId, timestamp, carbonMitigationValue, owner);
        uint64 newCertificateId = numCertificates;
        newCertificate.certificateId = newCertificateId;

        // Save the certificate
        certificates[newCertificateId] = newCertificate;
        numCertificates++;
    }



    function constructCertificate(
      uint64 meterId,
      uint32 timestamp,
      uint48 value,
      address owner
      ) internal returns (Certificate storage newCertificate) {
        newCertificate.meterId = meterId;
        newCertificate.timestamp = timestamp;
        newCertificate.value = value;

        newCertificate.owners.push(owner);
        newCertificate.ownershipSplit[owner] = value;

        newCertificate.burned = false; // by default new certificates are fresh

        return newCertificate;
    }
}
...