Comportamiento extraño que hace referencia a objetos de estructura en el ámbito local

Al tratar de trabajar con una lista enlazada, me encontré con este comportamiento extraño. Aquí el código

contract Test{


  struct Node{
    uint x;
    uint linked; //index to next
    bool    nil;

  }
  Node [] public nodes;


  function Test(){
      nodes.push(Node(59,1,false));
      nodes.push(Node(100,2,false));
      nodes.push(Node(0,0,true));
  }


  function remove(uint nodeIdx){
      Node node = nodes[nodeIdx];
      Node linked = nodes[node.linked];
  }



}

Si llamo a remove(1) debería esperar ver un nodo igual a {100,2,false}, pero en el depurador obtuve lo siguiente

ingrese la descripción de la imagen aquí

O, en otras palabras, node.x se valora con la longitud de la matriz de nodos. me pregunto porque

Además,

  • llamar a remove(anotherIndex) da los mismos resultados.
  • declarar var local Node storage node=nodes[nodeIdx]da el mismo resultado

Respuestas (1)

Probé tu código.

Si hubiera ido más lejos en la depuración de la transacción, habría visto que se establecen los valores correctos para nodey linked.

ingrese la descripción de la imagen aquí

declarar el almacenamiento local de var Node node=nodes[nodeIdx] da el mismo resultado

Usar storagesignifica que desea modificar el estado del contrato. No lo hace, por lo que debe usar memoryel que es más barato también.

Se supone que remove() cambia el estado, no mostré el código porque me estaba enfocando en hacer referencia a la variable de estado en el ámbito local. En realidad, con una matriz de 4 elementos obtengo node.x igual a 4
De acuerdo, no está pasando a la tarea, solo a la inicialización. Siga avanzando y verá que se asignan los valores correctos y, como dice Eilsha, use variables de memoria, excepto donde desee almacenar valores en el bloque. Cuando quiera hacer eso en este caso, configure directamente en la matriz, por ejemplo, a través de nodes[i].linked = newIndex.
¡Bien! Ustedes tienen razón. Parece que gráficamente estuve allí con el depurador, pero me engañó el paso a la mecánica. Me pregunto si esta pregunta será eliminada.
No lo elimines, marca la respuesta de Elisha como correcta. De lo contrario, dedicaron tiempo a responder a su pregunta sin recibir ninguna recompensa. (Lo que sucede con bastante frecuencia). Además, podría responder a otra persona que tenga el mismo problema en algún momento.