Разработчики - движущая сила экосистемы Injective
Injective предлагает широкий спектр децентрализованных приложений (dApps) для Web3-финансов, подходящих для самых разных задач. Если вы следите за экосистемой Injective и хотите узнать больше о создании своего первого dApp на Injective, это руководство для вас.
В этом руководстве мы расскажем о загрузке бинарных файлов injectived, создании вашего первого смарт-контракта, взаимодействии с ним через интерфейс командной строки (CLI), разработке интерфейса и его развертывании в тестовой сети.
Установка Injectived
injectived - это инструмент командной строки, используемый для взаимодействия с сетью Injective. Вы можете использовать CLI-интерфейс injectived для компиляции, развертывания и взаимодействия со смарт-контрактами Injective, запуска собственного узла и многого другого. Перед установкой убедитесь, что у вас установлены rustup вместе с последними версиями rustc и cargo. В настоящее время тестирование можно проводить с Rust v1.58.1+.
Кроме того, вам необходимо установить целевой пакет wasm32-unknown-unknown и пакет Rust crate cargo-generate.
Вы можете проверить версии с помощью следующих команд:
rustc --version
cargo --version
rustup target list --installed
Если wasm32 отсутствует в списке, выполните следующую команду:
rustup target add wasm32-unknown-unknown
Для установки cargo-generate выполните:
cargo install cargo-generate
Для установки injectived на вашем компьютере есть два варианта: установить его из двоичного файла или из исходного кода. Полные инструкции по обоим методам см. в разделе «Установка Injectived».
Ваш первый смарт-контракт
Смарт-контракт можно рассматривать как экземпляр объекта-синглтона, внутреннее состояние которого сохраняется в блокчейне. Пользователи могут инициировать изменения состояния или запрашивать состояние контракта, отправляя JSON-сообщения. Эти JSON-сообщения отличаются от сообщений Injective, таких как MsgSend и MsgExecuteContract.
Ваша задача как разработчика смарт-контрактов заключается в том, чтобы определить три функции, которые составляют интерфейс вашего смарт-контракта:
- instantiate(): конструктор, вызываемый во время создания экземпляра контракта для предоставления начального состояния
- execute(): вызывается, когда пользователь хочет вызвать метод в смарт-контракте
- query(): вызывается, когда пользователь хочет получить данные из смарт-контракта
В нашем образце контракта счетчика мы реализуем один метод instantiate, один метод query и два метода execute.
Шаблон счетчика
В вашем рабочем каталоге запустите ваш смарт-контракт с рекомендуемой структурой папок и параметрами сборки, выполнив следующие команды:
cargo generate --git https://github.com/CosmWasm/cw-template.git --branch 1.0 --name my-first-contract
cd my-first-contract
Этот шаблон предоставит вам базовую структуру для смарт-контракта. В файле src/contract.rs вы обнаружите, что стандартные точки входа CosmWasm instantiate(), execute() и query() правильно определены и подключены.
Состояние
Состояние управляет базой данных, где хранятся и доступны данные смарт-контракта.
Исходный шаблон имеет следующее базовое состояние, одиночная структура State, содержащая:
- count - 32-битное целое число, с которым будут взаимодействовать сообщения execute(), увеличивая или сбрасывая его.
- owner - адрес отправителя MsgInstantiateContract, который определяет, разрешены ли определенные сообщения выполнения.
InstantiateMsg
InstantiateMsg предоставляется контракту, когда пользователь создает экземпляр контракта в блокчейне с помощью MsgInstantiateContract. Это сообщение сообщает контракту его конфигурацию, а также его начальное состояние.
В Injective загрузка кода контракта и создание экземпляра контракта являются отдельными событиями, в отличие от Ethereum. Это разделение позволяет небольшому набору проверенных архетипов контрактов существовать в виде нескольких экземпляров, использующих одинаковый базовый код, но настроенных с разными параметрами (представьте себе один канонический ERC20 и несколько токенов, использующих его код).
ExecuteMsg
ExecuteMsg - это JSON-сообщение, передаваемое в функцию execute() через MsgExecuteContract. В отличие от InstantiateMsg, ExecuteMsg может существовать в виде нескольких различных типов сообщений для учета различных типов функций, которые смарт-контракт может предоставлять пользователям. Функция execute() разделяет эти сообщения на соответствующую логику обработчика сообщений.
У нас есть два ExecuteMsg: Increment и Reset.
- Increment не имеет входных параметров и увеличивает значение count на 1.
- Reset принимает 32-битное целое число в качестве параметра и сбрасывает значение count до входного параметра.
QueryMsg
Query-сообщение GetCount не имеет параметров и возвращает значение count.
Тестирование
Перед развертыванием кода в цепочке необходимо провести модульное тестирование в качестве первой линии обеспечения. Они выполняются быстро и могут предоставлять полезные обратные трассировки при сбоях с флагом RUST_BACKTRACE=1:
cargo unit-test // run this with RUST_BACKTRACE=1 for helpful backtraces
Вы можете найти реализацию модульного теста в src/contract.rs
Сборка контракта
Теперь, когда мы поняли и протестировали контракт, мы можем выполнить следующую команду для его сборки. Это проверит наличие предварительных ошибок, прежде чем мы оптимизируем контракт на следующем шаге.
cargo wasm
Далее, мы должны оптимизировать контракт, чтобы подготовить код к загрузке в цепочку.
CosmWasm имеет rust-optimizer, оптимизирующий компилятор, который генерирует небольшой и согласованный выходной результат сборки. Самый простой способ использовать инструмент - это опубликованный образ Docker - проверьте здесь для получения последней версии x86 или здесь для получения последней версии ARM. При работающем Docker используйте следующую команду, чтобы подключить код контракта к /code и оптимизировать вывод (вы можете использовать абсолютный путь вместо $(pwd), если вы не хотите сначала переходить в каталог):
Для x86:
docker run --rm -v "$(pwd)":/code \
--mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target \
--mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \
cosmwasm/rust-optimizer:0.12.12
Для ARM64:
docker run --rm -v "$(pwd)":/code \
--mount type=volume,source="$(basename "$(pwd)")_cache",target=/code/target \
--mount type=volume,source=registry_cache,target=/usr/local/cargo/registry \
cosmwasm/rust-optimizer-arm64:0.12.12
Это создает каталог artifacts с PROJECT_NAME.wasm и файлом checksums.txt, содержащим SHA256-хэш файла Wasm. Файл Wasm компилируется детерминированно, то есть любой другой человек, запускающий тот же образ Docker с тем же коммитом Git, должен получить идентичный файл с тем же SHA256-хэшем.
Загрузка контракта Wasm
Как упоминалось выше, смарт-контракты Wasm загружаются через CLI injectived. Для продолжения инициализируйте и пополните счет тестовыми средствами (см. инструкции здесь). После этого выполните следующую команду для загрузки контракта:
# inside the "injective-core-staging" container, or from the contract directory if running injectived locally
yes 12345678 | injectived tx wasm store artifacts/my_first_contract.wasm \
--from=$(echo $INJ_ADDRESS) \
--chain-id="injective-888" \
--yes --fees=1000000000000000inj --gas=2000000 \
--node=https://k8s.testnet.tm.injective.network:443
Далее, введите свой адрес в Injective Testnet Explorer и найдите транзакцию с txhash, возвращенным из хранения кода в цепочке. Тип транзакции должен быть MsgStoreCode.
Затем введите свой адрес в Injective Testnet Explorer и найдите транзакцию с txhash, полученным при хранении кода на цепи. Тип транзакции должен быть MsgStoreCode.
И вуаля! Вы успешно создали и загрузили свой первый смарт-контракт на Injective. Более подробную информацию и контекст каждого шага можно найти здесь.
Далее давайте создадим фронт-энд для взаимодействия с этим контрактом через пользовательский интерфейс.
Создание интерфейса
Хотя взаимодействие с вашим контрактом через CLI Injective возможно, это не идеально для большинства пользователей dApp. Веб-интерфейс может обеспечить гораздо лучший пользовательский опыт.
Вместо того, чтобы отправлять сообщения о транзакциях через injectived, мы можем абстрагировать сложность и предоставить пользователю две кнопки: одну для увеличения счетчика и одну для его сброса.
В качестве примера см. пример веб-сайта счетчика. Общее руководство по разработке интерфейса с использованием Vue и Injective TypeScript SDK можно найти в injective-simple-sc-counter/nuxt. Для реализации React см. injective-simple-sc-counter-ui/next.
Теперь взаимодействие с контрактом сводится к нажатию кнопки и подписи с помощью кошелька, такого как MetaMask (убедитесь, что счет настроен на Ethereum Goerli Testnet, чтобы избежать ошибки несоответствия идентификатора цепочки).
И вот так, вы создали свой первый dApp на Injective!
Для дальнейшего изучения
- Посетите сайт документации Injective, чтобы узнать больше информации, ознакомиться с передовыми практиками и следить за последними обновлениями Injective.
Счастливой разработки, нинзя!
Injective - это молниеносная, совместимая блокчейн-платформа первого уровня, оптимизированная для создания первоклассных приложений Web3 Finance. Injective предоставляет разработчикам мощные модули plug-and-play для создания непревзойденных dApps. INJ - это собственный актив, который питает Injective и его быстрорастущую экосистему. Injective инкубируется Binance и поддерживается ведущими инвесторами, такими как Jump Crypto, Pantera и Mark Cuban.