Könnyű Ethereum kliensek a Web3j használatával

Java Top

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT

1. Bemutatkozás

Ez az oktatóanyag bemutatja a Web3j-t, a népszerű Web3 absztrakciós könyvtár Java-implementációját.

A Web3j-t az Ethereum hálózattal való interakcióra használják azáltal, hogy a JSON-RPC segítségével csatlakoznak az Ethereum csomópontokhoz vagy olyan ismert szabványok, mint a HTTP, a WebSockets, az IPC.

Az Ethereum önmagában egy egész téma, ezért először nézzük meg gyorsan, mi ez!

2. Ethereum

Az Ethereum egy (1) kriptovaluta (token szimbólum ETH), (2) elosztott szuperszámítógép, (3) blokklánc és (4) intelligens szerződéses hálózat Szilárdság.

Más szavakkal, az Ethereum (a hálózat) egy csomó összekapcsolt szerver nevű csomópontok amelyek egyfajta háló topológiában kommunikálnak (technikailag ez nem éppen igaz, de elég közel van ahhoz, hogy szilárdabban megértsük az egész működését).

Web3j, és a szülőkönyvtár hívta Web3, lehetővé teszi webalkalmazások hogy csatlakozzon az egyikhez csomópontok és ezáltal benyújtja az Ethereumot tranzakciók, amelyek minden szempontból összeállítják a Szilárdságot okos szerződésfunkciókat amelyeket korábban az Ethereumba telepítettek hálózat. Az intelligens szerződésekkel kapcsolatos további információkért tekintse meg cikkünket a Solidity-vel való létrehozásukról és alkalmazásukról.

Minden csomópont minden másnak közvetíti a változásait csomópont hogy konszenzus és ellenőrzés érhető el. Így, minden egyes csomópont tartalmazza a teljes történelmét Ethereum blokklánc egyidejűleg ezáltal az összes adat redundáns biztonsági másolatát hozza létre, szabotázsbiztos módon, konszenzus és az összes többi fél általi ellenőrzés útján. csomópont ban,-ben hálózat.\

Az Ethereumról további információkért tekintse meg a hivatalos oldalt.

3. Beállítás

A Web3j által nyújtott szolgáltatások teljes készletének kihasználásához a szokásosnál kicsit többet kell tennünk a beállításhoz. Először is, a Web3j több, szabadon álló modulban kerül forgalomba, amelyek mindegyike opcionálisan hozzáadható a maghoz pom.xml függőség:

 org.web3j mag 3.3.1 

Kérjük, vegye figyelembe, hogy a Web3j csapata egy előre elkészített Spring Boot Starter programot kínál, amely némi konfigurációval és korlátozott funkcionalitással rendelkezik, beépítve!

Ebben a cikkben a fő funkciókra korlátozódunk (ideértve a Web3j hozzáadását a Spring MVC alkalmazáshoz, így kompatibilitás érhető el a Spring webalkalmazások szélesebb körével).

Ezeknek a moduloknak a teljes listája megtalálható a Maven Central oldalon.

3.1. Szerződések összeállítása: Szarvasgomba vagy Solc

Két fő módja van az Ethereum intelligens szerződések összeállításának és telepítésének (.solc fájlok):

  1. A hivatalos Solidity fordító.
  2. Szarvasgomba (absztrakciós csomag intelligens szerződések teszteléséhez, bevezetéséhez és kezeléséhez).

Ebben a cikkben ragaszkodunk a szarvasgombához. A szarvasgomba egyszerűsíti és absztrakt az intelligens szerződések összeállításának folyamatát, áttelepíti őket és egy hálózatba telepíti őket. Be is tekeri a Solc fordító lehetővé teszi, hogy tapasztalatokat szerezzünk mindkettőről.

A szarvasgomba beállítása:

$ npm szarvasgomba telepítése -g $ szarvasgomba verzió

Négy kulcsparancs, amelyet a projekt inicializálásához, az alkalmazásunk összeállításához, a Blockchain telepítéséhez és teszteléséhez használunk:

$ truffle init $ truffle compile $ truffle migrate $ truffle teszt

Most nézzünk át egy egyszerű példát:

pragma szilárdság ^ 0.4.17; szerződéses példa {function Example () {// konstruktor}} 

Amelyből össze kell állítani a következő ABI JSON-t:

{"contractName": "Példa", "abi": [{"bemenetek": [], "fizetendő": hamis, "stateMutability": "nem fizethető", "type": "konstruktor"}], "bytecode": "0x60606040523415600e57600080fd5b603580601b6 ...," deployedBytecode ":" 0x6060604052600080fd00a165627a7a72305 ..., // ...}

Ezután felhasználhatjuk a mellékelt bytecode-ot és az ABI-t alkalmazásunkon belül a telepített szerződésekkel való interakcióhoz!

3.2. Szerződések tesztelése: Ganache

Az Ethereum testnet használatának egyik legegyszerűbb módja a saját Ganache szerver elindítása. Az előre elkészített, dobozon kívüli megoldást fogjuk használni, mivel a legegyszerűbb beállítani és konfigurálni. Ezenkívül egy felületet és szerverhéjat biztosít a Ganache CLI számára, amely a motorháztető alatt hajtja a Ganache-ot.

Az alapértelmezett URL-címen csatlakozhatunk a Ganache szerverünkhöz: // localhost: 8545 vagy // localhost: 7545.

Van még néhány népszerű megközelítés a teszthálózat felállításához, beleértve a Meta-Mask, az Infura vagy a Go-Lang és Geth használatát.

Ebben a cikkben ragaszkodunk a Ganache-hoz, mivel a saját GoLang-példányának beállítása (és egyéni testnet-ként történő konfigurálása) meglehetősen trükkös lehet, és mivel a Meta-Mask állapota a Chrome-ban jelenleg bizonytalan.

Használhatjuk a Ganache-t manuális tesztelési szcenáriókhoz (hibakereséskor vagy az integrációs tesztelés befejezésénél), vagy automatizált tesztelési szcenáriókhoz (amelyek köré kell építenünk tesztjeinket, mivel ilyen körülmények között előfordulhat, hogy nincsenek elérhető végpontjaink).

4. Web3 és RPC

A Web3 egy homlokzatot és felületet biztosít az Ethereum blokklánc és az Ethereum szerver csomópontjaival való egyszerű interakcióhoz. Más szavakkal, A Web3 megkönnyíti az ügyfelek és az Ethereum blokklánc közötti kommunikációt a JSON-RPC útján. A Web3J a Web3 hivatalos Java portja.

Inicializálhatjuk a Web3j alkalmazást az alkalmazásunkon belül, ha átadunk egy szolgáltatót (pl. - egy harmadik fél vagy egy helyi Ethereum csomópont végpontja):

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

A harmadik lehetőség megmutatja, hogyan adhat hozzá egy harmadik fél szolgáltatót (ezáltal kapcsolódhat az Ethereum csomópontjához). De arra is van lehetőségünk, hogy a szolgáltatói opciónkat üresen hagyjuk. Ebben az esetben az alapértelmezett port lesz használva (8545) tovább helyi kiszolgáló helyette.

5. Alapvető Web3 módszerek

Most, hogy tudjuk, hogyan inicializálhatjuk az alkalmazásunkat az Ethereum blokklánccal való kommunikációhoz, nézzünk meg néhány alapvető módszert az Ethereum blokklánccal való interakcióra.

Jó irányelv, ha a Web3 módszereket a CompleteableFuture kezelni a konfigurált Ethereum csomópontra küldött JSON-RPC kérelmek aszinkron jellegét.

5.1. Jelenlegi blokk száma

Például adja vissza az aktuális blokkszámot:

public EthBlockNumber getBlockNumber () {EthBlockNumber eredmény = új EthBlockNumber (); eredmény = this.web3j.ethBlockNumber () .sendAsync () .get (); visszatérési eredmény; }

5.2. Számla

A megadott cím számlája:

public EthAccounts getEthAccounts () {EthAccounts result = new EthAccounts (); eredmény = this.web3j.ethAccounts () .sendAsync () .get (); visszatérési eredmény; }

5.3. Számlatranzakciók száma

Ahhoz, hogy a adott cím tranzakcióinak száma:

public EthGetTransactionCount getTransactionCount () {EthGetTransactionCount eredmény = új EthGetTransactionCount (); eredmény = this.web3j.ethGetTransactionCount (DEFAULT_ADDRESS, DefaultBlockParameter.valueOf ("legújabb")) .sendAsync () .get (); visszatérési eredmény; }

5.4. Számlaegyenleg

És végül, hogy megkapja a egy cím vagy pénztárca aktuális egyenlege:

public EthGetBalance getEthBalance () {EthGetBalance eredmény = új EthGetBalance (); this.web3j.ethGetBalance (DEFAULT_ADDRESS, DefaultBlockParameter.valueOf ("legújabb")) .sendAsync () .get (); visszatérési eredmény; }

6. A szerződések kezelése a Web3j-ben

Miután összeállítottuk a Szolidaritás szerződést a Szarvasgomba segítségével, együtt dolgozhatunk a fordítottunkkal Alkalmazás bináris interfészei (ABI) az itt elérhető önálló Web3j parancssori eszközzel, vagy itt szabadon álló zip-ként.

6.1. CLI Magic

Ezután automatikusan létrehozhatjuk Java intelligens szerződésburkolóinkat (lényegében POJO, amely az intelligens szerződés ABI-t teszi ki), a következő paranccsal:

$ web3j szarvasgomba generálja a [--javaTypes | --solidityTypes] /path/to/.json -o / path / to / src / main / java -p com.your.organisation.name

A következő parancs futtatása a projekt gyökérkönyvtárában:

web3j szarvasgomba generál dev_truffle / build / contractors / példa.json -o src / main / java / com / baeldung / web3 / contract -p com.baeldung

generálta a mi Példa osztály:

public class Példa meghosszabbítja a szerződést {private static final String BINARY = "0x60606040523415600e576 ..."; // ...}

6.2. Java POJO-k

Most, hogy megvan az intelligens szerződéscsomagolónk, programozottan létrehozhatunk egy pénztárcát, majd telepíthetjük erre a címre a szerződésünket:

WalletUtils.generateNewWalletFile ("JELSZÓ", új Fájl ("/ elérési út / cél / cél"), igaz);
Hitelesítő adatok hitelesítő adatai = WalletUtils.loadCredentials ("PASSWORD", "/ path / to / walletfile");

6.3. Szerződés telepítése

A szerződésünket így telepíthetjük:

Példa szerződés = példa.deploy (this.web3j, hitelesítő adatok, ManagedTransaction.GAS_PRICE, Contract.GAS_LIMIT) .send (); 

És akkor szerezd meg a címet:

contractAddress = contract.getContractAddress ();

6.4. Tranzakciók küldése

Küldeni a Tranzakció használni a Funkciók a mi Szerződés inicializálhatunk egy Web3j-t Funkció val,-vel Lista bemeneti értékek és a Lista kimeneti paraméterek:

List inputParams = new ArrayList (); List outputParams = new ArrayList (); Funkció függvény = új Funkció ("fuctionName", inputParams, outputParams); String encodedFunction = FunctionEncoder.encode (function); 

Ezután inicializálhatjuk Tranzakció szükség esetén gáz (a. végrehajtására használják Tranzakció) és nonce paraméterek:

BigInteger nonce = BigInteger.valueOf (100); BigInteger gázár = BigInteger.valueOf (100); BigInteger gaslimit = BigInteger.valueOf (100); Tranzakciós tranzakció = Transaction .createFunctionCallTransaction ("FROM_ADDRESS", nonce, gasprice, gaslimit, "TO_ADDRESS", encodedFunction); EthSendTransactionactionResponse = web3j.ethSendTransaction (tranzakció) .sendAsync (). Get (); transactionHash = tranzakcióResponse.getTransactionHash (); 

Az intelligens szerződéses funkciók teljes listáját lásd a hivatalos dokumentumokban.

7. Következtetés

Ez az! Felállítottunk egy Java Spring MVC alkalmazást a Web3j alkalmazással - itt a Blockchain ideje!

Mint mindig, az ebben a cikkben használt kódpéldák elérhetők a GitHubon.

Java alsó

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT