Въведение в EthereumJ

Java Top

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

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

1. Въведение

В тази статия ще разгледаме библиотеката EthereumJ, която ни позволява да взаимодействаме с блокчейна Ethereum, използвайки Java.

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

2. Относно Ethereum

Ethereum е криптовалута, използваща разпределена, peer-to-peer, база данни под формата на програмируема блокчейн , Ethereum Virtual Machine (EVM). Той се синхронизира и управлява чрез различни, но свързани възли .

От 2017 г. Nodes синхронизират блокчейна чрез консенсус, създават монети чрез добив ( доказателство за работа ), проверяват транзакции, изпълняват интелигентни договори, написани в Solidity, и стартират EVM.

В blockchain се разделя на блокове , които съдържат сметка държави (включително транзакции между сметки ) и доказателство за работа .

3. Фасадата на Ethereum

Класът org.ethereum.facade.Ethereum абстрахира и обединява много пакети на EthereumJ в един лесен за използване интерфейс.

Възможно е да се свържете с възел, за да се синхронизирате с цялостната мрежа и, след като се свържете, можем да работим с блокчейна.

Създаването на фасаден обект е толкова лесно, колкото:

Ethereum ethereum = EthereumFactory.createEthereum();

4. Свързване към мрежата Ethereum

За да се свържем с мрежата, първо трябва да се свържем с възел , т.е. сървър, изпълняващ официалния клиент. Възлите са представени от класа org.ethereum.net.rlpx.Node .

На org.ethereum.listener.EthereumListenerAdapter дръжки blockchain събития, открити от наш клиент, след като връзка към възел е създадена успешно.

4.1. Свързване към мрежата Ethereum

Нека се свържем с възел в мрежата. Това може да стане ръчно:

String ip = "//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. Работа с блокчейна с помощта на слушател

Също така можем да подкласираме 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. Достъп до Blockchain Object

Методът 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);

We can then use our key to initialize an Account. By calling .init() we set both an ECKey and the associated Address on the Account object:

org.ethereum.core.Account account = new Account(); account.init(key);

6. Other Functionality

There are two other major functionalities provided for by the framework that we won't cover here but that are worth mentioning.

First, we have the ability to compile and execute Solidity smart contracts. However, creating contracts in Solidity, and subsequently compiling and executing them is an extensive topic in its own right.

Second, although the framework supports limited mining using a CPU, using a GPU miner is the recommended approach given the lack of profitability of the former.

More advanced topics regarding Ethereum itself can be found in the official docs.

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

В този бърз урок показахме как да се свържете с мрежата Ethereum и няколко важни метода за работа с блокчейна.

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

Дъно на Java

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

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