Introduction à EthereumJ

Introduction à EthereumJ

1. introduction

Dans cet article, nous examinons la bibliothèqueEthereumJ qui nous permet d'interagir avec la blockchainEthereum, en utilisant Java.

Tout d'abord, plongeons brièvement dans ce qu'est cette technologie.

2. À propos d'Ethereum

Ethereum est uncryptocurrency exploitant une base de données distribuée, peer-to-peer, sous la forme d'unblockchain programmable, la machine virtuelle Ethereum (EVM). Il est synchronisé et exploité via desnodes disparates mais connectés.

À partir de 2017,Nodes synchronise lesblockchain par consensus, crée des pièces par extraction (proof of work), vérifie les transactions, exécutesmart contracts écrit enSolidity et exécute l'EVM.

Leblockchain est divisé enblocks qui contiennentaccount states (y compris les transactions entreaccounts) etproof of work.

3. LesEthereum Facade

La classeorg.ethereum.facade.Ethereum résume et unit de nombreux packages d'EthereumJ en une seule interface facile à utiliser.

Il est possible de se connecter à un nœud pour se synchroniser avec le réseau global et, une fois connectés, nous pouvons travailler avec la blockchain.

Créer un objet de façade est aussi simple que:

Ethereum ethereum = EthereumFactory.createEthereum();

4. Connexion au réseau Ethereum

Pour se connecter au réseau, il faut d'abord se connecter à un nœud, i.e. un serveur exécutant le client officiel. Les nœuds sont représentés par la classeorg.ethereum.net.rlpx.Node.

Leorg.ethereum.listener.EthereumListenerAdapter gère les événements blockchain détectés par notre client après que la connexion à un nœud a été établie avec succès.

4.1. Connexion au réseau Ethereum

Connectons-nous à un nœud du réseau. Cela peut être fait manuellement:

String ip = "http://localhost";
int port = 8345;
String nodeId = "a4de274d3a159e10c2c9a68c326511236381b84c9ec...";

ethereum.connect(ip, port, nodeId);

La connexion au réseau peut également s'effectuer automatiquement à l'aide d'un haricot:

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

Nous pouvons ensuite injecter nosEthBean dans la configuration de notre application. Ensuite, il se connecte automatiquement au réseau Ethereum et commence à télécharger la blockchain.

En fait, le plus grand nombre de traitements de connexion est commodément encapsulé et abstrait en ajoutant simplement une instanceorg.ethereum.listener.EthereumListenerAdapter à notre instanceorg.ethereum.facade.Ethereum créée, comme nous l'avons fait dans notre méthodestart() ci-dessus:

EthBean eBean = new EthBean();
Executors.newSingleThreadExecutor().submit(eBean::start);

4.2. Gestion de la blockchain à l'aide d'un auditeur

Nous pouvons également sous-classer lesEthereumListenerAdapter pour gérer les événements blockchain détectés par notre client.

Pour accomplir cette étape, nous devrons rendre notre auditeur sous-classé:

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;
        }
    }
}

La méthodeonBlock() est déclenchée sur tout nouveau bloc reçu (qu'il soit ancien ou actuel). EthereumJ représente et gère les blocs en utilisant la classeorg.ethereum.core.Block.

La méthodeonSyncDone() se déclenche une fois la synchronisation terminée, mettant à jour nos données Ethereum locales.

5. Travailler avec la Blockchain

Maintenant que nous pouvons nous connecter au réseau Ethereum et travailler directement avec la blockchain, nous allons nous plonger dans plusieurs opérations basiques mais néanmoins très importantes que nous utiliserons souvent.

5.1. Soumettre une transaction

Maintenant que nous sommes connectés à la blockchain, nous pouvons soumettre une transaction. Soumettre unTransaction est relativement facile, mais créer unTransaction réel est un long sujet en soi:

ethereum.submitTransaction(new Transaction(new byte[]));

5.2. Accéder à l'objetBlockchain

La méthodeThe[.pl-en]# getBlockchain#() renvoie un objet façadeBlockchain avec des getters pour récupérer les difficultés actuelles du réseau et desBlocks spécifiques.

Puisque nous avons configuré nosEthereumListener dans la section 4.3, nous pouvons accéder à la blockchain en utilisant la méthode ci-dessus:

ethereum.getBlockchain();

5.3. Renvoyer une adresse de compte Ethereum

On peut aussi retourner un EthereumAddress.

Pour obtenir un EthereumAccount –, nous devons d'abord authentifier une paire de clés publique et privée sur la blockchain.

Créons une nouvelle clé avec une nouvelle paire de clés aléatoires:

org.ethereum.crypto.ECKey key = new ECKey();

Et créons une clé à partir d'une clé privée donnée:

org.ethereum.crypto.ECKey key = ECKey.fromPivate(privKey);

Nous pouvons alors utiliser notre clé pour initialiser unAccount. En appelant.init(), nous définissons à la fois unECKey et leAddress associé sur l'objetAccount:

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

6. Autre fonctionnalité

Il existe deux autres fonctionnalités majeures prévues par le framework que nous ne couvrirons pas ici mais qui méritent d'être mentionnées.

Premièrement, nous avons la possibilité de compiler et d’exécuter les contrats intelligents Solidity. Cependant, créer des contrats dans Solidity, puis les compiler et les exécuter, est un vaste sujet à part entière.

Deuxièmement, bien que l'infrastructure prenne en charge une extraction limitée à l'aide d'un processeur, l'approche recommandée est l'approche recommandée, compte tenu du manque de rentabilité de l'ancien.

Des sujets plus avancés concernant Ethereum lui-même peuvent être trouvés dans lesdocs officiels.

7. Conclusion

Dans ce rapide tutoriel, nous avons montré comment se connecter au réseau Ethereum et à plusieurs méthodes importantes pour travailler avec la blockchain.

Comme toujours, le code utilisé dans cet exemple peut être trouvéover on GitHub.