Node.js'de Basit Bir Kripto Para Birimi Blok Zinciri Nasıl Oluşturulur

Yayınlanan: 2022-03-10
Hızlı özet ↬ Bu eğitici, JavaScript sınıfları ve Node.js kavramlarını kullanarak smashingCoin adlı basit bir kripto para biriminin nasıl oluşturulacağını gösterir. Bir deneyin - düşündüğünüzden daha basit!

Kripto para birimlerinin benzeri görülmemiş yükselişi ve onları destekleyen blok zincir teknolojisi, on yıldan fazla bir süre önce akademik bir kavram olmanın mütevazi başlangıcından çeşitli endüstrilerde mevcut artan benimsenmeye kadar dünyayı fırtınaya soktu.

Blockchain teknolojisi, güvenilmez ortamlarda güvenliği artırma, ademi merkeziyetçiliği zorlama ve süreçleri verimli hale getirme yeteneği nedeniyle çok dikkat çekiyor.

Geleneksel olarak Python, blok zinciri geliştirme için fiili programlama dili olmuştur. Ancak, bu şaşırtıcı teknolojinin yaygınlaşmasıyla birlikte geliştirme seçenekleri de arttı ve Node.js de geride kalmadı.

Bu eğitimde, Node.js'de basit bir kripto para birimi blok zincirinin nasıl oluşturulacağından bahsedeceğim. Çok süslü olmayacak, ancak bir blok zincirinin nasıl çalıştığını anlamanıza yardımcı olacak kadar yeterli.

Bu basit kripto para birimini smashingCoin olarak adlandıracağım.

Gelişmekte olan kripto para birimi alanına bir adım atmak isteyen bir JavaScript geliştiricisiyseniz, bu makale sizi başlamak için gerekli becerilerle donatacaktır. Veya kripto para birimleri dünyasında işlerin nasıl yürüdüğünü merak ediyorsanız, bu eğitim bazı sorularınızı yanıtlamanıza yardımcı olabilir.

Önerilen okuma : Alt Kaynak Bütünlüğünü Anlamak, Drew McLellan

Önkoşullar

Bu öğreticiyi başarılı bir şekilde takip etmek için aşağıdakilere sahip olmanız gerekir:

  • Node.js makinenize yüklendi. Buradan indirebilirsiniz;
  • Visual Studio Code, Sublime Text veya başka herhangi bir kod düzenleyici.

Başlayalım…

Atlamadan sonra daha fazlası! Aşağıdan okumaya devam edin ↓

Blockchain Nedir?

Blockchain, Bitcoin ve Ethereum gibi dijital para birimlerine güç sağlayan teknolojidir. Kriptografi kullanılarak güvenli bir şekilde birbirine bağlanan bloklar olarak adlandırılan ve sürekli büyüyen bir kayıt listesini tutan yenilikçi bir dağıtılmış halka açık defter teknolojisidir.

Blockchain terimi, işlem verilerini, yani bir zincir oluşturmak için birbirine bağlanan bloklarda tutma biçiminden dolayı adını almıştır. Blok zincirinin boyutu, üstlenilen işlem sayısındaki artışla birlikte büyür.

Herhangi bir geçerli işlem verisi, katılımcıların şart koştuğu eşler arası kurallar tarafından yönetilen blok zinciri ağına kaydedilir. Örneğin, bu veriler, dijital para birimlerinde olduğu gibi bloğun "değerini", bir işlem kaydını (taraflar mal ve hizmet alışverişinde bulunduğunda olduğu gibi) veya zincirin sahiplik bilgilerini kaydetmesi gibi yetki ayrıcalıklarını içerebilir.

İşlem verilerinin yanı sıra, her blok kendi kriptografik karmasını (benzersiz bir tanımlayıcı veya dijital ayak izi), kendi nonce değerini (kriptografik hesaplamalarda bir kez kullanılan rastgele bir rastgele sayı), önceki bloğun karmasını ve son zaman damgasını içerebilir. kimliği doğrulanmış işlemler.

Her yeni blok bir önceki bloğa işaret etmesi gerektiğinden, son bloğun doğru karmasını içermeyen bir blok zincire dahil edilirse, tüm blok zincirini geçersiz kılabilir. Bu değişmezlik özelliği, blok zincirlerinin güvenliğinin anahtarıdır.

Ayrıca, blok zincirinin gerçekliğini korumak için genellikle çeşitli konsensüs protokolleri uygulanır. Konsensüs, tüm katılımcıların ağ tarafından doğrulanan işlemleri kabul etmesini sağlar.

Örneğin, yaygın olarak kullanılan bir fikir birliği protokolü, belirli bir miktarda hesaplama işini tamamladıktan sonra karmaşık bir matematik problemine çözüm bulan bir sayıyı belirlemeyi amaçlayan çalışmanın kanıtıdır.

Kanıt çalışmasının ana fikri, blok zinciri ağındaki herhangi bir katılımcının bu numarayı tanımlamayı zor, ancak kolayca doğrulanabilir bulması gerektiğidir. Sonuç olarak, spam göndermeyi ve blok zincirinin yapısını değiştirmeyi engeller.

Çoğu kripto para birimi durumunda, blok zincirine yeni bir blok eklemek, blok zinciri büyüdükçe zamanla zorluğu artan karmaşık bir matematiksel denklemin çözülmesini gerektirir. Sonuç olarak, bu sorunu çözerek iş yaptığını kanıtlayan herhangi bir kişi, “madencilik” olarak adlandırılan bir süreçte dijital para birimi ile tazmin edilir.

Blok Nasıl Oluşturulur

Şimdi blockchain teknolojisini ve nasıl çalıştığını tanıttıktan sonra, blok oluşturmada kavramları nasıl uygulayabileceğimizi görelim. Daha önce de belirtildiği gibi, bloklar, bir blok zinciri oluşturmak için birbirine bağlanan şeydir.

smashingCoin para birimini oluşturmak için ES6'da tanıtılan JavaScript sınıflarını kullanacağım.

Hazır?

Ellerimizi kirletelim…

İşte CryptoBlock sınıfının kodu:

 const SHA256 = require('crypto-js/sha256'); class CryptoBlock{ constructor(index, timestamp, data, precedingHash=" "){ this.index = index; this.timestamp = timestamp; this.data = data; this.precedingHash = precedingHash; this.hash = this.computeHash(); } computeHash(){ return SHA256(this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data)).toString(); } }

Yukarıdaki kodda görebileceğiniz gibi, CryptoBlock sınıfını oluşturdum ve buna, herhangi bir JavaScript sınıfında olduğu gibi, constructor() yöntemini ekledim. Ardından, özelliklerini başlatmak için constructor yöntemine aşağıdaki parametreleri atadım:

index Tüm blok zincirindeki her bloğun konumunu izleyen benzersiz bir sayıdır.
timestamp Tamamlanan her işlemin meydana gelme zamanının kaydını tutar.
data Gönderici detayları, alıcı detayları ve işlem gören miktar gibi tamamlanmış işlemler hakkında veriler sağlar.
precedingHash Blok zincirindeki önceki bloğun karmasını gösterir, blok zincirinin bütünlüğünü korumada önemli bir şeydir.

Ayrıca, yukarıdaki verilerde verildiği gibi, özelliklerine göre bloğun computeHash hesaplamak için hesaplamaHash yöntemini kullandım.

Gördüğünüz gibi, crypto-js JavaScript kitaplığını içe aktardım ve her bloğun karmasını hesaplamak için crypto-js/sha256 modülünü kullandım. Modül bir sayı nesnesi döndürdüğünden, onu bir dizgeye dönüştürmek için toString() yöntemini kullandım.

Crypto-js kitaplığını projenize eklemek için terminale gidin ve npm kullanarak kurmak için aşağıdaki komutu çalıştırın:

 npm install --save crypto-js

Yukarıdaki komutu çalıştırdıktan sonra, kitaplığı ve diğer gerekli dosyaları içeren düğüm modülleri dizini projenizin klasörüne eklenecektir.

Blockchain Nasıl Oluşturulur

Daha önce açıklandığı gibi, blok zincir teknolojisi, tüm blokların birbirine zincirlenmesi kavramına dayanmaktadır. Öyleyse, tüm zincirin operasyonlarını yönetmekten sorumlu olacak bir CryptoBlockchain sınıfı oluşturalım. Kauçuğun yolla buluşacağı yer burasıdır.

CryptoBlockchain sınıfı, yeni bloklar oluşturmak ve onları zincire eklemek gibi farklı görevleri yerine getiren yardımcı yöntemleri kullanarak blok zincirinin işlemlerini sürdürecektir.

İşte CryptoBlockchain sınıfının kodu:

 class CryptoBlockchain{ constructor(){ this.blockchain = [this.startGenesisBlock()]; } startGenesisBlock(){ return new CryptoBlock(0, "01/01/2020", "Initial Block in the Chain", "0"); } obtainLatestBlock(){ return this.blockchain[this.blockchain.length - 1]; } addNewBlock(newBlock){ newBlock.precedingHash = this.obtainLatestBlock().hash; newBlock.hash = newBlock.computeHash(); this.blockchain.push(newBlock); } }

CryptoBlockchain sınıfını oluşturan yardımcı yöntemlerin her birinin rollerinden bahsedeyim.

1. Yapıcı Yöntemi

Bu yöntem blok zincirini başlatır. Yapıcının içinde, bir dizi bloğa atıfta bulunan blockchain özelliğini yarattım. Zincirdeki ilk bloğu oluşturan startGenesisBlock() yöntemini ona ilettiğime dikkat edin.

2. Genesis Bloğunun Oluşturulması

Bir blok zincirinde, genesis bloğu, ağda oluşturulan ilk bloğa atıfta bulunur. Bir blok zincirin geri kalanıyla entegre olduğunda, önceki bloğa referans vermelidir.

Tersine, bu ilk blok durumunda, işaret edecek herhangi bir önceki bloğa sahip değildir. Bu nedenle, bir genesis bloğu genellikle blok zincirine sabit kodlanmıştır. Bu sayede üzerinde sonraki bloklar oluşturulabilir. Genellikle 0 indeksine sahiptir.

Genesis bloğunu oluşturmak için startGenesisBlock() yöntemini kullandım. Bunu, önceden oluşturulmuş CryptoBlock sınıfını kullanarak oluşturduğuma ve index , timestamp , data ve precedingHash parametrelerini ilettiğime dikkat edin.

3. En Son Bloğun Alınması

Blok zincirindeki en son bloğu almak, mevcut bloğun hash'inin önceki bloğun hash'ine işaret etmesini sağlamaya yardımcı olur - böylece zincirin bütünlüğünü korur.

Onu almak için obtainLatestBlock() yöntemini kullandım.

4. Yeni Bloklar Ekleme

Zincire yeni bir blok eklemek için addNewBlock() yöntemini kullandım. Bunu başarmak için, yeni bloğun önceki karmasını, zincirdeki son bloğun karmasına eşit olacak şekilde ayarladım - böylece zincirin kurcalamaya karşı korumalı olmasını sağladım.

Her yeni hesaplamada yeni bloğun özellikleri değiştiğinden, kriptografik karmasını yeniden hesaplamak önemlidir. Karmasını güncelledikten sonra, yeni blok blok zinciri dizisine itilir.

Gerçekte, bir blok zincirine yeni bir blok eklemek, yerleştirilmiş birkaç kontrol nedeniyle o kadar kolay değildir. Bununla birlikte, bu basit kripto para birimi için bir blok zincirinin gerçekte nasıl çalıştığını göstermek yeterlidir.

Blockchain'i Test Etme

Şimdi basit blok zincirimizi test edelim ve çalışıp çalışmadığını görelim.

İşte kod:

 let smashingCoin = new CryptoBlockchain(); smashingCoin.addNewBlock(new CryptoBlock(1, "01/06/2020", {sender: "Iris Ljesnjanin", recipient: "Cosima Mielke", quantity: 50})); smashingCoin.addNewBlock(new CryptoBlock(2, "01/07/2020", {sender: "Vitaly Friedman", recipient: "Ricardo Gimenes", quantity: 100}) ); console.log(JSON.stringify(smashingCoin, null, 4));

Yukarıdaki kodda da görebileceğiniz gibi CryptoBlockchain sınıfının yeni bir örneğini oluşturdum ve onu smashingCoin olarak adlandırdım. Ardından, bazı keyfi değerler kullanarak blok zincirine iki blok ekledim. data parametresinde bir nesne kullandım ve gönderen ayrıntılarını, alıcı ayrıntılarını ve işlem yapılan miktarı ekledim.

Kodu terminalde çalıştırırsam, aldığım çıktı şöyle:

Kaputun altında bir blockchain nasıl görünüyor?
Blok zincirimizin çalışıp çalışmadığını test etmek. (Büyük önizleme)

smashingCoin böyle görünüyor! Zincirdeki tüm blokları içeren bir dizi olan blockchain özelliğini içeren bir nesnedir. Yukarıdaki resimde görebileceğiniz gibi, her blok bir önceki bloğun hash değerini referans almaktadır. Örneğin, ikinci blok, birinci bloğun özetine başvurur. Test ettikten ve blok zincirimizin çalıştığını gördükten sonra, smashingCoin özelliklerini geliştirmek için biraz daha işlevsellik ekleyelim.

Blockchain'in Bütünlüğü Nasıl Doğrulanır?

Daha önce bahsedildiği gibi, bir blok zincirinin önemli bir özelliği, zincire bir blok eklendikten sonra, zincirin geri kalanının bütünlüğünü geçersiz kılmadan değiştirilememesidir.

Bu nedenle, blok zincirinin bütünlüğünü doğrulamak için CryptoBlockchain sınıfına bir checkChainValidity() yöntemi ekleyeceğim.

Hash'ler blok zincirinin geçerliliğini ve güvenliğini sağlamak için kritik öneme sahiptir çünkü bir bloğun içeriğindeki herhangi bir değişiklik tamamen yeni bir hash üretilmesine ve blok zincirinin geçersiz olmasına neden olacaktır.

Bu nedenle, checkChainValidity() yöntemi, her bloğun karma değerinin değiştirilip değiştirilmediğini doğrulamak için if deyimlerini kullanır. İlk oluşturulan bloktan başlayarak, tüm blok zinciri üzerinde döngü yapacak ve geçerliliğini kontrol edecektir. Genesis bloğu sabit kodlandığından, kontrol edilmeyeceğini unutmayın.

Ayrıca yöntem, her iki ardışık bloğun karmalarının birbirini işaret edip etmediğini doğrulayacaktır. Blok zincirinin bütünlüğünden ödün verilmemişse, doğru döndürür; aksi halde herhangi bir anormallik olması durumunda false döndürür.

İşte kod:

 checkChainValidity(){ for(let i = 1; i < this.blockchain.length; i++){ const currentBlock = this.blockchain[i]; const precedingBlock= this.blockchain[i-1]; if(currentBlock.hash !== currentBlock.computeHash()){ return false; } if(currentBlock.precedingHash !== precedingBlock.hash) return false; } return true; }

İş Kanıtı Nasıl Eklenir

Daha önce bahsedildiği gibi, iş kanıtı, madencilik veya blok zincirine yeni bloklar eklemenin gerektirdiği zorluğu artırmak için uygulanan kavramdır.

smashingCoin durumunda, insanları kolayca yeni bloklar oluşturmaktan veya blok zincirini spam göndermekten caydıran basit bir algoritma kullanacağım.

Bu yüzden CryptoBlock sınıfında, proofOfWork(). Esasen, bu basit algoritma bir difficulty özelliği olarak geçirilen bir sayıyı tanımlar, öyle ki her bloğun hash'i bu difficulty seviyesine karşılık gelen baştaki sıfırları içerir.

Her bloğun hash'inin, difficulty seviyesinde ayarlandığı gibi sıfır sayısıyla başlamasını sağlamak, çok fazla bilgi işlem gücü gerektirir. Zorluk seviyesi ne kadar yüksek olursa, yeni blokları kazmak o kadar uzun sürer.

Ayrıca, her karma bloğa rastgele bir nonce değeri ekleyeceğim, böylece yeniden düzenleme gerçekleştiğinde zorluk seviyesi kısıtlamaları hala karşılanabilir.

İşte kod:

 proofOfWork(difficulty){ while(this.hash.substring(0, difficulty) !==Array(difficulty + 1).join("0")){ this.nonce++; this.hash = this.computeHash(); } }

Ve burada, nonce değişkeninin dahil olduğu güncellenmiş computeHash() yöntemi:

 computeHash(){ return SHA256(this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data)+this.nonce).toString(); }

Ek olarak, yeni blokların oluşturulmasında iş kanıtı mekanizmasını uygulamak için onu addNewBlock() yöntemine dahil edeceğim:

 addNewBlock(newBlock){ newBlock.precedingHash = this.obtainLatestBlock().hash; //newBlock.hash = newBlock.computeHash(); newBlock.proofOfWork(this.difficulty); this.blockchain.push(newBlock); }

Toplama

Node.js kullanarak smashingCoin kripto para birimini oluşturmaya yönelik kodun tamamı:

 const SHA256 = require("crypto-js/sha256"); class CryptoBlock { constructor(index, timestamp, data, precedingHash = " ") { this.index = index; this.timestamp = timestamp; this.data = data; this.precedingHash = precedingHash; this.hash = this.computeHash(); this.nonce = 0; } computeHash() { return SHA256( this.index + this.precedingHash + this.timestamp + JSON.stringify(this.data) + this.nonce ).toString(); } proofOfWork(difficulty) { while ( this.hash.substring(0, difficulty) !== Array(difficulty + 1).join("0") ) { this.nonce++; this.hash = this.computeHash(); } } } class CryptoBlockchain { constructor() { this.blockchain = [this.startGenesisBlock()]; this.difficulty = 4; } startGenesisBlock() { return new CryptoBlock(0, "01/01/2020", "Initial Block in the Chain", "0"); } obtainLatestBlock() { return this.blockchain[this.blockchain.length - 1]; } addNewBlock(newBlock) { newBlock.precedingHash = this.obtainLatestBlock().hash; //newBlock.hash = newBlock.computeHash(); newBlock.proofOfWork(this.difficulty); this.blockchain.push(newBlock); } checkChainValidity() { for (let i = 1; i < this.blockchain.length; i++) { const currentBlock = this.blockchain[i]; const precedingBlock = this.blockchain[i - 1]; if (currentBlock.hash !== currentBlock.computeHash()) { return false; } if (currentBlock.precedingHash !== precedingBlock.hash) return false; } return true; } } let smashingCoin = new CryptoBlockchain(); console.log("smashingCoin mining in progress...."); smashingCoin.addNewBlock( new CryptoBlock(1, "01/06/2020", { sender: "Iris Ljesnjanin", recipient: "Cosima Mielke", quantity: 50 }) ); smashingCoin.addNewBlock( new CryptoBlock(2, "01/07/2020", { sender: "Vitaly Friedman", recipient: "Ricardo Gimenes", quantity: 100 }) ); console.log(JSON.stringify(smashingCoin, null, 4));

Kodu terminalde çalıştırırsam, aldığım çıktı şöyle:

Node.js'de basit bir kripto para birimi oluşturma çıktısı
Sonunda, smashingCoin kripto para birimimiz! (Büyük önizleme)

Yukarıdaki resimde görebileceğiniz gibi, hashler artık iş ispat mekanizmasında ayarlanan zorluk seviyesine karşılık gelen dört sıfır ile başlıyor.

Çözüm

Bu kadar! Node.js kullanarak basit bir kripto para birimi blok zincirini bu şekilde oluşturabilirsiniz.

Tabii ki, smashingCoin kripto para birimi tamamlanmış olmaktan çok uzak. Aslında, daha fazla iyileştirme yapmadan piyasaya sürerseniz, güvenli, güvenilir ve sezgisel bir dijital para birimi için mevcut piyasa taleplerini karşılamanız pek mümkün değildir - bu da onu kullanan tek kişi olmanızı sağlar!

Bununla birlikte, umarım bu eğitim sizi heyecan verici kripto dünyasında ayaklarınızı ıslatmak için bazı temel becerilerle donatmıştır.

Herhangi bir yorumunuz veya sorunuz varsa, lütfen bunları aşağıya gönderin.

Diğer Kaynaklar

  • “Blockchain 101,” CoinDesk
  • “Bitcoin: Eşler Arası Elektronik Nakit Sistemi,” Satoshi Nakamoto, Bitcoin.org