JavaScript ve Algorand ile Yeni Hesap Açma
JavaScript ile akıllı kontrat geliştirmeye başlamadan önce bu akıllı kontratların etkileşime geçeceği hesapların oluşturulması gerekmektedir. Bu hesapların içerisine kripto para gönderebilecek bakiye sorgulayabilecek ve transferlerini görüntüleyebileceğiz. Bu adresler içerisinde iki ana eleman taşımaktadırlar.
- addr: Adresi ifade etmektedir bu adresi hesabın ismi olarak da düşünebiliriz. Bu adresi istediğimiz kadar kişiyle güvenlik endişesi yaşamadan paylaşabiliriz. Bu adrese sahip olan herkes hesabın bulundurduğu bakiyeyi ve gerçekleştirdiği transferleri görüntüleyebilir.
- sk: Açılımı "secret key" olan bu parametre aslında hesabın kendisi olmaktadır. Hesap üzerinde gerçekleştiren tüm işlemler bu anahtar sayesinde gerçekleştirir. İsminin de belirttiği üzere saklı ve güvende tutulmalıdır. Bu anahtara sahip olan herkes hesabın mutlak kontrolünü eline almış olur ve hesapta transfer ve benzeri işlemleri gerçekleştirebilir.
İlk olarak önceki bölümde gerekli paket kurulumlarını gerçekleştirdiğimiz index.js dosyasının bulunduğu klasöre VS Code içinde giriş yapmaktayız. Bu klasör içerisine yeni bir JavaScript dosyası oluşturacağız. Bu durum kesin gerekli olmamak ile projenin zamanla büyümesi sonucunda bize hız kazandıracak ve daha derli toplu bir kod arayüzü yazmamızı sağlayacaktır. Girdiğimiz klasörün içerisine "address.js" adında yeni bir klasör oluşturacağız. Yazdığımız kod parçası bu dosya içerisinde yer alacaktır.
JavaScript dosyasını oluşturduğumuzda karşımıza boş bir kod dosyası çıkmaktadır. İlk olarak bu dosya içerisine kullanacağımız paketleri eklememiz gerekmektedir. Adres oluşturmak için sadece Algorand SDK'sının paket halini aldığı algosdk paketini yüklememiz yeterli olmaktadır.
const Algosdk = require("algosdk")
Tablo 5
Tablo 5'te paketin kod içerisine eklenmesi gösterilmiştir. JavaScript üzerinde paketler "require()" fonksiyonu ile eklenmektedir. Paketi "require()" ile çağırdıktan sonra kod içerisinde özgürce çağırabilmemiz için bu paketi bir sabit veya değişkene eşitlememiz gerekmektedir. Bu nedenle Algosdk adında bir değişken oluşturup tanımlamayı gerçekleştiririz. Sabitin adının büyük olmasının nedeni kod içerisinde takibini kolaylaştırmaktır. Paket adından bağımsız bir şekilde istenilen tüm isimler bu sabite tanımlanabilir.
let hesapAdresi = ()=\>{
}
Tablo 6
Paketi ekledikten sonra dosyamızın içerisinde adres oluşturma işleminin yer alacağı bir fonksiyon oluşturmamız gerekmektedir. Bu fonksiyonu Şekil 6'da gösterildiği gibi oluşturmamız mümkündür. Bu fonksiyon yapısına "Arrow Function" adı verilir ve gösterildiği şekilde tanımlanır. Başlangıçta bu fonksiyonu ifade edecek değişkenin oluşturulması gerekmektedir. Bu işlem için "const" adında bir değişken kullanmak yerine "let" ifadesini kullanmaktayız. Bu durumdaki neden fonksiyonun değişken değerler tutmasını istememizden kaynaklanmaktadır. Fonksiyon adı tamamen tercihe dayalı olsa da anlam bütünlüğü oluşması amacıyla "hesapAdresi" isimlendirmesi kullanılmıştır. Parametre kısmı olan parantez içerisi herhangi bir parametre gerektirmemesinden dolayı boş bırakılmıştır.
let Hesap = Algosdk.generateAccount()console.log("Hesap Adresi: ", Hesap);
Tablo 7
Fonksiyon içerisine girdiğimizde şekil 7'de ifade edildiği şekilde adres oluşturması yapmamız gerekmektedir. Bu işlemi "let" ile oluşturduğumuz "Hesap" değişkeni üzerinde Algosdk paketinin "generateAccount()" metodu ile gerçekleştirebiliriz. Sonrasında bu değişkeni "console.log()" ile ekranımıza yazdırabiliriz. Eğer fonksiyonu bu şekilde çalıştırmak istersek fonksiyon dışına kodun en sonuna "hesapAdresi()" ibaresi ile gerçekleştirebiliriz. Sonrasında terminalden kodun bulunduğu klasör içerisinde "node address.js" kod satırı ile kodu çalıştırabiliriz.
Hesap Adresi: {addr: 'TJA62NSXJIOA5SD5F6PWOH3RTILYHG2QIHKRKBX6RNPJPIEH6YV3ZC2I7E',sk: Uint8Array(64) [44, 69, 34, 14, 200, 215, 127, 227, 219, 165, 47,108, 73, 211, 102, 116, 79, 235, 78, 45, 230, 191,230, 229, 155, 182, 117, 66, 140, 44, 86, 4, 154,65, 237, 54, 87, 74, 28, 14, 200, 125, 47, 159,103, 31, 113, 154, 23, 131, 155, 80, 65, 213, 21,6, 254, 139, 94, 151, 160, 135, 246, 43]}
Tablo 8
Kodu bu şekilde çalıştırdığımızda karşımıza Tablo 8'de ifade edildiği üzere bir obje türüne sahip verinin çıktığını gözlemlemekteyiz. Aslında bu obje hesabın ta kendisidir. Bu objenin içerisinde iki adet anahtar bulunmaktadır.
- addr anahtarı içerisinde hesabın adresini bulundurmaktadır. Bu adres hesabın kimliği olmaktadır herhangi bir transfer ve benzeri işlem gerçekleştiğinde zincirde adresi belirtmek için bu adres kullanılır ve paylaşılabilir.
- sk anahtarı içerisinde hesabın "secret key" değerini yani gizli anahtarını bulundurmaktadır. Bu anahtar hesabın mimarisi konumunda olmaktadır. Yapılacak tüm transferler bakiye tutma işlemleri ve benzeri işlemler bu anahtar üzerinde gerçekleşmektedir. Anahtara sahip olan kişinin cüzdana da istediği gibi sahip olabilmesi durumundan dolayı paylaşımı son derece risklidir ve tavsiye edilmez. 64 integer değerinden oluşur. Okunması ve anlaşılması zor durumdadır. Güvenli tutulması gerekmektedir.
let MnemonicAnahtar = Algosdk.secretKeyToMnemonic(Hesap.sk)console.log("Mnemonic Şifre: ", MnemonicAnahtar);
Tablo 9
Secret Key'in yani gizli anahtarın gizli tutulması gerektiğinden bahsettik ancak bu kadar karmaşık ve uzun bir integer değerinin kolay ve anlaşılır hale getirilmesi için Mnemonic şifrelerin kullanılması gerektiği belirlenmiştir. Bu Mnemonic şifreler secret key kullanılarak türetilmektedir. Tablo 9'da bu anahtarların tanımladığımız fonksiyon içerisinde algosdk paketinin "secretKeyToMnemonic()" metodu ile çağırıldığını gözlemlemekteyiz. Bu fonksiyon içerisine secret key değerini almaktadır. Bu değere bir önceki satırlarda tanımladığımız Hesap objesinin "sk" anahtarı ile erişebilir ve metot içerisine verebiliriz. Sonrasında "console.log()" ile MnemonicAnahtar adı ile kaydettiğimiz değişkeni ekrana yazdırabiliriz.
Mnemonic Şifre: bean six digital arrange genre soap citizen ramp provide moon matrix random volume hill tissue expand toast client pizza hockey fortune hobby tonight absorb sure
Tablo 10
Tablo 10'da gösterildiği üzere secret-key'den türeyen Mnemonic şifre kolaylıkla okunabilen az heceli İngilizce kelimelerden oluşmaktadır. Genellikle bu anahtarın oluşturulduktan sonra fiziki ve sanal olarak bir yere kaydedilmesi tavsiye edilir. Bu anahtarın kaybolması sonucunda adrese dair her şeyi kaybetmiş olunur. Bu nedenle güvenli şekilde kaydedilmelidir.
module.exports= hesapAdresi
Tablo 11
Fonksiyonun tamamlanmasından sonra oluşturduğumuz address.js dosyasının çıktı verebilmesini sağlamak amacıyla fonksiyonumuzu "export" etmemiz gerekmektedir. Bu işlemi Tablo 11'de ifade edildiği üzere "module.export" fonksiyonu ile gerçekleştirmekteyiz. Fonksiyonumuzu tanımlarken değişken almadığı için parantezsiz tanımlama yapabilmekteyiz.
const Algosdk = require("algosdk")
let hesapAdresi = ()=\>{let Hesap = Algosdk.generateAccount()console.log("Hesap Adresi: ", Hesap);
let MnemonicAnahtar = Algosdk.secretKeyToMnemonic(Hesap.sk)console.log("Mnemonic Şifre: ", MnemonicAnahtar);}module.exports= hesapAdresi
Tablo 12 address.js Tamamı
Tüm address.js dosyasının içerisindeki kodu Tablo 12'de ifade edildiği şekilde açıklamak gerekirse;
- İlk olarak paket tanımlarız.
- Sonrasında adresi içerisinde oluşturacağımız fonksiyonu tanımlarız.
- Fonksiyonun içerisinde adresi SDK ile oluşturup bir değişkene kaydederiz.
- Bu hesap objesini ekrana yazdırırız.
- Hesabın içerisinde yer alan Secret key anahtarı ile mnemonic anahtar oluştururuz.
- Mnemonic anahtarı ekrana yazdırırız
- Fonksiyon dışına çıkarak fonksiyonu dosya dışına export ederiz.
Dosyamız hazır konuma gelse de bu dosyaya index.js dosyası üzerinden bir değişkencesine erişmemiz gerekmektedir. Bu nedenle index.js içerisine paket olarak address.js dosyasını eklememiz gerekmektedir.
const AdresYarat = require("./address")
Tablo 13
Dosyamızı "require()" fonksiyonu ile bir paketcesine eklememiz mümkündür. Bunu gerçekleştirmek için Tablo 13'te görüldüğü üzere "require" değişkeni içerisine dosya yolu ile ekleme sağlayabiliriz. Bu dosyayı sabit olarak "const" ile istediğimiz ad ile index.js dosyası içerisine kaydedebilir ve sonraki satırlarda çağırabiliriz.
AdresYarat()
Tablo 14
Fonksiyonu çağırmak için index.js içerisinde Tablo 14'de görüldüğü üzere "AdresYarat()" fonksiyonu kullanılabilir.
Hesap Adresi: {addr: 'IL3IC7M32U775WXPJTUYODRHJ4QKSM4QQXSX37RHIAHGKNRMY3M4CS2KSU',sk: Uint8Array(64) [142, 103, 249, 121, 39, 133, 59, 126, 166, 255, 142,195, 140, 184, 120, 216, 79, 9, 52, 77, 111, 94,231, 12, 188, 11, 210, 46, 119, 40, 243, 134, 66,246, 129, 125, 155, 213, 63, 254, 218, 239, 76, 233,135, 14, 39, 79, 32, 169, 51, 144, 133, 229, 125,254, 39, 64, 14, 101, 54, 44, 198, 217]}Mnemonic Şifre: vault tortoise rude fame jacket panel wood moment observe timber detail work barely escape kidney fury ostrich usual alarm unfold unusual skate daring above pact
Tablo 15
Kodumuzu bulunduğu klasör içerisinde "node index.js" komutu ile terminalden çalıştırdığımızda Tablo 15'te bulunan çıktıyı vermektedir.