RSA алгоритмы. Часть 4
Аннулирование открытого ключа с помощью шаблона метаморфного контракта
Смарт контракт создается путем загрузки байткода в память и возврата runtime кода. Когда смарт контракт создается с помощью команды create2, адрес контракта можно предсказать заранее. Адрес вычисляется из комбинации соли, деплоера и байткода инициализации. Если контракт самоуничтожится, то можно развернуть новый контракт по тому же адресу.
Обратите внимание, что адрес зависит от кода инициализации, а не от развертываемого кода. Можно развернуть разные байткоды, если код инициализации использует другой runtime код. Таким образом, мы можем иметь смарт контракт, первые k байт которого предназначены для самоуничтожения при определенном условии, а остальные байты - это открытый ключ RSA.
Поскольку адрес определен заранее, мы можем хранить адрес этого метаморфического контракта в неизменяемой переменной. Когда нам понадобится открытый ключ, мы можем выполнить EXTCODECOPY с этого адреса. Чтобы заменить открытый ключ, мы дадим контракту команду на самоуничтожение, а затем развернем новый контракт по этому адресу.
Экономим еще 100 единиц газа с помощью access lists
В EIP2930 добавлен новый тип транзакций, который позволяет пользователю заранее указать, к каким адресам и слотам хранения будет осуществляться доступ. Это позволяет узлам предварительно извлекать эти значения из хранилища, тем самым ускоряя время выполнения. Использование транзакции с access lists при вызове внешнего контракта позволяет сэкономить 100 газа. Обратите внимание, что эта экономия не распространяется на случаи, когда смарт контракт обращается к собственной переменной хранилища. Поскольку этот дизайн RSA presale airdrop полагается на внешний контракт для хранения открытого ключа, то использование списка доступа вполне уместно.
Бенчмарки: Затраты на газ в зависимости от размера ключа
Большая часть затрат на газ возникает из-за очень больших данных вызова в результате использования больших подписей. Если размер ключа установлен на 1024 бита, то данные вызова составят 128 байт. Каждый байт стоит 16 газа, так что общая стоимость газа для таких больших данных составляет 2 048 газа. По сравнению с большинством других сценариев использования, наш использует значительный объем памяти, и Ethereum взимает за это плату.
Почему это экономит газ по сравнению с ECDSA?
Из бенчмарков ясно, что чем больше ключ (и, следовательно, подпись), тем больше затраты на газ. Наш дизайн использует тот факт, что прекомпиляция назначает низкую цену за увеличение числа до низкой мощности. Стоимость выполнения прекомпилированного контракта в этих условиях при 0x05 составляет всего несколько сотен газа по сравнению с тысячами для выполнения прекомпиляции для ECDSA.
Выбор размера ключа
Хотя ключ с 829 битами и был взломан, для этого потребовался современный суперкомпьютер. Для таких задач, как выпуск в эфир токенов меньшей стоимости или предварительная продажа NFT, у злоумышленника нет стимула тратить от шестизначной суммы до миллиона долларов на взлом открытого ключа и получение NFT в ходе аирдропа.
Контрольные показатели размера ключа
RSA-896 (газ: 26 850)
RSA-960 (газ: 26 925)
RSA-1024 (газ: 27 033)
RSA-2048 (газ: 29 271)
#rsa
Post #1281
1.16K
- 👍 2
- 🤔 1