Estoy desarrollando un escenario de prueba en Remix (Solidity). He visto algunos códigos de muestra, pero aún no tengo claro cómo se hace esto. He adjuntado un código de muestra (no completo) que ayudaría a aclarar esto.
Tengo dos preguntas para el siguiente escenario:
gracias,
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;
}
}
Se necesita algo de pensamiento nuevo aquí. Bienvenido a Ethereum. ;-)
No puede iterar las claves en una asignación. En esencia, todas las claves existen.
Además, es un antipatrón para iterar sobre una lista ilimitada. En algún momento, se quedará sin gas debido al bloque gasLimit.
Por lo tanto, desea continuar con pequeñas funciones que cuestan aproximadamente lo mismo en gas a cualquier escala. Eso generalmente implica llevar los procesos iterativos a los clientes y construir una lógica de "una pasada" en el contrato.
Tenga cuidado de asegurarse de que el estado del contrato esté "completo" en todo momento para evitar condiciones de carrera y otras rarezas.
Eche un vistazo aquí a Mapped Struct with Index que se acerca bastante a lo que desea: ¿Existen patrones de almacenamiento simples y bien resueltos para Solidity?
Espero eso ayude.
usuarioDSSR