Gibt es eine Möglichkeit zu überprüfen, ob der eingegebene Schlüssel einen entsprechenden Wert in einem Mapping hat oder nicht?

Angenommen, in einem Bankensystem sind viele Personen registriert (verwaltet durch Mapping).mapping (address => bool) enrolled;

Und nur diejenigen können einzahlen, die bei der Bank registriert sind.

Kann ich überprüfen, ob der msg.sender als Schlüssel in der obigen Zuordnung vorhanden ist?

Antworten (3)

Der Standardwert eines Bool in einem Mapping ist false. Wenn Sie es auch als Teil Ihres Tracking-Systems verwenden false, können Sie nicht feststellen, ob ein Wert festgelegt wurde falseoder überhaupt nicht.

Dazu benötigen Sie möglicherweise ein zweites Mapping, das nachverfolgt, ob der Wert zuvor festgelegt wurde.

mapping (address => bool) enrolledSet;
Es werden Mittel zum Verfolgen einer neuen Zuordnung benötigt. Wir können die Zuordnung nicht überprüfen oder durchlaufen, oder?
Sie können ein Mapping nicht durchlaufen. Sie müssen ein Array erstellen, um praktische Iterationen durchzuführen, da sie eine messbare Länge und Reihenfolge haben. Ansonsten funktioniert, wie ich in meiner Antwort vorgeschlagen habe, ein Mapping, um einfach zu prüfen, ob der Wert gesetzt wurde

Hier ist eine minimale Möglichkeit, den wahlfreien Zugriff abzudecken, eindeutige Elemente zu zählen und die Liste zu durchlaufen.

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;
    }
}

Sie können ein vorläufiges Löschen hinzufügen, indem Sie das boolauf false setzen.

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

Schauen Sie hier nach verschiedenen Mustern: Gibt es gut gelöste und einfache Speichermuster für Solidity?

Ich hoffe es hilft.

Ja, mit Ihrem Beispiel können Sie einfach Folgendes tun:

require(enrolled[msg.sender]);