Для этого проекта я пишу умные контракты для 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;
}
}