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.
He notado que en tu ejemplo usas una string
tecla 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;
}
benjaminion
values[randomValue] = 0x1;
(o cualquier dirección) después de larequire()
declaración. Una vez que hayas hecho eso, se comporta exactamente como esperas.invitado7630763