¿Cómo puedo crear una función de solidez que pase un puntero de almacenamiento en lugar de crear una copia?

El siguiente contrato falla (creo) porque cuando Wordbase.setse llama, crea un nuevo Nodeen 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;
  }

}

Respuestas (1)

Todo lo que necesita hacer es establecer el tipo de retorno de getNodeen 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;
}