Letvægts Ethereum-klienter ved hjælp af Web3j

Java Top

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Introduktion

Denne tutorial introducerer Web3j, en Java-implementering af det populære Web3-abstraktionsbibliotek.

Web3j bruges til at interagere med Ethereum-netværket ved at oprette forbindelse til Ethereum-noder ved hjælp af JSON-RPC eller velkendte standarder som HTTP, WebSockets, IPC.

Ethereum er et helt emne for sig selv, så lad os først se hurtigt på, hvad det er!

2. Ethereum

Ethereum er en (1) kryptokurrency (tokensymbol ETH), (2) distribueret supercomputer, (3) blockchain og (4) smart kontraktnetværk skrevet i Tørhed.

Med andre ord, Ethereum (the netværk) køres af en masse forbundne servere kaldet noder der kommunikerer i en slags masketopologi (teknisk set er dette ikke ligefrem sandt, men tæt nok til at få en mere solid forståelse af, hvordan det hele fungerer).

Web3j, og dets overordnede bibliotek kaldes Web3, tillader webapplikationer at oprette forbindelse til en af ​​dem noder og derved indsende Ethereum transaktioner, som for alt sammen er samlet soliditet smart kontraktfunktioner der tidligere er blevet udsendt til Ethereum netværk. For mere information om smarte kontrakter, se vores artikel om oprettelse og implementering af dem med Solidity her.

Hver node udsender sine ændringer til hinanden knude så konsensus og verifikation kan opnås. Dermed, hver knude indeholder hele historien om Ethereum blockchain samtidigt derved skaber en overflødig sikkerhedskopi af alle data på en manipulationssikker måde og via konsensus og verifikation af alle de andre knude i netværk.\

For mere detaljeret information om Ethereum, se den officielle side.

3. Opsætning

For at bruge den fulde serie af funktioner, der leveres af Web3j, er vi nødt til at gøre lidt mere for at blive konfigureret end normalt. For det første leveres Web3j i flere, fritstående moduler, som hver kan valgfrit føjes til kernen pom.xml afhængighed:

 org.web3j kerne 3.3.1 

Bemærk, at Teamet på Web3j leverer en forudbygget Spring Boot Starter med en vis konfiguration og begrænset funktionalitet indbygget lige ind!

Vi begrænser vores fokus til kernefunktionaliteterne i denne artikel (herunder hvordan man tilføjer Web3j til en Spring MVC-applikation, så kompatibilitet med en bredere vifte af Spring-webapps opnås).

En komplet liste over disse moduler kan findes på Maven Central.

3.1. Kompilering af kontrakter: Trøffel eller solc

Der er to primære måder at kompilere og implementere smarte Ethereum-kontrakter på (.solc filer):

  1. Den officielle Solidity-kompilator.
  2. Truffle (en abstraktionssuite til test, implementering og styring af smarte kontrakter).

Vi holder fast ved trøffel i denne artikel. Truffle forenkler og abstraherer processen med at kompilere smarte kontrakter, migrere dem og distribuere dem til et netværk. Det indpakker også Solc kompilator, der lader os få erfaring med begge dele.

Sådan opsættes trøffel:

$ npm installer trøffel -g $ trøffelversion

Fire nøglekommandoer, vi bruger til at initialisere henholdsvis vores projekt, kompilere vores app, distribuere vores app til Blockchain og teste den henholdsvis:

$ trøffel init $ trøffel kompiler $ trøffel migrere $ trøffel test

Lad os nu gå over et simpelt eksempel:

pragmasoliditet ^ 0.4.17; kontrakteksempel {funktion Eksempel () {// konstruktør}} 

Hvilket skal give følgende ABI JSON, når det kompileres:

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

Vi kan derefter bruge den leverede bytecode og ABI i vores applikation til at interagere med de implementerede kontrakter!

3.2. Testkontrakter: Ganache

En af de nemmeste måder at arbejde med et Ethereum testnet er at starte egen Ganache-server. Vi bruger den præ-bygget, out-of-the-box løsning, da det er den nemmeste at konfigurere og konfigurere. Det giver også en interface og server shell til Ganache CLI, der driver Ganache under-the-hood.

Vi kan oprette forbindelse til vores Ganache-server på den standardleverede URL-adresse: // localhost: 8545 eller // localhost: 7545.

Der er et par andre populære tilgange til at oprette et testnetværk, herunder brug af Meta-Mask, Infura eller Go-Lang og Geth.

Vi holder fast ved Ganache i denne artikel, da det kan være ret vanskeligt at konfigurere din egen GoLang-forekomst (og konfigurere det som et brugerdefineret testnet), og da status for Meta-Mask på Chrome i øjeblikket er usikker.

Vi kan bruge Ganache til manuelle testscenarier (når debugging eller udfyldning af vores integrationstest) eller bruge dem til automatiserede testscenarier (som vi er nødt til at bygge vores tests omkring, da vi under sådanne omstændigheder måske ikke har de tilgængelige slutpunkter).

4. Web3 og RPC

Web3 giver en facade og grænseflade til let at interagere med Ethereum-blockchain og Ethereum-serverknudepunkter. Med andre ord, Web3 letter interkommunikation mellem klienter og Ethereum Blockchain ved hjælp af JSON-RPC. Web3J er den officielle Java-port på Web3.

Vi kan initialisere Web3j til brug i vores applikation ved at sende en udbyder (f.eks. Slutpunktet for en tredjepart eller en lokal Ethereum-node):

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

Den tredje mulighed viser, hvordan man tilføjer en tredjepartsudbyder (derved forbinder med deres Ethereum-node). Men vi har også mulighed for at lade vores udbydermulighed være tom. I så fald vil standardporten blive brugt (8545) på lokal vært i stedet.

5. Væsentlige Web3-metoder

Nu hvor vi ved, hvordan vi initialiserer vores app til at kommunikere med Ethereum blockchain, lad os se på nogle få, centrale måder at interagere med Ethereum blockchain på.

Det er en god politik at pakke dine Web3-metoder med en Færdiggørelse til at håndtere den asynkrone karakter af JSON-RPC-anmodninger til din konfigurerede Ethereum-node.

5.1. Nuværende bloknummer

Vi kan f.eks. returner det aktuelle bloknummer:

offentlig EthBlockNumber getBlockNumber () {EthBlockNumber resultat = nyt EthBlockNumber (); resultat = this.web3j.ethBlockNumber () .sendAsync () .get (); returresultat }

5.2. Konto

For at få konto for en specificeret adresse:

offentlige EthAccounts getEthAccounts () {EthAccounts resultat = nye EthAccounts (); resultat = this.web3j.ethAccounts () .sendAsync () .get (); returresultat }

5.3. Antal kontotransaktioner

For at få antal transaktioner med en given adresse:

public EthGetTransactionCount getTransactionCount () {EthGetTransactionCount result = new EthGetTransactionCount (); resultat = this.web3j.ethGetTransactionCount (DEFAULT_ADDRESS, DefaultBlockParameter.valueOf ("seneste")) .sendAsync () .get (); returresultat }

5.4. Kontosaldo

Og endelig for at få nuværende saldo på en adresse eller tegnebog:

public EthGetBalance getEthBalance () {EthGetBalance result = new EthGetBalance (); this.web3j.ethGetBalance (DEFAULT_ADDRESS, DefaultBlockParameter.valueOf ("seneste")) .sendAsync () .get (); returresultat }

6. Arbejde med kontrakter i Web3j

Når vi har udarbejdet vores fasthedskontrakt ved hjælp af trøffel, kan vi arbejde med vores udarbejdede Applikation Binære grænseflader (ABI) ved hjælp af det enkeltstående Web3j-kommandolinjeværktøj, der er tilgængeligt her eller som en fritstående zip her.

6.1. CLI Magic

Vi kan derefter automatisk generere vores Java Smart Contract Wrappers (i det væsentlige en POJO, der udsætter den smarte kontrakt ABI) ved hjælp af følgende kommando:

$ web3j trøffel genererer [--javaTypes | --solidityTypes] /path/to/.json -o / path / to / src / main / java -p com.your.organisation.name

Kører følgende kommando i roden af ​​projektet:

web3j trøffel genererer dev_truffle / build / kontrakter / Eksempel.json -o src / main / java / com / baeldung / web3 / contract -p com.baeldung

genereret vores Eksempel klasse:

offentlig klasse Eksempel udvider kontrakt {privat statisk endelig streng BINÆR = "0x60606040523415600e576 ..."; // ...}

6.2. Java POJO'er

Nu hvor vi har vores smarte kontraktindpakning, vi kan oprette en tegnebog programmatisk og derefter distribuere vores kontrakt til den adresse:

WalletUtils.generateNewWalletFile ("PASSWORD", ny fil ("/ sti / til / destination"), sand);
Credentials credentials = WalletUtils.loadCredentials ("PASSWORD", "/ path / to / walletfile");

6.3. Implementere en kontrakt

Vi kan implementere vores kontrakt sådan:

Eksempel på kontrakt = Eksempel.deploy (this.web3j, legitimationsoplysninger, ManagedTransaction.GAS_PRICE, Contract.GAS_LIMIT) .send (); 

Og få derefter adressen:

contractAddress = contract.getContractAddress ();

6.4. Afsendelse af transaktioner

At sende en Transaktion bruger Funktioner af vores Kontrakt vi kan initialisere en Web3j Fungere med en Liste af inputværdier og a Liste af outputparametre:

Liste inputParams = ny ArrayList (); Liste outputParams = ny ArrayList (); Funktionsfunktion = ny funktion ("fuktionsnavn", inputParams, outputParams); Streng kodetFunktion = FunctionEncoder.encode (funktion); 

Vi kan derefter initialisere vores Transaktion med nødvendigt gas (bruges til at udføre Transaktion) og nonce-parametre:

BigInteger nonce = BigInteger.valueOf (100); BigInteger gasprice = BigInteger.valueOf (100); BigInteger gaslimit = BigInteger.valueOf (100); Transaktionstransaktion = Transaktion .createFunctionCallTransaction ("FROM_ADDRESS", nonce, gasprice, gaslimit, "TO_ADDRESS", encodedFunction); EthSendTransaction transactionResponse = web3j.ethSendTransaction (transaktion) .sendAsync (). Get (); transactionHash = transactionResponse.getTransactionHash (); 

Se de officielle dokumenter for en komplet liste over smarte kontraktfunktioner.

7. Konklusion

Det er det! Vi har oprettet en Java Spring MVC-app med Web3j - det er Blockchain-tid!

Som altid er kodeeksemplerne, der bruges i denne artikel, tilgængelige på GitHub.

Java bund

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN