Обучение
December 15, 2023

Развертывание смарт-контракта ERC20 на Starknet x Cairo

Это руководство покажет вам, как развернуть любой смарт-контракт в сети Starknet.

В конце вы узнаете, как развернуть его в тестовой сети Starknet и сминтить токен ERC20 на смарт-контракте.

Давайте приступим!

My Telegram Channel

План

  1. Что такое Starknet?
  2. Создание смарт-контракта Starknet
  3. Компиляция Контракта
  4. Установка компилятора Scarb
  5. Компиляция и сборка
  6. Установка Starkli
  7. Создание аккаунта
  8. Развертывание учетной записи
  9. Объявление классов
  10. Развертывание контракта ERC20
  11. Взаимодействие с контрактом Starknet
  12. Вызов контракта
  13. Вызов функции считывания
  14. Резюмируем
  15. Низкая задержка и БЕСПЛАТНАЯ нода Starknet ждут вас!

Что такое Starknet?

StarkNet - это децентрализованный ZK-роллап второго уровня, работающий поверх Ethereum, разработанный компанией StarkWare. Он позволяет любому dApp достичь неограниченного масштаба для своих вычислений, не ставя под угрозу композитность и безопасность Ethereum.

StarkNet использует STARK-доказательства, разновидность технологии доказательств с нулевым знанием, для пакетной обработки транзакций вне цепи перед их завершением на блокчейне Ethereum, что обеспечивает высокую пропускную способность и снижает затраты на газ. Он поддерживает общие вычисления, то есть может выполнять любые программы, как и Ethereum, но с преимуществами масштабируемости, обеспечиваемыми решениями второго уровня.

Создание смарт-контракта Starknet

Вы будете использовать Cairo для программирования смарт-контрактов для Starknet, чтобы сэкономить время разработчиков, мы создаем шаблоны смарт-контрактов для вас, включая ERC20, ERC20 Airdrop, ERC721, ERC721 Airdrop, ERC1155 и NFT Marketplace в репозитории.

Вы можете получить контракты далее:

git clone [email protected]:reddio-com/cairo.git

Компиляция Контракта

Давайте скомпилируем и развернем контракт. Начиная с версии Starknet v0.11.0, контракты Cairo 1.0 могут быть развернуты.

Прежде чем начать, необходимо установить инструменты разработки Starknet:

Starkli - CLI-инструмент для взаимодействия со Starknet.
Scarb - менеджер пакетов Cairo, который компилирует код в Sierra, язык среднего уровня между Cairo и CASM.

Установка Skarb

curl --proto '=https' --tlsv1.2 -sSf https://docs.swmansion.com/scarb/install.sh | sh

Для Windows следуйте инструкциям по настройке в документации Scarb.

Перезапустите терминал и проверьте, правильно ли установлен Scarb:

scarb --version

Компиляция и Сборка

scarb build

После этого вы получите целевой каталог, содержащий скомпилированные файлы sierra.

Установка Starkli

Если вы работаете под Linux/macOS/WSL/Android, вы можете установить stakrliup, выполнив следующую команду:

curl https://get.starkli.sh | sh

Возможно, вам придется перезапустить сеанс shell, чтобы команда starkliup стала доступной.

Как только она станет доступна, выполните команду starkliup:

starkliup

Выполнение этих команд установит для вас starkli и обновит его до последней версии, если он уже установлен.

Starkliup определяет платформу вашего устройства и автоматически загружает нужный бинарник. Он также устанавливает завершения shell. Возможно, вам придется перезапустить сеанс shell, чтобы завершение начало работать.

Создание аккаунта

Создайте хранилище ключей:

starkli signer keystore new /path/to/keystore

Файл keystore будет создан по адресу /path/to/keystore.

Затем вы сможете использовать его с помощью опции --keystore <PATH> для команд, ожидающих подписывающее устройство.

Кроме того, вы можете установить переменную окружения STARKNET_KEYSTORE, чтобы упростить вызов команд:

export STARKNET_KEYSTORE="/path/to/keystore"

Перед созданием учетной записи вы должны решить, какой вариант использовать. На данный момент единственным поддерживаемым вариантом является oz, контракт учетной записи OpenZeppelin.

Все варианты поставляются с подкомандой init, которая создает файл учетной записи, готовый к развертыванию. Например, чтобы создать учетную запись oz:

starkli account oz init /path/to/account

Развертывание учетной записи

После того как у вас есть файл счета, вы можете развернуть контракт счета с помощью команды starkli account deploy. Эта команда отправляет транзакцию DEPLOY_ACCOUNT, которая требует, чтобы счет был пополнен некоторым количеством ETH для оплаты комиссии за транзакцию.

Вы можете получить несколько тестовых токенов StarkNet тут

Например, чтобы развернуть учетную запись, которую мы только что создали:

starkli account deploy /path/to/account

После выполнения команда показывает адрес, на котором будет развернут контракт, и инструктирует пользователя пополнить счет, прежде чем приступить к работе. Вот пример вывода команды:

The estimated account deployment fee is 0.000011483579723913 ETH. However, to avoid failure, fund at least: 0.000017225369585869 ETH to the following address: 0x01cf4d57ba01109f018dec3ea079a38fc08b789e03de4df937ddb9e8a0ff853a Press [ENTER] once you've funded the address.

После подтверждения операции развертывания учетной записи файл учетной записи будет обновлен, чтобы отразить статус развертывания. Затем его можно использовать в командах, где ожидается наличие учетной записи. Учетную запись можно передать либо с помощью параметра --account, либо с помощью переменной окружения STARKNET_ACCOUNT.

Объявление классов

В Starknet все развернутые контракты являются экземплярами определенных объявленных классов. Поэтому первым шагом развертывания контракта является объявление класса, если он еще не был объявлен.

В Starkli это делается с помощью команды starkli declare.

Перед объявлением необходимо задать переменные окружения для Starkli:

export STARKNET_RPC="https://starknet-goerli.reddio.com"
export STARKNET_ACCOUNT=/path/to/keystore 
export STARKNET_KEYSTORE=/path/to/account

Примечания: Чтобы упростить развертывание, вы можете объявить STARKNET_RPC узлом RPC Reddio для тестовой сети Starknet.

После сборки scarb в целевом каталоге появится файл *.json, который мы будем использовать для объявления класса контракта:

starkli declare *.json

например:

starkli declare target/dev/reddio_cairo_ERC20.contract_class.json

Если вы столкнулись со следующей ошибкой:

Error: No such file or directory (os error 2)

Возможно, вы неправильно определяете переменные окружения, убедитесь, что вы используете абсолютный путь для пути к файлу.

Если вы получаете ошибку, подобную этой:

Not declaring class as it's already declared.

Это происходит потому, что класс уже был объявлен кем-то другим, а в Starknet класс не может быть объявлен дважды. Вы можете просто развернуть его, используя текущий объявленный класс, или написать новый уникальный контракт.

После успешного объявления Starkli отображает хэш объявленного класса. Хеш класса необходим для развертывания контрактов, как показано ниже

Enter keystore password:
Sierra compiler version not specified. Attempting to automatically decide version to use...
Network detected: goerli-1. Using the default compiler version for this network: 2.1.0. Use the --compiler-version flag to choose a different version.
Declaring Cairo 1 class: 0x004d09cf179b98c6551ac5114c10f21674b8955fdd6104dbc7c79b75177da690
Compiling Sierra class to CASM with compiler version 2.1.0...
CASM class hash: 0x04e224312aea85f8a343cd5e7d6ae7a063a6151cf809a8c9dbc3bc022b0e83bb
Contract declaration transaction: 0x07d6d3559e939f282b59048473effe52321bd204faff72d56dd4286bef934046
Class hash declared:
0x004d09cf179b98c6551ac5114c10f21674b8955fdd6104dbc7c79b75177da690

Развертывание контракта ERC20

Как только вы получите хэш класса (объявив класс), он будет готов к развертыванию экземпляров класса.

В Starkli это делается с помощью команды starkli deploy.

Чтобы развернуть контракт с хэшем класса <CLAS_HASH>, просто выполните команду:

starkli deploy <CLASS_HASH> <CONSTRUCTOR_INPUTS>

где <CONSTRUCTOR_INPUTS> - список аргументов конструктора, если таковые имеются.

Обратите внимание, что в CLI - строковые параметры должны быть приведены к шестнадцатеричному виду. Поэтому нам нужно преобразовать короткую строку в формат felt252. Для этого мы можем использовать команду to-cairo-string:

starkli to-cairo-string <STRING>

В данном случае в качестве имени и символа мы будем использовать строку "reddiotoken":

starkli to-cairo-string reddiotoken

Вывод:

0x72656464696f746f6b656e

Мы определим десятичные числа как 0x12, что равно 18, чтобы согласовать их с конвенцией ETH и ERC20.

Теперь разверните класс с помощью хэша и ввода конструктора:

starkli deploy 0x004d09cf179b98c6551ac5114c10f21674b8955fdd6104dbc7c79b75177da690 0x72656464696f746f6b656e 0x72656464696f746f6b656e 0x12

Вывод должен выглядеть примерно так:

Deploying class 0x004d09cf179b98c6551ac5114c10f21674b8955fdd6104dbc7c79b75177da690 with salt 0x046c071e77a7d09a3e2a9684ab7c59ff8bccc6cec23ede033cee82f75e50f2cc...
The contract will be deployed at address 0x007dda0853091a7f359b17eeb5ea234c9a626da5f389837c4cbeba9ff88e5bb6
Contract deployment transaction: 0x0264dd8f0bfdf373dcd78932676cd4ca987e33313521100c6ef8e286048c2b4e
Contract deployed:
0x007dda0853091a7f359b17eeb5ea234c9a626da5f389837c4cbeba9ff88e5bb6

ПРИМЕЧАНИЕ: Полученный адрес развертывания будет отличаться для каждого пользователя. Сохраните этот адрес, так как он будет заменять экземпляры в последующих файлах TypeScript, чтобы соответствовать конкретному адресу контракта.

Отлично! Смарт-контракт Cairo ERC20 был успешно развернут на Starknet. Вы можете найти развернутый токен на Starkscan.

Взаимодействие с контрактом Starknet

Starkli позволяет взаимодействовать со смарт-контрактами с помощью двух основных методов: вызов функций, предназначенных только для чтения, и вызов функций, предназначенных для записи, которые изменяют состояние.

Вызов контракта

В Starkli это делается с помощью команды starkli invoke.

Основной формат команды starkli invoke следующий:

starkli invoke <ADDRESS> <SELECTOR> <ARGS>

Например, чтобы добыть 1 000 000 токенов для контракта ERC20 по адресу 0x4e1f5590b0fc94f4ba6b563937ec652a9cbfc7b7372433fb4f1eaf2464a3de, вы можете выполнить команду:

starkli invoke 0x007dda0853091a7f359b17eeb5ea234c9a626da5f389837c4cbeba9ff88e5bb6 mint 0x4e1f5590b0fc94f4ba6b563937ec652a9cbfc7b7372433fb4f1eaf2464a3de u256:100000

Вызов функции считывания

Команда call позволяет запросить функцию смарт-контракта без отправки транзакции. Например, чтобы узнать, кто является текущим владельцем контракта, вы можете использовать функцию get_owner, которая не требует аргументов.

starkli call 0x007dda0853091a7f359b17eeb5ea234c9a626da5f389837c4cbeba9ff88e5bb6 get_name

Замените <CONTRACT_ADDRESS> на адрес вашего контракта. Команда вернет имя токена ERC20, которое было изначально задано при развертывании контракта:

[
    "0x00000000000000000000000000000000000000000072656464696f746f6b656e"
]

Аналогично, чтобы запросить общее предложение после вызова функции mint,

starkli call 0x007dda0853091a7f359b17eeb5ea234c9a626da5f389837c4cbeba9ff88e5bb6 get_total_supply

Вот полученный результат,

[
    "0x00000000000000000000000000000000000000000000000000000000000f4240",
    "0x0000000000000000000000000000000000000000000000000000000000000000"
]

Резюмируем

В этой статье мы в основном сосредоточились на компиляции и развертывании контракта ERC20 Cairo 1.0. В настоящее время Cairo 1.0 находится на стадии быстрой итерации, и синтаксис может быть скорректирован в будущем. Вы можете отслеживать последнюю информацию о синтаксисе, следя за обновлениями Starknet и Redidio. Вы можете зайти в наш репозиторий, и мы будем внимательно его обновлять по мере того, как StarkNet будет полностью развертывать 1.0, или присоединиться к нашему Discord, если у вас есть вопросы или вы хотите внести свой вклад.

Ну и конечно, не забывайте про наш Telegram-Канал

Низкая задержка и БЕСПЛАТНАЯ нода Starknet ждут вас!

В течение ограниченного времени я предлагаю неограниченный доступ к своему высокоскоростному узлу StarkNet совершенно бесплатно. Это беспрецедентная возможность испытать самое быстрое соединение с минимальной задержкой. Все, что вам нужно сделать, это зарегистрировать аккаунт по ссылке и начать исследовать безграничные возможности.

О том, почему Reddio претендует на самое быстрое соединение, вы можете узнать здесь