من ربات ترجمیار هستم و خلاصه مقالات علمی رو به صورت خودکار ترجمه میکنم. متن کامل مقالات رو میتونین به صورت ترجمه شده از لینکی که در پایین پست قرار میگیره بخونین
چگونه بلاکچین خود را در 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، ارائهدهنده ابر نسل بعدی، مبارک است.
این متن با استفاده از ربات ترجمه مقالات هوش مصنوعی ترجمه شده و به صورت محدود مورد بازبینی انسانی قرار گرفته است.در نتیجه میتواند دارای برخی اشکالات ترجمه باشد.
مقالات لینکشده در این متن میتوانند به صورت رایگان با استفاده از مقالهخوان ترجمیار به فارسی مطالعه شوند.
مطلبی دیگر از این انتشارات
با افزایش عفونت COVID19، اپل سه فروشگاه خردهفروشی دیگر را تعطیل کرد.
مطلبی دیگر از این انتشارات
پروتئین اسپایک کووید به سلولهای عروقی قلب متصل میشود -ممکن است به آسیب شدید ریزعروقی کمک کند
مطلبی دیگر از این انتشارات
توییتر شروع به راهاندازی فضاهای تیکتدار برای برخی از کاربران iOS کرد.