Wie überprüfe ich, ob noch kein Mapping geschrieben wurde?

Ich habe diese Zuordnung:

mapping (uint256 => string ) private storedData;

Ich versuche dies zu tun:

modifier dataNotStored(uint256 _index) {
        require( keccak256(abi.encodePacked(storedData[_index])) == keccak256(abi.encodePacked('')) );
        _;
    }

    function set(uint _index, string calldata _data_to_store) external dataNotStored(_index) {
        storedData[_index] = _data_to_store;
    }

Mein Ziel ist es, nur einen Schreibvorgang für jeden Eintrag der Zuordnung zuzulassen.

Ich denke, es funktioniert, weil ich von Remix IDE nur beim Versuch einer Neuschreibung einen Fehler bekomme.

Gibt es eine effizientere und intelligentere Möglichkeit, das Überschreiben einer Zuordnung zu vermeiden?

Antworten (1)

Sie können den Modifikator und das Hashing vermeiden. Einfacher geht es:

function set(uint _index, string calldata _data_to_store) external {
    require(bytes(storedData[_index]).length == 0);
    storedData[_index] = _data_to_store;
}

Die Überprüfung der Länge von wurde von dieser Antwortbytes inspiriert .

Nebenfrage: Ist ein Require oder ein Modifier effizienter
@realtebo: modifierist nur Zuckersyntax. Es hat keinen Einfluss auf den ausgegebenen Bytecode und somit auch nicht auf die Gaskostenleistung.