Я разрабатываю тестовый сценарий в Remix (Solidity). Я видел несколько примеров кода, но до сих пор не понимаю, как это делается. Я приложил пример кода (неполный), который поможет прояснить это.
У меня есть два вопроса для сценария ниже:
Спасибо,
pragma solidity ^0.4.11;
contract RaceParticipants {
struct Participants {
bytes32 id;
bytes32 name;
uint age;
bool isValue;
}
mapping (bytes32 => Participants) participantsMap;
bytes32[] participantsKey;
event LogParticipants (bytes32 id, bytes32 name, uint age);
function ListRegisteredParticipants () {
for (.....) {
LogParticipants (id, name, age);
}
}
function DeleteRegisteredParticipants (bytes32 _id)
returns (bool flag) {
if (participantsMap[_id].isValue) {
delete participantsMap[_id];
return true;
}
return false;
}
function RegisterParticipants (bytes32 _id, bytes32 _name, uint _age) returns (bool flag) {
if (!participantsMap[_id].isValue) {
participantsMap[_id].id = _id;
participantsMap[_id].name = _name;
participantsMap[_id].age = _age;
participantsMap[_id].isValue = true;
participantsKey.push(_id);
return true;
}
return false;
}
}
Здесь нужно новое мышление. Добро пожаловать в Эфириум. ;-)
Вы не можете перебирать ключи в сопоставлении. По сути, все ключи существуют.
Кроме того, это анти-шаблон для перебора неограниченного списка. На каком-то этапе у него закончится газ из-за блокировки gasLimit.
Поэтому вы хотите продолжить с небольшими функциями, которые стоят примерно одинаково в газе в любом масштабе. Обычно это подразумевает передачу итерационных процессов клиентам и построение логики «одного прохода» в контракте.
Позаботьтесь о том, чтобы состояние контракта всегда было «завершенным», чтобы избежать условий гонки и других странностей.
Посмотрите здесь Mapped Struct with Index, который довольно близок к тому, что вы хотите: Существуют ли хорошо решенные и простые шаблоны хранения для Solidity?
Надеюсь, поможет.
пользовательDSSR