Önceki birkaç yılın trendlerine bakarsak, her zaman blockchain hakkında bir şeyler duyduk, ancak ayrıntılar hakkında pek bir şey duymadık.
Bitcoin, Ethereum, Dogecoin, Matic ve diğerleri gibi kripto para birimlerinin blok zinciri teknolojisine güvendiğini hepimiz biliyoruz. Blockchain, 2021'de sayısız endüstride devrim yaratan önemli olaylara öncülük etti ve yeni başarıların önünü açtı.
Blockchain, verileri düzenlemesi, hacklemesi veya dolandırılması zor veya imkansız bir şekilde depolamanın bir yoludur. Blok zincirinin tüm bilgisayar sistemleri ağına çoğaltılan ve yayılan işlemlerin dijital bir defteridir.
Neredeyse tüm kripto para birimlerine güç sağlayan çığır açan veritabanı teknolojisidir. Blockchain, bir veritabanının aynı kopyalarını tüm ağa yayarak sistemi hacklemeyi veya aldatmayı inanılmaz derecede zorlaştırır.
Bitcoin şu anda blockchain için en belirgin kullanım olsa da, teknoloji çok çeşitli uygulamalara hizmet edebilir.
Kripto para birimleri ve blok zincirleri son yıllarda giderek daha popüler hale geldi ve bu eğilimin devam etmesi bekleniyor.
Bu eğitimde JavaScript ile basit bir blok zinciri yapacağız. Bir blok zincirinin nasıl çalıştığına dair temel bir anlayış sağlayacaktır.
Adını MelodyCoin koyalım ve hemen harekete geçelim!
Blok Oluşturma
Başlamak için, tüm kodumuzu yerleştireceğimiz yeni bir JavaScript dosyası oluşturacağız.
Buna main.js diyelim ve bir blok zincirinin ve blokların nasıl görünmesi gerektiğine dair bir açıklama ile başlayalım.
Bir Block sınıfı oluşturun ve ona başlamak için Object() { [yerel kod] } işlevini verin.
Yeni bir blok oluştururken bir tarih ve önceki bloğun hash değerini vermelisiniz:
Her bir mülkün tanımları aşağıda verilmiştir:
- Zaman damgası, bloğun ne zaman yapıldığını gösterir. Hangi biçimi seçerseniz seçin (bu durumda bir UNIX zaman damgası) kullanabilirsiniz.
- Bu bloğa bağlamak istediğiniz herhangi bir veri formu data parametresine dahil edilebilir. Bir kripto para birimi oluşturmak istiyorsanız, gönderen/alıcı ve taşınan para miktarı gibi işlem verilerini burada tutabilirsiniz.
- ÖncekiHash, önceki bloğun karmasını tutan bir dizedir. Daha sonra blok zincirimizin bütünlüğünü sağlamada kritik olacak olan blok zincirini oluşturacak olan budur.
Hash Oluşturma
Her blok bir önceki bloğa bağlanır (böylece öncekiHash özelliği). Yani, her blok bir hash gerektirir. Hash, parmak izine benzer. Her blok için ayrıdır.
Bir bloğun hash değeri, tüm içeriği bir hash fonksiyonundan geçirilerek hesaplanabilir.
O halde, mevcut bloğun hash değerini hesaplayan bir fonksiyon uygulayarak başlayalım.
Böylece, Block sınıfının altında hesaplananHash fonksiyonunu tanımlarız:
Ancak, SHA256 karması JavaScript tarafından desteklenmez ve harici bir kitaplıktan alınması gerekir.
Crypto-js, birkaç karma algoritmanın güvenli uygulamalarını içeren harika bir pakettir.
Ardından bunu main.js kodumuza aktarabiliriz.
Artık hesapHash() fonksiyonumuza sahip olduğumuza göre, onu Block fonksiyonumuzda kullanalım:
Bir Bloğun neye benzediğini tanımladıktan sonra, bir Blockchain'in nasıl görünmesi gerektiğini tanımlayabiliriz. O halde yeni bir sınıf oluşturalım.
Bu senaryoda, blok zinciri, bir özellik zincirine sahip çok basit bir nesnedir. Bu, zincirdeki tüm blokları tutan bir dizidir.
Blok eklemeden önce, "genesis bloğu" olarak bilinen şeyi oluşturmalıyız. Bu, zincirdeki ilk bloktur ve önceki bir bloğa işaret edememesi bakımından benzersizdir (ilk!).
Genesis bloğunu oluşturmak için sınıfımıza createGenesisBlock() adında bir fonksiyon ekleyeceğim. Blockchain sınıfımızın Object() { [yerel kod] } işlevine geri dönün.
Artık yeni bir Blockchain örneği oluşturduğumuzda her zaman genesis bloğunu dahil edebiliriz:
Blok Zinciri Yöntemleri
Şimdi, Blockchain sınıfımıza yeni bloklar ekleme ve en son bloğu getirme gibi şeyler yapmamızı sağlayacak yöntemler ekleyelim.
getLatestBlock işlevi en temel işlevdir. Sadece zincir dizisinin son üyesini döndürür:
addBlock tekniği biraz daha ilgili.
Zincirimize yeni bir blok ekleyebilmemiz için önce o bloğun önceki Hash alanını uygun şekilde ayarlamalıyız.
Zincirimize en son eklenen bloğun hash değerine ayarlanmalıdır. Ayrıca yeni bloğun karmasını da hesaplamamız gerekiyor:
Test yapmak
Bakalım MelodyCoin'imiz nasıl çıkmış.
Bunu başarmak için bir blockchain örneği oluşturun. Birkaç blok daha ekleyelim:
Orada iki yeni blok yaptık. Şu anda blok zincirimizin nasıl göründüğüne bir göz atalım.
MelodyCoin, dört boşlukla dizilecek ve biçimlendirilecektir:
Blockchain'in Bütünlüğünü Doğrulayın
Blok zincirleri harikadır çünkü bir blok eklendikten sonra zincirin geri kalanını geçersiz kılmadan değiştirilemez.
Ancak, bu uygulama ile blok zincirimizin bütünlüğünü kontrol etmem için bir yöntem yok.
Blok zincirimize bir isChainValid işlevi ekleyelim. Zincir meşru ise, doğru dönecektir; aksi takdirde false döndürür:
Bütünlüğü Test Etme
Artık blok zincirimizin bütünlüğünü test edebiliriz. Şimdi çalıştırırsak, zincirimizin gerçek olduğunu onaylayacaktır.
Şimdi blok zincirimizi kurcalamaya çalışalım. Blok 2'yi değiştirelim ve içeriğinin üzerine yazalım (dört yerine 100 jeton aktardığımızı varsayalım).
Bunu uyguladığımızda, yazılımın zinciri kurcalamak için gösterdiğimiz çabayı tanıdığını görebiliriz.
Ancak, buna karışmam için başka bir yöntem olduğuna inanabilirsiniz. Bloktaki içeriği değiştirdim ama hash'i yeniden hesaplamadım. Böylece akıllı olmayı deneyebilir ve aynı bloğun karmasını yeniden hesaplayabilirsiniz.
Minik blok zinciri kurulumumuzda hepsi bu kadardı! Yeni bloklar eklememizi ve zincir içindeki verilerle kurcalamayı algılamamızı sağlar.
Küçük blok zincirimizle ilgili ele almamız gereken iki sorun var:
- Modern bilgisayarlar son derece hızlıdır ve saniyeler içinde zincirimize binlerce blok ekleyebilir. Açıkçası kimsenin blok zincirimize spam göndermesini istemiyoruz.
- Blok zincirimiz hala kurcalanmaya karşı savunmasız. Bir bloğun içeriğini güncelleyebilir ve ardından takip eden tüm bloklar için karmaları (ve önceki karmaları) yeniden hesaplayabilirsiniz. Bununla uğraşsanız bile, meşru bir zincirle sonuçlanacaksınız.
Bu endişeleri gidermek için blok zincirleri “iş kanıtı” olarak bilinen bir teknik kullanır. Bu yaklaşımı kullanarak bir blok oluşturmak için önemli miktarda hesaplama kaynağı kullandığınızı göstermelisiniz. Buna da denir madencilik.
Proof-of-work, bir bloğun hash değerinin belirli bir sayıda sıfırla başlamasını gerektirir. Ancak karmanızın bu kurala uyup uymadığını nasıl bilebilirsiniz?
Bir bloğun içeriği onun hash değerini belirler. Bu yüzden, içeriği değiştirmemek şartıyla, her zaman aynı hash'i elde ederiz.
Her bloğa bir çözüm olarak eklenmiş bir nonce değeri olmalıdır. Bu aslında bloğumuzun hash'i yeterli sıfırla başlayana kadar güncelleyebileceğimiz bazı rastgele verilerdir. Bir hash fonksiyonunun çıktısını değiştiremeyeceğiniz için, birçok farklı kombinasyonu test etmeniz ve en iyisini ummanız gerekir.
Madenciliği Blockchain ile Tanıtın
Block sınıfımıza bir nonce ekleyerek başlayalım. Nonce, bloğumuzun hash değerini etkilemek için değiştirebileceğimiz bloğumuzdaki tek değerdir.
Zaman damgasını veya verileri değiştiremiyoruz.
Ardından, bir bloğun gerçek madenciliğini yapacak bir mineBlock() işlevi yazalım. Bu fonksiyona parametre olarak gerekli zorluk gönderilecek ve bloğumuzun hash'i yeterli sıfırla başlayana kadar yürütülmeye devam edecektir.
Karmamız yeterince sıfırla başlayana kadar çalışacak basit bir while döngüsü yaptım. Zorluğu kaç tane sıfıra ihtiyaç olduğunu belirlemek için kullanırız. 5 zorlukta hashimiz 5 sıfır ile başlamalıdır.
Hash'imiz yeterli sıfır içermediğinde, nonce'yi birer birer yükseltir ve hash'i yeniden hesaplarız. Ve eğer zorluğa karşılık gelen bir hash bulursak onu konsola kaydediyoruz.
Yapmamız gereken bir şey daha var. HesaplamaHash yöntemimizde nonce değişkenini gerçekten hesaba katmıyoruz, işte burada:
Blockchain Sınıfı
Bu yeni yaklaşımı blockchain sınıfımızda test edelim ve nasıl gittiğini görelim.
Başlamak için, blok zincirimizin zorluğunu Object() işlevinde tanımlayacağım. Daha sonra bir yerde kullanabileceğimiz için burada tanımlıyoruz.
addBlock işlevi, zincirimize eklemeden önce bloğu mayınlayacak şekilde değiştirilmelidir.
Blockchain'i kullanın
Şimdi yeni blok zincirimizi iş kanıtı algoritmasıyla birlikte kullanalım. Buraya birkaç console.log ifadesi ekleyin.
Bu kodu çalıştırdığımızda, madencilik sürecinin artık özellikle hızlı olmadığını gözlemleyebiliriz.
Algoritmanın üç sıfırla başlayan (zorluk tarafından yapılandırıldığı gibi) karmalara sahip bloklar oluşturması biraz zaman alır.
Temel blok zinciri kurulumumuzun sonu buydu.
Proof-of-work mekanizması sayesinde blok zincirimize yeni blokların ne kadar hızlı ekleneceğini düzenleyebiliriz.
Blok zincirlerdeki en önemli güvenlik özelliğidir. Ve şimdi nasıl çalıştığını anladığınıza göre, kendinizinkini yaratmaya başlayın!
Yorum bırak