Използване на SDK на Axelar за свързани контракти

Natalia Dulapchi
11 min readSep 17, 2022

Технологията за предаване на съобщенията (General Message Passing — GMP) на Axelar позволява на смарт контрактите безопасно да взаимодействат в различни мрежи. Това позволява на разработчиците да изграждат свързани кросчейн приложения на Moonbeam, които могат да използват функционалност от Polkadot, Ethereum, Avalanche, Cosmos и други. В този блог ще представя пакета JavaScript SDK, който Axelar попълни с инструменти, за да подпомогне разработчиците в тази кросчейн визия.

Axelar SDK позволява на разработчиците да изчисляват такси, да проследяват и възстановяват транзакции и лесно да прехвърлят токени. За да покажем някои от инструментите, които SDK предоставя, ще преминем през демонстрация, която разгръща NFT, който може да се минтва в различни мрежи. Но преди да започнем, разгледайте последната ни публикация в блога за запознаване с кросчейн съобщения посредством Axelar.

Запознаване с контрактите на Axelar

Axelar е блокчейн, който свързва блокчейн мрежи и осигурява безопасна мултичейн комуникация. Всеки валидатор в мрежата на Axelar работи с леки ноди в мрежите, които Axelar поддържа. Този динамичен набор от валидатори достига консенсус, за да потвърди, че съобщенията се изпращат от една мрежа към друга, като контролира контракта Axelar gateway на всяка мрежа, който е един от двата контракта Axelar, с които ще взаимодействаме по-късно в демонстрацията.

Снимка от Axelar Network

Другият контракт, с който ще работим, е микроуслугата Axelar Gas Receiver. Всеки път, когато използвате шлюза на Axelar, за да изпратите транзакция между мрежите, IAxelarGasReceiver ви позволява да платите за последващата транзакция в целевата мрежа. Въпреки че не е необходимо, това позволява на крайния потребител да изпрати само една транзакция за автоматично актуализиране на целевата мрежа и да плати всички такси за транзакции в токена на изходната мрежа, който вече притежава.

Контрактът CrossChainNFT

Написах прост контракт, който може да минтва NFT само ако получи конкретно кросчейн съобщение.

Минтването на NFT ще изисква плащане с токени, които ще бъдат обединени в DEV ( собствената валута на Moonbase Alpha). Опакованият токен за собствена валута като DEV ще минтва един ERC-20 WDEV токен за всеки един DEV, изпратен към него, и ще даде възможност да се откупи един WDEV токен за един DEV. Използването на WDEV вместо собствен DEV е необходимо, защото Axelar изисква всички изпратени токени да бъдат ERC-20.

Така че, за да може да минтва в кросчейн съобщението, той трябва да получи поне 0,05 WDEV.

Въвеждаме един и същ договор в две мрежи, така че той трябва едновременно да изпраща и да получава съобщения. От високо ниво нашият контракт прави две неща:

  1. Изпращане на кодирано адресно съобщение с WDEV между мрежите чрез шлюза на Axelar с възможност за плащане на газ в мрежата на получателя
  2. Получава кодирано адресно съобщение от Axelar и го изпълнява само ако е получил поне 0,05 WDEV

Ще използвате проекта Hardhat, вместо да използвате Remix, но преди да го настроим, нека първо разгледаме няколко части от контракта. Препоръчвам ви да проследите процеса!

Контрактите, които могат да бъдат изпълнени от шлюза на Axelar, като нашия тук, наследяват IAxelarExecutable. Този основен договор има две функции, които могат да се пренастройват, _execute и _executeWithToken, които позволяват на разработчиците да променят логиката, когато контрактът получи повикване от шлюза Axelar. Двете функции имат еднакви входни данни, но _executeWithToken включва също tokenSymbol и сума, за да опише токена, който се изпраща по крос-чейн.

А сега нека най-накрая разгледаме нашата функция mint. Тя приема три входа: адрес на дестинация, мрежа на дестинация и количество WDEV за изпращане. Не забравяйте, че тази функция за минтване се извиква в изходната мрежа (Moonbase Alpha) и води до минтването на NFT в друга мрежа на дестинация.

Самата логика се състои от три стъпки. Първо, тя взема WDEV от лицето, което я извиква. Преди това лицето, което я е извикало, ще трябва да одобри нашия NFT контракт за прехвърляне на неговия WDEV. След това нашият NFT контракт одобрява гейтуея да прехвърли WDEV, които взема от извикващия, тъй като на последната стъпка гейтуей контрактът ще се опита да прехвърли токените от нашия NFT контракт.

След това, за да платим за газ в целевата мрежа, използваме контракта IAxelarGasService. Този контракт има много различни конфигурации за плащане за газ, като например плащане за изпълнение срещу executeWithToken или използване на ERC-20 токен като плащане срещу използване на собствена валута. Бъдете внимателни, ако планирате да напишете свой собствен контракт по-късно!

В този случай, тъй като изходната мрежа е Moonbase Alpha, собствената валута е DEV. Можем да използваме собствената DEV, за да платим за газ в целевата мрежа, въз основа на обменните курсове между собствената валута на Moonbase Alpha и собствената валута на целевата мрежа. Тъй като изпращаме повикване за контракт, което включва токен, и планираме да платим за газта на целевата мрежа в DEV, ще използваме функцията payNativeGasForContractCallWithToken.

Накрая извикваме шлюза, за да изпратим нашето съобщение между мрежите с callContractWithToken. Обърнете внимание, че полезният товар (общите данни, които могат да бъдат изпратени при крос-чейн извикване), който изпращаме, е само адресът на извикващия. Тези данни ще трябва да бъдат декодирани от целевия контракт.

Сега нека да разгледаме какво се случва в целевата мрежа.

Тъй като очакваме токените да бъдат изпратени като плащане за NFT минтване, ще заменим _executeWithToken с IAxelarExecutable.

В нашата реализация на _executeWithToken първо проверяваме, за да се уверим, че символът tokenSymbol, предоставен от Axelar, е “WDEV”. След това очакваме 0,05 WDEV токена за плащане и ще се върнем, ако бъде изпратен друг токен или нещо по-малко от 0,05 WDEV. След това декодираме плащането, за да получим адреса на първоначалния повикващ на мрежата, така че да можем да минтваме NFT на този адрес. Накрая завършваме минтването!

Настройка на хранилището
Създадох хранилище в Github специално за тази публикация в блога. Не забравяйте да го клонирате!

За да настроите всички категории зависимости, изпълнете следната команда в клонираната папка:

“`

npm install

“`

Най-вече ще инсталираме Hardhat, контрактите на OpenZeppelin, някои контракти на Axelar и SDK на Axelar.

Хранилището съдържа два солидити файла. Първият файл е CrossChainNFT, както се очаква, а вторият е библиотеката StringAddressUtils.sol на Axelar, която все още няма пакет npm, но все пак е необходима за реализацията на Hardhat.

В папката със скриптове на хранилището има и четири скрипта на Hardhat.

  • axelarStatus.js: задача на Hardhat, която ви позволява да видите информация за транзакциите на Axelar
  • deploy.js: разгръща CrossChainNFT в мрежата, предоставена от Hardhat
  • gatewayGasReceiver.js: връща кодирани стойности за контрактите за шлюзове и услуги за газ на Axelar
  • mint.js: минтва CrossChainNFT (изпълнява се само в Moonbase Alpha)

Преди да преминем към пикантната част, ще трябва да получите акаунт с личен ключ, финансиран с DEV, за да разгърнете контракта и да подписвате всички бъдещи транзакции. Поставете го в рамките на файла secrets.json в главната директория на хранилището. Той трябва да бъде форматиран по следния начин:

“`

{

“privateKey”: “YOUR_PRIVATE_KEY”

}

“`

Ако всичко е наред, ще можете да компилирате коректно:

“`

npx hardhat compile

“`

Разгръщане на крос-чейн контракт в Moonbeam

Тази демонстрация се фокусира върху използването на скриптовете, така че е най-добре да ги разгледате, като започнете с deploy.js, който е подобен на примерните контракти за внедряване на Ethers.js.

GatewayGasReceiver.js съхранява редица адреси на контракти в това хранилище, които са необходими за разгръщането. Вероятно няма да ви се наложи да променяте нито един от закодираните адреси.

Опитайте да разгърнете договора си в изходната мрежа:

“`

npx hardhat run scripts/deploy.js -network moonbase

“`

Трябва да видите адреса разгърнат и отпечатан в конзолата. Не забравяйте да го копирате! Той ще ви е необходим за взаимодействие със следващия скрипт.

Също така трябва да го разгърнете в целевата мрежа. Изборът коя мрежа за дестинация да използвате зависи от вас, но ще ви е необходима нейната собствена валута за разгръщане. Тук съм включил някои от достъпните мрежи и техните кранове:

Ropsten Testnet : npx hardhat run scripts/deploy.js –network ropsten

Polygon Mumbai : npx hardhat run scripts/deploy.js –network mumbai

Avalanche Fuji : npx hardhat run scripts/deploy.js –network fuji

Fantom Testnet : npx hardhat run scripts/deploy.js –network fantom

Не забравяйте да копирате и контракта на целевата мрежа!

Поглед към Mint Script

Контрактът за минтване е по-интересен и ще изисква SDK на Axelar.

В горната част на скрипта Ethers.js се инициализира в скрипта Hardhat. SDK на Axelar също се инициализира. В SDK са достъпни множество API на Axelar, но в този случай ще използваме само AxelarQueryAPI, тъй като той включва цялата функционалност за оценка на газ, от която ще се нуждаем за плащане на такси за газ в мрежите.

Има и някои константи, които можете да промените веднага след това. В това ръководство се използва Fantom като целева мрежа, но вие можете да използвате която и да е мрежа, която сте избрали. Обърнете внимание, че въпреки че използваме среда на тестова мрежа, имената на мрежите все още са техните еквиваленти в главната мрежа, поради което изходната мрежа е “MOONBEAM”, а не “MOONBASE”.

След това трябва да работим с пакетите DEV, за да ги изпратим в други мрежи. Първо, трябва да пакетираме нашия DEV и след това да одобрим контракта на изходната мрежа, за да вземем част от нашия WDEV. Това е необходимо, тъй като контрактът на изходната мрежа трябва да изпрати вашия WDEV, за да плати за минтването на NFT в целевата мрежа.

Обърнете внимание, че вместо да кодираме предварително адреса на контракта за WDEV, ние използваме договора IAxelarGateway, за да намерим адреса. Можехме да направим това и в самия смарт контракт, но исках да покажа как бихте го направили с Ethers.js.

Както се очакваше, подписваме две транзакции: първо, за да пакетираме 0,13 WDEV, а след това, за да одобрим нашия контракт CrossChainNFT, за да изпратим този WDEV.

Може би се чудите защо пакетираме 0,13 WDEV, когато цената на минтване е само 0,05. Към момента на писане на статията Axelar събира малка такса (0,08 WDEV в този случай) при прехвърляне на токени между мрежите, която може да бъде изчислена на техния уебсайт. Това се прави автоматично от шлюзовете, но в бъдеще тази отговорност може да бъде делегирана на контракта IAxelarGasService.

Сега трябва да определим количеството DEV, което изпращаме на функцията mintXCNFT, за да платим за газ в целевата мрежа. Тук се включва SDK на Axelar.

Трябва да оценим количеството газ, което трябва да се изразходва в целевата мрежа, защото е трудно да се оцени функция, която може да бъде извикана само от конкретен контракт. В този случай преценяваме количеството газ, което ще изразходваме, като 400 000. В реална производствена среда може да пожелаете да направите сравнителен анализ на количеството газ, което изразходвате. Въпреки това, ако в крайна сметка сте преувеличили сумата, тя ще ви бъде върната от услугите за газ на Axelar.

Функцията estimateGasFee (Оценка на цената за газ), предоставена от SDK на Axelar, ще намери прехода между собствената валута на изходната мрежа и собствената валута на целевата мрежа, за да определи правилната сума, която да изпрати към целевата мрежа.

Вие, внимателният читател, може би се чудите защо използваме “GLMR” вместо “DEV”. Подобно на начина, по който Axelar използва имената на мрежите в основната мрежа, вместо да използва имената на тестовите мрежи, Axelar ще интерпретира “GLMR” като “DEV”, тъй като използваме средата на тестовите мрежи.

Извикването на тази функция от SDK ще върне символна линия, която представлява сумата на DEV WEI, която трябва да се плати, например “241760932800000”. Това е трудно за разбиране от нас, простите хора, затова използваме Ethers.js, за да го преобразуваме в по-разбираема за хората версия, която по-късно да отпечатаме в конзолата.

Накрая извикваме mintXCNFT функция на контракта. Важното тук е, че изпращаме gasFee не като лимит на газа, а като стойност. Ethers.js може да изчисли колко газ да изпрати в изходната мрежа, но за да платим за целевата мрежа, трябва да изчислим с помощта на Axelar SDK и да го изпратим като стойност към контракта IAxelarGasReceiver.

Това е целият скрипт! Преди да стартирате скрипта, проверете отново дали четирите константи (ORIGIN_CHAIN, DESTINATION_CHAIN, ORIGIN_CHAIN_ADDRESS, DESTINATION_CHAIN_ADDRESS) в горната част на скрипта са зададени правилно.

Ето и командата, с която минтвате своя NFT!

“`
npx hardhat run scripts/mint.js -network moonbase
“`

Конзолата трябва да покаже нещо подобно на това:

“`
Wrap transaction hash: 0x3ddb9d8334444dffb3a16ca2ddd61f5f32b12ce0df5cdc916b7465f6b67f22b8
Approve transaction hash: 0x5b05e781aa8c4aafe12f62a61b5f99b010cf70caf0f6ce0912c640348bde11ad
Awaiting transaction confirmations…
Cross-Chain Gas Fee: 241760932800000 Wei / 0.0002417609328 Ether
Minting transaction hash: 0x148031bce691b0025928b5e5f911a82fd27f224d7d14cd3f428381553d2bb2c1
“`

Най-важните данни тук са транзакциите за минтване, защото така се проследява статуса на вашата транзакция. Затова не я губете! Но ако все пак го направите, можете да прегледате всички последни транзакции в тестовия скенер на Axelar.

Преглед на статуса на транзакцията в Axelar
Axelar разполага с тестнет експлорър, и успешна транзакция за току-що завършеното взаимодействие ще изглежда по следния начин:

Но би било добра практика да се опитате да използвате SDK, за да видите статуса на транзакциите си, тъй като той дава повече информация за транзакцията и евентуалните грешки. За тази цел написах задача на Hardhat, която да използваме. Можете да видите кода в axelarStatus.js, но ние ще се задълбочим и тук.

Основната част от кода се намира в тези 5 реда. Първо, инициализираме модула на SDK, който ще използваме — AxelarGMPRecoveryAPI. За разлика от AxelarQueryAPI, който използвахме в скрипта за минтване, AxelarGMPRecoveryAPI помага за проследяване и възстановяване на спрени транзакции.

Всичко, което трябва да направим след това, е да направим запитване за статуса на транзакцията и SDK ще се погрижи за това вместо нас.

Можете да научите малко повече за AxelarGMPRecoveryAPI в документацията на Axelar. Той включва допълнителна функционалност в случай, че транзакцията се обърка, особено ако няма достатъчно газ, изпратен заедно с кросчейн транзакцията.

За да стартирате скрипта, изпълнете следната команда, където “YOUR_TRANSACTION_HASH” е хешът на транзакцията на изходната мрежа, в която сте изпратили кросчейн съобщение:

“`
npx hardhat axelarStatus –tx YOUR_TRANSACTION_HASH
“`

Ако стартирате скрипта Hardhat, в конзолата ви ще се появи нещо подобно (не съм включил целия текст, тъй като е много голям). Вероятно най-много се интересувате от статуса, където в документацията на Axelar има списък с възможните такива. Търсите destination_executed, за да посочите, че е получено и изпълнено правилно, но ако сте прекалено рано, може да потърсите source_gateway_called или destination_gateway_approved.

Можете да научите повече за дебъгването на контрактите в документацията на Axelar, където са разгледани подробно конкретни съобщения за грешки и как да използвате инструменти като Tenderly за логически грешки.

Научете повече за свързаните контракти
Вече сте на път да създадете свои собствени свързани контракти с Axelar! Научете повече за Axelar на техния сайт с документацията и прочетете за това как Moonbeam се превръща в лидер в блокчейн оперативната съвместимост в нашето представяне на свързаните контракти.

Ако се интересувате от Moonbeam и искате да научите повече, абонирайте се за нашия нюзлетър и ни следвайте в социалните мрежи ( линкове в заглавието на страницата).

Anomalia#6628

Original link: https://moonbeam.network/blog/axelars-sdk-connected-contracts/

--

--

No responses yet