¿Hay alguna forma de verificar si la clave ingresada tiene un valor correspondiente en una asignación o no?

Supongamos que en un sistema bancario muchas personas están inscritas (gestionadas a través de mapeo)mapping (address => bool) enrolled;

Y solo pueden depositar los que están inscritos en el banco.

¿Puedo comprobar si msg.sender existe como clave en la asignación anterior?

Respuestas (3)

El valor predeterminado de un bool en una asignación es false. Si también lo usa falsecomo parte de su sistema de seguimiento, entonces no, no podrá saber si se ha establecido un valor falseo si no se ha establecido en absoluto.

Para eso, es posible que necesite una segunda asignación que rastree si el valor se ha establecido antes.

mapping (address => bool) enrolledSet;
Se necesitan medios para rastrear un nuevo mapeo, no podemos verificar o iterar a través del mapeo, ¿verdad?
No puede iterar a través de una asignación. Deberá crear una matriz para realizar cualquier tipo de iteración práctica, ya que tienen una longitud y un orden medibles. De lo contrario, como sugerí en mi respuesta, un mapeo funciona para simplemente verificar si se ha establecido el valor

Aquí hay una forma mínima de cubrir el acceso aleatorio, contando únicos e iterando sobre la lista.

pragma solidity 0.5.0;

contract InterableMapping {

    address[] public addressList;
    mapping(address => bool) public isAddress;

    function insertAddress(address customer) public {
        require(!isAddress[customer]);
        addressList.push(customer);
        isAddress[customer] = true;
    }

    function getAddressCount() public view returns(uint count) {
        return addressList.length;
    }
}

Puede agregar una eliminación temporal configurando el boolen falso.

function disableCustomer(address customer) public {
  require(isAddress[customer]);
  isAddress[customer] = false;
}

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

Espero eso ayude.

Sí, con tu ejemplo, puedes hacer lo siguiente:

require(enrolled[msg.sender]);