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

شکل۱. ساخت بلاک‌چین در NodeJSمنتشر شده در dev به تاریخ ۲۴ ژوئن ۲۰۲۱لینک منبع: How to Build Your Own Blockchain in NodeJSهنگامی که ما در حال تلاش برای یادگیری چیزی جدید هستیم، اغلب اوقات می‌تواند وسوسه برانگیز باشد که ابتدا به سراغ مستندات، مقالات، و توضیحات مفهومی برویم. در حالی که همه این موارد به طور قطع مهم است، برنامه‌نویسان ابزار بزرگی در زرادخانه خود برای درک موضوعات پیچیده‌ای دارند که اغلب آن‌ها را مسلم می‌دانند..ساخت مدل‌ها برای موضوعات مختلف در کد می‌تواند به ما کمک کند درک کنیم که چگونه بخش‌های مختلف یک ایده با هم جور می‌شوند و در عمل فعالیت می‌کنند.در این برنامه آموزشی، من به شما نشان خواهم داد که چگونه یک بلاک‌چین ابتدایی را با برخی از اسناد نسبتا ساده جاوا بسازید.یک بلاک‌چین چیست؟فکر کردن به بلاک‌چین‌ها به عنوان لیست‌های پیوندی افزوده شده یا آرایه‌هایی که در آن‌ها هر عنصر به آرایه قبلی اشاره می‌کند، می‌تواند مفید باشد.در داخل هر بلوک (معادل یک عنصر در یک آرایه) از بلاک‌چین، حداقل موارد زیر وجود دارد:یک مهر زمان از زمان اضافه شدن بلوک به زنجیرهیک نوع داده مرتبط. در مورد ارز رمزنگاری شده، این داده می‌تواند تراکنش‌ها را ذخیره کند، اما بلاک‌چین می‌تواند در ذخیره‌سازی بسیار بیشتر از فقط تراکنش‌ها برای ارز رمزنگاری شده مفید واقع شود.هش رمزگذاری شده بلوکی که قبل از آن قرار داردیک هش رمزگذاری شده براساس داده‌های موجود در بلوک (شامل هش بلوک قبلی(مولفه کلیدی که باعث می‌شود بلاک‌چین بسیار قدرتمند شود این است که در هر بلاک‌چین، اطلاعات بلوک قبلی (که از طریق بلاک‌چین قبلی ذخیره شده‌است) قرار می‌گیرد. این به این معنی است که اگر شما داده‌های یک بلوک را تغییر دهید، هش آن را تغییر خواهید داد و در نتیجه هش تمام بلوک‌های آینده را بی‌اعتبار خواهید کرد.ایجاد یک بلوکدر حالی که این کار را احتمالا می‌توان با جاوا اسکریپت وانیل انجام داد، به خاطر سادگی، ما می‌خواهیم یک اسکریپت Node.js بسازیم و از Node.js ساخته شده در بستهCrypto برای محاسبه هش‌هایمان استفاده کنید.ما می‌توانیم یک بلوک را در کدهایی مانند این تعریف کنیم:const crypto = require('crypto'); // Import NodeJS's Crypto Moduleclass Block { // Our Block Classconstructor(data, prevHash = "") {this.timestamp = Date.now(); // Get the current timestampthis.data = data; // Store whatever data is relevantthis.prevHash = prevHash // Store the previous block's hashthis.hash = this.computeHash() // Compute this block's hash}computeHash() { // Compute this Block's hashlet strBlock = this.prevHash + this.timestamp + JSON.stringify(this.data) // Stringify the block's datareturn crypto.createHash("sha256").update(strBlock).digest("hex") // Hash said string with SHA256 encrpytion}}توجه داشته باشید که ما از رمزگذاری SHA256 برای هش تابع خود استفاده می‌کنیم. این یک تابع هش رمزنگاری استاندارد است که در اکثر بلاک‌چین‌ها استفاده می‌شود زیرا محاسبه آن فوق‌العاده آسان است، اما معکوس کردن آن فوق‌العاده سخت است.سپس می‌توانیم نمونه‌هایی از این بلوک‌ها مانند موارد زیر را ایجاد کنیم:فرض کنید a = بلوک جدید ({ از: «جو»، تا: «جین» }، مقدم بر هش= «۰»)فرض کنید b = بلوک جدید ({ از: «جین»، تا: «جو» }، مقدم بر هش=( a.hashبرای این بلوک‌ها Hashها را چاپ کنید و توجه داشته باشید که آن‌ها چگونه متفاوت هستند. همچنین توجه داشته باشید که اگر شما داده‌های بلوک اول را تغییر دهید، هش‌های هر دو تغییر خواهند کرد.ایجاد یک بلاک‌چینحالا که ما بلوک‌های سازنده خودمان را داریم (جناس در نظر گرفته شده‌است(، بیایید یک کلاس برای زنجیره خود ایجاد کنیم. می‌توانیم آن را به این صورت تعریف کنیم:class BlockChain { // Our Blockchain Objectconstructor() {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 blocknewBlock.prevHash = this.obtainLatestBlock().hash // Set its previous hash to the correct valuenewBlock.hash = newBlock.computeHash() // Recalculate its hash with this new prevHash valuethis.blockchain.push(newBlock) // Add the block to our chain}checkChainValidity() { // Check to see that all the hashes are correct and the chain is therefore validfor(let i = 1; i < this.blockchain.length; i++) { // Iterate through, starting after the genesis blockconst 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 datalet a = new Block({from: "Joe", to: "Jane"})let b = new Block({from: "Jane", to: "Joe"})let chain = new BlockChain() // Init our chainchain.addNewBlock(a) // Add block achain.addNewBlock(b) // Add block bconsole.log(chain) // Print out the blockchainconsole.log("Validity: " + chain.checkChainValidity()) // Check our chain for validityابتدا توجه داشته باشید که بلوک اولیه زنجیره را Genesis Block می‌نامیم از آنجایی که این بلوک اولین بلوک در زنجیره است، نمی‌تواند هیچ مقدار هش قبلی را ذخیره کند.سپس، ما کارکردی را برای بررسی اعتبار بلاک‌چین برای نظارت بر دستکاری ایجاد کردیم. ما در حال بررسی دو احتمال هستیم.· شخصی داده‌ها را دستکاری کرده و مقدار هش ذخیره شده دیگر مقدار صحیح هش نیست.· یک نفر اطلاعات بلاک‌چین قبلی را دستکاری کرده، و بنابراین مقدارprevHash ذخیره شده نادرست است.اگر شما آن کد را اجرا کنید و مقدار آن زنجیره را چاپ کنید، باید بتوانید ببینید که چگونه هر بلوک در زنجیره، هم هش خود و هم هش بلوک قبلی را ذخیره می‌کند!همه اینها برای این مثال است، اما اگر می‌خواهید با بلاک‌چین راحت‌تر شوید، من به شدت توصیه می‌کنم که با این کد بازی کنید و ببینید چه چیزی اعتبار این زنجیره را می‌شکند!کدنویسی از دوستان خوب خود در Codesphere، ارائه‌دهنده ابر نسل بعدی، مبارک است.این متن با استفاده از ربات ترجمه مقالات هوش مصنوعی ترجمه شده و به صورت محدود مورد بازبینی انسانی قرار گرفته است.در نتیجه می‌تواند دارای برخی اشکالات ترجمه باشد.مقالات لینک‌شده در این متن می‌توانند به صورت رایگان با استفاده از مقاله‌خوان ترجمیار به فارسی مطالعه شوند.