Lagani klijenti Ethereuma koji koriste Web3j

Java Top

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

1. Uvod

Ovaj vodič predstavlja Web3j, Java implementaciju popularne biblioteke apstrakcije Web3.

Web3j koristi se za interakciju s Ethereum mrežom povezivanjem na Ethereum čvorove pomoću JSON-RPC ili poznati standardi poput HTTP-a, WebSockets-a, IPC-a.

Ethereum je cijela tema za sebe, pa prvo pogledajmo što je to!

2. Ethereum

Ethereum je (1) kriptovaluta (simbol simbola ETH), (2) distribuirano superračunalo, (3) blockchain i (4) mreža pametnih ugovora napisana u Čvrstoća.

Drugim riječima, Ethereum ( mreža) pokreće gomila povezanih poslužitelja tzv čvorovi koji komuniciraju u svojevrsnoj mrežnoj topologiji (tehnički, to nije točno točno, ali dovoljno blizu da steknemo solidnije razumijevanje kako sve to funkcionira).

Web3j, a njegova matična biblioteka zove Web3, dopušta web aplikacija za povezivanje s jednim od tih čvorovi i time podnijeti Ethereum transakcije, koji su, za sve namjere i svrhe, sastavljeni Solidity pametni ugovorfunkcije koji su prethodno raspoređeni u Ethereum mreža. Za više informacija o pametnim ugovorima pogledajte naš članak o njihovom stvaranju i primjeni s Solidity ovdje.

Svaki čvor emitira svoje promjene svakom drugom čvor kako bi se mogao postići konsenzus i provjera. Tako, svaki čvor sadrži cjelokupnu povijest Ethereum blockchain istovremeno čime se stvara suvišna sigurnosna kopija svih podataka, na način zaštićen od neovlaštenog korištenja, te putem konsenzusa i provjere svih ostalih čvor u mreža.\

Za detaljnije informacije o Ethereumu pogledajte službenu stranicu.

3. Postavite

Da bismo koristili puni paket značajki koje pruža Web3j, moramo učiniti malo više kako bismo se postavili nego inače. Prvo, Web3j isporučuje se u nekoliko samostojećih modula, od kojih se svaki može po želji dodati jezgri pom.xml ovisnost:

 org.web3j jezgra 3.3.1 

Imajte na umu da tim na Web3j nudi unaprijed izgrađeni Spring Boot Starter s ugrađenom određenom konfiguracijom i ograničenom funkcionalnošću!

U ovom ćemo se članku ograničiti na osnovne funkcije (uključujući kako dodati Web3j u Spring MVC aplikaciju, tako da se postiže kompatibilnost sa širim rasponom proljetnih web-aplikacija).

Cjelovit popis ovih modula nalazi se na Maven Central.

3.1. Sastavljanje ugovora: tartuf ili solc

Postoje dva osnovna načina za sastavljanje i raspoređivanje pametnih ugovora Ethereum (.solc datoteke):

  1. Službeni sastavljač Solidity.
  2. Tartuf (skup apstrakcija za testiranje, postavljanje i upravljanje pametnim ugovorima).

U ovom ćemo se članku držati Tartufa. Tartuf pojednostavljuje i apstrahira postupak sastavljanja pametnih ugovora, migrirajući ih i raspoređujući ih u mrežu. Također obavija Solc kompajler koji nam omogućava da steknemo neko iskustvo s obje.

Da biste postavili tartuf:

$ npm instalacija tartufa -g $ verzija tartufa

Četiri ključne naredbe koje ćemo koristiti za inicijalizaciju našeg projekta, kompajliranje naše aplikacije, postavljanje naše aplikacije na Blockchain i njegovo testiranje:

$ tartuf init $ tartuf kompajliranje $ tartuf migrirati $ tartuf test

Pređimo sada na jednostavan primjer:

čvrstoća pragme ^ 0,4,17; Primjer ugovora {Primjer funkcije () {// konstruktor}} 

Koji bi trebao stvoriti sljedeći ABI JSON kad je kompiliran:

{"contractName": "Primjer", "abi": [{"inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor"}], "bytecode": "0x60606040523415600e57600080fd5b603580601b6 ...," deployedBytecode ":" 0x6060604052600080fd00a165627a7a72305 ..., // ...}

Tada možemo koristiti isporučeni bajt kod i ABI unutar naše aplikacije za interakciju s raspoređenim ugovorima!

3.2. Ugovori o testiranju: Ganache

Jedan od najlakših načina za rad s Ethereum testnet mrežom je pokretanje vlastitog Ganache poslužitelja. Upotrijebit ćemo unaprijed izgrađeno rješenje izvan okvira jer ga je najjednostavnije postaviti i konfigurirati. Također pruža sučelje i ljusku poslužitelja za Ganache CLI koji pokreće Ganache ispod haube.

S našim Ganache poslužiteljem možemo se povezati na zadanoj dostavljenoj URL adresi: // localhost: 8545 ili // localhost: 7545.

Postoji nekoliko drugih popularnih pristupa postavljanju test mreže, uključujući upotrebu Meta-maske, Infure ili Go-Langa i Geth-a.

U ovom ćemo se članku držati Ganachea jer postavljanje vlastite instance GoLanga (i konfiguriranje kao prilagođenog testne mreže) može biti prilično nezgodno i budući da je status Meta-maske u Chromeu trenutno neizvjestan.

Ganache možemo koristiti za scenarije ručnog testiranja (prilikom uklanjanja pogrešaka ili dovršavanja integracijskog testiranja) ili ih koristiti za automatizirane scenarije testiranja (oko kojih moramo graditi testove jer u takvim okolnostima možda nemamo dostupne krajnje točke).

4. Web3 i RPC

Web3 pruža fasadu i sučelje za jednostavnu interakciju s Ethereum blockchain i Ethereum poslužitelj čvorovima. Drugim riječima, Web3 olakšava međusobnu komunikaciju između klijenata i Ethereum Blockchaina putem JSON-RPC. Web3J je službena Java veza Web3.

Web3j možemo inicijalizirati za upotrebu u našoj aplikaciji unošenjem davatelja usluge (npr. - krajnje točke treće strane ili lokalnog Ethereum čvora):

Web3j web3a = Web3j.build (novi HttpService ()); Web3j web3b = Web3j.build (nova HttpService ("YOUR_PROVIDER_HERE")); Web3j myEtherWallet = Web3j.build (nova HttpService ("// api.myetherapi.com/eth"));

Treća opcija pokazuje kako dodati neovisnog dobavljača (čime se povezuje s njihovim Ethereum čvorom). Ali također imamo mogućnost da ostavimo opciju davatelja usluga praznom. U tom će se slučaju koristiti zadani port (8545) na lokalnihost umjesto toga.

5. Osnovne metode Web3

Sad kad znamo kako inicijalizirati našu aplikaciju za komunikaciju s Ethereum blockchain-om, pogledajmo nekoliko temeljnih načina interakcije s Ethereum blockchain-om.

Dobra je politika da svoje Web3 metode omotate s CompleteableFuture za rukovanje asinkronom prirodom JSON-RPC zahtjeva upućenih na vaš konfigurirani Ethereum čvor.

5.1. Broj trenutnog bloka

Možemo, na primjer, vrati trenutni broj bloka:

javni EthBlockNumber getBlockNumber () {Rezultat EthBlockNumber = novi EthBlockNumber (); rezultat = ovo.web3j.ethBlockNumber () .sendAsync () .get (); povratni rezultat; }

5.2. Račun

Da biste dobili račun određene adrese:

javni EthAccounts getEthAccounts () {Rezultat EthAccounts = novi EthAccounts (); rezultat = this.web3j.ethAccounts () .sendAsync () .get (); povratni rezultat; }

5.3. Broj transakcija računa

Da biste dobili broj transakcija s dane adrese:

public EthGetTransactionCount getTransactionCount () {EthGetTransactionCount rezultat = novi EthGetTransactionCount (); result = this.web3j.ethGetTransactionCount (DEFAULT_ADDRESS, DefaultBlockParameter.valueOf ("latest")) .sendAsync () .get (); povratni rezultat; }

5.4. Stanje na računu

I na kraju, da biste dobili trenutni saldo adrese ili novčanika:

javni EthGetBalance getEthBalance () {Rezultat EthGetBalance = novi EthGetBalance (); this.web3j.ethGetBalance (DEFAULT_ADDRESS, DefaultBlockParameter.valueOf ("najnovije")) .sendAsync () .get (); povratni rezultat; }

6. Rad s ugovorima u Web3j

Jednom kad sastavimo naš ugovor o solidnosti pomoću tartufa, možemo raditi s našim kompiliranim Binarna sučelja aplikacije (ABI) pomoću samostalnog alata za naredbene retke Web3j koji je ovdje dostupan ili ovdje kao samostalni zip.

6.1. CLI Magic

Tada možemo automatski generirati naše omote Java Smart Contract Wrappers (zapravo POJO koji izlaže ABI pametnog ugovora) pomoću sljedeće naredbe:

$ web3j tartuf generira [--javaTypes | --solidityTypes] /path/to/.json -o / path / to / src / main / java -p com.your.organisation.name

Pokretanje sljedeće naredbe u korijenu projekta:

web3j tartuf generira dev_truffle / build / ugovora / Example.json -o src / main / java / com / baeldung / web3 / ugovor -p com.baeldung

generirao naš Primjer razred:

Primjer javne klase proširuje ugovor {privatni statički konačni niz BINARY = "0x60606040523415600e576 ..."; // ...}

6.2. Java POJO

Sad kad imamo svoj omot za pametni ugovor, možemo programski izraditi novčanik, a zatim rasporediti ugovor na tu adresu:

WalletUtils.generateNewWalletFile ("PASSWORD", nova datoteka ("/ put / do / odredišta"), true);
Vjerodajnice za vjerodajnice = WalletUtils.loadCredentials ("PASSWORD", "/ path / to / walletfile");

6.3. Razmjestite ugovor

Svoj ugovor možemo rasporediti ovako:

Primjer ugovora = Example.deploy (this.web3j, vjerodajnice, ManagedTransaction.GAS_PRICE, Contract.GAS_LIMIT) .send (); 

A zatim dobijte adresu:

contractAddress = contract.getContractAddress ();

6.4. Slanje transakcija

Da biste poslali Transakcija koristiti Funkcije Od našeg Ugovor možemo inicijalizirati Web3j Funkcija s Popis ulaznih vrijednosti i a Popis izlaznih parametara:

Popis inputParams = novi ArrayList (); Popis outputParams = novi ArrayList (); Funkcija funkcija = nova funkcija ("fuctionName", inputParams, outputParams); String encodedFunction = FunctionEncoder.encode (funkcija); 

Tada možemo inicijalizirati svoj Transakcija s potrebnim plin (koristi se za izvršavanje Transakcija) i nonce parametri:

BigInteger nonce = BigInteger.valueOf (100); BigInteger cijena plina = BigInteger.valueOf (100); BigInteger gaslimit = BigInteger.valueOf (100); Transakcijska transakcija = Transaction .createFunctionCallTransaction ("FROM_ADDRESS", nonce, gasprice, gaslimit, "TO_ADDRESS", encodedFunction); EthSendTransactionactionResponse = web3j.ethSendTransaction (transakcija) .sendAsync (). Get (); transactionHash =actionResponse.getTransactionHash (); 

Potpuni popis funkcionalnosti pametnih ugovora potražite u službenim dokumentima.

7. Zaključak

To je to! Postavili smo Java Spring MVC aplikaciju s Web3j - vrijeme je Blockchaina!

Kao i uvijek, primjeri koda korišteni u ovom članku dostupni su na GitHubu.

Dno Java

Upravo sam najavio novo Uči proljeće tečaj, usredotočen na osnove Spring 5 i Spring Boot 2:

>> PROVJERITE TEČAJ

$config[zx-auto] not found$config[zx-overlay] not found