Леки клиенти на Ethereum, използващи Web3j

Java Top

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА

1. Въведение

Този урок представя Web3j, Java реализация на популярната библиотека за абстракция Web3.

Web3j се използва за взаимодействие с мрежата Ethereum чрез свързване към възли Ethereum с помощта на JSON-RPC или познати стандарти като HTTP, WebSockets, IPC.

Ethereum е цяла тема за себе си, така че нека първо разгледаме набързо какво представлява!

2. Ethereum

Ethereum е (1) криптовалута (символен символ ETH), (2) разпределен суперкомпютър, (3) блокчейн и (4) мрежа за интелигентни договори, написана в Solidity.

С други думи, Ethereum ( мрежата ) се управлява от куп свързани сървъри, наречени възли, които комуникират в един вид мрежова топология (технически това не е точно вярно, но достатъчно близо, за да получите по-солидно разбиране за това как всичко работи) .

Web3j и нейната родителска библиотека, наречена Web3 , позволява на уеб приложенията да се свързват с един от тези възли и по този начин да изпращат транзакции на Ethereum , които за всички цели и цели са съставени функции за интелигентен договор Solidity , които преди това са били внедрени в мрежата на Ethereum . За повече информация относно интелигентните договори вижте нашата статия за тяхното създаване и внедряване с Solidity тук.

Всеки възел излъчва своите промени на всеки друг възел, за да може да се постигне консенсус и проверка. По този начин всеки възел съдържа цялата история на блокчейна Ethereum едновременно, като по този начин създава излишно архивиране на всички данни, по начин, защитен от фалшифициране, и чрез консенсус и проверка от всички останали възли в мрежата . \

За по-подробна информация за Ethereum, вижте официалната страница.

3. Настройте

За да използваме пълния набор от функции, предоставени от Web3j, трябва да направим малко повече, за да се настроим от обикновено. Първо, Web3j се предлага в няколко самостоятелни модула, всеки от които по желание може да бъде добавен към основната зависимост pom.xml :

 org.web3j core 3.3.1  

Моля, обърнете внимание, че екипът на Web3j предоставя предварително изграден Spring Boot Starter с вградена конфигурация и ограничена функционалност!

Ще ограничим фокуса си върху основните функционалности в тази статия (включително как да добавим Web3j към приложението Spring MVC, така че се получава съвместимост с по-широк спектър от Spring webapps).

Пълен списък на тези модули можете да намерите в Maven Central.

3.1. Съставяне на договори: Трюфел или Solc

Има два основни начина за компилиране и внедряване на интелигентни договори на Ethereum (. Solc файлове):

  1. Официалният компилатор на Solidity.
  2. Трюфел (набор за абстракция за тестване, внедряване и управление на интелигентни договори).

Ще се придържаме към трюфела в тази статия. Трюфелът опростява и абстрахира процеса на съставяне на интелигентни договори , мигрирането им и разполагането им в мрежа. Той също така обгръща компилатора на Solc, като ни позволява да придобием известен опит и с двете.

За да настроите трюфел:

$ npm install truffle -g $ truffle version

Четири ключови команди, които ще използваме, за да инициализираме съответно нашия проект, да компилираме нашето приложение, да разположим нашето приложение в Blockchain и да го тестваме съответно:

$ truffle init $ truffle compile $ truffle migrate $ truffle test

Сега, нека да разгледаме един прост пример:

pragma solidity ^0.4.17; contract Example { function Example() { // constructor } } 

Което трябва да даде следния ABI JSON, когато се компилира:

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

След това можем да използваме предоставения байт код и ABI в нашето приложение, за да взаимодействаме с внедрените договори!

3.2. Договори за тестване: Ganache

One of the easiest ways to work with an Ethereum testnet is to launch own Ganache server. We'll use the pre-built, out-of-the-box, solution since it's the easiest to set up and configure. It also provides an interface and server shell for Ganache CLI which drives Ganache under-the-hood.

We can connect to our Ganache server on the default supplied URL address: //localhost:8545 or //localhost:7545.

There are a couple of other popular approaches to setting up a test network including using Meta-Mask, Infura, or Go-Lang and Geth.

We'll stick with Ganache in this article since setting up your own GoLang instance (and configuring it as a custom testnet) can be pretty tricky and since the status of Meta-Mask on Chrome is presently uncertain.

We can use Ganache for manual testing scenarios (when debugging or completing our integration testing) or use them for automated testing scenarios (which we have to build our tests around since, in such circumstances, we might not have the available endpoints).

4. Web3 and RPC

Web3 provides a facade and interface for interacting easily with the Ethereum blockchain and Ethereum server nodes. In other words, Web3 facilitates intercommunication between clients and the Ethereum Blockchain by way of JSON-RPC. Web3J is the official Java port of Web3.

We can initialize Web3j for use within our application by passing in a provider (e.g. – the endpoint of a third-party or local Ethereum node):

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

The third option shows how to add in a third-party provider (thereby connecting with their Ethereum node). But we also have the option to leave our provider option empty. In that case, the default port will be used (8545) on localhost instead.

5. Essential Web3 Methods

Now that we know how to initialize our app to communicate with the Ethereum blockchain, let's look at a few, core, ways to interact with the Ethereum blockchain.

It's a good policy to wrap your Web3 methods with a CompleteableFuture to handle the asynchronous nature of JSON-RPC requests made to your configured Ethereum node.

5.1. Current Block Number

We can, for example, return the current block number:

public EthBlockNumber getBlockNumber() { EthBlockNumber result = new EthBlockNumber(); result = this.web3j.ethBlockNumber() .sendAsync() .get(); return result; }

5.2. Account

To get the account of a specified address:

public EthAccounts getEthAccounts() { EthAccounts result = new EthAccounts(); result = this.web3j.ethAccounts() .sendAsync() .get(); return result; }

5.3. Number of Account Transactions

To get the number of transactions of a given address:

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

5.4. Account Balance

And finally, to get the current balance of an address or wallet:

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

6. Working With Contracts in Web3j

Once we've compiled our Solidity contract using Truffle, we can work with our compiled Application Binary Interfaces (ABI) using the standalone Web3j command line tool available here or as a free-standing zip here.

6.1. CLI Magic

We can then automatically generate our Java Smart Contract Wrappers (essentially a POJO exposing the smart contract ABI) using the following command:

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

Running the following command in the root of the project:

web3j truffle generate dev_truffle/build/contracts/Example.json -o src/main/java/com/baeldung/web3/contract -p com.baeldung

generated our Example class:

public class Example extends Contract { private static final String BINARY = "0x60606040523415600e576..."; //... }

6.2. Java POJO's

Now that we have our Smart Contract Wrapper, we can create a wallet programmatically and then deploy our contract to that address:

WalletUtils.generateNewWalletFile("PASSWORD", new File("/path/to/destination"), true);
Credentials credentials = WalletUtils.loadCredentials("PASSWORD", "/path/to/walletfile");

6.3. Deploy a Contract

We can deploy our contract like so:

Example contract = Example.deploy(this.web3j, credentials, ManagedTransaction.GAS_PRICE, Contract.GAS_LIMIT).send(); 

And then get the address:

contractAddress = contract.getContractAddress();

6.4. Sending Transactions

To send a Transaction using the Functions of our Contract we can initialize a Web3j Function with a List of input values and a List of output parameters:

List inputParams = new ArrayList(); List outputParams = new ArrayList(); Function function = new Function("fuctionName", inputParams, outputParams); String encodedFunction = FunctionEncoder.encode(function); 

We can then initialize our Transaction with necessary gas (used to execute of the Transaction) and nonce parameters:

BigInteger nonce = BigInteger.valueOf(100); BigInteger gasprice = BigInteger.valueOf(100); BigInteger gaslimit = BigInteger.valueOf(100); Transaction transaction = Transaction .createFunctionCallTransaction("FROM_ADDRESS", nonce, gasprice, gaslimit, "TO_ADDRESS", encodedFunction); EthSendTransaction transactionResponse = web3j.ethSendTransaction(transaction).sendAsync().get(); transactionHash = transactionResponse.getTransactionHash(); 

За пълен списък на функционалностите за интелигентни договори вижте официалните документи.

7. Заключение

Това е! Създадохме Java Spring MVC приложение с Web3j - време е за Blockchain!

Както винаги, примерите за кодове, използвани в тази статия, са достъпни в GitHub.

Дъно на Java

Току що обявих новия курс Learn Spring , фокусиран върху основите на Spring 5 и Spring Boot 2:

>> ПРЕГЛЕД НА КУРСА