Контроль доступа и голосование за предложения
Интересную реализацию задумки голосования встретил в конкурсном протоколе Axelar. Опишу кратко.
В общем, там пользователи могут создавать предложения для последующего голосования за него. Если оно набирает необходимый минимум, то можно перенести в очередь на выполнение.
В обычном подходе делают как-то так: создается предложение, из которого хешируются предлагаемое действие и аргументы. Затем пользователи могут голосовать за него в нужной функции. Там предложение достается из памяти контракта, проверяется и в итоге засчитывают голос пользователя.
В Axelar голосование происходит в модификаторе!
P.S. Я сделаю более упрощенное описание процедуры для понимания ее сути.
Итак, мы создали предложение, из него сформировался уникальный хэш через keccak256 и сохранился где-то в контракте.
Далее авторизованным пользователям можно вызывать функцию, типа как:
function execute(
address target,
bytes calldata callData,
uint256 nativeValue
) external payable onlySigners {
...
}
Обратите внимание на модификатор onlySigners, там и происходит все действие!
modifier onlySigners() {
if (!signers.isSigner[msg.sender]) revert NotSigner();
bytes32 topic = keccak256(msg.data);
Voting storage voting = votingPerTopic[signerEpoch][topic];
if (voting.hasVoted[msg.sender]) revert AlreadyVoted();
voting.hasVoted[msg.sender] = true;
uint256 voteCount = voting.voteCount + 1;
if (voteCount < signers.threshold) {
voting.voteCount = voteCount;
return;
}
voting.voteCount = 0;
uint256 count = signers.accounts.length;
for (uint256 i; i < count; ++i) {
voting.hasVoted[signers.accounts[i]] = false;
}
emit MultisigOperationExecuted(topic);
_;
}
Другими словами, в модификаторе мы проверяем авторизацию пользователя, через аргументы в функции execute мы передаем данные по предложению в msg.data, который позже вытаскивается из памяти контракта.
Далее фиксируется голос пользователя. Если проходного минимума не хватает, то идет return и до выполнения самой функции execute дело не доходит!
Если же голоса набраны, то модификатор делает свое дело и execute срабатывает!
По моему, сделано прикольно! Такого я еще ни разу не видел.
#modifier
Post #829
930
- 👍 10
- ❤ 1