Как проверить, что отображение еще не было написано?

У меня есть это отображение:

mapping (uint256 => string ) private storedData;

Я пытаюсь сделать это:

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

Моя цель - разрешить только одну запись для каждой записи сопоставления.

Я думаю, что это работает, потому что из Remix IDE я получаю сообщение об ошибке только при попытке перезаписи.

Есть ли более эффективный и интеллектуальный способ избежать перезаписи сопоставления?

Ответы (1)

Вы можете избежать модификатора и хеширования. Сделать проще:

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

Проверка длины bytesбыла вдохновлена ​​этим ответом .

Побочный вопрос: более эффективен запрос или модификатор
@realtebo: modifierэто просто сахарный синтаксис. Это не влияет на выходной байт-код и, следовательно, не влияет на производительность по стоимости газа.