Ограничьте взаимодействие пользователя с методом контракта, подписав данные, используя адрес сервера dapp - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть контракт токенов ERC20 с функцией чеканки токенов.

Эта функция должна позволять пользователям чеканить токены после выполнения определенных действий или действий на веб-сайте.Если пользователь успешно выполнит действие, он сможет отправить транзакцию с помощью функции mint и получить токены.

Мой рабочий процесс и проблемы: чтобы пользователи не могли напрямую взаимодействовать с контрактом и чеканили столько токенов, сколько они хотят, контракт разрешает только определенный адрес eth вызывать функцию mint.Этот определенный адрес будет установлен на сервере и будет подписывать транзакции, если действия были выполнены успешно.Однако это означает, что этот адрес также должен будет оплачивать газ.

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

Возможная и простая реализация этого, как я предполагал, следующая:

  1. Сервер подписывает три фрагмента информации: адрес пользователя, сумму, которую нужно чеканить, и целое число, которое увеличивается с каждой транзакцией (он же mintRequestId) - это увеличение может быть случайным.
  2. Эти три хэшированные строки передаются клиентской логике моего пользователя и служат аргументами для метода моего контракта, который должен посылать:

    myContract.methods.Mint (signatureAddresses, signatureMintAmount, signatureMintRequestId) .send ({from: userWallet})

  3. В своем контракте я восстановил три аргумента, используя открытый ключ кошелька моего сервера, и:

    A.Сравните msg.sender с подписанным адресом.

    B.Получить сумму.

    C.Убедитесь, что mintRequestId больше, чем тот, который сохранен в контракте.Если все требования выполнены, контракт одобряет чеканку и mintRequestId для изменений контракта.

Этот подход слишком прост?где слабые места и как вы их исправите?Можно ли как-то подделать подписи и как?

Спасибо.

...