1. введение
В этой статье мы рассмотрим библиотеку Ethereum , которая позволяет нам взаимодействовать с блокчейном Ethereum , используя Java.
Во-первых, давайте просто кратко погрузимся в то, что представляет собой эта технология.
2. Об Эфириуме
Ethereum – это криптовалюта , использующая распределенную одноранговую базу данных в виде программируемой блокчейн виртуальной машины Ethereum (EVM). Он синхронизирован и управляется через разрозненные, но связанные узлы .
По состоянию на 2017 год/| Узлы синхронизируют блокчейн через консенсус, создают монеты с помощью майнинга ( доказательство работы ), проверяют транзакции, выполняют смарт-контракты , написанные в Солидности , и запускают EVM.
Блокчейн разделен на блоки , которые содержат состояния счетов (включая транзакции между счетами ) и подтверждение работы .
3. Фасад Эфириума
Фасад org.ethereum.Класс Ethereum абстрагирует и объединяет множество пакетов Ethereum в один простой в использовании интерфейс.
Можно подключиться к узлу для синхронизации с общей сетью, и после подключения мы сможем работать с блокчейном.
Создание объекта фасада так же просто, как:
Ethereum ethereum = EthereumFactory.createEthereum();
4. Подключение к сети Ethereum
Чтобы подключиться к сети, мы должны сначала подключиться к узлу , т. е. серверу, на котором работает официальный клиент. Узлы представлены классом org.ethereum.net.rlpx.Node .
Слушатель org.ethereum.Адаптер прослушивателя Ethereum обрабатывает события блокчейна, обнаруженные нашим клиентом после успешного подключения к узлу.
4.1. Подключение к сети Ethereum
Давайте подключимся к узлу в сети. Это можно сделать вручную:
String ip = "http://localhost"; int port = 8345; String nodeId = "a4de274d3a159e10c2c9a68c326511236381b84c9ec..."; ethereum.connect(ip, port, nodeId);
Подключение к сети также может быть выполнено автоматически с помощью компонента:
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. Обработка Блокчейна с помощью Прослушивателя
Мы также можем подкласс Адаптер прослушивателя Ethereum для обработки событий блокчейна, обнаруженных нашим клиентом.
Чтобы выполнить этот шаг, нам нужно будет сделать наш подклассный слушатель:
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; } } }
Метод on Block() запускается на любом новом полученном блоке (старом или текущем). EthereumJ представляет и обрабатывает блоки с помощью org.ethereum.core.Блок класс.
Метод onSyncDone() срабатывает после завершения синхронизации, обновляя наши локальные данные Ethereum.
5. Работа с Блокчейном
Теперь, когда мы можем подключиться к сети Ethereum и работать непосредственно с блокчейном, мы погрузимся в несколько основных, но, тем не менее, очень важных операций, которые мы будем часто использовать.
5.1. Отправка транзакции
Теперь, когда мы подключились к блокчейну, мы можем отправить транзакцию. Отправка Транзакции относительно проста, но создание фактической Транзакции само по себе является длительной темой:
ethereum.submitTransaction(new Transaction(new byte[]));
5.2. Доступ к объекту Блокчейн
Метод getBlockchain () возвращает объект Blockchain facade с геттерами для извлечения текущих сетевых проблем и конкретных Блоки .
Поскольку мы настроили наш 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 , так и связанный Адрес на объекте Account :
org.ethereum.core.Account account = new Account(); account.init(key);
6. Другие Функциональные возможности
Есть еще две основные функции, предусмотренные фреймворком, которые мы здесь не будем рассматривать, но о которых стоит упомянуть.
Во-первых, у нас есть возможность компилировать и выполнять смарт-контракты Солидности. Однако создание контрактов в Солидности, а затем их компиляция и выполнение-это сама по себе обширная тема.
Во-вторых, хотя фреймворк поддерживает ограниченный майнинг с использованием процессора, использование майнера GPU является рекомендуемым подходом, учитывая отсутствие прибыльности первого.
Более продвинутые темы, касающиеся самого Эфириума, можно найти в официальном docs .
7. Заключение
В этом кратком руководстве мы показали, как подключиться к сети Ethereum и несколько важных методов работы с блокчейном.
Как всегда, код, используемый в этом примере, можно найти на GitHub .