¿Es posible la eliminación de elementos de matrices en solidez?

Supongamos una struct Nodey una matriz de nodos allNodes[]. Tuve éxito al agregar Nodea la matriz, pero cuando traté de usar un removeNode()método (que usa el deletemétodo en matrices), el valor de allNodes.lengthsigue siendo el mismo. ¿Es porque las cadenas de bloques son "inmutables"? ¿No significa inmutable que cuando se realiza una transacción (incluso remove Node()), no se puede deshacer?

@RichardHorrocks Ya mencioné que estoy usando deleteel método. El problema aquí es que si muevo manualmente mi Nodes, la próxima vez que intente agregar un elemento usando el pushmétodo, habrá algún conflicto... porque el último elemento permanece sin cambios en el método manual.
Delete no reorganiza la matriz ni cambia la longitud como cabría esperar. Algunas ideas de diseño de contratos aquí: ethereum.stackexchange.com/questions/13167/…

Respuestas (1)

Es posible, pero no hace exactamente lo que (probablemente) esperas.

Señala "no hay datos importantes aquí" y ayuda a mantener las cosas eficientes en el nivel de la plataforma, pero no reorganiza la matriz en el nivel de la aplicación, lo que significa que no cambia todos los elementos por encima de la fila eliminada una fila hacia abajo. La longitud no cambia.

La inmutabilidad tiene un impacto aquí. No importa lo que hagamos, solo estamos agregando al estado anterior. Nada se elimina realmente. Incluso las transacciones que crearon, actualizaron y finalmente eliminaron la "fila" son parte del historial inmutable. "Eliminar" no puede tratarse de borrar datos, pero podría tratarse de reorganizarlos.

Eche un vistazo aquí: ¿Existen patrones de almacenamiento sencillos y bien resueltos para Solidity?

"Estructuras asignadas con índice habilitado para eliminar" realiza una eliminación lógica. Es apropiado para situaciones en las que se eliminará un alto porcentaje de filas y desea evitar repetir la basura.

El mucho más simple "Mapeo con Struct" es más común. Establece un "bit" para indicar una eliminación lógica.

Espero eso ayude.

Gracias señor... pero ¿es legal aumentar/disminuir manualmente la allNodes.lengthvariable? Me gusta allNodes.length ++o allNodes.length --...
Sí. Posiblemente alguien hablará con cierta certeza sobre todos los casos extremos alrededor de ++. No lo he usado lo suficiente para estar seguro y no deseo engañarte. Probablemente sea una cuestión de gustos: me gusta presionar () porque no deja dudas sobre lo que existe en la nueva fila.