Легкие клиенты 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 здесь.

Каждый узел передает свои изменения всем остальным узлам, чтобы можно было достичь консенсуса и проверки. Таким образом, каждый узел содержит всю историю Эфириума blockchain одновременно создавая тем самым избыточные резервную копию всех данных, в защищенном от несанкционированного доступа способа, а также с помощью консенсуса и проверок по всему другому узлу в сети . \

Для получения более подробной информации об Ethereum посетите официальную страницу.

3. Настроить

Чтобы использовать полный набор функций, предоставляемых Web3j, нам нужно сделать немного больше для настройки, чем обычно. Во-первых, Web3j поставляется в виде нескольких автономных модулей, каждый из которых может быть необязательно добавлен в основную зависимость pom.xml :

 org.web3j core 3.3.1  

Обратите внимание, что команда Web3j предоставляет готовый Spring Boot Starter с некоторой встроенной конфигурацией и ограниченной функциональностью!

В этой статье мы ограничимся основными функциями (включая то, как добавить Web3j в приложение Spring MVC, чтобы обеспечить совместимость с более широким спектром веб-приложений Spring).

Полный список этих модулей можно найти на Maven Central.

3.1. Составление контрактов: Truffle или Solc

Существует два основных способа компиляции и развертывания смарт-контрактов Ethereum ( файлов .solc ):

  1. Официальный компилятор Solidity.
  2. Truffle (набор абстракций для тестирования, развертывания и управления смарт-контрактами).

В этой статье мы остановимся на трюфеле. Truffle упрощает и абстрагирует процесс компиляции смарт-контрактов , их миграции и развертывания в сети. Он также является оболочкой для компилятора Solc, позволяя нам получить некоторый опыт работы с обоими.

Чтобы настроить трюфель:

$ npm install truffle -g $ truffle version

Четыре ключевые команды, которые мы будем использовать для инициализации нашего проекта соответственно, компиляции нашего приложения, развертывания нашего приложения в цепочке блоков и тестирования соответственно:

$ 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. Тестирование контрактов: ганаш

Один из самых простых способов работы с тестовой сетью Ethereum - запустить собственный сервер Ganache. Мы будем использовать готовое готовое решение, так как его проще всего установить и настроить. Он также предоставляет интерфейс и серверную оболочку для Ganache CLI, которая управляет Ganache под капотом.

Мы можем подключиться к нашему серверу Ganache по предоставленному по умолчанию URL-адресу: // localhost: 8545 или // localhost: 7545.

Есть несколько других популярных подходов к настройке тестовой сети, включая использование Meta-Mask, Infura или Go-Lang и Geth.

В этой статье мы будем придерживаться Ganache, поскольку настройка собственного экземпляра GoLang (и настройка его как пользовательской тестовой сети) может быть довольно сложной задачей, а статус мета-маски в Chrome в настоящее время неизвестен.

Мы можем использовать Ganache для сценариев ручного тестирования (при отладке или завершении нашего интеграционного тестирования) или использовать их для сценариев автоматического тестирования (для которых мы должны строить наши тесты, поскольку в таких обстоятельствах у нас может не быть доступных конечных точек).

4. Web3 и RPC

Web3 предоставляет фасад и интерфейс для простого взаимодействия с блокчейном Ethereum и серверными узлами Ethereum. Другими словами, Web3 облегчает взаимодействие между клиентами и блокчейном Ethereum посредством JSON-RPC. Web3J - это официальный порт Java для Web3.

Мы можем инициализировать Web3j для использования в нашем приложении, передав поставщика (например, конечную точку стороннего или локального узла Ethereum):

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:

>> ПРОВЕРИТЬ КУРС