לקוחות אתריום קלים המשתמשים ב- Web3j

ג'אווה טופ

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

1. הקדמה

הדרכה זו מציגה את Web3j, יישום Java של ספריית ההפשטה הפופולרית Web3.

Web3j משמש לאינטראקציה עם רשת Ethereum על ידי חיבור לצמתים Ethereum באמצעות JSON-RPC או סטנדרטים מוכרים כמו HTTP, WebSockets, IPC.

את'ריום הוא נושא שלם בפני עצמו, אז בואו נסתכל במהירות על מה זה!

2. אתריום

את'ריום הוא (1) מטבע מוצפן (סמל אסימון ETH), (2) מחשב-על מבוזר, (3) blockchain ו- (4) רשת חוזים חכמה כתובה מוּצָקוּת.

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

Web3j, וספריית האם שלה נקראת Web3, מאפשר יישומי רשת להתחבר לאחד כזה צמתים ובכך להגיש את אתריום עסקאות, שהם, לכל דבר ועניין, מוצקות חוזה חכםפונקציות שנפרסו בעבר לאת'ריום רֶשֶׁת. למידע נוסף על חוזים חכמים עיין במאמר שלנו בנושא יצירה ופריסה של Solidity כאן.

כל צומת משדר את השינויים שלו לכל אחד אחר צוֹמֶת כך שניתן יהיה להשיג קונצנזוס ואימות. לכן, כל אחד צוֹמֶת מכיל את כל ההיסטוריה של Ethereum blockchain בּוֹ זְמַנִית ובכך ליצור גיבוי מיותר של כל הנתונים, באופן חסין טמפר, ובאמצעות הסכמה ואימות על ידי כל האחרים צוֹמֶת בתוך ה רֶשֶׁת.\

למידע מפורט יותר על Ethereum, עיין בדף הרשמי.

3. הגדר

כדי להשתמש בחבילת התכונות המלאה המסופקת על ידי Web3j, עלינו לעשות קצת יותר על מנת להתקין מהרגיל. ראשית, Web3j מסופק בכמה מודולים העומדים בפני עצמם, וכל אחד מהם יכול להיות אופציונלי להוסיף לליבה pom.xml תלות:

 org.web3j הליבה 3.3.1 

שים לב ש הצוות ב- Web3j מספק Starter Spring Boot שנבנה מראש עם תצורה מסוימת ופונקציונליות מוגבלת המובנית ממש!

נגדיל את ההתמקדות שלנו בפונקציות הליבה במאמר זה (כולל כיצד להוסיף את Web3j ליישום MVC של Spring, כך שמתקבלת תאימות למגוון רחב יותר של יישומי רשת Spring).

רשימה מלאה של מודולים אלה תמצאו ב- Maven Central.

3.1. עריכת חוזים: כמהין או סולק

ישנן שתי דרכים עיקריות להרכיב ולפרוס חוזים חכמים של Ethereum (.סולק קבצים):

  1. מהדר הסולידיטי הרשמי.
  2. טראפל (חבילת הפשטה לבדיקה, פריסה וניהול חוזים חכמים).

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

להגדרת טראפל:

$ npm להתקין כמהין - גרסת כמהין $

ארבע פקודות מפתח בהן נשתמש לאתחל את הפרויקט שלנו בהתאמה, לקמפל את האפליקציה שלנו, לפרוס את היישום שלנו ל- Blockchain ולבדוק אותו בהתאמה:

$ כמהין init $ כמהין לקמפל $ כמהין להעביר $ כמהין בדיקה

עכשיו, בוא נעבור על דוגמה פשוטה:

מוצק פרגמה ^ 0.4.17; דוגמה לחוזה {פונקציה דוגמה () {// constructor}} 

אשר אמור להניב את ABI JSON הבאים בעת הידורו:

{"contractName": "דוגמה", "abi": [{"קלטים": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor"}], "bytecode": "0x60606040523415600e57600080fd5b603580601b6 ...," deployedBytecode ":" 0x6060604052600080fd00a165627a7a72305 ..., // ...}

לאחר מכן נוכל להשתמש ב- bytecode וב- ABI המסופקים בתוך היישום שלנו כדי לקיים אינטראקציה עם החוזים הפרוסים!

3.2. בדיקות חוזים: גנאש

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

אנו יכולים להתחבר לשרת Ganache בכתובת ה- URL המוגדרת כברירת מחדל: // localhost: 8545 או // localhost: 7545.

ישנן כמה גישות פופולריות אחרות להקמת רשת בדיקות, כולל שימוש ב- Meta-Mask, Infura או Go-Lang ו- Geth.

אנו נשמור על גנאש במאמר זה מכיוון שהקמת מופע משלך של GoLang (והגדרת התצורה כ- testnet מותאם אישית) עשויה להיות די מסובכת ומכיוון שמצב Meta-Mask ב- Chrome אינו בטוח כעת.

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

4. Web3 ו- RPC

Web3 מספק חזית וממשק לאינטראקציה קלה עם בלוקצ'יין Ethereum ו- Ethereum. במילים אחרות, Web3 מאפשר אינטראקציה בין לקוחות לבין Ethereum Blockchain דרך JSON-RPC. Web3J הוא יציאת Java הרשמית של Web3.

אנו יכולים לאתחל את Web3j לשימוש ביישום שלנו על ידי העברת ספק (למשל - נקודת הקצה של צד שלישי או צומת אתריום מקומי):

Web3j web3a = Web3j.build (HttpService חדש ()); Web3j web3b = Web3j.build (HttpService חדש ("YOUR_PROVIDER_HERE")); Web3j myEtherWallet = Web3j.build (HttpService חדש ("// api.myetherapi.com/eth"));

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

5. שיטות Web3 חיוניות

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

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

5.1. מספר חסימה נוכחי

אנחנו יכולים, למשל, להחזיר את מספר החסימה הנוכחי:

EthBlockNumber ציבורי getBlockNumber () {EthBlockNumber תוצאה = EthBlockNumber חדש (); תוצאה = this.web3j.ethBlockNumber () .sendAsync () .get (); תוצאת החזרה; }

5.2. חֶשְׁבּוֹן

כדי להשיג את חשבון של כתובת מוגדרת:

EthAccounts ציבוריים getEthAccounts () {EthAccounts result = EthAccounts new (); תוצאה = this.web3j.ethAccounts () .sendAsync () .get (); תוצאת החזרה; }

5.3. מספר עסקאות החשבון

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

EthGetTransactionCount ציבורי getTransactionCount () {EthGetTransactionCount תוצאה = EthGetTransactionCount חדש (); תוצאה = this.web3j.ethGetTransactionCount (DEFAULT_ADDRESS, DefaultBlockParameter.valueOf ("אחרון")) .sendAsync () .get (); תוצאת החזרה; }

5.4. יתרת חשבון

ולבסוף, כדי להשיג את היתרה הנוכחית של כתובת או ארנק:

EthGetBalance ציבורי getEthBalance () {תוצאה EthGetBalance = EthGetBalance חדש (); this.web3j.ethGetBalance (DEFAULT_ADDRESS, DefaultBlockParameter.valueOf ("האחרון")). sendAsync () .get (); תוצאת החזרה; }

6. עבודה עם חוזים ב- Web3j

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

6.1. CLI Magic

לאחר מכן אנו יכולים ליצור באופן אוטומטי את Java Wrappers חוזה החכם שלנו (למעשה POJO החושף את החוזה החכם ABI) באמצעות הפקודה הבאה:

כמהין $ web3j כמהין ליצור [--javaTypes | --solidityTypes] /path/to/.json -o / path / to / src / main / java -p com.your.organisation.name

הפעלת הפקודה הבאה בשורש הפרויקט:

כמהין web3j ליצור dev_truffle / build / חוזים / דוגמה.json -o src / main / java / com / baeldung / web3 / contract -p com.baeldung

יצר את שלנו דוגמא מעמד:

מעמד ציבורי דוגמה מרחיבה חוזה {סופי סטטי פרטי מחרוזת BINARY = "0x60606040523415600e576 ..."; // ...}

6.2. Java POJO

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

WalletUtils.generateNewWalletFile ("סיסמת", קובץ חדש ("/ path / to / destination"), נכון);
אישורי אישורים = WalletUtils.loadCredentials ("סיסמת", "/ path / to / walletfile");

6.3. לפרוס חוזה

אנו יכולים לפרוס את החוזה שלנו כך:

חוזה לדוגמא = Example.deploy (this.web3j, אישורי אישורים, ManagedTransaction.GAS_PRICE, Contract.GAS_LIMIT) .send (); 

ואז קבל את הכתובת:

contractAddress = contract.getContractAddress ();

6.4. שליחת עסקאות

לשלוח a עִסקָה משתמש ב פונקציות שלנו חוֹזֶה אנו יכולים לאתחל Web3j פוּנקצִיָה עם רשימה של ערכי קלט ו רשימה של פרמטרי הפלט:

רשימת inputParams = ArrayList חדש (); רשימת outputParams = ArrayList חדש (); פונקציית פונקציה = פונקציה חדשה ("fuctionName", inputParams, outputParams); מחרוזת encodedFunction = FunctionEncoder.encode (פונקציה); 

לאחר מכן נוכל לאתחל את עִסקָה עם הכרחי גַז (משמש לביצוע של עִסקָה) ופרמטרים nonce:

BigInteger nonce = BigInteger.valueOf (100); BigInteger gasprice = BigInteger.valueOf (100); BigInteger gaslimit = BigInteger.valueOf (100); עסקת עסקה = Transaction .createFunctionCallTransaction ("FROM_ADDRESS", nonce, gasprice, gaslimit, "TO_ADDRESS", encodedFunction); EthSendTransaction transactionResponse = web3j.ethSendTransaction (עסקה) .sendAsync (). Get (); transactionHash = transactionResponse.getTransactionHash (); 

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

7. מסקנה

זהו זה! הקמנו אפליקציית Java Spring MVC עם Web3j הגיע הזמן של בלוקצ'יין!

כמו תמיד, דוגמאות הקוד המשמשות במאמר זה זמינות ב- GitHub.

תחתית Java

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס