¿Cómo eliminar un elemento de un mapeo?

Tengo un mapeo como este:

struct data {  
   string name;  
   string nickname;  
}

mapping(address => data) public user;

¿Cuál es la forma correcta de eliminar un elemento de la variable usuario? ¿Solo tengo que llamar?delete(user[address])

o

¿También tengo que eliminar user[address].namey user[address].nickname?

Respuestas (1)

Sí, delete user[someAddress];funcionará con estructuras que no contengan un mapeo.

Para esta pregunta, debido a que namey nicknameno son asignaciones, se eliminarán (se pondrán a cero) automáticamente: no hay necesidad de hacer algo como "eliminar usuario[alguna dirección].nombre".

http://solidity.readthedocs.io/en/develop/types.html#delete

si elimina una estructura, restablecerá todos los miembros que no sean asignaciones y también recurra a los miembros a menos que sean asignaciones

Advertencia:

delete no tiene efecto en las asignaciones completas (ya que las claves de las asignaciones pueden ser arbitrarias y generalmente desconocidas)

¿Qué sucederá con los datos de usuario[alguna dirección].nombre y usuario[alguna dirección].apodo del ejemplo anterior, cuando elimine el usuario[algunadirección]? ¿Se eliminarán también o tengo que eliminarlos antes de eliminar el usuario [alguna dirección]?
Gracias por el comentario, agregué a la respuesta para que quede más claro.
¿Significa esto que "eliminar" no libera espacio de almacenamiento, eliminar y poner a cero son dos cosas diferentes, no?
@Jaime "eliminar" en un contrato inteligente es simplemente establecer valores en cero. La recuperación de espacio en disco es un detalle de implementación y depende del nodo: puede que vea un cero y realice una "poda", pero puede que no.
Eliminar elementos de una matriz y reorganizarlos para eliminar agujeros ahorra gasolina en forma de reembolso de gasolina (se resta una cantidad de su costo de gasolina). ¿No hay algo similar con los mapeos?
@Qwerty Los reembolsos se han reducido en EIP-3529 .