对于这个项目,我正在使用 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;
}
}