Как ограничить количество токенов, которые можно передать за определенный период времени?

Как можно гарантировать, что держатель токена ERC20 не сможет отправить/перевести/иное более чем X токенов в заданный период Y , где Y может час, день, неделя, месяц и т. д.

Было бы лучше, если бы это можно было сделать, не занимая больше места для хранения.

Ответы (2)

Для контрактов единственным источником правды является блокчейн, поэтому ответ для второй части — нет.

Что касается первого вопроса: вы можете сохранить временную метку последней операции для держателя Q и перед принятием операции потребовать, чтобы прошло как минимум Y время, например:

now >= last_operation + Y

Вы можете реализовать грубый контроль и разрешить до X передач токенов в течение периода Y. Вы можете установить период, начинающийся при первой передаче и истекающий через Y секунд. Это обойдется вам всего в несколько передач хранилища, но освободит блок позже, чем следовало бы.

Чтобы решить проблему, если она заполнена, вы должны хранить журнал (сумма + метка времени или номер блока) всех последних транзакций в массиве. При передаче вы должны пройти через этот массив и проверить ограничение скорости передачи. Вы должны хранить отдельный массив для каждого держателя токена. Это может быть дорого, и, если отправитель делает слишком много переводов, существует риск того, что операция проверки скорости передачи превысит лимит блочного газа. Однако должен быть способ закодировать его таким образом, чтобы избежать постоянного зависания.

Вы можете найти золотую середину, сохраняя подсчеты в дневных/часовых слотах.

Вы также можете исследовать это https://github.com/figs999/Ethereum/blob/master/EventStorage.sol .