چگونه بلاک‌چین خود را در NodeJS ایجاد کنید؟

شکل۱. ساخت بلاک‌چین در NodeJS
شکل۱. ساخت بلاک‌چین در NodeJS
منتشر شده در dev به تاریخ ۲۴ ژوئن ۲۰۲۱
لینک منبع: How to Build Your Own Blockchain in NodeJS

هنگامی که ما در حال تلاش برای یادگیری چیزی جدید هستیم، اغلب اوقات می‌تواند وسوسه برانگیز باشد که ابتدا به سراغ مستندات، مقالات، و توضیحات مفهومی برویم. در حالی که همه این موارد به طور قطع مهم است، برنامه‌نویسان ابزار بزرگی در زرادخانه خود برای درک موضوعات پیچیده‌ای دارند که اغلب آن‌ها را مسلم می‌دانند..

ساخت مدل‌ها برای موضوعات مختلف در کد می‌تواند به ما کمک کند درک کنیم که چگونه بخش‌های مختلف یک ایده با هم جور می‌شوند و در عمل فعالیت می‌کنند.

در این برنامه آموزشی، من به شما نشان خواهم داد که چگونه یک بلاک‌چین ابتدایی را با برخی از اسناد نسبتا ساده جاوا بسازید.

یک بلاک‌چین چیست؟

فکر کردن به بلاک‌چین‌ها به عنوان لیست‌های پیوندی افزوده شده یا آرایه‌هایی که در آن‌ها هر عنصر به آرایه قبلی اشاره می‌کند، می‌تواند مفید باشد.

در داخل هر بلوک (معادل یک عنصر در یک آرایه) از بلاک‌چین، حداقل موارد زیر وجود دارد:

  • یک مهر زمان از زمان اضافه شدن بلوک به زنجیره
  • یک نوع داده مرتبط. در مورد ارز رمزنگاری شده، این داده می‌تواند تراکنش‌ها را ذخیره کند، اما بلاک‌چین می‌تواند در ذخیره‌سازی بسیار بیشتر از فقط تراکنش‌ها برای ارز رمزنگاری شده مفید واقع شود.
  • هش رمزگذاری شده بلوکی که قبل از آن قرار دارد
  • یک هش رمزگذاری شده براساس داده‌های موجود در بلوک (شامل هش بلوک قبلی(

مولفه کلیدی که باعث می‌شود بلاک‌چین بسیار قدرتمند شود این است که در هر بلاک‌چین، اطلاعات بلوک قبلی (که از طریق بلاک‌چین قبلی ذخیره شده‌است) قرار می‌گیرد. این به این معنی است که اگر شما داده‌های یک بلوک را تغییر دهید، هش آن را تغییر خواهید داد و در نتیجه هش تمام بلوک‌های آینده را بی‌اعتبار خواهید کرد.

ایجاد یک بلوک

در حالی که این کار را احتمالا می‌توان با جاوا اسکریپت وانیل انجام داد، به خاطر سادگی، ما می‌خواهیم یک اسکریپت Node.js بسازیم و از Node.js ساخته شده در بستهCrypto برای محاسبه هش‌هایمان استفاده کنید.

ما می‌توانیم یک بلوک را در کدهایی مانند این تعریف کنیم:

const crypto = require('crypto'); // Import NodeJS's Crypto Module

class Block { // Our Block Class

constructor(data, prevHash = "") {

this.timestamp = Date.now(); // Get the current timestamp

this.data = data; // Store whatever data is relevant

this.prevHash = prevHash // Store the previous block's hash

this.hash = this.computeHash() // Compute this block's hash

}

computeHash() { // Compute this Block's hash

let strBlock = this.prevHash + this.timestamp + JSON.stringify(this.data) // Stringify the block's data

return crypto.createHash("sha256").update(strBlock).digest("hex") // Hash said string with SHA256 encrpytion

}

}

توجه داشته باشید که ما از رمزگذاری SHA256 برای هش تابع خود استفاده می‌کنیم. این یک تابع هش رمزنگاری استاندارد است که در اکثر بلاک‌چین‌ها استفاده می‌شود زیرا محاسبه آن فوق‌العاده آسان است، اما معکوس کردن آن فوق‌العاده سخت است.

سپس می‌توانیم نمونه‌هایی از این بلوک‌ها مانند موارد زیر را ایجاد کنیم:

فرض کنید a = بلوک جدید ({ از: «جو»، تا: «جین» }، مقدم بر هش= «۰»)

فرض کنید b = بلوک جدید ({ از: «جین»، تا: «جو» }، مقدم بر هش=( a.hash

برای این بلوک‌ها Hashها را چاپ کنید و توجه داشته باشید که آن‌ها چگونه متفاوت هستند. همچنین توجه داشته باشید که اگر شما داده‌های بلوک اول را تغییر دهید، هش‌های هر دو تغییر خواهند کرد.

ایجاد یک بلاک‌چین

حالا که ما بلوک‌های سازنده خودمان را داریم (جناس در نظر گرفته شده‌است(، بیایید یک کلاس برای زنجیره خود ایجاد کنیم. می‌توانیم آن را به این صورت تعریف کنیم:

class BlockChain { // Our Blockchain Object

constructor() {

this.blockchain = [this.startGenesisBlock()] // Initialize a new array of blocks, starting with a genesis block

}

startGenesisBlock() {

return new Block({}) // Create an empty block to start

}

obtainLatestBlock() {

return this.blockchain[this.blockchain.length - 1] // Get last block on the chain

}

addNewBlock(newBlock) { // Add a new block

newBlock.prevHash = this.obtainLatestBlock().hash // Set its previous hash to the correct value

newBlock.hash = newBlock.computeHash() // Recalculate its hash with this new prevHash value

this.blockchain.push(newBlock) // Add the block to our chain

}

checkChainValidity() { // Check to see that all the hashes are correct and the chain is therefore valid

for(let i = 1; i < this.blockchain.length; i++) { // Iterate through, starting after the genesis block

const currBlock = this.blockchain[i]

const prevBlock = this.blockchain[i -1]

// Is the hash correctly computed, or was it tampered with?

if(currBlock.hash !== currBlock.computeHash()) {

return false

}

// Does it have the correct prevHash value?; ie: What a previous block tampered with?

if(currBlock.prevHash !== prevBlock.hash) {

return false

}

}

return true // If all the blocks are valid, return true

}

}

// Create two test blocks with some sample data

let a = new Block({from: "Joe", to: "Jane"})

let b = new Block({from: "Jane", to: "Joe"})

let chain = new BlockChain() // Init our chain

chain.addNewBlock(a) // Add block a

chain.addNewBlock(b) // Add block b

console.log(chain) // Print out the blockchain

console.log("Validity: " + chain.checkChainValidity()) // Check our chain for validity

ابتدا توجه داشته باشید که بلوک اولیه زنجیره را Genesis Block می‌نامیم از آنجایی که این بلوک اولین بلوک در زنجیره است، نمی‌تواند هیچ مقدار هش قبلی را ذخیره کند.

سپس، ما کارکردی را برای بررسی اعتبار بلاک‌چین برای نظارت بر دستکاری ایجاد کردیم. ما در حال بررسی دو احتمال هستیم.

· شخصی داده‌ها را دستکاری کرده و مقدار هش ذخیره شده دیگر مقدار صحیح هش نیست.

· یک نفر اطلاعات بلاک‌چین قبلی را دستکاری کرده، و بنابراین مقدارprevHash ذخیره شده نادرست است.

اگر شما آن کد را اجرا کنید و مقدار آن زنجیره را چاپ کنید، باید بتوانید ببینید که چگونه هر بلوک در زنجیره، هم هش خود و هم هش بلوک قبلی را ذخیره می‌کند!

همه اینها برای این مثال است، اما اگر می‌خواهید با بلاک‌چین راحت‌تر شوید، من به شدت توصیه می‌کنم که با این کد بازی کنید و ببینید چه چیزی اعتبار این زنجیره را می‌شکند!

کدنویسی از دوستان خوب خود در Codesphere، ارائه‌دهنده ابر نسل بعدی، مبارک است.

این متن با استفاده از ربات ترجمه مقالات هوش مصنوعی ترجمه شده و به صورت محدود مورد بازبینی انسانی قرار گرفته است.در نتیجه می‌تواند دارای برخی اشکالات ترجمه باشد.
مقالات لینک‌شده در این متن می‌توانند به صورت رایگان با استفاده از مقاله‌خوان ترجمیار به فارسی مطالعه شوند.