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
- 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 mumbainpx 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: