LayerZero Protocol ile Omnichain NFT Nasıl Yapılır?

Eray USTA
7 min readMay 9, 2022

Başlangıç

Bu eğitim, LayerZero ile bir omnichain NFT projesi oluştururken size yol gösterici olacaktır. Bunu basit bir proje oluşturma olarak düşünebilirsiniz. Sonuç olarak, LayerZero kullanarak zincirler arası NFT sözleşmesi oluşturacağız ve varsayılan UA yapılandırmasını kullanacağız.

Başka bir deyişle, mükemmel bir şey inşa etmeye çalışmıyoruz — daha çok işe yarayan bir şey olması için uğraşacağız.

Bu makalenin herhangi bir bölümünde takılırsanız veya bir şeyden bahsetmeyi unuttuysam bana yorumlar veya twitter hesabım aracılığı ile ulaşabilirsiniz.

LayerZero hakkında bilginiz yok ise aşağıdaki floodları okumanızı tavsiye ediyorum.

Önkoşullar

Bu eğitim, Solidity Hardhat, LayerZero’nun temelleri ve ERC721 hakkında biraz bilgi sahibi olduğunuzu varsayar.

Eğer Hardhat ve NFT ler hakkında bilgi sahibi değilseniz aşağıdaki linklerden fayalanabilirsiniz.

Genel Bakış

Bu eğitim, zincirler arasında mesaj/NFT göndermek için LayerZero’nun zincirler arası mesajlaşma protokolünü kullanır. Zincirler arası bir köprüleme protokolü oluşturmak için bundan yararlanacağız.

Bu eğitimde, her NFT’nin bir başlangıç zinciri vardır ve her zincirin basılabilen 100 NFT’si vardır. Oluşturduğumuz bu protokol, kaynak zincirinden uzaklaşırken, kaynak NFT’nin yakıldığı ve hedef zincirde yenisinin basıldığı bir burn ve mint mekanizması kullanır.

Hazırlık ve Kurulumları Gerçekleştirelim

  1. Klasörü oluşturup, klasör içine girin.
mkdir layerzero
cd layerzero

2. Hardhat projesini oluşturun.

npx hardhat

3. OpenZeppelin kütüphanesini içeri ekleyelim.

npm install @openzeppelin/contracts

4. LayerZero Interface lerini ekleyelim.

Ben repoyu indirip interfaces klasörünü contracts klasörü içerisine ekledim. Sizde böyle yapabilirsiniz.

Akıllı Kontratı Oluşturalım

Kontrat, “NilNFT” adlı bir ERC721 tokenı oluşturur ve dağıtılan her zincirde 100 NFT ile sınırlar, ilk token kimliği ve sözleşme konuşlandırılmış olarak constructor işlevinde başlatılan maksimum adetle sınırlıdır. Basit olması için NFT’ye yalnızca bir ad veriyoruz ve herhangi bir meta veri yapılandırmadık, kendiniz deneyebilirsiniz.

Özel fonksiyon crossChain, herhangi bir “NilNFT” nin 2 kaynak zincir arasında transfer istediğini, NFT’nin yandığını (burn) ve sözleşmenin mevcut zincirdeki NFT sayısını sayan sayacı değiştireceği anlamına gelir. Her şeyden önce, hedef zincirde lzReceive() öğesinin çağrılmasına neden olacak şekilde endpoint.send(…) öğesini içerir.

Override fonksiyonu lzReceive, kaynak zincir endpoint.send(…)’i çağırdıktan sonra alıcı zincirde otomatik olarak çağrılır.

Kontratı Test Ağlarına Deploy Etme

Öncelikle LayerZero endpoint lerine buradan ulaşabilirsiniz:

https://layerzero.gitbook.io/docs/technical-reference/testnet/testnet-addresses

1- Hardhat config dosyası yapılandırması

Bu eğitimde 4 ağda yayınlanacak bir onmichain NFT projesi olacak. Bu doğrultuda aşağıdaki bilgileri olduğu gibi kullanıp sadece testler için kullandığınız metamask cüzdanınızın privateKey ini girmeniz gerekmektedir.

Infura ile ilgili bilginiz yoksa aşağıdaki yazıyı okuyabilirsiniz.

2- Fantom test ağına kontratı deploy edelim

Öncelikle scripts klasörü içerisinde yer alan dosya adını deploy-fantom.js olarak değiştirelim.

LayerZero Fantom endpoint: 0x7dcAD72640F835B0FA36EFD3D6d3ec902C7E5acf

Ardından metamask ımıza Fantom Test ağını ekleyelim.

Network Name: Fantom testnet
New RPC Url: https://rpc.testnet.fantom.network/
ChainID: 0xfa2
Symbol: FTM

Deploy etmek için cüzdanımızda FTM token bulundurmamız gerekiyor.

Yukarıdaki linkten cüzdanımıza 5 adet FTM token isteyelim.

Terminale gelip hardhat deploy komutumuzu verelim.

npx hardhat run scripts/deploy-fantom.js --network fantom

Eğer işlem başarılı ise bize şöyle bir çıktı vermesi gerekiyor. Çıktı olarak dönen kontrat adresini bir kenarda tutalım.

Fantom testnet — — — nilNFT deployed to: 0xf69E1dFAc3D43F438Bae80090b8E186B0231CFeb

3- Avalanche ağına kontratımızı deploy edelim.

deploy-fuji.js dosyamızı oluşturalım.

LayerZero fuji endpoint 0x93f54D755A063cE7bB9e6Ac47Eccc8e33411d706

Metmaskımıza Fuji Ağını ekleyelim

Network Name: Avalanche FUJI C-Chain
New RPC URL: https://api.avax-test.network/ext/bc/C/rpc
ChainID: 43113
Symbol: AVAX
Explorer: https://testnet.snowtrace.io/

Kontrat deploy edebilmemiz için ihtiyacımız olan Avax tokenları almak için aşağıdaki linkten talep edelim.

Ardından aşağıdaki komutu verelim

npx hardhat run scripts/deploy-fuji.js --network avalanche

Deploy edildikten sonra kontrat adresini not edelim.

Fuji testnet — — — NilNFT deployed to: 0x350267976F153C620d5897aFfd6f0f3bbeaB3E99

4- Mumbai ağına kontratımızı deploy edelim.

scripts/deploy-mumbai.js dosyamızı oluşturalım

LayerZero Mumbai Endpoint : 0xf69186dfBa60DdB133E91E9A4B5673624293d8F8

Metamaskımıza mumbai testnet i ekleyelim.

Network Name: Mumbai Testnet
New RPC URL: https://rpc-mumbai.maticvigil.com/
Chain ID: 80001
Currency Symbol: MATIC
Block Explorer URL: https://polygonscan.com/

Kontrat deploy edebilmemiz için ihtiyacımız olan Matic tokenları almak için aşağıdaki linkten token talep edelim.

Ardından aşağıdaki komutu verelim

npx hardhat run scripts/deploy-mumbai.js --network mumbai

Deploy edildikten sonra kontrat adresini not edelim.

Mumbai testnet ----- NilNFT deployed to: 0x92b3dB5B4807e76f7a308BaBF1a9C273C150dfA0

5- BSC ağına kontratımızı deploy edelim

scripts/deploy-bsc.js dosyamızı oluşturalım

LayerZero BSC ağı Endpoint : 0x6Fcb97553D41516Cb228ac03FdC8B9a0a9df04A1

BSC Test ağını metamask a ekleyelim

Network Name (Ağ Adı): Smart Chain — Testnet
New RPC URL (Yeni PRC URL’si): https://data-seed-prebsc-1-s1.binance.org:8545/
ChainID (Zincir Kimliği): 97
Symbol (Sembol): BNB
Block Explorer URL (Blok Tarayıcı URL’si): https://testnet.bscscan.com

Kontrat deploy edebilmemiz için ihtiyacımız olan BNB tokenları almak için aşağıdaki linkten token talep edelim.

Ardından aşağıdaki komutu verelim

npx hardhat run scripts/deploy-bsc.js --network binance

Deploy edildikten sonra kontrat adresini not edelim.

BSC testnet ----- NilNFT deployed to: 0x00000000000000000000000000000000

🎉 Tebrikler! Omnichain NFT nin ilk adımı olarak kontratları tüm ağlara deploy ettik! Şimdi sırada kod ile mint etme ve ağlar arasında token ları değiştirme var.

1- Fantom ağından ilk NFT mizi mint edelim

Scripts klasörü içerisine mint-fantom.js dosyasını oluşturalım.

Aşağıdaki komutu verelim

npx hardhat run scripts/mint-fantom.js — network fantom

İşte ilk NFT ye sahip şanslı kişi

Fantom NFT balance: 0
Token 1 owner: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8

Transaction ı fantom testnet explorer dan inceleyelim.

Aşağıda kırmızı çizgi çekilen yerde gördüğünüz gibi token ı mint ettik.

Fantom için yaptığımız adımları Fuji, Mumbai ve BSC içinde gerçekleştiriyoruz. Sadece ilgili ağda deploy sonrası aldığımız kodu her mint dosyası için değiştirmemiz gerekiyor.

2 ID li nft yi mint eden Avalanche ağı kodları şu şekilde

3 ID li nft yi mint eden BSC ağı kodları şu şekilde

4 ID li nft yi mint eden mumbai ağı kodları şu şekilde


npx hardhat run scripts/mint-mumbai.js --network mumbai
npx hardhat run scripts/mint-bsc.js --network binancenpx hardhat run scripts/mint-fuji.js --network avalanche

Avalanche ağından mintlediğimizde çıktısı şu şekilde olacaktır

Fuji NFT balance:  1
Token 2 owner: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8

Cüzdan adresini arattığınızda şu şekilde bu ağdada NFT yi mint ettiğimizi görebilirsiniz.

Diğer ağları da sırasıyla yapıp diğer ID lerde farklı ağlarda NFT leri alabilirsiniz.

🎉 Tebrikler! Oluşturduğunuz kontrat ile etkileşime girip NFT lerinizi mint ettiniz!

Ağlar Arası Çapraz Transfer

crossChain fonksiyonunu çağırmak için basit bir komut dosyası oluşturup “NilNFT”yi Fantom testnet’ten Fuji’ye aktaralım.

Fuji testnet kontratını 0x350267976F153C620d5897aFfd6f0f3bbeaB3E9 adresini attach ile scripte ekledik. Çapraz zincirleri(cross chain) birleştirmeye ihtiyacımız olan token ID sini hedef olan Fantomda dağıttığımız sözleşmeye (90xf69E1dFAc3D43F438Bae80090b8E186B0231CFeb) gönderecektir.

İşlem ücreti olarak 5FTM değeri ile gönderiyoruz. Kaynak işlem, geçen değer tutarından daha ucuzsa, ek tutarı cüzdan adresine iade edecektir.

Şimdi kodumuzu çalıştıralım.

npx hardhat run scripts/cross-chain.js --network avalanche

Transaction Avalanche ağında NFT yi burn eder. Daha sonra aşağıdaki gibi Fantom ağında 7 ID li NFT yi mint ettirir.

https://testnet.ftmscan.com/tx/0x8dcc37128026bbfd969e281f969b49143b43ad948cfd6ac816dec9fdd763edd3

Sonuç

Bu eğitimde, LayerZero, Solidity, Hardhat’ı kullandık, “NilNFT” adlı omnichain NFT’yi oluşturduk ve NFT’yi Avalanche dan Fantom ağına taşıdık. Açıkçası, LayerZero, NFT’ye ve Solidity’e yeni başlayanlar için bile omnichain NFT koleksiyonu yapmayı kolaylaştırıyor. LayerZero, NFT çapraz zincirlerini tek bir işlemde birleştirmeyi mümkün kılıyor ve çok hızlı bir şekilde tamamlandı.

NFT, omnichain veya LayerZero ile ilgileniyorsanız, bu eğitimdeki kaynak kodunu kullanmaktan çekinmeyin ve bazı meta veriler ekleyin veya kendi NFT koleksiyonunuzu oluşturmak için Moralis, NFT port API, Opensea kullanabilirsiniz. Omnichain NFT’yi giderek daha ilginç hale gelecektir.

Kodlara aşağıdan ulaşabilirsiniz

Kodlarda benim deploy ettiğim kontratlar ve tanımlamalar mevcuttur. Değiştirerek kullanabilirsiniz.

👨🏼‍💻 Beni twitter ve youtube hesabımdan beni takip edebilirsiniz.

Kaynaklar:

--

--