Автор: Алексей Куценко 👨💻
Блокчейн Scroll совместим с байт-кодом EVM и спроектирован таким образом, чтобы разработчики могли разрабатывать с их любимыми фреимворками с минимальными различиями. Заявлено, что блокчейн разрабатывался разработчиками Ethereum для разработчиков Ethereum.
Блокчейн не поддерживает erc-4337
c коробки.
Среднее время финализации транзакции в L1 ~ 3 минуты.
Уже существует целая экосистема вокруг этого блокчейна. К сожалению в указанном источнике отображаются не все dapps, например, уже есть возможность воспользоваться популярным oracle chainlink для получения цен на токены.
При разработке, всегда обращайтесь к актуальной документации тут.
При взаимодействии с сетью, например с тестнет Scroll, нужно учитывать, что EIP-1559 отключен в Scroll (мы поговорим о всех изменениях позже).
В Foundry существует флаг --legacy
который позволяет использовать legacy транзакции.
В данный момент, Foundry пытается автоматически включить флаг --legacy
для обычных сетей без EIP-1559.
Если же автоматически не включилось и произошла ошибка - EIP-1559 not activated
, то следует самому включить флаг указания типа транзакции.
Например:
forge create src/Contract.sol:MyToken --rpc-url=https://sepolia-rpc.scroll.io/ --legacy
Для использования данного фреимворка, необходимо всего лишь внести необходимую сеть в hardhat.config.ts
.
Например, давайте настроим под тестнет Scroll Sepolia:
...
const config: HardhatUserConfig = {
...
networks: {
scrollSepolia: {
url: "https://sepolia-rpc.scroll.io/" || "",
accounts:
process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [],
},
},
};
...
Для подключения необходимо добавить сеть в файл truffle-config.js
const HDWalletProvider = require("@truffle/hdwallet-provider")
...
module.exports = {
networks: {
scrollSepolia: {
provider: () =>
new HDWalletProvider(process.env.PRIVATE_KEY, "https://sepolia-rpc.scroll.io/"),
network_id: '*',
},
}
}
Для добавления сети необходимо воспользоваться командой brownie networks add Ethereum scrollSepolia host=https://sepolia-rpc.scroll.io/ chainid=534351
.
После чего, вы увидите, что сеть добавлена:
И можете это проверить через команду brownie networks list
Cмарт-контракты легко компилируются и деплоются в Remix. Для взаимодействия с тестнет, вам необходимо получить ETH. Способы можно посмотреть тут.
Тестировать возможно в вышеуказанных средах, но следует понимать, в связи с тем, что существуют отличия Scroll от Ethereum на уровне EVM, окончательная полноценная проверка работоспособности смарт-контрактов может быть проверена только через деплой в тестнет.
Хотя и было заявлено, что Scroll это решение от "Ethereum разработчиков для Ethereum-разработчиков" и данная сеть zkEVM совместима с Ethereum на уровне байт-кода, все же есть некоторые отличия, которые следует учитывать при разработке смарт-контрактов:
Opcodes
SELFDESTRUCT
→ отключен. Будет реверт транзакции.BASEFEE
→ отключен. Будет реверт транзакции.DIFFICULTY/PREVRANDAO
→ всегда возвращает 0.COINBASE
→ возвращает адрес predeployed контракта - Transaction Fee Vault. Контракты можно посмотреть тут.BLOCKHASH
→ возвращает keccak (chain_id || block_number) на последние 256 блоков.
Предварительно скомпилированные контракты
Поддерживаются:
- ecRecover
- identity
- ecAdd
- ecMul
Поддерживаются с изменениями:
-
modexp поддерживается, но поддерживает только входные данные размером меньше или равным 32 байтам (т. е. u256).
-
ecPairing поддерживается, но количество точек(sets, pairs) ограничено 4 вместо 6.
Временно не поддерживаются:
- SHA2-256 (address 0x2)
- RIPEMD-160 (address 0x3)
- blake2f (address 0x9)
При попытке вызова, будет реверт транзакции. Разработчики планируют включить их в будущем хард форке.
State account:
В структуру данных используемой для хранения информации о состоянии учетной записи были добавлены два поля PoseidonCodehash
и CodeSize
:
type StateAccount struct {
Nonce uint64 // счетчик, указывающий количество транзакций, отправленных отправителем
Balance *big.Int //Баланс ETH на балансе аккаунта (единица в wei).
Root common.Hash // Корень Merkle дерева хранилища
KeccakCodeHash []byte // Keccak хеш
// добавленные поля
PoseidonCodeHash []byte // Poseidon хеш
CodeSize uint64 // Количество байтов в байт-коде контракта
}
KeccakCodeHash - используется для поддержания совместимости с опкодом EXTCODEHASH
.
PoseidonCodeHash: - тип хеша используется для верификации правильности байт-кода, загруженного в zkEVM. Poseidon hash оптимизирован для использования в вычислениях Zero-Knowledge Proof и позволяет более эффективно и безопасно работать с байт-кодом смарт-контрактов в таких средах.
CodeSize - используется для сохранения размера контракта. Когда происходит верификация EXTCODESIZE, загрузка полных данных контракта в zkEVM является дорогостоящей, поэтому, вместо этого, мы сохраняем размер контракта в хранилище во время создания контракта. Таким образом, нам не нужно загружать код — достаточно доказательства из хранилища для верификации этого опкода.
Block
Для быстрой обратной связи и улучшения пользовательского опыта, Scroll реализовал время создания блока ~ 3 секунды.
block.timestamp возвращает временную метку L2 транзакций.
Разработчики отключили некоторые EIPs в London fork и включили новые с Shanghai fork для улучшения совместимости. Разработчики обещают вернуть EIP-2930 and EIP-1559 в будущем.
Отключили:
-
EIP-1559: Новая система комиссий с автоматически регулируемой базовой ставкой и сжиганием части комиссий, а также расширяемые размеры блоков для улучшения эффективности сети.
-
EIP-2930: Опциональные списки доступа в транзакции для уменьшения риска ошибок и улучшения взаимодействия со смарт-контрактами путём указания адресов и ключей хранения, которые они будут использовать.
-
EIP-3198: Вводит BASEFEE opcode в Ethereum, позволяющую смарт-контрактам напрямую получать информацию о текущей базовой комиссии сети, улучшая их адаптивность и функциональность.
Импортировали:
-
EIP-3651: Уменьшает стоимость газа для доступа к адресу майнера (операция COINBASE) в смарт-контрактах.
-
EIP-3855: Вводит PUSH0 opcode. Позволяет поместить значение нуля на стек, упрощая определённые операции и потенциально уменьшая затраты на газ за счет сокращения количества необходимых байтов для кодирования нулевых значений в смарт-контрактах.
-
EIP-3860: Ограничивает размер и измеряет стоимость инициализационного кода (initcode) для контрактов. Это направлено на уменьшение рисков безопасности и улучшение производительности сети, вводя ограничения на длину initcode и связывая стоимость его выполнения с его размером.