0

对于这个项目,我正在使用 Solidity 为以太坊编写智能合约。

在以下代码中,变量numCertificates最初应为 1。尽管如此,newCertificateId 在分配时为 0。根据调试器(我正在使用 remix.ethereum.org),由于某种原因,一旦到达分配 newCertificateId 的行,numCertificates 就会变为 0。

我玩过很多混音,根据它,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;
    }
}
4

0 回答 0