El siguiente contrato falla (creo) porque cuando Wordbase.set
se llama, crea un nuevo Node
en el almacenamiento, en lugar de pasar el antiguo Node
. Por lo tanto, el valor se actualiza en la copia en lugar del original.
¿Cómo puedo obtener un contrato para pasar un puntero en lugar de crear una copia?
contract Wordbase {
struct Node {
bytes32 value;
mapping(bytes32 => Node) nodes;
}
mapping(address => Node) realms;
function getNode(address addr , bytes32[] fields) internal returns (Node) {
Node node = realms[addr];
for (uint i = 0; i < fields.length; i ++) {
node = node.nodes[fields[i]];
}
return node;
}
function get(address addr, bytes32[] fields) constant returns (bytes32) {
return getNode(addr, fields).value;
}
function get(bytes32[] fields) constant returns (bytes32) {
return get(msg.sender, fields);
}
function set(bytes32[] fields, bytes32 value) {
getNode(msg.sender, fields).value = value;
}
}
Todo lo que necesita hacer es establecer el tipo de retorno de getNode
en storage
.
es decir
function getNode(address addr , bytes32[] fields) internal returns (Node storage) {
Node node = realms[addr];
for (uint i = 0; i < fields.length; i ++) {
node = node.nodes[fields[i]];
}
return node;
}
Badr Bellaj