Estoy creando un contrato inteligente donde quiero que cada cuenta tenga un apodo/nombre único adjunto a la dirección. Aquí hay un código de ejemplo:
mapping (address => string) members;
function isMember() constant returns bool() {
return members[msg.sender] != "";
}
function register(string _name) {
if (members[msg.sender] != "") {
throw("Already registered");
}
/* now check if name is already taken...
foreach (name : members) {
if (name == _name) {
throw();
}
}
*/
}
¿Es posible utilizar mapping
para garantizar que cada apodo/nombre ingresado en los miembros sea único? ¿O mi mejor curso de acción sería crear otra propiedad que solo contenga una lista de nicks que ya están en uso? ¿Cuál es el mejor enfoque desde el punto de vista del uso de gas (considerando que iterar listas enormes debería incurrir en costos más altos)?
Cambié su string
para bytes32
evitar un desafío adicional de hacer esto con cadenas, para mayor claridad.
pragma solidity ^0.4.20;
contract Checker {
mapping (address => bytes32) members; // using bytes32 instead of string
mapping (bytes32 => bool) isTaken;
function isMember(address member) public view returns(bool isIndeed) {
return (members[member] != 0);
}
function isSet(bytes32 name) public view returns(bool isIndeed) {
return (isTaken[name]);
}
function register(bytes32 _name) public returns(bool success){
require(members[msg.sender] == "");
require(!isSet(_name));
members[msg.sender] = _name;
isTaken[_name] = true;
return true;
}
}
Espero eso ayude.
srinivas
Rob Hitchens
isTaken
esfalse
, por lo que no se toma . Entonces, siisTaken[index] == false
entoncesisSet == false
. Es un pequeño garabato rápido, así que si hay un error, explíquelo. Gracias.srinivas
Rob Hitchens
require(!isSet(...
, no establecer. Lo arreglé en el ejemplo.