1. Введение
В этой статье мы рассмотрим библиотеку EthereumJ , которая позволяет нам взаимодействовать с блокчейном Ethereum с помощью Java.
Во-первых, давайте кратко рассмотрим, что представляет собой эта технология.
2. Об Эфириуме
Ethereum — это криптовалюта
, использующая распределенную одноранговую базу данных в форме программируемого блокчейна
, виртуальную машину Ethereum (EVM). Он синхронизирован и управляется через разрозненные, но связанные узлы
.
По состоянию на 2017 год узлы
синхронизируют блокчейн
посредством консенсуса, создают монеты посредством майнинга ( доказательство работы
), проверяют транзакции, выполняют смарт-контракты
, написанные на Solidity , и запускают EVM.
Блокчейн разделен на блоки
, которые содержат состояния
учетных
записей (включая транзакции между учетными записями
) и доказательства работы
.
3. Фасад Эфириума
Класс org.ethereum.facade.Ethereum
абстрагирует и объединяет множество пакетов EthereumJ в один простой в использовании интерфейс.
Можно подключиться к узлу для синхронизации со всей сетью, и после подключения мы можем работать с блокчейном.
Создать объект фасада так же просто, как:
Ethereum ethereum = EthereumFactory.createEthereum();
4. Подключение к сети Ethereum
Чтобы подключиться к сети, мы должны сначала подключиться к узлу , то есть
к серверу, на котором работает официальный клиент. Узлы представлены классом org.ethereum.net.rlpx.Node
.
org.ethereum.listener.EthereumListenerAdapter обрабатывает события
блокчейна, обнаруженные нашим клиентом после успешного установления соединения с узлом.
4.1. Подключение к сети Ethereum
Давайте подключимся к узлу в сети. Это можно сделать вручную:
String ip = "http://localhost";
int port = 8345;
String nodeId = "a4de274d3a159e10c2c9a68c326511236381b84c9ec...";
ethereum.connect(ip, port, nodeId);
Подключение к сети также может быть выполнено автоматически с помощью bean-компонента:
public class EthBean {
private Ethereum ethereum;
public void start() {
ethereum = EthereumFactory.createEthereum();
ethereum.addListener(new EthListener(ethereum));
}
public Block getBestBlock() {
return ethereum.getBlockchain().getBestBlock();
}
public BigInteger getTotalDifficulty() {
return ethereum.getBlockchain().getTotalDifficulty();
}
}
Затем мы можем внедрить наш EthBean
в конфигурацию нашего приложения. Затем он автоматически подключается к сети Ethereum и начинает загрузку блокчейна.
На самом деле, большая часть обработки соединения удобно обернута и абстрагирована простым добавлением экземпляра org.ethereum.listener.EthereumListenerAdapter
к нашему созданному экземпляру org.ethereum.facade.Ethereum
, как мы сделали в нашем методе start()
выше:
EthBean eBean = new EthBean();
Executors.newSingleThreadExecutor().submit(eBean::start);
4.2. Обработка блокчейна с помощью прослушивателя
Мы также можем создать подкласс EthereumListenerAdapter
для обработки событий блокчейна, обнаруженных нашим клиентом.
Чтобы выполнить этот шаг, нам нужно сделать наш слушатель подкласса:
public class EthListener extends EthereumListenerAdapter {
private void out(String t) {
l.info(t);
}
//...
@Override
public void onBlock(Block block, List receipts) {
if (syncDone) {
out("Net hash rate: " + calcNetHashRate(block));
out("Block difficulty: " + block.getDifficultyBI().toString());
out("Block transactions: " + block.getTransactionsList().toString());
out("Best block (last block): " + ethereum
.getBlockchain()
.getBestBlock().toString());
out("Total difficulty: " + ethereum
.getBlockchain()
.getTotalDifficulty().toString());
}
}
@Override
public void onSyncDone(SyncState state) {
out("onSyncDone " + state);
if (!syncDone) {
out(" ** SYNC DONE ** ");
syncDone = true;
}
}
}
Метод onBlock()
запускается при получении любого нового блока (будь то старый или текущий). EthereumJ представляет и обрабатывает блоки, используя класс org.ethereum.core.Block
.
Метод onSyncDone()
срабатывает после завершения синхронизации, обновляя наши локальные данные Ethereum.
5. Работа с блокчейном
Теперь, когда мы можем подключиться к сети Ethereum и работать напрямую с блокчейном, мы углубимся в несколько основных, но, тем не менее, очень важных операций, которые мы будем часто использовать.
5.1. Отправка транзакции
Теперь, когда мы подключились к блокчейну, мы можем отправить транзакцию. Отправка Транзакции
относительно проста, но создание фактической Транзакции
само по себе является длинной темой:
ethereum.submitTransaction(new Transaction(new byte[]));
5.2. Доступ к объекту блокчейна
Метод getBlockchain ()
возвращает фасадный объект Blockchain
с геттерами для получения текущих сетевых сложностей и конкретных блоков
.
Поскольку мы настроили наш EthereumListener
в разделе 4.3, мы можем получить доступ к блокчейну, используя описанный выше метод:
ethereum.getBlockchain();
5.3. Возврат адреса учетной записи Ethereum
Мы также можем вернуть адрес Ethereum .
Чтобы получить учетную запись
Ethereum , нам сначала нужно аутентифицировать пару открытого и закрытого ключей в блокчейне.
Давайте создадим новый ключ с новой случайной парой ключей:
org.ethereum.crypto.ECKey key = new ECKey();
И давайте создадим ключ из данного закрытого ключа:
org.ethereum.crypto.ECKey key = ECKey.fromPivate(privKey);
Затем мы можем использовать наш ключ для инициализации учетной записи
. Вызывая .init()
, мы устанавливаем как ECKey
, так и связанный с ним Address
в объекте Account :
org.ethereum.core.Account account = new Account();
account.init(key);
6. Другая функциональность
Есть еще две основные функции, предоставляемые фреймворком, которые мы не будем здесь рассматривать, но о которых стоит упомянуть.
Во-первых, у нас есть возможность компилировать и выполнять смарт-контракты Solidity. Однако создание контрактов в Solidity, их последующая компиляция и выполнение — отдельная обширная тема.
Во-вторых, хотя фреймворк поддерживает ограниченный майнинг с использованием ЦП, рекомендуемым подходом является использование майнера на GPU, учитывая отсутствие прибыльности первого.
Более сложные темы, касающиеся самого Ethereum, можно найти в официальной документации .
7. Заключение
В этом кратком руководстве мы показали, как подключиться к сети Ethereum и несколько важных методов работы с блокчейном.
Как всегда, код, использованный в этом примере, можно найти на GitHub .