Tengo dos matrices:
address[ ] addresses
uint [ ] numbers
Quiero crear una función que cree otra matriz que almacene el valor hash de ambos.
bytes32[ ] addressNumbers
por ejemplo, si tengo dos direcciones almacenadas y dos unidades:
address[address1, address2] addresses,
uint [1, 2] numbers.
Quiero hacer un hash con ellos para keccak256(address, uint)
obtener una matriz:
bytes 32[ address1,1 ,address1,2 , address2,1 , address2,2 ]
addressNumbers
Supongo que necesito usar un bucle for anidado, pero tengo problemas para descubrir cómo. alguno de ustedes me puede ayudar a poner?
Lo que puede hacer es tratarlo como una unión de muchos a muchos entre dos tablas, Votantes y Problemas. La relación suele abordarse con una tercera mesa, en este caso Voto (o Ballet si reduce la confusión).
En resumen, coloque Votantes y Problemas en tablas (matrices o asignaciones con índices). Algunos patrones aquí: ¿Existen patrones de almacenamiento simples y bien resueltos para Solidity?
Elija un patrón que le permita confirmar fácilmente que un votante está realmente registrado y que realmente existe un problema. Luego haga hash de las claves y presione un voto en la tabla de votos.
Por "tabla" me refiero a una de las construcciones descritas en la respuesta vinculada anteriormente. Piensa en las fortalezas y debilidades y elige en consecuencia. Para los votos en sí, consideraría:
struct Vote {
bool yayNay;
bool isVote;
}
mapping(she3HashKey => Vote) voteStructs;
El segundo campo se establecería en verdadero para todos los votos emitidos para que pueda distinguir un "falso" real de un 0 predeterminado, porque...
En mi enfoque , necesita funciones simples para verificar si existen cosas:
isVoter() public constant returns(bool isIndeed) {}
isIssue() public constant returns(bool isIndeed) {}
isVote() public constant returns(bool isIndeed) {}
Eso es imprescindible o podría enredarse en problemas incómodos, por ejemplo, diferenciar un valor predeterminado (falso) de un "No" real.
Verifique los dos primeros antes de permitir un nuevo Voto.
if(!isVoter(msg.sender)) throw;
if(!isIssue(issueId)) throw;
// continue ...
Verifique el tercero antes de hacer algo con un voto almacenado.
Mantenga sus cuentas a medida que avanza para que pueda evitar la iteración a toda costa.
Espero eso ayude.
Rob Hitchens
Locos