Рубрики
Без рубрики

Легкие Клиенты Ethereum, Использующие Web 3j

Узнайте, как взаимодействовать с сетью Ethereum с помощью библиотеки Web3.

Автор оригинала: baeldung.

1. введение

Этот учебник знакомит с Web3j, Java-реализацией популярной библиотеки абстракций Web3.

Web3j используется для взаимодействия с сетью Ethereum путем подключения к узлам Ethereum с помощью JSON-RPC или знакомых стандартов, таких как HTTP, WebSockets, IPC.

Эфириум-это целая тема сама по себе, так что давайте сначала быстро посмотрим, что это такое!

2. Эфириум

Ethereum-это (1) криптовалюта (символ токена ETH ), (2) распределенный суперкомпьютер, (3) блокчейн и (4) сеть смарт-контрактов, написанная в Солидности.

Другими словами, Ethereum ( сеть ) управляется кучей подключенных серверов, называемых узлами , которые взаимодействуют в своего рода сетчатой топологии (технически это не совсем верно, но достаточно близко, чтобы получить более четкое представление о том, как все это работает).

Web3j и его родительская библиотека под названием Web3 , позволяет веб-приложениям подключаться к одному из этих узлов и тем самым отправлять Ethereum транзакции , которые, по сути, являются скомпилированными смарт-контрактами | функциями , которые ранее были развернуты в сети 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. Составление договоров: Трюфель или Солк

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

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

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

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

$ 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-адресу: http://localhost:8545 или http://localhost:7545.

Существует несколько других популярных подходов к настройке тестовой сети, включая использование Metal-Mask , In fear или GoLang and Geth .

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

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

4. Web 3 и RPC

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

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

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

Третий вариант показывает, как добавить стороннего провайдера (тем самым подключившись к своему узлу Ethereum). Но у нас также есть возможность оставить наш вариант поставщика пустым. В этом случае будет использоваться порт по умолчанию ( 8545 ) на localhost вместо .

5. Основные Методы Web3

Теперь, когда мы знаем, как инициализировать наше приложение для связи с блокчейном Ethereum, давайте рассмотрим несколько основных способов взаимодействия с блокчейном Ethereum.

Это хорошая политика, чтобы обернуть ваши методы Web 3 с помощью Completablefuture для обработки асинхронного характера запросов JSON-RPC, сделанных к вашему настроенному узлу Ethereum.

5.1. Текущий Номер Блока

Мы можем, например, вернуть текущий номер блока :

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

5.2. Учетная запись

Чтобы получить аккаунт по указанному адресу :

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

5.3. Количество Операций по Счету

Чтобы получить количество транзакций по данному адресу :

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

5.4. Баланс Счета

И, наконец, чтобы получить текущий баланс адреса или кошелька:

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

6. Работа с Контрактами в Web 3j

После того как мы скомпилировали наш контракт солидности с помощью Truffle, мы можем работать с нашими скомпилированными Прикладными двоичными интерфейсами ( ABI ), используя автономный инструмент командной строки Web3j, доступный здесь или как отдельно стоящий zip здесь .

6.1. Магия CLI

Затем мы можем автоматически сгенерировать наши оболочки смарт-контрактов Java (по сути, POJO, раскрывающий смарт-контракт ABI), используя следующую команду:

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

Запуск следующей команды в корне проекта:

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

сгенерировал наш Пример класс:

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

6.2. Java POJO’s

Теперь, когда у нас есть наша оболочка смарт-контракта, мы можем создать кошелек программно, а затем развернуть наш контракт по этому адресу :

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

6.3. Развертывание Контракта

Мы можем развернуть наш контракт вот так:

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

А потом получить адрес:

contractAddress = contract.getContractAddress();

6.4. Отправка Транзакций

Чтобы отправить Транзакцию с помощью Функций нашего Контракта мы можем инициализировать Web3j Функцию с Списком входных значений и Списком выходных параметров:

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

Затем мы можем инициализировать нашу транзакцию с помощью необходимого газа (используемого для выполнения Транзакции ) и параметров nonce:

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();

Полный список функций смарт-контрактов см. в official docs .

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

Вот оно! Мы создали приложение Java Spring MVC с Web 3j – пришло время блокчейна!

Как всегда, примеры кода, используемые в этой статье, доступны на GitHub .