Attester Hesabı Oluşturma 🏢
Hadi başlayalım! Bir önceki adımda gerekli dosya konumlarını ayarladık. Şimdi, Attester
karakterimizin blokzincirdeki hesabını oluşturmanın zamanı geldi. 🎉
İki ana bileşen var burada: public address
yani halka açık adres ve tabii ki mnemonic şifre
. Eğer bu detayları zaten bir sanal cüzdan kullanarak oluşturduysanız, yeni bir hesap oluşturmanıza gerek yok. 🎯
KILT blokzinciri'nde bir hesap, blokzincirle etkileşime giren ana bileşenlerden biridir. 🌐 Bu hesapta çeşitli özellikler bulunur. Bunlardan biri de address
, yani hesap adresidir. 💳 Bu adres, işlem ücretleri ve depozitoları ödemek için kullanılır.
Bir KILT hesabı aslında birkaç kripto elemanının birleşiminden oluşur:
- Halka açık bir adres 🌐
- İmza için bir anahtar çifti 🔑
Mnemonic şifre genellikle 12, 18 veya 24 kelimeden oluşur. 📝 Bu, cüzdanınıza ve varlıklarınıza erişim sağlar. Örneğin "elma şamdan dağ bisikleti çiçek" gibi. Güvenlik için kritiktir, bu yüzden bu şifreyi güvende tutmak çok önemli! 🔒
Hesabı Oluşturmak 🛠️
Hesap oluşturmak için, KiltKeyringPair
sınıfı üzerinde addFromMnemonic()
fonksiyonunu kullanıyoruz. 🌟 Bu, bize 12 kelimelik bir mnemonic şifre oluşturuyor.
KILT SDK polkadot.js
kütüphanesi üzerine kuruludur. 🛠️ Çalışmalarınızda sıkça karşılaşacaksınız. Bu kütüphane, KILT ve diğer substrate
tabanlı blokzincirler için birçok yararlı özelliğe sahiptir. 🌐
Kodlamaya başlayalım
Temelleri ve neleri neden yaptığımzı öğrendiğimize göre kodlamaya başlayabiliriz:
Kütüphane Entegrasyonu
import { config as envConfig } from "dotenv"
import * as Kilt from "@kiltprotocol/sdk-js"
İlk olarak diğer yazılım projelerininde de yapılması gerektiği üzere kütüphanelerimizi kodumuza entegre ediyoruz. Bu kodları satır satır incelemek gerekirse:
- İlk olarak
dotenv
kütüphanesindenenvConfig
methodunuconfig
olarak çağırarak işe başlayabiliriz. Bu kütüphane sayesinde harici bir.env
dosyasında kaydettiğimiz verilere kodumuz içerisindeconfig
anahtar kelimesini kullanarak erişim sağlayabiliriz. - Alt satıra indiğimizde de KILT SDK'nin tüm özelliklerinin
@kiltprotcol/sdk-js
kütüphanesindenKilt
olarak isimlendirilerek çağırıldığını görüyoruz. Bu satırdaki*
yapısı kütüphanenin içerisindeki tüm kodları entegre ettiğimizi ifade ederkenas Kilt
yapısı ise her seferinde uzun uzun kütüphanenin@kiltprotocol/sdk-js
ismini kullanmamıza gerek kalmadanKilt
adıyla erişim sağlamamızı mümkün kılmaktadır.
generateAccount
Fonksiyonu
export function generateAccount(
mnemonic = Kilt.Utils.Crypto.mnemonicGenerate()
): {
account: Kilt.KiltKeyringPair
mnemonic: string
} {
Kütüphanelerimizi ekledikten sonra işlemlere başlayabiliriz. Bu işlemlerden ilki mnemonic
anahtarı oluşturmaktır. Üstte ifade edilen generateAccount()
fonksiyonu tam olarak bu işlemi yapmaktadır. Sırasıyla incelenecek olunursa:
- İlk olarak export methodu ile kodun dışarısından da erişilebilen bir fonsksiyon oluşturulur. Bu fonksiyona istediğimiz adı verebilsek de şimdilik
generateAccount()
ismini verdik. - Bir alt satıra indiğimizde ilk kez KILT SDK'ye erişim sağladığımız kod karşılar. Bu satırda
mnemonic
olarak tanımladığımız değişkeniKILT-SDK
kütüphanesi içerisinde bulunanUtils.Crypto
paketininmnemonicGenerate()
methodu karşılamaktadır. Bu sayede mnemonic anahtarı oluşturmuş oluruz. - Bir alt kısıma indiğimizde çok alışık olmadığımız bir
:{ ... }
yapısı ile karşılaşmaktayız. Bu yapı fonksiyonun çalışmasından sonra döndüreceği değerin türünü belirlemek için kullanılmaktadır. Bu yapının da içerisine girersek:- İlk satırda
account: Kilt.KiltKeyringPair
ifadesinde dödürülecek nesneninaccount
isimli özelliğinin olacağını ve bu özelliğinKilt.KiltKeyringPair
özel türünde olacağını belirtiriz. Bu değer aslında biizim için daha önce de kısaca öneminden bahsettiğimizKeyPair
adındaki imzalama işlemleri için kullanılan anahtar çiftimizi ifade etmektedir. - İkinci satırda bulunan
mnemonic: string
ifadesi ise döndürülecek nesneninmnemonic
isimli bir özelliği daha olacağını ve bu özelliğin türününstring
olacağını ifade etmektedir. Bu da aslında bizim oluşturmaya çalıştığımızmnemonic şifre
yapısının ta kendisidir.
- İlk satırda
const keyring = new Kilt.Utils.Keyring({
ss58Format: 38,
type: 'sr25519'
})
Fonksiyonumuz içerisindeki bir sonraki kod yapısı ise keyring
değişkeninin oluşturduğumuz yapı olmaktadır. Bu yapı bir üstte bulunan koddan hemen sonra kod bloğu içerisinde yazılmaktadır ve keyring değerinin oluşmasını sağlamaktadır.
Koddaki keyring
terimi, bir anahtar yüzüğü (keyring) oluşturmak için kullanılır. Bir anahtar yüzüğü, çeşitli anahtar çiftlerini (public ve private keys) yönetmeyi kolaylaştıran bir veri yapısıdır. Bu yapı, genellikle kriptografik işlemler için anahtarların güvenli ve etkin bir şekilde saklanması ve yönetilmesi amacıyla kullanılır.
Satır satır inceleyecek olursak:
- İlk olarak keyring olarak tanımlanan değişkenin
Kilt.Utils.Keyring
methodundannew
anahtar kelimesi ile yeni bir obje oluşturduğunu görebiliriz. Bu objenin iki adet parametresi olmaktadır:ss58Format
: Anahtarın kodlandığı formatı belirtmektedir. SS58 genellikle Substrate tabanlı blokzincirlerde kullanılır. Değerini şimdilik38
olarak belirledik.type
: kullanıcının kriptografik algoritmasını belirler. Biz buradasr25519
değerini tercih ettik. Bu değer Substrate tabanlı blokzincirlerde yaygın olarak kullanılır.
return {
account: keyring.addFromMnemonic(mnemonic) as Kilt.KiltKeyringPair, mnemonic
}
}
Fonksiyonumuzun son aşaması olarak da return
yapısı ile çıktı verildiği görülmektedir. Bu çıktı aslında account
adındaki Attester
hesabı olmaktadır. İçerisinde iki adet değer bulundurmaktadır. Bunlar:
addFromMnemonic(mnemonic)
metodu, verilen mnemonic şifreyi kullanarak bir anahtar çifti oluşturur vekeyring
'e ekler.mnemonic
ifadesi ise adresinmnemonic
şifresinin kaydedilmesi için kullanılmaktadır.
Bu şekilde hesabımızı oluşturmuş oluruz. Tek yapmamız gereken fonksiyonu çağırıp doğru çalıştığına emin olmaktır.
Ana Program Kısmı
Üst kısımda oluşturduğumuz fonksiyonu çağırmak için bir yapı lazım olmaktadır. Bu yapı kod diğer modüller olmadan tek başına çalışınca neler olacağını ifade eder.
if (require.main === module) {
;(async () => {
envConfig()
Üst satırda belirtildiği üzere ilk olarak bir if
döngüsü içerisinde çalışan dosyanın ana program olup olmadığını kontrol etmekteyiz. Eğer ana program ise çevre değişkenlerini elde etmek için envConfig
değerini çağırarak .env
dosyasından verilerimizi projemize entegre etmiş oluruz.
try {
await Kilt.init()
.
.
.
}catch (e){
console.log('Error while setting up attester account')
throw e
}
})()
}
Sonrasında if
fonksiyonu içerisinde try
yapısı ile KILT-SDK
'yi başlatmayı deneriz. Yazmaya devam ettiğimiz tüm kodlar bu try
yapısının içerisinde yer alacaktır.
Altına indiğimizde hataları algılamak, konsola yazdırmak için bir catch
yapısı olduğunu görüntüleyebiliriz.
const { mnemonic, account } = generateAccount()
Try yapısı içerisine girdiğimizde generateAccount
fonksiyonumuzu çağırdığımızı ve bu fonksiyon içerisinden mnemonic
ve account
değerlerini değişkenine kaydettiğimizi görüntüleyebiliriz.
console.log('Devam etmedeönce .env dosyasına kaydet!\n\n')
console.l(`ATTESTER_ACCOUNT_MNEMONIC= {mnemonic}"`)
console.(`ATTESTER_ACCOUNT_ADDRESS {account.address}"\n\n`
Yukarıda belirtilen kod ile bu değerler teker teker terminale kod tarafından yazdırılır.
Kodumuzu Çalıştıralım!
Artık kodumuzu çalıştırarak Attester
bireyimizin adres
'ini ve mnemonic
şifresini elde edebiliriz.
Kodu çalıştırmak için terminalde kilt-rocks
klasöründe bulunduğumuza emin olduktan sonra alt kısımdaki kodu çalıştırabiliriz:
yarn ts-node ./attester/generateAccount.ts
Konsola yazdırılan bu değerlerin aynı şekilde kopyalanıp .env
dosyasına kaydedilmesi gerekmektedir.
WSS_ADDRESS=wss://peregrine.kilt.io
ATTESTER_ACCOUNT_MNEMONIC="MNEMONİC ŞİFRE"
ATTESTER_ACCOUNT_ADDRESS="ADRES"
Hesaplarımızı oluşturduğumuza göre artık işlem ücretlerini ve depozitoları ödeyecek bir yapıya sahibiz. Ancak eksik olan bir şey var, o da neyle ödeyeceğimiz! Bu işlemi yapmak için kod çalışınca oluşan account_address
değerini buradaki linke girerek faucet
'den transfer edebilirsin.