Cómo verificar si hay direcciones duplicadas en el mapeo

Quiero tener un mapeo donde solo sea posible agregar valores cuando sean ÚNICOS. No debe ser posible agregar claves duplicadas, pero no puedo hacerlo funcionar.

El código:

contract test {
    mapping(string => address) values;

    function AddValue(string randomValue) {
        require(values[randomValue] == 0x0);

        //execute transaction if randomValue doesn't exist
        //cancel transaction - payout if the randomValue exists 
    }
}

En este ejemplo, estoy tratando de verificar si los valores [randomValue] están vacíos, no existen. Si no existe, el código posterior puede ejecutarse. Si SÍ existe, el código debe detenerse. Sin embargo, soy incapaz de encontrar una solución.

Trabajando bien para mí. Debe agregar una línea como values[randomValue] = 0x1;(o cualquier dirección) después de la require()declaración. Una vez que hayas hecho eso, se comporta exactamente como esperas.
Gracias por responder :) y agrego msg.sender después, pero lo dejé aquí. Además, hago un seguimiento de la longitud con un contador, que cuenta la longitud de la asignación. Cada vez que agrego un valor aleatorio que ya está dentro del mapeo, aparece una pantalla de metamáscara para confirmar, lo envío, se extrae y el conteo aumenta. No tengo idea de lo que me estoy perdiendo ;s ;s Parece que el requerimiento no está haciendo nada @benjaminion

Respuestas (1)

He notado que en tu ejemplo usas una stringtecla for. Solidity usa el keccack256(key)valor de búsqueda as. Entonces, existe el caso de que tenga dos asignaciones de cadenas diferentes al mismo valor. (Esto es raro porque significará que ha encontrado una colisión de sha3).

Si tiene una asignación a una estructura, usaría un campo booleano para indicar que se usa una entrada. Una entrada vacía hará que dichos campos se establezcan inicialmente en falso.

struct Entry {
    bytes32 id;
    uint balance;
    bool used;
}

mapping (address => Entry) public collection;

function AddEntry(bytes32 _id, uint _balance) public {
    require(!collection[msg.sender].used);
    collection[msg.sender] = Entry(_id, _balance, true);
}

Si tiene una asignación a un valor como dirección, puede verificar directamente con un valor especial como address(0).

mapping (bytes32 => address) public users;

function AddUser(bytes32 id) public {
    require(users[id] != address(0));
    users[id] = msg.sender;
}
Gracias por su respuesta :) Mi problema fue un mal funcionamiento con TestRPC o webpack (aún no estoy seguro, cuál de los dos) Tengo el problema frecuente en el que el código nuevo o editado no parece estar compilado y enviado correctamente. En este caso, solo tengo que reiniciar TestRPC, eliminar la carpeta de compilación y compilar, migrar los contratos nuevamente. Sin embargo, este ejemplo sigue siendo una mejor práctica en el problema que creé :) +1