Supongamos que tengo esta estructura:
struct TextThatWorks {
bytes32 text;
uint reads;
}
¿ Cómo puedo agregarle una address
variable?
Intenté simplemente agregar address someadress;
dentro de la declaración de estructura, así:
struct TextThatDoesNotWork {
bytes32 text;
uint reads;
address addr;
}
He visto muchos ejemplos haciendo exactamente lo mismo. Ejemplo: Solidity Docs
Pero cuando hago esto, mis funciones se rompen.
Entonces, en mi contrato tengo una matriz de texto:
TextThatWorks[] public textArray;
Y tengo una función para recuperar los textos dentro de esta matriz, que devuelve matrices:
function listTexts () public view returns (bytes32[], uint[]) {
bytes32[] memory texts = new bytes32[](textArray.length);
uint[] memory readsArray = new uint[](textArray.length);
for (uint i = 0; i < textArray.length; i++){
texts[i] = textArray[i].text;
readsArray[i] = textArray[i].reads;
}
return (texts, readsArray);
}
Esto devuelve una buena matriz en el formato[["some hexadecimal example"],[12]]
La segunda estructura, TextThatDoesNotWork
, solo se diferencia de TextThatWorks
porque tiene un address
campo.
Cuando lo uso, mi listTexts()
función deja de funcionar. Siempre devuelve matrices vacías como[[],[],[]]
Para acomodar el campo adicional, mi listTexts()
función se convierte en la siguiente:
function listTexts () public view returns (bytes32[], uint[], address[]) {
bytes32[] memory texts = new bytes32[](textArray.length);
uint[] memory readsArray = new uint[](textArray.length);
address[] memory addresses = new address[](textArray.length);
for (uint i = 0; i < textArray.length; i++){
texts[i] = textArray[i].text;
readsArray[i] = textArray[i].reads;
addresses[i] = textArray[i].addr;
}
return (texts, readsArray, addresses);
}
function put(bytes32 _text, uint _reads) public returns (uint){
return textArray.push(TextThatDoesNotWork({
text: _text,
reads: _reads,
addr: msg.sender
}))-1;
}
diego lima
contract.put("text", 200)
, obtengo un hash de transacción en la consola, en lugar del índice devuelto por la función. ¿Podría ser el problema la forma en que llamo a la funciónput()
?Águila
put
la función es otro problema. ¿Qué tiene después de las acciones: contrato de implementación -> llamadaput(0x1221, 10)
-> llamadalistTexts()
?Águila
contract.put("text", 200)
no funcionará, porque el primer parámetro tiene tipobytes32
, necesita convertir la cadena a bytes32, puede usarweb3.utils.fromAscii("text")
la funcióndiego lima
address
atributo a la estructura. Simplemente deja de funcionar, pero antes de agregar ese atributo, ¡funciona!diego lima
address
atributo en la estructura, puedo implementar el contrato, llamarcontract.put("some text", 200)
y ver los nuevos datos usandocontract.listTexts()
.Águila
diego lima
Águila
solc
otruffle
con pruebas.Ingeniero de tecnología de la ciudad de Nueva York