مقدمه
بلاک چین فناوری است که در چند ماه اخیر بسیار سر زبان ها افتاده و مورد بحث قرار میگیرد، اما چگونه میتوانیم تحت این فناوری کد نویسی انجام دهیم و برنامه هایمان را طبق این فناوری تولید کنیم؟ تا کنون روش مشخص یا پروژه تست شده سالم در کتابخانه های جهانی منبع باز (Github) منتشر نشده اما میتوان طبق معلومات کسب شده در مقالهی فناوری بلاک چین چیست و چه ارتباطی با بیت کوین دارد؟ کدهایی را تولید کرد که پایه و اساس ساخت برنامه های مبتنی بر فناوری بلاک چین (Block Chain) را فراهم سازد.
در این مقاله با برنامه نویسی سیستم بلاک چین به زبان JAVA بصورت کامل آشنا خواهید شد (همراه با سورس کد). کد ها را میتوانید با سایر زبان های برنامه نویسی نیز پیاده سازی نمایید. (C,C++,C#,JAVA,Kotlin,PHP,ASP.NET,PHYTHON,…)
نکات
- ابتدا باید مقاله ی فناوری بلاک چین چیست و چه ارتباطی با بیت کوین دارد؟ را برای کسب اطلاعات پایه بصورت کامل مطالعه کنید.
- نمونه کد تولید شده به زبان JAVA (جاوا) میباشد اما به دلیل هم خانواده بودن با زبان های فرزند C، به راحتی میتوانید تحت زبان های دیگر برنامه نویسی نیز کدنویسی را انجام دهید.
- کتابخانه ای که باید به پروژه خود اضافه کنید GSON library by google است.
ابتدا نگاهی به زیر ساخت بلاک چین می اندازیم:
همانطور که ملاحظه می فرمایید هر بلاک حاوی یکسری اطلاعات است که میتواند هر چیزی باشد. هر بلاک طبق محتوای داخل آن یک کد شناسایی منحصر بفرد برای خودش تولید میکند که توسط الگوریتم های Hash این کد به وجود می آید. به این روش اصلاحا Digital Signature یا امضای دیجیتال میگویند. یکی از دیگر از آپشن های الزامی که هر بلاک باید داشته باشد، کد شناسایی بلاک قبلی است.
اگر داده های بلوک قبلی تغییر کرده باشند، هش بلوک قبلی تغییر می کند (از آنجا که بخشی از آن توسط داده ها محاسبه می شود) به نوبه خود بر تمامی هش ها بلوک های بعد از آن تاثیر می گذارد. محاسبه و مقایسه هش ها به ما اجازه می دهد تا ببینیم آیا blockchain نامعتبر است یا خیر.
تغییر هر گونه داده در این لیست، امضا را تغییر و زنجیره را شکست خواهد داد.
در نهایت هر بلاک شامل موارد زیر میشود :
- اطلاعات داخلی
- کد شناسایی
- کد شناسایی بلاک قبلی
- تاریخ و زمان بصورت TimeStamp
شروع ساخت پروژه
طبق تصویر زیر پروژه جدید خود را ایجاد کنید.
پس از اینکه پروژه شما ساخته شد، باید کلاس Model بلاک چین را ایجاد کنیم. و فیلد هایی که توضیح دادیم را درون مدل بلاک چین اضافه کنیم.
import java.util.Date; public class Block { public String hash; public String previousHash; private String data; //our data will be a simple message. private long timeStamp; //as number of milliseconds since 1/1/1970. //Block Constructor. public Block(String data,String previousHash ) { this.data = data; this.previousHash = previousHash; this.timeStamp = new Date().getTime(); } }
همانطور که می بینید بلوک اصلی ما حاوی یک هش رشته ای است که امضای دیجیتال ما را نگه می دارد. متغیر previousHash برای نگه داشتن هش بلوک قبلی و متغیر data برای نگهداری اطلاعات بلوک ما تعریف شده اند.
در ادامه باید امضای دیجیتالی را انجام دهیم که الگوریتم های رمزنگاری زیادی وجود دارد که می توانید از آن استفاده کنید، اما SHA256 فقط برای این مثال مناسب است و کتابخانه java.security.MessageDigest را را برای دسترسی به الگوریتم SHA256 وارد پروژه میکنیم (import).
پس کلاس StringUtil را بصورت زیر اضافه میکنیم تا توابع ساخت امضای دیجیتال را در آن قرار دهیم :
import java.security.MessageDigest; public class StringUtil { //Applies Sha256 to a string and returns the result. public static String applySha256(String input){ try { MessageDigest digest = MessageDigest.getInstance("SHA-256"); //Applies sha256 to our input, byte[] hash = digest.digest(input.getBytes("UTF-8")); StringBuffer hexString = new StringBuffer(); // This will contain hash as hexidecimal for (int i = 0; i < hash.length; i++) { String hex = Integer.toHexString(0xff & hash[i]); if(hex.length() == 1) hexString.append('0'); hexString.append(hex); } return hexString.toString(); } catch(Exception e) { throw new RuntimeException(e); } } }
نمونه مثال تابع زیر جهت استفاده از کلاس StringUtil است :
public String calculateHash() { String calculatedhash = StringUtil.applySha256( previousHash + Long.toString(timeStamp) + data ); return calculatedhash; }
بنابراین امکان تغییر مدل بلاک بصورت زیر فراهم میشود :
public Block(String data,String previousHash ) { this.data = data; this.previousHash = previousHash; this.timeStamp = new Date().getTime(); this.hash = calculateHash(); //Making sure we do this after we set the other values. }
تا این مرحله که رسیدیم پروژه را تست میکنیم. چون در اولین بلاک هش بلاک قبلی موجود نیست مقدار آن را ۰ در نظر میگیریم.
public class NoobChain { public static void main(String[] args) { Block genesisBlock = new Block("Hi im the first block", "0"); System.out.println("Hash for block 1 : " + genesisBlock.hash); Block secondBlock = new Block("Yo im the second block",genesisBlock.hash); System.out.println("Hash for block 2 : " + secondBlock.hash); Block thirdBlock = new Block("Hey im the third block",secondBlock.hash); System.out.println("Hash for block 3 : " + thirdBlock.hash); } }
خروجی :
هر بلوک دارای امضای دیجیتال خود بر اساس اطلاعات آن و امضای بلوک قبلی است. در حال حاضر این مقدار زیادی از blockchain نیست، بنابراین ما می توانیم بلوک هایمان را در ArrayList ذخیره کنیم و همچنین gson را import کنید تا Json آن را ببیند. (برای یادگرفتن چگونگی وارد کردن کتابخانه gson اینجا را کلیک کنید)
import java.util.ArrayList; import com.google.gson.GsonBuilder; public class NoobChain { public static ArrayList<Block> blockchain = new ArrayList<Block>(); public static void main(String[] args) { //add our blocks to the blockchain ArrayList: blockchain.add(new Block("Hi im the first block", "0")); blockchain.add(new Block("Yo im the second block",blockchain.get(blockchain.size()-1).hash)); blockchain.add(new Block("Hey im the third block",blockchain.get(blockchain.size()-1).hash)); String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain); System.out.println(blockchainJson); } }
اینک باید تابعی بنویسیم تا بلاک ها را بصورت زنجیره ای جهت اعتبار سنجی چک کند. در این تابع هش تمام بلاک ها مجددا محاسبه و با بلاک بعدی و قبلی مقایسه میشوند.
public static Boolean isChainValid() { Block currentBlock; Block previousBlock; //loop through blockchain to check hashes: for(int i=1; i < blockchain.size(); i++) { currentBlock = blockchain.get(i); previousBlock = blockchain.get(i-1); //compare registered hash and calculated hash: if(!currentBlock.hash.equals(currentBlock.calculateHash()) ){ System.out.println("Current Hashes not equal"); return false; } //compare previous hash and registered previous hash if(!previousBlock.hash.equals(currentBlock.previousHash) ) { System.out.println("Previous Hashes not equal"); return false; } } return true; }
هر تغییری در هر کدام از بلاک ها باعث میشود که صحت سنجی بلاک چین ما با مشکل مواجه شود و تابع مقدار False را بازگردانی کند.
گره های شبکه bitcoin بلوک های خود را به اشتراک می گذارند و طولانی ترین زنجیره معتبر توسط شبکه پذیرفته می شود. اما چه چیزی باعث میشود تا کسی نتواند داده ها را در بلاک های قدیمی حین ساخت بلاک جدید دستکاری کند؟ سیستم اثبات کار!
هرچقدر تعداد بلاک ها در بلاک چین بیشتر شود، عملیات ساخت بلاک جدید بیشتر به طول می انجامد، بنابراین زمان هک شدن این سیستم بستگی به تعداد زنجیره ها دارد چون هر گونه تغییری که در یک بلاک انجام شود باید مجددا هش آن تغییر کند و برای معتبر بودن زنجیره باید هش تمامی بلاک های سیستم تغییر کنند.
استخراج بلاک جدید (Block Mining)
Miners یا معدنچیان در واقع همان سیستم هایی هستند که برای ساخت بلاک جدید، هش ها را از بلاک ۰ تا آخرین بلاک در زنجیره بلاک چین جهت اثبات کار محاسبه میکنند تا در نهایت هش بلاک جدید بدست آید. در نتیجه تابع mineBlock را برای این هدف به مدل Block اضافه میکنیم :
import java.util.Date; public class Block { public String hash; public String previousHash; private String data; //our data will be a simple message. private long timeStamp; //as number of milliseconds since 1/1/1970. private int nonce; //Block Constructor. public Block(String data,String previousHash ) { this.data = data; this.previousHash = previousHash; this.timeStamp = new Date().getTime(); this.hash = calculateHash(); //Making sure we do this after we set the other values. } //Calculate new hash based on blocks contents public String calculateHash() { String calculatedhash = StringUtil.applySha256( previousHash + Long.toString(timeStamp) + Integer.toString(nonce) + data ); return calculatedhash; } public void mineBlock(int difficulty) { String target = new String(new char[difficulty]).replace('\0', '0'); //Create a string with difficulty * "0" while(!hash.substring( 0, difficulty).equals(target)) { nonce ++; hash = calculateHash(); } System.out.println("Block Mined!!! : " + hash); } }
تابع mineBlock یک ورودی از نوع int میگیرد که دشواری کار را تعیین میکند. دشواری کم مانند ۱ یا ۲ می تواند تقریبا بلافاصله بر روی اکثر کامپیوترها حل شود، من پیشنهاد می کنم چیزی حدود ۴ تا ۶ برای آزمایش داشته باشم. مقدار دشواری در لایتکوین ها چیزی حدود ۴۴۲٫۵۹۲ است.
بنابراین برای تعیین کردن دشواری کار در پروژه ها، متغییر difficulty را با مقدار ۵ به مدل Block اضافه میکنیم .
public static int difficulty = 5;
ما باید کلاس NoobChain را برای راه اندازی تابع mineBlock برای هر بلوک جدید به روز کنیم. همچنین تابع isChainValid باید اعتبار سنجی بلاک های Mine شده را نیز بررسی کند.
import java.util.ArrayList; import com.google.gson.GsonBuilder; public class NoobChain { public static ArrayList<Block> blockchain = new ArrayList<Block>(); public static int difficulty = 5; public static void main(String[] args) { //add our blocks to the blockchain ArrayList: blockchain.add(new Block("Hi im the first block", "0")); System.out.println("Trying to Mine block 1... "); blockchain.get(0).mineBlock(difficulty); blockchain.add(new Block("Yo im the second block",blockchain.get(blockchain.size()-1).hash)); System.out.println("Trying to Mine block 2... "); blockchain.get(1).mineBlock(difficulty); blockchain.add(new Block("Hey im the third block",blockchain.get(blockchain.size()-1).hash)); System.out.println("Trying to Mine block 3... "); blockchain.get(2).mineBlock(difficulty); System.out.println("\nBlockchain is Valid: " + isChainValid()); String blockchainJson = new GsonBuilder().setPrettyPrinting().create().toJson(blockchain); System.out.println("\nThe block chain: "); System.out.println(blockchainJson); } public static Boolean isChainValid() { Block currentBlock; Block previousBlock; String hashTarget = new String(new char[difficulty]).replace('\0', '0'); //loop through blockchain to check hashes: for(int i=1; i < blockchain.size(); i++) { currentBlock = blockchain.get(i); previousBlock = blockchain.get(i-1); //compare registered hash and calculated hash: if(!currentBlock.hash.equals(currentBlock.calculateHash()) ){ System.out.println("Current Hashes not equal"); return false; } //compare previous hash and registered previous hash if(!previousBlock.hash.equals(currentBlock.previousHash) ) { System.out.println("Previous Hashes not equal"); return false; } //check if hash is solved if(!currentBlock.hash.substring( 0, difficulty).equals(hashTarget)) { System.out.println("This block hasn't been mined"); return false; } } return true; } }
کار تمام است و در نهایت خروجی ما بصورت زیر است :
در خروجی، استخراج هر بلوک زمان خاصی را گذراند! (حدود ۳ ثانیه) مقدار دشواری را تغییر دهید تا ببیند که چگونه بر روی زمان استخراج هر بلوک تاثیر میگذارد!
اگر کسی در سیستم بلاک چین قصد جاسوسی با تغییر داده ها را داشته باشد :
- سیستم بلاک چین نامعتبر خواهد شد.
- آنها قادر نخواهند بود یک بلوک زنجیره ای بزرگتر ایجاد کنند.
یک سیستم بلاک چین دستکاری شده نمیتواند تبدیل به یک زنجیره معتبر و طولانی شود مگر اینکه آنها سرعت رایانه ای بیشتری نسبت به تمام گره های دیگر در شبکه شما داشته باشند. چیزی مانند یک کامپیوتر کوانتومی ویژه یا غیره.
منبع : پارس اَپ
هر گونه کپی برداری از این مطلب ممنوع است!
- 06 سپتامبر 2018
- وبمستر پارس اَپ
- 25859 بازدید
- بدون نظر
- دسته بندی : آموزش , ارز دیجیتال , اندروید , برنامه نویسی , بلاک چین , بیت کوین , تکنولوژی , دستهبندی نشده , فناوری , کامپیوتر , موبایل
تیم نرم افزاری پارس اَپ یک تیم فعال در زمینه های برنامه نویسی، طراحی و نقد و بررسی است که از جوانان نخبه و فعال تشکیل شده است.
وبمستر پارس اَپ 28 نوشته در پارس اَپ دارد . مشاهده تمام نوشته های وبمستر پارس اَپلایک استور بهترین اپلیکیشن کاربردی به منظور افزایش لایک و بازدید پست های شما در اینستاگرام است. به محض ورود به اپلیکیشن مستقیما به صفحه لاگین اینستاگرام هدایت میشوید و بایستی یوزرنیم و پسورد پیج خودتان را وارد نمایید و لاگین کنید تا بتوانید از اپلیکیشن استفاده نمایید. نکته : شما مستقیما در صفحهی لاگین اینستاگرام لاگین میکنید و اطلاعات پیج شما به هیچ عنوان در اختیار ما و یا سایرین قرار نخواهد گرفت. برای سفارش لایک و بازدید باید از لیست پست های خود […]
سپر ایمنی چیست ؟ گوگل یک سیستم امنیتی برای برنامه هایی که از Google Play دانلود نشده است به نام “Play Protect” اضافه کرده است. سپر ایمنی که بصورت سرویسی بسیار قدرتمند در اپلیکیشن گوگل پلی تنظیم میشود قادر است تا روزانه حدود ۵ میلیارد اپلیکیشن و بازی را در سیستم های اندرویدی کاربران در سراسر دنیا مورد بررسی قرار دهد و به گونه ای نقش آنتی ویروس را در سیستم عامل اندروید بازی میکند! سپر ایمنی گوگل که در صورت مشاهده برنامه مخرب میتواند […]
مقدمه با انتشار اپلیکیشن در استورها و مارکت ها، فرصت خوبی برای جذب کاربران در اختیارتان قرار میگیرد و در این مقاله قصد داریم به صورت گام به گام شما را با روال انجام این کار و نحوه انتشار اپلیکیشن در گوگل پلی استور آشنا کنیم. اگر توسعه دهنده اپلیکیشن ها و بازی های اندروید هستید، در ادامه با ما همراه شوید. دانستی ها اپ استور کمپانی اپل قوانین سختگیرانه ای برای تایید اپلیکیشن ها دارد و تنها اپلیکیشن هایی مورد تایید این استور قرار […]
گوگل به مناسبت پانزدهمین سالگرد راه اندازی جی میل آپدیت جدیدی را برای اپلیکیشن Gmail منتشر کرده که قابلیت هایی کاربردی را به آن اضافه می کند. قابلیت هایی از جمله نگارش هوشمند و امکان تعیین زمان ارسال ایمیل ها به دلخواه که در زیر بیشتر به آنها خواهیم پرداخت. علاوه بر این یک سری از کارهایی که برای انجام دادن آنها کاربر مجبور به خروج از Gmail بود نیز از این پس از داخل خود جی میل قابل انجام خواهند بود. قابلیت ارسال ایمیل در […]
مقدمه استوری، قابلیت جذابی که سال گذشته به اینستاگرام اضافه شد که توسط آن میتوانید چندین عکس یا ویدئو را حداکثر به مدت ۲۴ ساعت در صفحه (پیج)تان به اشتراک بگذارید و پس از ۲۴ ساعت بصورت خودکار حذف میشوند. روش راحتی که برای دانلود محتوای پست های اینستاگرام پیشنهاد میشود این است که پس از انتخاب گزینه Copy Link در منوی پست مورد نظر و کپی شدن لینک آن پست، به تلگرام رفته و آنرا در فضای Cloud یا همان Saved Messages ارسال کنید […]
مقدمه نام بلوتوث در ذهن خیلی از ما یادآور رد و بدل کردن فایل از فاصله نزدیک بین دو گوشی، تبلت یا رایانه بدون استفاده از کابل ارتباطی است. در واقع یکی از کارکردهای اصلی بلوتوث نیز همین است ولی آیا می دانستید که می شود اینترنت وای فای را هم از طریق بلوتوث با دیگران به اشتراک گذاشت؟ به عبارت دیگر دوستان شما به جای آنکه مستقیم به شبکه وای فای متصل شوند می توانند از طریق بلوتوث به گوشی یا تبلت شما متصل […]
شرح مشکل سرویس Google Play Protect که پیش از این توسعه دهنده های اندرویدی را در نقاط مختلف جهان به دردسر انداخته بود و برنامه های اندرویدی را هنگام نصب به عنوان بدافزار شناسایی و بلاک میکرد، اخیرا کار را برای توسعه دهنده ها سخت تر کرده به گونه ای که اجازه نصب برنامه را نمیدهد و درنهایت کاربر با پیغام App Not Installed یا برنامه نصب نشد، عملیات نصب برنامه را با ناکامی به پایان میرساند. در این مقاله آموزش رفع خطای Google Play […]
اینستاگرمبا بیش از یک میلیارد کاربر از سراسر دنیا بدون شک یکی از پر طرفدار ترین شبکه های اجتماعی مبتنی بر تصویر است. اما همه چیز در اینستاگرم به تصویر ختم نمی شود. بخش استوری که البته مدتهاست به اینستاگرماضافه شده محلی است که روزانه میلیون ها کاربر لحظات ناب شان را در آن ثبت می کنند و البته دیدن آنها برای تمام کسانی که اصطلاحا فالور شخص به حساب می آیند ممکن است. اما سوال اینجاست که اگر یکی از این استوری ها تا حدودی […]
فیشینگ چیست ؟ فیشینگ (به انگلیسی: Phishing) به تلاش برای بدست آوردن اطلاعاتی مانند نام کاربری، گذرواژه، اطلاعات حساب بانکی و… از طریق جعل یک وبسایت، آدرس ایمیل و… گفته میشود و یا به عبارت سادهتر وقتی شخصی سعی میکند شما را فریب دهد تا اطلاعات شخصیتان را در اختیارش بگذارید، یک حمله فیشینگ اتفاق میافتد. شبکههای اجتماعی و وبسایتهای پرداخت آنلاین از جمله اهداف حملات فیشینگ هستند. علاوه بر آن، ایمیلهایی که با این هدف ارسال میشوند و حاوی پیوندی به یک وبسایت هستند در اکثر موارد حاوی بدافزار هستند. تاریخچه فیشینگ روش فیشینگ با جزئیات در […]
به نقل از وبسایت atechcare.com: شاید تا به حال نام خرید یا پرداخت درون برنامه ای به گوشتان خورده باشد مخصوصا اگر اهل بازی باشید. خرید یا پرداخت درون برنامه ای اصطلاحا به پرداختی گفته می شود که کاربر نه برای خرید کل یک برنامه یا بازی بلکه برای خرید آیتم های درون آن انجام می دهد (با پول واقعی). اگر اهل بازی کلش آو کلنز باشید می دانید که به عنوان مثال الماس که یکی از آیتم های درون برنامه ای این بازی است را می توان […]
کانال تلگرام سایت
اطلاع از آخرین اخبار پارس اَپ
صفحه اینستاگرام
آخرین تصاویر و ویدئو های پارس اَپ
- آموزش (۱۷)
- ترفند (۱۱)
- ویندوز (۳)
- طراحی سایت (۱)
- ترفند (۱۱)
- ارز دیجیتال (۲)
- بیت کوین (۲)
- برنامه نویسی (۴)
- تکنولوژی (۱۲)
- اخبار (۶)
- دستهبندی نشده (۳)
- فناوری (۳)
- بلاک چین (۲)
- کامپیوتر (۲)
- موبایل (۲۲)
- اندروید (۲۲)
- اپلیکیشن (۱۶)
- اینستاگرام (۲)
- بازی (۳)
- نقد و بررسی (۴)
- اپلیکیشن (۱۶)
- اندروید (۲۲)
- هک (۲)
- دی ۱۳۹۸ (۱)
- اردیبهشت ۱۳۹۸ (۱)
- فروردین ۱۳۹۸ (۴)
- اسفند ۱۳۹۷ (۱)
- آذر ۱۳۹۷ (۲)
- آبان ۱۳۹۷ (۱)
- شهریور ۱۳۹۷ (۵)
- مرداد ۱۳۹۷ (۴)
- تیر ۱۳۹۷ (۹)
- ایران اپس ایران اپس 0
- کافه بازار کافه بازار 1
- مایکت مایکت 0