Tengo la siguiente estructura simple y una matriz de esa estructura:
struct Document {
bytes32 ownerID;
bytes32 documentID;
bytes32 name;
}
Document[] public documents;
Tengo un método storeDoc() que llena la matriz:
function storeDocument (bytes32 _ownerID , bytes32 _documentID, bytes32 _name) {
Document memory newDoc;
newDoc.ownerID = _ownerID;
newDoc.documentID = _documentID;
newDoc.name = _name;
documents.push(newDoc);
}
Y finalmente un captador. Podría haber múltiples entradas contra un OwenerID, por lo tanto, las matrices de memoria:
function getDocumentDetailsByID(bytes32 _ownerID) constant public returns (bytes32[], bytes32[], bytes32[]) {
uint length = documents.length;
if(registeredCandidates[_ownerID].clientAddress == msg.sender) {
bytes32[] memory documentIDs = new bytes32[](length);
bytes32[] memory names = new bytes32[](length);
bytes32[] memory descriptions = new bytes32[](length);
bytes32[] memory docYears = new bytes32[](length);
for(uint i =0; i < length; i++) {
if(documents[i].ownerID == _ownerID) {
Document memory currentDocument;
currentDocument = documents[i];
documentIDs[i] = currentDocument.documentID;
names[i] = currentDocument.name;
}
}
return (documentIDs, names);
} else {
return;
}
}
El problema al que me enfrento es que solo la primera entrada realizada por storeDocument() regresa usando getDocumentDetailsByID() correctamente.
¡Las segundas entradas realizadas por storeDocument() vienen como todos ceros cuando llamo a getDocumentDetailsByID() por segunda vez!
¿Alguien podría guiarme por favor, qué estoy haciendo mal? Gracias.
Esto contiene un antipatrón.
Probablemente puedas sentirlo crecer en longitud y complejidad. Incluso si se encuentra el error lógico (realmente no estoy seguro de para qué son los arreglos de memoria) y se resuelve, encontrará que aún ha creado un contrato que no escalará.
El problema es que su for
ciclo itera sobre el conjunto. Cada iteración cuesta un poco de gasolina. El costo aumentará a medida que crezca el conjunto. Eventualmente, esto chocará con el límite de gas del bloque y las transacciones no podrán completarse en absoluto .
Puede resolver esto utilizando una estructura interna más eficiente que evite bucles ilimitados. Lo que está haciendo se parece mucho a las Estructuras asignadas con patrón de índice aquí: ¿Existen patrones de almacenamiento simples y bien resueltos para Solidity?
Ese, o la variante con eliminar, le dará un patrón de almacenamiento interno escalable (mismo costo de gas en cualquier escala) con acceso aleatorio por ID. Si no necesita enumerar las claves, hay un patrón aún más simple.
Espero eso ayude.
Prána
Prána
Rob Hitchens
Prána