Solidity 0.8.29
Вчера выпустили новую версию Solidity, вот несколько ключевых изменений, а также пара ссылок.
1. В версии 0.8.29 появилась экспериментальная поддержка EVM Object Format (EOF). Обратите внимание, что эта функция может быть включена только при компиляции для версии EVM Osaka, которая еще не была развернута в mainnet или testnets.
Чуть больше об этом можно узнать тут:
https://x.com/uttam_singhk/status/1830526179105001771
В связи с экспериментальным характером функции, не все синтаксические различия покрываются проверками анализа на данный момент, и в некоторых случаях вы можете столкнуться с внутренними ошибками компилятора при попытке их использования.
Кроме того, компиляция в EOF может быть выполнена только через IR и только при включенном оптимизаторе. Текущая реализация, однако, не включает никаких низкоуровневых оптимизаций, что может привести к увеличению размера кода в некоторых случаях.
Чтобы опробовать ее на своем контракте, используйте --experimental-eof-version 1 в командной строке или settings.eofVersion: 1 в стандартном JSON и не забудьте выбрать версию EVM, которая ее поддерживает (--evm-version osaka/settings.evmVersion: «osaka»).
2. В этом выпуске появился синтаксис для перемещения переменных хранения контракта в произвольное место.
Поддержка указания местоположения хранилища - один из самых старых и обсуждаемых запросов в трекере проблем Solidity, но множество вариантов использования и потенциально противоречивые требования до сих пор не позволяли прийти к какому-то конкретному решению. С включением EIP-7702: Set EOA account code в обновление Pectra, это стало критичным для безопасной реализации абстракции учетных записей, и разработчики решили сделать этот вариант использования приоритетным.
В настоящее время синтаксис очень ограничен: базовое местоположение может быть только буквальным выражением и применяется ко всему дереву наследования.
Чуть больше о EIP7702 можно прочитать тут:
https://cantina.xyz/introduction/pectra-competition-resources/eip-7702
3. Начальная поддержка ethdebug. Этот релиз также представляет первый экспериментальный шаг к поддержке ethdebug - формата отладочных данных, подходящего для смарт-контрактов.
Текущая реализация поддерживает генерацию инструкций и диапазонов исходных текстов. Эта начальная версия поддерживает только неоптимизированную компиляцию через IR и все еще не имеет многих важных возможностей.
Если вы хотите попробовать, вы можете включить вывод ethdebug в командной строке с помощью команды:
Чтобы запросить артефакты ethdebug в стандартном JSON, добавьте
в settings.outputSelection (обратите внимание, что символ «*» не включает его). Также не забывайте, что settings.viaIR: true/--via-ir необходим для работы функции.
4. Также были исправлены несколько проблем с SMTChecker, Error Reporting, Yul Optimizer, а также перешил с C++17 на C++20.
#solidity
📟 Прилетело из @solidityset
🍣 На суши
Вчера выпустили новую версию Solidity, вот несколько ключевых изменений, а также пара ссылок.
1. В версии 0.8.29 появилась экспериментальная поддержка EVM Object Format (EOF). Обратите внимание, что эта функция может быть включена только при компиляции для версии EVM Osaka, которая еще не была развернута в mainnet или testnets.
Чуть больше об этом можно узнать тут:
https://x.com/uttam_singhk/status/1830526179105001771
В связи с экспериментальным характером функции, не все синтаксические различия покрываются проверками анализа на данный момент, и в некоторых случаях вы можете столкнуться с внутренними ошибками компилятора при попытке их использования.
Кроме того, компиляция в EOF может быть выполнена только через IR и только при включенном оптимизаторе. Текущая реализация, однако, не включает никаких низкоуровневых оптимизаций, что может привести к увеличению размера кода в некоторых случаях.
Чтобы опробовать ее на своем контракте, используйте --experimental-eof-version 1 в командной строке или settings.eofVersion: 1 в стандартном JSON и не забудьте выбрать версию EVM, которая ее поддерживает (--evm-version osaka/settings.evmVersion: «osaka»).
2. В этом выпуске появился синтаксис для перемещения переменных хранения контракта в произвольное место.
contract C layout at 2**255 - 42 {
uint x;
}Поддержка указания местоположения хранилища - один из самых старых и обсуждаемых запросов в трекере проблем Solidity, но множество вариантов использования и потенциально противоречивые требования до сих пор не позволяли прийти к какому-то конкретному решению. С включением EIP-7702: Set EOA account code в обновление Pectra, это стало критичным для безопасной реализации абстракции учетных записей, и разработчики решили сделать этот вариант использования приоритетным.
В настоящее время синтаксис очень ограничен: базовое местоположение может быть только буквальным выражением и применяется ко всему дереву наследования.
Чуть больше о EIP7702 можно прочитать тут:
https://cantina.xyz/introduction/pectra-competition-resources/eip-7702
3. Начальная поддержка ethdebug. Этот релиз также представляет первый экспериментальный шаг к поддержке ethdebug - формата отладочных данных, подходящего для смарт-контрактов.
Текущая реализация поддерживает генерацию инструкций и диапазонов исходных текстов. Эта начальная версия поддерживает только неоптимизированную компиляцию через IR и все еще не имеет многих важных возможностей.
Если вы хотите попробовать, вы можете включить вывод ethdebug в командной строке с помощью команды:
--ethdebug/--ethdebug-runtime.
Чтобы запросить артефакты ethdebug в стандартном JSON, добавьте
evm.bytecode.ethdebug»/«evm.deployedBytecode.ethdebug
в settings.outputSelection (обратите внимание, что символ «*» не включает его). Также не забывайте, что settings.viaIR: true/--via-ir необходим для работы функции.
4. Также были исправлены несколько проблем с SMTChecker, Error Reporting, Yul Optimizer, а также перешил с C++17 на C++20.
#solidity
📟 Прилетело из @solidityset
🍣 На суши
gm! Реакций на предыдущие посты собрали мало, так что сегодня без авторского перевода - изучайте оригинал 😶
Статья от настоящего олда разработки - блоггера с 2002 года, опенсорс разработчика и автора фреймворка Django
https://simonwillison.net/2025/Mar/11/using-llms-for-code/
📟 Прилетело из @insuline_eth
🍣 На суши
Статья от настоящего олда разработки - блоггера с 2002 года, опенсорс разработчика и автора фреймворка Django
https://simonwillison.net/2025/Mar/11/using-llms-for-code/
📟 Прилетело из @insuline_eth
🍣 На суши
Please open Telegram to view this post
VIEW IN TELEGRAM
Simon Willison’s Weblog
Here’s how I use LLMs to help me write code
Online discussions about using Large Language Models to help write code inevitably produce comments from developers who’s experiences have been disappointing. They often ask what they’re doing wrong—how come some …
БЫК ОСЕМЕНИТЕЛЬ ПОЛУЧИЛ ГРАНДИОЗНОЕ ОБНОВЛЕНИЕ С МОЛОЧКОМ ⠀⠀⠀
Марсель печатает...
Здарова, братва, выкатываю улучшенный кликер под последнее обновление в Eclipse Turbo Tap.
Всё как раньше и даже больше:
— Автоматические клики с рандомной частотой
— Автоклик по случайной области
— Настройка диапазона пауз
— Автосбор молока
— Автоматическая покупка бустов
— Рестарт страницы после паузы для уменьшения лагов
Установка:
1. Качаем расширение Tampermonkey
2. Создаем новый скрипт
3. Заходим в файл на гитхабе main.js.
4. Копируем и вставляем код в тамперманки.
5. Обязательно включаем режим разработчика в расширениях браузера
https://github.com/Marcelkoo/turbo-tap-clicker
https://github.com/Marcelkoo/turbo-tap-clicker
https://github.com/Marcelkoo/turbo-tap-clicker
С вас лайк и подписка. Не забываем заходить в чатик, я там отвечаю на вопросы и сливаю деньги на фьючах.
📟 Прилетело из @marcelkow_crypto
📟 На серваки
Марсель печатает...
Здарова, братва, выкатываю улучшенный кликер под последнее обновление в Eclipse Turbo Tap.
Всё как раньше и даже больше:
— Автоматические клики с рандомной частотой
— Автоклик по случайной области
— Настройка диапазона пауз
— Автосбор молока
— Автоматическая покупка бустов
— Рестарт страницы после паузы для уменьшения лагов
Установка:
1. Качаем расширение Tampermonkey
2. Создаем новый скрипт
3. Заходим в файл на гитхабе main.js.
4. Копируем и вставляем код в тамперманки.
5. Обязательно включаем режим разработчика в расширениях браузера
https://github.com/Marcelkoo/turbo-tap-clicker
https://github.com/Marcelkoo/turbo-tap-clicker
https://github.com/Marcelkoo/turbo-tap-clicker
С вас лайк и подписка. Не забываем заходить в чатик, я там отвечаю на вопросы и сливаю деньги на фьючах.
📟 Прилетело из @marcelkow_crypto
📟 На серваки
🔥1
#Roko: общайтесь с нейронкой в боте, упоминайте в любом чате и получайте награды, выполняйте квесты и задания, покупайте ноды для пассивного начисления поинтов и так далее...
Как всегда за всё выше перечисленное выдаются баллы, что в будущем возможно будут конвертированы в токен.
Насколько я понял, в будущем это будет проект по созданию ИИ-агентов в Ton и Telegram.
Учитывая, что на это хайп, направление актуальное.
Правда сейчас просадка, но думаю это не конец эпохи ИИ-агентов в web3.
Также удивило, когда упоминул Roko в одном чате, где бота точно нет, и он через время начислил награду за это!
Это прям круто!
Оценка за концепт: 4 из 5, т. к. сам функционал создания ИИ-агентов пока не реализован.
Команда:
Неизвестна.
Но есть канал @JoinRoko, где публикуют новости по боту, а также информацию о квестах в загадочном формате.
Можно написать на e-mail rokoteam@proton.me, но я пока жду ответа на вопросы. Правда бот на моё сообщение с просьбой написать инфу о команде и токеномике написал, что нет пока этих данных.
Итог по команде: оценка 2 из 5 (есть канал и чат @RokoChat, и достаточно активный, но нет инфы об участниках).
Коин:
Токеномики нет, ютилити тоже.
Инвестиции неизвестны.
Оценка 1 из 5.
Код:
Закрыт. Оценка 1 из 5.
Практика:
1. Запускаем.
2. Видим такую страницу (скрин 1).
3. Вам предложат поиграть в snake roko: если согласны, нажимаете по названию, и появится кнопка для начала игры (скрин 2).
4. "Play Game" - появляется игра.
Но она мне недоступна.
5. Ниже кнопки "Snake roko" нажимаем "Join Roko Chat" и вступаем. После к ней добавится слово "Completed", как сейчас у меня.
6. Также выполняем другие задания, если будут на главной.
7. На скрине 3 показана вкладка "Shop", где вы можете купить одну из нод.
У меня уже есть несколько.
Покупка за $TON или звёзды.
8. А вот и они (скрин 4) на вкладке "Bag".
Здесь можем выбирать их и получать награды кнопкой "COLLECT".
Важно делать это периодически, так как у некоторых есть лимит, до скольки идёт накопление.
Если типов нод несколько, переключение, например, на Super Node отобразит накопленные ею награды.
10. Вкладка "Roko" - это главная.
11. На скрине 5 показана вкладка "Quests".
Здесь вы можете скопировать свою рефку или поделиться ей, а также выполнить разные задания.
Как видите, у меня почти всё из базовых выполнено.
12. Выбрал "Update name", который даёт 4000 ROKO (скрин 6). Нажав "Update Name" можем увидеть подробную инфу о том, что надо сделать (скрин 7).
После этого жмёте "Claim Reward".
13. В Daily есть задание про упоминание Роко (скрин 8). По кнопке "How does it work?" можно узнать подробности.
Подобным образом проходите и другие квесты.
14. На вкладке "Top" показан топ 50 лидеров по накопленным баллам или по упоминаниям...
15. На скрине 10 пример общения с Роко в личке с ботом.
Практика: 5 из 5, т. к. всё удобно и понятно реализовано.
Общий итог:
13 из 25 или 2 из 5.
На этом всё.
Как вам бот?
Использовали его? Напишите в комментариях.
Решил написать о Roko, так как необычный проект:
До него ничего подобного не видел...
📟 Прилетело из @blind_dev
🍣 На суши
Как всегда за всё выше перечисленное выдаются баллы, что в будущем возможно будут конвертированы в токен.
Насколько я понял, в будущем это будет проект по созданию ИИ-агентов в Ton и Telegram.
Учитывая, что на это хайп, направление актуальное.
Правда сейчас просадка, но думаю это не конец эпохи ИИ-агентов в web3.
Также удивило, когда упоминул Roko в одном чате, где бота точно нет, и он через время начислил награду за это!
Это прям круто!
Оценка за концепт: 4 из 5, т. к. сам функционал создания ИИ-агентов пока не реализован.
Команда:
Неизвестна.
Но есть канал @JoinRoko, где публикуют новости по боту, а также информацию о квестах в загадочном формате.
Можно написать на e-mail rokoteam@proton.me, но я пока жду ответа на вопросы. Правда бот на моё сообщение с просьбой написать инфу о команде и токеномике написал, что нет пока этих данных.
Итог по команде: оценка 2 из 5 (есть канал и чат @RokoChat, и достаточно активный, но нет инфы об участниках).
Коин:
Токеномики нет, ютилити тоже.
Инвестиции неизвестны.
Оценка 1 из 5.
Код:
Закрыт. Оценка 1 из 5.
Практика:
1. Запускаем.
2. Видим такую страницу (скрин 1).
3. Вам предложат поиграть в snake roko: если согласны, нажимаете по названию, и появится кнопка для начала игры (скрин 2).
4. "Play Game" - появляется игра.
Но она мне недоступна.
5. Ниже кнопки "Snake roko" нажимаем "Join Roko Chat" и вступаем. После к ней добавится слово "Completed", как сейчас у меня.
6. Также выполняем другие задания, если будут на главной.
7. На скрине 3 показана вкладка "Shop", где вы можете купить одну из нод.
У меня уже есть несколько.
Покупка за $TON или звёзды.
8. А вот и они (скрин 4) на вкладке "Bag".
Здесь можем выбирать их и получать награды кнопкой "COLLECT".
Важно делать это периодически, так как у некоторых есть лимит, до скольки идёт накопление.
Если типов нод несколько, переключение, например, на Super Node отобразит накопленные ею награды.
10. Вкладка "Roko" - это главная.
11. На скрине 5 показана вкладка "Quests".
Здесь вы можете скопировать свою рефку или поделиться ей, а также выполнить разные задания.
Как видите, у меня почти всё из базовых выполнено.
12. Выбрал "Update name", который даёт 4000 ROKO (скрин 6). Нажав "Update Name" можем увидеть подробную инфу о том, что надо сделать (скрин 7).
После этого жмёте "Claim Reward".
13. В Daily есть задание про упоминание Роко (скрин 8). По кнопке "How does it work?" можно узнать подробности.
Подобным образом проходите и другие квесты.
14. На вкладке "Top" показан топ 50 лидеров по накопленным баллам или по упоминаниям...
15. На скрине 10 пример общения с Роко в личке с ботом.
Практика: 5 из 5, т. к. всё удобно и понятно реализовано.
Общий итог:
13 из 25 или 2 из 5.
На этом всё.
Как вам бот?
Использовали его? Напишите в комментариях.
Решил написать о Roko, так как необычный проект:
До него ничего подобного не видел...
📟 Прилетело из @blind_dev
🍣 На суши
Дарова. Пару апдейтов:
— Тяга анализировать новую нефть привела меня присоединиться к TON Foundation. Внезапно это открыло невиданные ранее нетворкинг оппортунитиз как в, так и вне тона.
— Полу-физтех командой размечаем адреса (уже 1000+), стоим бигдата пайплайны, парсеры bag of cells на SQL и конечно дешбордики.
— Запустили TON Data Hub и контест с DeDust: сделай дешборд на Дюне за $$$. Длится еще неделю, а потом новые проекты. И разметь адреса - получи райское наслаждение.
— Также плотно работал с некоторыми проектами из нашего преакселератора. Отвели и записали лекции топ челов. Думаем, что делать дальше.
Сори, что не пишу сюда часто. Как-то заработался, да и гораздо приятнее щитпостить в микро канальчике с друзьями и общаться в закрытых чатиках с брос. А еще меня в тг забанили (не за спам, а хз за что). Так что теперь пишите мне первыми))☕️
📟 Прилетело из @danokhlopkov
☕️ На кофе
— Тяга анализировать новую нефть привела меня присоединиться к TON Foundation. Внезапно это открыло невиданные ранее нетворкинг оппортунитиз как в, так и вне тона.
— Полу-физтех командой размечаем адреса (уже 1000+), стоим бигдата пайплайны, парсеры bag of cells на SQL и конечно дешбордики.
— Запустили TON Data Hub и контест с DeDust: сделай дешборд на Дюне за $$$. Длится еще неделю, а потом новые проекты. И разметь адреса - получи райское наслаждение.
— Также плотно работал с некоторыми проектами из нашего преакселератора. Отвели и записали лекции топ челов. Думаем, что делать дальше.
Сори, что не пишу сюда часто. Как-то заработался, да и гораздо приятнее щитпостить в микро канальчике с друзьями и общаться в закрытых чатиках с брос. А еще меня в тг забанили (не за спам, а хз за что). Так что теперь пишите мне первыми))
📟 Прилетело из @danokhlopkov
☕️ На кофе
Please open Telegram to view this post
VIEW IN TELEGRAM
• Разбор проекта был тут: ТЫК🔗
По сути перед нами очередной довольно амбициозный тестнет, в котором при наличии большого количества аккаунтов мы рискуем получить приятную зп на долгое время.
У проекта большой инвест и уровень хайпа, однако большинство "наградных" токенов будут с вестингом, на TGE выделена небольшая часть.
Поэтому делать данный проект в тестнете руками - богохульство. Ведь тратывашего времени могут быть не вознаграждены.
То ли дело делать 0G нашим софтиком в автоматическом режиме вместе с другими проектами, лутая максимальную выгоду.
— Клеймить газовый токен с крана, а также токены для свапов.
— Делать свапы. По сути это основная активность в проекте на данный момент.
— Есть минт NFT и домена.
— Есть загрузка файла на хранение (0G это же всё таки также хранилище данных)
— Если вам не хочется долго ждать фарм токенов с крана - есть модуль bridge, который через gas.zip забриджит токены за небольшую плату.
— Поддержка прокси и многопоток.
— Лёгкая настройка и возможность включить софт в планировщик, дабы он сам запускался каждый день в рандомное время.
Это пока первая стадия тестнета и она тихонько приближается к завершению. В ближайшее время начнётся вторая стадия и там мы уже будем готовы влетать с двух ног.
📟 Прилетело из @oxygen_tools
☯️ Почистить карму
Please open Telegram to view this post
VIEW IN TELEGRAM
Добавил модуль для отработки Fantasy Top
- Регистрирует акк по твиттеру
- Проходит онбординг
- Открывает пак
- Собирает деки и регается в турнирах
- Клеймит дейлик
- Все на запросах
📟 Прилетело из @thelaziestcoder
📟 На серваки
- Регистрирует акк по твиттеру
- Проходит онбординг
- Открывает пак
- Собирает деки и регается в турнирах
- Клеймит дейлик
- Все на запросах
📟 Прилетело из @thelaziestcoder
📟 На серваки
Я нечаянно удалил 34 запланированных дела, написал треды в Твиттере, создал пост с токеном в Zora и сделал другое. Мои #новости:
1. Создал пост о себе в Zora с токеном.
Буду рад поддержке в виде покупки его на любую цену. Заодно и активность проявите в проекте...
2. В dpos.space:
2.1. Сделал переадресацию на https.
2.2. Добавил в главное меню Viz (почему-то удалился).
2.3. Исправил ошибку в вёрстке на странице Минтера (была лишняя p>).
3. В @satoshiNotify добавил рейтинг холдеров $SATOSHI.
4. Опубликовал новые треды в X (буду рад лайкам и ретвитам):
4.1. По Skate chain.
4.2. По Sign protocol.
5. Продолжаю писать книгу с другими людьми.
После хочу продолжить свою "Друзья на век".
6. В четверг на некоторое время зависали скрипты - восстановил их работу.
7. Нечаянно удалил все свои планы:
Большой был список! На 34 пункта.
Надо будет как-нибудь засесть, попытаться их вспомнить. Либо хотя бы частично написать / запланировать новое...
8. Также завершил изучение одного курса и начал новый.
На этом всё. Благодарю за внимание. Хорошего дня!
Канал (подписаться), Чат | бот | Поддержать донатом
📟 Прилетело из @blind_dev
📟 На серваки
1. Создал пост о себе в Zora с токеном.
Буду рад поддержке в виде покупки его на любую цену. Заодно и активность проявите в проекте...
2. В dpos.space:
2.1. Сделал переадресацию на https.
2.2. Добавил в главное меню Viz (почему-то удалился).
2.3. Исправил ошибку в вёрстке на странице Минтера (была лишняя p>).
3. В @satoshiNotify добавил рейтинг холдеров $SATOSHI.
4. Опубликовал новые треды в X (буду рад лайкам и ретвитам):
4.1. По Skate chain.
4.2. По Sign protocol.
5. Продолжаю писать книгу с другими людьми.
После хочу продолжить свою "Друзья на век".
6. В четверг на некоторое время зависали скрипты - восстановил их работу.
7. Нечаянно удалил все свои планы:
Большой был список! На 34 пункта.
Надо будет как-нибудь засесть, попытаться их вспомнить. Либо хотя бы частично написать / запланировать новое...
8. Также завершил изучение одного курса и начал новый.
На этом всё. Благодарю за внимание. Хорошего дня!
Канал (подписаться), Чат | бот | Поддержать донатом
📟 Прилетело из @blind_dev
📟 На серваки
Будьте очень аккуратны с действием changed files для GH https://semgrep.dev/blog/2025/popular-github-action-tj-actionschanged-files-is-compromised/
📟 Прилетело из @dev_in_ruby_colors
📟 На серваки
📟 Прилетело из @dev_in_ruby_colors
📟 На серваки
Semgrep
🚨 Popular GitHub Action tj-actions/changed-files is compromised
Popular GitHub Action tj-actions/changed-files has been compromised with a payload that appears to attempt to dump secrets, impacting thousands of CI pipelines.
Понимание метаданных смарт-контракта. Часть 2
Выходные прошли и пора возвращаться к рабочим ритмам.
С прошлым постом я забыл дать прикрепить ссылку к оригинальной статье, поэтому исправляюсь и выделяю ее отдельно:
https://www.rareskills.io/post/solidity-metadata
Вообще у RareSkills очень хороший всегда материал и, при изучении каакой-либо темы, рекомендую искать подборки там.
А сейчас мы продолжаем разговор о metadata.
Расшифровка metadata
Давайте посмотрим на гекс в синей рамке скрина из предыдущего поста:
Далее рассмотрим код в красном поле:
Это дает нам подсказку о том, что содержат эти данные: хэш IPFS и версию компилятора solidity.
Хэш IPFS
Раздел, подчеркнутый желтым, вместе с бирюзовой рамкой можно поместить в следующий python-скрипт (обратите внимание, что мы используем версию кода с комментарием // nothing):
Qm...RTEa - это IPFS-хэш файла метаданных, созданного компилятором. Этот участок кода (бирюзовый и желтый) кодируется иначе, чем поля выше. В частности, IPFS-хэш (бирюзовый и желтый) представляет собой закодированную в base58 версию шестнадцатеричных данных «1220...RTEa».
Это хэш IPFS, который вы получите, если поместите JSON-файл из компилятора Solidity на IPFS. На скрине этого поста файл JSON, о котором идет речь.
Мы можем сохранить JSON-файл как реальный файл, а затем проверить, что хэш совпадает с тем, который мы создали в python выше. Вам понадобится установленный инструмент командной строки ipfs (как установить).
Это совпадает с хэшем, полученным ранее.
Не приведет ли это к коллизиям хэшей?
Если два контракта с идентичным исходным кодом и конфигурацией компилятора хранят свой проверенный исходный код на IPFS, хэши IPFS будут сталкиваться (clash), но это желательно, потому что это экономит место storage. Смарт-контракты однозначно идентифицируются по комбинации идентификатора цепочки и их адреса, а не по содержимому IPFS.
Получение версии solidity
Наконец, если мы преобразуем секцию в оранжевой рамке, то получим версию solidity.
Зачем нужны метаданные смарт-контракта?
Эти метаданные добавляют дополнительные 53 байта к стоимости развертывания, что означает дополнительные 10 600 газа (200 на байткод) + стоимость calldata (16 газа на ненулевой байт, 4 газа на нулевой байт). Это означает до 848 дополнительных газа к стоимости calldata.
Так зачем это включать?
Это позволяет строго проверять код смарт-контракта. В метаданные JSON, которые выводит компилятор, входит хэш исходного кода. Поэтому если исходный код немного изменится, то изменится и JSON-файл метаданных, и его IPFS-хэш изменится.
Один странный трюк для снижения расхода газа через хэш IPFS
Один из очевидных способов оптимизировать затраты на газ во время развертывания - использовать опцию --no-cbor-metadata. Но если вам это нужно для проверки контракта, то вы все равно можете снизить стоимость газа, добывая хэши IPFS, в которых много нулевых байтов.
Когда контракт будет развернут, нулевые байты уменьшат стоимость calldata. Поскольку исходный код хэшируется, включая комментарии, это означает, что можно добывать комментарии, которые приводят к газоэффективным хэшам IPFS, которые будут добавлены к контракту. Обратите внимание, это означает, что мы хотим, чтобы в шестнадцатеричном представлении хэша были нули, а не в кодировке base58.
#metadata
📟 Прилетело из @solidityset
🍣 На суши
Выходные прошли и пора возвращаться к рабочим ритмам.
С прошлым постом я забыл дать прикрепить ссылку к оригинальной статье, поэтому исправляюсь и выделяю ее отдельно:
https://www.rareskills.io/post/solidity-metadata
Вообще у RareSkills очень хороший всегда материал и, при изучении каакой-либо темы, рекомендую искать подборки там.
А сейчас мы продолжаем разговор о metadata.
Расшифровка metadata
Давайте посмотрим на гекс в синей рамке скрина из предыдущего поста:
>>> bytes.fromhex("69706673").decode("ASCII")
'ipfs'Далее рассмотрим код в красном поле:
>>> bytes.fromhex("736f6c63").decode("ASCII")
'solc'Это дает нам подсказку о том, что содержат эти данные: хэш IPFS и версию компилятора solidity.
Хэш IPFS
Раздел, подчеркнутый желтым, вместе с бирюзовой рамкой можно поместить в следующий python-скрипт (обратите внимание, что мы используем версию кода с комментарием // nothing):
import base58
hex_ipfs_hash = "12206a68b6b8bcc01ba559ec3adf7a387b6c4210a5dc69a05d038e9d17cae3fa373b"
bytes_str = bytes.fromhex(hex_ipfs_hash)
print(base58.b58encode(bytes_str).decode("utf-8"))
# QmVW2XyafSxDtiSqirJRauuT5SaQtGnQYsxxyYHrFmRTEa
Qm...RTEa - это IPFS-хэш файла метаданных, созданного компилятором. Этот участок кода (бирюзовый и желтый) кодируется иначе, чем поля выше. В частности, IPFS-хэш (бирюзовый и желтый) представляет собой закодированную в base58 версию шестнадцатеричных данных «1220...RTEa».
Это хэш IPFS, который вы получите, если поместите JSON-файл из компилятора Solidity на IPFS. На скрине этого поста файл JSON, о котором идет речь.
Мы можем сохранить JSON-файл как реальный файл, а затем проверить, что хэш совпадает с тем, который мы создали в python выше. Вам понадобится установленный инструмент командной строки ipfs (как установить).
mkdir out
solc --optimize-runs 1000 --bin --metadata C.sol --output-dir out
# Compiler run successful. Artifact(s) can be found in directory "out".
ipfs add -qr --only-hash out/Empty_meta.json
# QmVW2XyafSxDtiSqirJRauuT5SaQtGnQYsxxyYHrFmRTEa
Это совпадает с хэшем, полученным ранее.
Не приведет ли это к коллизиям хэшей?
Если два контракта с идентичным исходным кодом и конфигурацией компилятора хранят свой проверенный исходный код на IPFS, хэши IPFS будут сталкиваться (clash), но это желательно, потому что это экономит место storage. Смарт-контракты однозначно идентифицируются по комбинации идентификатора цепочки и их адреса, а не по содержимому IPFS.
Получение версии solidity
Наконец, если мы преобразуем секцию в оранжевой рамке, то получим версию solidity.
>>> 0x00 # solidity is version 0
0
>>> 0x08 # major version
8
>>> 0x14 # minor version
20
# correct, we used solidity 0.8.20
Зачем нужны метаданные смарт-контракта?
Эти метаданные добавляют дополнительные 53 байта к стоимости развертывания, что означает дополнительные 10 600 газа (200 на байткод) + стоимость calldata (16 газа на ненулевой байт, 4 газа на нулевой байт). Это означает до 848 дополнительных газа к стоимости calldata.
Так зачем это включать?
Это позволяет строго проверять код смарт-контракта. В метаданные JSON, которые выводит компилятор, входит хэш исходного кода. Поэтому если исходный код немного изменится, то изменится и JSON-файл метаданных, и его IPFS-хэш изменится.
Один странный трюк для снижения расхода газа через хэш IPFS
Один из очевидных способов оптимизировать затраты на газ во время развертывания - использовать опцию --no-cbor-metadata. Но если вам это нужно для проверки контракта, то вы все равно можете снизить стоимость газа, добывая хэши IPFS, в которых много нулевых байтов.
Когда контракт будет развернут, нулевые байты уменьшат стоимость calldata. Поскольку исходный код хэшируется, включая комментарии, это означает, что можно добывать комментарии, которые приводят к газоэффективным хэшам IPFS, которые будут добавлены к контракту. Обратите внимание, это означает, что мы хотим, чтобы в шестнадцатеричном представлении хэша были нули, а не в кодировке base58.
#metadata
📟 Прилетело из @solidityset
🍣 На суши