יישום Blockchain פשוט בג'אווה

1. סקירה כללית

במדריך זה נלמד את המושגים הבסיסיים של טכנולוגיית הבלוקצ'יין. אנו ניישם גם יישום בסיסי בג'אווה המתמקד במושגים.

בהמשך נדון בכמה מושגים מתקדמים ויישומים מעשיים של טכנולוגיה זו.

2. מה זה בלוקצ'יין?

אז בואו ראשית להבין מה זה בעצם בלוקצ'יין ...

ובכן, הוא מתחקה אחר מקורו לעיתון הלבן שפרסם סאטושי נקאמוטו על ביטקוין, עוד בשנת 2008.

Blockchain הוא ספר מידע מבוזר. הוא מורכב מגושי נתונים המחוברים באמצעות קריפטוגרפיה. הוא שייך לרשת צמתים המחוברים דרך הרשת הציבורית. נבין זאת טוב יותר כאשר ננסה לבנות הדרכה בסיסית בהמשך.

יש כמה תכונות חשובות שעלינו להבין, אז בוא נעבור אותן:

  • חסין טמפר: בראש ובראשונה, נתונים כחלק מחסימה הינם חסינים בפני טמפ '. כל בלוק מוזכר על ידי עיכול קריפטוגרפי, המכונה בדרך כלל חשיש, מה שהופך את הבלוק חסין טמפר.
  • מבוזרת: כולה בלוקצ'יין מבוזר לחלוטין ברחבי הרשת. המשמעות היא שאין צומת ראשי, ולכל צומת ברשת יש את אותו עותק.
  • שקוף: כל צומת שמשתתפת ברשת מאמת ומוסיף חסם חדש לשרשרת שלו באמצעות קונצנזוס עם צמתים אחרים. מכאן שלכל צומת יש נראות מוחלטת של הנתונים.

3. איך Blockchain עובד?

עכשיו, בואו נבין איך עובד בלוקצ'יין.

ה יחידות היסוד של בלוקצ'יין הן חסימות. בלוק יחיד יכול להכיל מספר עסקאות או נתונים יקרי ערך אחרים:

3.1. כריית בלוק

אנו מייצגים חסימה לפי ערך חשיש. יצירת ערך החשיש של בלוק נקרא "כרייה" הבלוק. כריית בלוק היא בדרך כלל יקרה מבחינה חישובית שכן היא משמשת "הוכחת העבודה".

ה- hash של בלוק מורכב בדרך כלל מהנתונים הבאים:

  • בעיקר, hash של בלוק מורכב מעסקאות שהוא מכיל
  • החשיש מורכב גם מחותמת הזמן של יצירת הבלוק
  • זה כולל גם nonce, מספר שרירותי המשמש בקריפטוגרפיה
  • לבסוף, החשיש של החסימה הנוכחית כולל גם את החשיש של החסימה הקודמת

מרובות צמתים ברשת יכולים להתחרות בכרייה את החסימה בו זמנית. מלבד יצירת החשיש, הצמתים צריכים גם לוודא שהעסקאות שמתווספות בבלוק הן לגיטימיות. הראשון שכורה בלוק זוכה במירוץ!

3.2. הוספת בלוק לבלוקצ'יין

בעוד שכריית בלוק היא יקרה מבחינה חישובית, לוודא שחסימה היא לגיטימית זה הרבה יותר קל. כל הצמתים ברשת משתתפים באימות חסימה שזה עתה ממוקש.

לפיכך, מוקש לאחרונה בלוק מתווסף לבלוקצ'יין בקונצנזוס של הצמתים.

כעת, קיימים מספר פרוטוקולי קונצנזוס בהם אנו יכולים להשתמש לצורך אימות. הצמתים ברשת משתמשים באותו פרוטוקול כדי לזהות ענף זדוני של השרשרת. לפיכך, ענף זדוני גם אם הוצג יידחה בקרוב על ידי רוב הצמתים.

4. בלוקצ'יין בסיסי בג'אווה

עכשיו יש לנו מספיק הקשר כדי להתחיל לבנות יישום בסיסי בג'אווה.

הפשוט שלנו דוגמה כאן תדגים את מושגי היסוד פשוט ראינו. יישום בכיתה ייצור טומן בחובו הרבה שיקולים שאינם מתחום הדרכה זו. עם זאת, ניגע בכמה נושאים מתקדמים בהמשך.

4.1. יישום בלוק

ראשית, עלינו להגדיר POJO פשוט שיחזיק את הנתונים לחסימה שלנו:

מחלקה ציבורית חסום {hash פרטי מחרוזת; פרטי מחרוזת הקודםאש; נתוני מחרוזת פרטיים; זמן פרטי פרטי חותמת; אינטראקציה פרטית; חסימה ציבורית (נתוני מחרוזת, מחרוזת הקודמתאש, זמן זמן חותמת) {this.data = data; this.previousHash = הקודם hash; this.timeStamp = timeStamp; this.hash = calcBlockHash (); } // גטרים וקובעים סטנדרטיים}

בואו נבין מה ארזנו כאן:

  • האש של הבלוק הקודם, חלק חשוב לבניית השרשרת
  • הנתונים בפועל, כל מידע שיש לו ערך, כמו חוזה
  • חותמת הזמן של יצירת הבלוק הזה
  • נונס, שהוא מספר שרירותי המשמש בקריפטוגרפיה
  • לבסוף, הגיבוב של הבלוק הזה, מחושב על סמך נתונים אחרים

4.2. חישוב האש

עכשיו, כיצד נחשב את החשיש של בלוק? השתמשנו בשיטה calcBlockHash אך עדיין לא ראיתי יישום. לפני שאנו מיישמים שיטה זו, כדאי להקדיש זמן להבין מה זה בדיוק חשיש.

חשיש הוא פלט של משהו המכונה פונקציית חשיש. א פונקציית hash ממפה נתוני קלט בגודל שרירותי לנתוני פלט בגודל קבוע. החשיש די רגיש לכל שינוי בנתוני הקלט, קטן ככל שיהיה.

יתר על כן, אי אפשר להחזיר את נתוני הקלט רק מהשיש שלהם. מאפיינים אלה הופכים את פונקציית הגיבוב לשימושי למדי בקריפטוגרפיה.

אז בואו נראה איך נוכל ליצור את החשיש של החסימה שלנו ב- Java:

מחרוזת פומבית calcBlockHash () {String dataToHash = הקודםאש + Long.toString (timeStamp) + Integer.toString (nonce) + data; MessageDigest digest = null; בתים [] בתים = null; נסה את {digest = MessageDigest.getInstance ("SHA-256"); בתים = digest.digest (dataToHash.getBytes (UTF_8)); } לתפוס (NoSuchAlgorithmException | לא נתמך קידוד exception ex) {logger.log (Level.SEVERE, ex.getMessage ()); } חיץ StringBuffer = StringBuffer חדש (); עבור (בתים b: בתים) {buffer.append (String.format ("% 02x", b)); } החזר buffer.toString (); }

די הרבה דברים קורים כאן, בואו נבין אותם בפירוט:

  • ראשית, אנו מצרפים חלקים שונים של הבלוק כדי ליצור מהם חשיש
  • לאחר מכן, נקבל מופע של פונקציית החשיש SHA-256 מ MessageDigest
  • לאחר מכן, אנו מייצרים את ערך החשיש של נתוני הקלט שלנו, שהם מערך בתים
  • לבסוף, אנו הופכים את מערך הבתים למחרוזת hex, hash מיוצג בדרך כלל כמספר hex בן 32 ספרות

4.3. האם כריינו את הבלוק עדיין?

הכל נשמע פשוט ואלגנטי עד כה, למעט העובדה שעדיין לא מכרה את הבלוק. אז מה בדיוק כרוך בכריית בלוק, שתפס את תחושת המפתחים של המפתחים מזה זמן!

נו, כריית בלוק פירושה פתרון משימה מורכבת מבחינה חישובית לבלוק. אמנם חישוב ה- hash של בלוק הוא מעט טריוויאלי, אך לא למצוא את ה- hash החל מחמישה אפסים. מסובך עוד יותר יהיה למצוא חשיש שמתחיל בעשרה אפסים, ואנחנו מקבלים מושג כללי.

אז איך בדיוק נוכל לעשות זאת? בכנות, הפיתרון הרבה פחות מהודר! בכוח אכזרי אנו מנסים להשיג מטרה זו. אנו משתמשים ב- nonce כאן:

public String mineBlock (קידומת int) {String prefixString = מחרוזת חדשה (char [קידומת חדשה)). החלף ('\ 0', '0'); בעוד (! hash.substring (0, קידומת) .equals (prefixString)) {nonce ++; hash = calcBlockHash (); } להחזיר חשיש; }

בואו נראה מה אנחנו מנסים לעשות כאן הם:

  • אנו מתחילים בהגדרת הקידומת אותה אנו רוצים למצוא
  • ואז אנחנו בודקים אם מצאנו את הפיתרון
  • אם לא אנו מגדילים את ה- nonce ומחושבים את החשיש בלולאה
  • הלולאה נמשכת עד שנכנס לקופה

אנו מתחילים עם ערך ברירת המחדל של nonce כאן ומגדילים אותו באחד. אבל יש עוד אסטרטגיות מתוחכמות להתחיל ולהגדיל נונזה ביישומים בעולם האמיתי. כמו כן, איננו מאמתים כאן את הנתונים שלנו, שהם בדרך כלל חלק חשוב.

4.4. בואו נפעיל את הדוגמה

כעת, לאחר שהגדרנו את הבלוק שלנו יחד עם הפונקציות שלו, נוכל להשתמש בזה ליצירת בלוקצ'יין פשוט. נאחסן זאת ב- רשימת מערך:

רשימת בלוקצ'יין = ArrayList חדש (); קידומת int = 4; קידומת מחרוזת מחרוזת = מחרוזת חדשה (תו חדש [קידומת]). החלף ('\ 0', '0');

בנוסף, הגדרנו קידומת של ארבעה, מה שאומר למעשה שאנחנו רוצים שה- hash שלנו יתחיל בארבעה אפסים.

בואו נראה איך נוכל להוסיף חסום כאן:

@Test ציבור בטל givenBlockchain_whenNewBlockAdded_thenSuccess () {חסום newBlock = חסום חדש ("The is a New Block.", Blockchain.get (blockchain.size () - 1) .getHash (), תאריך חדש (). GetTime ()); newBlock.mineBlock (קידומת); assertTrue (newBlock.getHash (). substring (0, קידומת). שווה (prefixString)); blockchain.add (newBlock); }

4.5. אימות בלוקצ'יין

כיצד יכול צומת לאמת שבלוקצ'יין תקף? אמנם זה יכול להיות די מורכב, בואו נחשוב על גרסה פשוטה:

@Test הציבור בטל givenBlockchain_whenValidated_thenSuccess () {דגל בוליאני = נכון; עבור (int i = 0; i <blockchain.size (); i ++) {String previousHash = i == 0? "0": blockchain.get (i - 1) .getHash (); דגל = blockchain.get (i) .getHash (). שווה (blockchain.get (i) .calculateBlockHash ()) && previousHash.equals (blockchain.get (i) .getPreviousHash ()) && blockchain.get (i). getHash (). substring (0, קידומת) .equals (prefixString); אם (! דגל) נשבר; } assertTrue (דגל); }

אז הנה אנו מבצעים שלוש בדיקות ספציפיות עבור כל בלוק:

  • החשיש המאוחסן של הבלוק הנוכחי הוא למעשה מה שהוא מחשב
  • החשיש של הבלוק הקודם המאוחסן בבלוק הנוכחי הוא החשיש של הבלוק הקודם
  • החסימה הנוכחית נכרה

5. כמה מושגים מתקדמים

בעוד שהדוגמה הבסיסית שלנו מביאה את המושגים הבסיסיים של בלוקצ'יין, היא בהחלט לא שלמה. כדי להשתמש בטכנולוגיה זו לשימוש מעשי, יש להתחשב בכמה שיקולים אחרים.

אמנם לא ניתן לפרט על כולם, בוא נעבור על כמה מהחשובים:

5.1. אימות עסקה

חישוב החשיש של בלוק ומציאת החשיש הרצוי הוא רק חלק אחד בכרייה. חסימה מורכבת מנתונים, לרוב בצורה של מספר עסקאות. יש לאמת את אלה לפני שהם יכולים להפוך לחלק מבלוק ולכרות אותם.

יישום אופייני של blockchain מגדיר מגבלה על כמות הנתונים שיכולה להיות חלק מבלוק. זה גם קובע כללים כיצד ניתן לאמת עסקה. מספר צמתים ברשת משתתפים בתהליך האימות.

5.2. פרוטוקול קונצנזוס חלופי

ראינו כי נעשה שימוש באלגוריתם של קונצנזוס כמו "הוכחת עבודה" כדי לכרות ולאמת חסימה. עם זאת, זה לא האלגוריתם היחיד שקיים קונצנזוס לשימוש.

יש כמה אלגוריתמים אחרים של קונצנזוס לבחירה, כמו הוכחת יתד, הוכחת סמכות והוכחת משקל. לכל אלה היתרונות והחסרונות שלהם. איזה מהם להשתמש תלוי בסוג היישום שאנו מתכוונים לעצב.

5.3. תגמול כרייה

רשת בלוקצ'יין מורכבת בדרך כלל מצמתים מרצון. עכשיו, מדוע שמישהו ירצה לתרום לתהליך מורכב זה ולשמור עליו לגיטימי וצומח?

זה בגלל ש צמתים מתוגמלים על אימות העסקאות וכריית חסימה. תגמולים אלה הם בדרך כלל בצורה של מטבע המשויך ליישום. אבל יישום יכול להחליט שהתגמול יהיה כל דבר בעל ערך.

5.4. סוגי צומת

בלוקצ'יין מסתמך לחלוטין על הפעלת הרשת שלה. בתיאוריה, הרשת מבוזרת לחלוטין, וכל צומת שווה. עם זאת, בפועל, רשת מורכבת ממספר סוגים של צמתים.

בזמן לצומת מלא יש רשימה מלאה של עסקאות, לצומת אור יש רק רשימה חלקית. יתר על כן, לא כל הצמתים משתתפים באימות ובאימות.

5.5. תקשורת מאובטחת

אחד מסימני ההיכר של טכנולוגיית הבלוקצ'יין הוא הפתיחות והאנונימיות שלה. אך כיצד הוא מספק ביטחון לעסקאות המתבצעות בתוכם? זה מבוסס על הצפנה ותשתית מפתח ציבורי.

יוזם העסקה משתמש במפתח הפרטי שלהם כדי לאבטח אותה ולצרף אותה למפתח הציבורי של הנמען. צמתים יכולים להשתמש במפתחות הציבוריים של המשתתפים כדי לאמת עסקאות.

6. יישומים מעשיים של Blockchain

אז נראה שבלוקצ'יין היא טכנולוגיה מרגשת, אבל היא גם חייבת להיות שימושית. טכנולוגיה זו קיימת כבר זמן מה - ולמותר לציין - היא הוכיחה את עצמה כמפריעה בתחומים רבים.

יישומה בתחומים רבים אחרים מתבצע באופן פעיל. בואו להבין את היישומים הפופולריים ביותר:

  • מַטְבֵּעַ: זהו ללא ספק השימוש הוותיק והידוע ביותר בבלוקצ'יין, הודות להצלחתו של ביטקוין. הם מספקים כסף מאובטח וללא חיכוך לאנשים ברחבי העולם ללא כל סמכות מרכזית או התערבות ממשלתית.
  • זהות: הזהות הדיגיטלית הופכת במהירות לנורמה בעולם הנוכחי. עם זאת, זה שקוע על ידי בעיות אבטחה והתעסקות. בלתי נמנע מבלוקצ'יין לחולל מהפכה בתחום זה עם זהויות מאובטחות וחסינות טמפר.
  • בריאות: ענף הבריאות עמוס בנתונים, שמטופלים בעיקר על ידי הרשויות המרכזיות. זה מקטין את השקיפות, האבטחה והיעילות בטיפול בנתונים כאלה. טכנולוגיית הבלוקצ'יין יכולה לספק מערכת ללא שום צד שלישי כדי לספק אמון נחוץ.
  • מֶמְשָׁלָה: זה אולי אזור שפתוח היטב לשיבושים על ידי טכנולוגיית הבלוקצ'יין. השלטון נמצא בדרך כלל במרכזם של כמה שירותי אזרחים העמוסים לעתים קרובות בחוסר יעילות ושחיתות. בלוקצ'יין יכול לסייע ביצירת יחסי ממשל ואזרח טובים בהרבה.

7. כלי המסחר

אמנם היישום הבסיסי שלנו כאן שימושי להעלאת המושגים, אך לא מעשי לפתח מוצר על בלוקצ'יין מאפס. למרבה המזל, שטח זה הבשיל כעת, ויש לנו כמה כלים די שימושיים להתחיל מהם.

בוא נעבור על כמה מהכלים הפופולריים לעבודה במרחב זה:

  • מוצקות: מוצקות היא שפת תכנות מוכוונת סטטית ומכוונת עצמים מיועד לכתיבת חוזים חכמים. ניתן להשתמש בו בכדי לכתוב חוזים חכמים בפלטפורמות בלוקצ'יין שונות כמו Ethereum.
  • רמיקס IDE: רמיקס הוא חזק כלי קוד פתוח לכתיבת חוזים חכמים במוצקות. זה מאפשר למשתמש לכתוב חוזים חכמים ישירות מהדפדפן.
  • סוויטת כמהין: כמהין מספקת חבורה של כלים כדי להקים מפתח ולהתחיל בפיתוח אפליקציות מבוזרות. זה כולל טראפל, גנאש וטפטוף.
  • Ethlint / Solium: Solium מאפשר למפתחים להבטיח כי שלהם חוזים חכמים שנכתבו על סולידטי נקיים מבעיות סגנון ואבטחה. Solium מסייע גם בתיקון בעיות אלה.
  • זוגיות: זוגיות עוזרת הגדרת סביבת הפיתוח לחוזה חכם על אתריום. זה מספק דרך מהירה ומאובטחת לקיים אינטראקציה עם הבלוקצ'יין.

8. מסקנה

לסיכום, במדריך זה עברנו את המושגים הבסיסיים של טכנולוגיית הבלוקצ'יין. הבנו איך מכרה רשת ומוסיפים בלוק חדש בבלוקצ'יין. יתר על כן, יישמנו את המושגים הבסיסיים ב- Java. דנו גם בכמה מהמושגים המתקדמים הקשורים לטכנולוגיה זו.

לבסוף, סיכמנו כמה יישומים מעשיים של בלוקצ'יין וכן כלים זמינים.

כמו תמיד, ניתן למצוא את הקוד ב- GitHub.