У меня есть это отображение:
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 я получаю сообщение об ошибке только при попытке перезаписи.
Есть ли более эффективный и интеллектуальный способ избежать перезаписи сопоставления?
Вы можете избежать модификатора и хеширования. Сделать проще:
function set(uint _index, string calldata _data_to_store) external {
require(bytes(storedData[_index]).length == 0);
storedData[_index] = _data_to_store;
}
Проверка длины bytes
была вдохновлена этим ответом .
реалтебо
хорошая вибрация
modifier
это просто сахарный синтаксис. Это не влияет на выходной байт-код и, следовательно, не влияет на производительность по стоимости газа.