У меня есть контракт токенов ERC20 с функцией чеканки токенов.
Эта функция должна позволять пользователям чеканить токены после выполнения определенных действий или действий на веб-сайте.Если пользователь успешно выполнит действие, он сможет отправить транзакцию с помощью функции mint и получить токены.
Мой рабочий процесс и проблемы: чтобы пользователи не могли напрямую взаимодействовать с контрактом и чеканили столько токенов, сколько они хотят, контракт разрешает только определенный адрес eth вызывать функцию mint.Этот определенный адрес будет установлен на сервере и будет подписывать транзакции, если действия были выполнены успешно.Однако это означает, что этот адрес также должен будет оплачивать газ.
В настоящее время я думаю о реализации другого контракта, который будет действовать как единственный адрес, который может вызывать функцию монетного двора в контракте ERC20.Этот новый контракт будет получать транзакцию от пользователя, которая включает переменные, строки и одноразовые номера, подписанные и хешированные по адресу сервера.Новый контракт сможет расшифровать данные и узнать, что транзакция действительно была утверждена сервером, и вызвать функцию mint из контракта токенов.Таким образом, пользователи не смогут напрямую пытаться чеканить токены или повторно отправлять транзакции, чтобы получить больше токенов.
Возможная и простая реализация этого, как я предполагал, следующая:
- Сервер подписывает три фрагмента информации: адрес пользователя, сумму, которую нужно чеканить, и целое число, которое увеличивается с каждой транзакцией (он же mintRequestId) - это увеличение может быть случайным.
Эти три хэшированные строки передаются клиентской логике моего пользователя и служат аргументами для метода моего контракта, который должен посылать:
myContract.methods.Mint (signatureAddresses, signatureMintAmount, signatureMintRequestId) .send ({from: userWallet})
В своем контракте я восстановил три аргумента, используя открытый ключ кошелька моего сервера, и:
A.Сравните msg.sender с подписанным адресом.
B.Получить сумму.
C.Убедитесь, что mintRequestId больше, чем тот, который сохранен в контракте.Если все требования выполнены, контракт одобряет чеканку и mintRequestId для изменений контракта.
Этот подход слишком прост?где слабые места и как вы их исправите?Можно ли как-то подделать подписи и как?
Спасибо.