Pelanggan Ethereum Ringan Menggunakan Web3j

Java Teratas

Saya baru sahaja mengumumkan kursus Learn Spring yang baru , yang berfokus pada asas-asas Spring 5 dan Spring Boot 2:

>> SEMAK KURSUS

1. Pengenalan

Tutorial ini memperkenalkan Web3j, implementasi Java dari perpustakaan abstraksi Web3 yang popular.

Web3j digunakan untuk berinteraksi dengan rangkaian Ethereum dengan menyambung ke nod Ethereum menggunakan JSON-RPC atau standard biasa seperti HTTP, WebSockets, IPC.

Ethereum adalah keseluruhan topik untuk dirinya sendiri jadi mari kita lihat dengan cepat apa itu!

2. Ethereum

Ethereum adalah (1) cryptocurrency (simbol token ETH), (2) superkomputer diedarkan, (3) blockchain, dan (4) rangkaian kontrak pintar yang ditulis dalam Solidity.

Dengan kata lain, Ethereum ( rangkaian ) dijalankan oleh sekumpulan pelayan yang disambungkan yang disebut nod yang berkomunikasi dalam sejenis topologi mesh (secara teknikal, ini tidak betul tetapi cukup dekat untuk mendapatkan pemahaman yang lebih kukuh tentang bagaimana semuanya berfungsi) .

Web3j , dan perpustakaan induknya yang disebut Web3 , membolehkan aplikasi web menyambung ke salah satu nod tersebut dan dengan itu menyerahkan transaksi Ethereum , yang, untuk semua maksud dan tujuan, menyusun fungsi kontrak pintar Soliditas yang sebelumnya telah disebarkan ke jaringan Ethereum . Untuk maklumat lebih lanjut mengenai kontrak pintar, lihat artikel kami mengenai pembuatan dan penggunaannya dengan Soliditi di sini.

Setiap Node menyiarkan perubahannya ke setiap simpul yang lain sehingga konsensus dan pengesahan dapat dicapai. Oleh itu, setiap node mengandungi keseluruhan sejarah blockchain Ethereum secara serentak sehingga membuat sandaran berlebihan semua data, dengan cara yang tidak selamat, dan melalui kata sepakat dan pengesahan oleh semua nod lain dalam rangkaian .

Untuk maklumat lebih terperinci mengenai Ethereum, lihat halaman rasmi.

3. Sediakan

Untuk menggunakan rangkaian ciri lengkap yang disediakan oleh Web3j, kita harus melakukan sedikit lebih banyak untuk menyiapkannya daripada biasa. Pertama, Web3j dibekalkan dalam beberapa modul bebas, masing-masing boleh ditambahkan secara opsional ke dalam pergantungan inti pom.xml :

 org.web3j core 3.3.1  

Harap maklum bahawa pasukan di Web3j menyediakan Spring Boot Starter yang telah dibina dengan beberapa konfigurasi dan fungsi terhad yang dibina!

Kami akan mengehadkan fokus kami ke fungsi teras dalam artikel ini (termasuk cara menambahkan Web3j ke aplikasi Spring MVC, sehingga keserasian dengan rangkaian web Spring yang lebih luas diperoleh).

Senarai lengkap modul ini boleh didapati di Maven Central.

3.1. Menyusun Kontrak: Truffle atau Solc

Terdapat dua cara utama untuk menyusun dan menggunakan kontrak pintar Ethereum (. File solc ):

  1. Penyusun Soliditi rasmi.
  2. Truffle (rangkaian abstraksi untuk menguji, menggunakan, dan mengurus kontrak pintar).

Kami akan mengikuti Truffle dalam artikel ini. Truffle mempermudah dan mengaburkan proses menyusun kontrak pintar , memindahkannya, dan menyebarkannya ke rangkaian. Ia juga membungkus penyusun Solc membiarkan kami memperoleh pengalaman dengan kedua-duanya.

Untuk menyediakan Truffle:

$ npm install truffle -g $ truffle version

Empat arahan utama yang akan kami gunakan untuk memulakan projek kami masing-masing, menyusun aplikasi kami, menyebarkan aplikasi kami ke Blockchain, dan mengujinya masing-masing:

$ truffle init $ truffle compile $ truffle migrate $ truffle test

Sekarang, mari kita lihat contoh mudah:

pragma solidity ^0.4.17; contract Example { function Example() { // constructor } } 

Yang harus menghasilkan ABI JSON berikut semasa disusun:

{ "contractName": "Example", "abi": [ { "inputs": [], "payable": false, "stateMutability": "nonpayable", "type": "constructor" } ], "bytecode": "0x60606040523415600e57600080fd5b603580601b6..., "deployedBytecode": "0x6060604052600080fd00a165627a7a72305..., //... }

Kami kemudian boleh menggunakan bytecode dan ABI yang disediakan dalam aplikasi kami untuk berinteraksi dengan kontrak yang digunakan!

3.2. Kontrak Ujian: Ganache

Salah satu kaedah termudah untuk bekerja dengan Ethereum testnet adalah dengan melancarkan pelayan Ganache sendiri. Kami akan menggunakan penyelesaian pra-bawaan, kerana ia adalah yang paling mudah untuk disiapkan dan dikonfigurasikan. Ia juga menyediakan antara muka dan shell pelayan untuk Ganache CLI yang mendorong Ganache terkurang.

Kami boleh menyambung ke pelayan Ganache kami pada alamat URL yang disediakan secara lalai: // localhost: 8545 atau // localhost: 7545.

Terdapat beberapa pendekatan popular lain untuk membuat rangkaian ujian termasuk menggunakan Meta-Mask, Infura, atau Go-Lang dan Geth.

Kami akan mengikuti Ganache dalam artikel ini kerana menyiapkan instance GoLang anda sendiri (dan mengkonfigurasinya sebagai testnet tersuai) boleh menjadi sangat rumit dan kerana status Meta-Mask pada Chrome pada masa ini tidak dapat dipastikan.

Kami boleh menggunakan Ganache untuk senario pengujian manual (semasa melakukan debug atau menyelesaikan ujian integrasi kami) atau menggunakannya untuk senario pengujian automatik (yang mana kami harus membina ujian kami kerana, dalam keadaan seperti itu, kami mungkin tidak mempunyai titik akhir yang tersedia).

4. Web3 dan RPC

Web3 menyediakan fasad dan antara muka untuk berinteraksi dengan mudah dengan blockchain Ethereum dan nod pelayan Ethereum. Dengan kata lain, Web3 memudahkan komunikasi antara pelanggan dan Ethereum Blockchain melalui JSON-RPC. Web3J adalah port Java rasmi Web3.

Kami dapat menginisialisasi Web3j untuk digunakan dalam aplikasi kami dengan menyerahkan penyedia (contohnya - titik akhir nod Ethereum pihak ketiga atau tempatan):

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

The third option shows how to add in a third-party provider (thereby connecting with their Ethereum node). But we also have the option to leave our provider option empty. In that case, the default port will be used (8545) on localhost instead.

5. Essential Web3 Methods

Now that we know how to initialize our app to communicate with the Ethereum blockchain, let's look at a few, core, ways to interact with the Ethereum blockchain.

It's a good policy to wrap your Web3 methods with a CompleteableFuture to handle the asynchronous nature of JSON-RPC requests made to your configured Ethereum node.

5.1. Current Block Number

We can, for example, return the current block number:

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

5.2. Account

To get the account of a specified address:

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

5.3. Number of Account Transactions

To get the number of transactions of a given address:

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

5.4. Account Balance

And finally, to get the current balance of an address or wallet:

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

6. Working With Contracts in Web3j

Once we've compiled our Solidity contract using Truffle, we can work with our compiled Application Binary Interfaces (ABI) using the standalone Web3j command line tool available here or as a free-standing zip here.

6.1. CLI Magic

We can then automatically generate our Java Smart Contract Wrappers (essentially a POJO exposing the smart contract ABI) using the following command:

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

Running the following command in the root of the project:

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

generated our Example class:

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

6.2. Java POJO's

Now that we have our Smart Contract Wrapper, we can create a wallet programmatically and then deploy our contract to that address:

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

6.3. Deploy a Contract

We can deploy our contract like so:

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

And then get the address:

contractAddress = contract.getContractAddress();

6.4. Sending Transactions

To send a Transaction using the Functions of our Contract we can initialize a Web3j Function with a List of input values and a List of output parameters:

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

We can then initialize our Transaction with necessary gas (used to execute of the Transaction) and nonce parameters:

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

Untuk senarai penuh fungsi kontrak pintar, lihat dokumen rasmi.

7. Kesimpulannya

Itu sahaja! Kami telah menyediakan aplikasi Java Spring MVC dengan Web3j - ini adalah masa Blockchain!

Seperti biasa, contoh kod yang digunakan dalam artikel ini terdapat di GitHub.

Bahagian bawah Java

Saya baru sahaja mengumumkan kursus Learn Spring yang baru , yang berfokus pada asas-asas Spring 5 dan Spring Boot 2:

>> SEMAK KURSUS