I was making something like a blockchain explorer using Web3j, but I was a little worried about how to get blocks, so I will leave a note.
Immediately, here is the code made with the sample.
SampleBlock.java
import java.io.IOException;
import java.math.BigInteger;
import org.web3j.protocol.admin.Admin;
import org.web3j.protocol.core.DefaultBlockParameter;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.methods.response.EthBlock;
import org.web3j.protocol.http.HttpService;
public class SampleBlock {
public static final Admin web3j = Admin.build(new HttpService("http://localhost:8545"));
public static void main(String[] args) {
System.out.println("-------------------------Latest Block----------------------------------");
EthBlock block = getLatestBlock();
showBlockInfo(block);
System.out.println("-------------------------Block Number(100)-----------------------------");
block = getBlock(BigInteger.valueOf(100));
showBlockInfo(block);
}
public static EthBlock getLatestBlock() {
EthBlock latestBlock = null;
try {
latestBlock = web3j.ethGetBlockByNumber(
DefaultBlockParameterName.LATEST,
false).send();
}catch(IOException e) {
e.printStackTrace();
}
return latestBlock;
}
public static EthBlock getBlock(BigInteger blockNumber) {
EthBlock block = null;
try {
block =web3j.ethGetBlockByNumber(DefaultBlockParameter.valueOf(blockNumber), true).send();
}catch(IOException e) {
e.printStackTrace();
}
return block;
}
public static void showBlockInfo(EthBlock block) {
System.out.println("Block Number: " + block.getBlock().getNumber());
System.out.println("Block Size : " + block.getBlock().getHash());
System.out.println("Extra Data : " + block.getBlock().getExtraData());
System.out.println("Nonce : " + block.getBlock().getNonce());
System.out.println("Block Size : " + block.getBlock().getSize());
}
}
The content of the code is
First, get the latest information.
SampleBlock.java
public static EthBlock getLatestBlock() {
EthBlock latestBlock = null;
try {
latestBlock = web3j.ethGetBlockByNumber(
DefaultBlockParameterName.LATEST,
false).send();
}catch(IOException e) {
e.printStackTrace();
}
return latestBlock;
}
public static void showBlockInfo(EthBlock block) {
System.out.println("Block Number: " + block.getBlock().getNumber());
System.out.println("Block Size : " + block.getBlock().getHash());
System.out.println("Extra Data : " + block.getBlock().getExtraData());
System.out.println("Nonce : " + block.getBlock().getNonce());
System.out.println("Block Size : " + block.getBlock().getSize());
}
It is an argument of ethGetBlockByNumber, First argument: Information of the block to be acquired Second argument: Whether to get detailed transaction information It will be.
The EthBlock class holds an inner class called Block. Basic information about the block can be obtained by using the getter method of the Block class.
Get the block by specifying the block number 100.
SampleBlock.java
public static EthBlock getBlock(BigInteger blockNumber) {
EthBlock block = null;
try {
block =web3j.ethGetBlockByNumber(DefaultBlockParameter.valueOf(blockNumber), true).send();
}catch(IOException e) {
e.printStackTrace();
}
return block;
}
The method used to get the latest block information is the same. The first argument is DefaultBlockParameter.valueOf (blockNumber) instead of "DefaultBlockParameterName.LATEST".
All you have to do is set the block number you want to get in the argument of DefaultBlockParameter.valueOf (blockNumber) with BigInteger type.
The result of executing the main method of the first code
-------------------------Latest Block----------------------------------
Block Number: 1126
Block Size : 0x43b54d8fa0721f48775662bc931f71b84037cf7697e008af630143e4be0d6c68
Extra Data : 0xda83010900846765746888676f312e31322e378777696e646f7773
Nonce : 8592711553053470949
Block Size : 540
-------------------------Block Number(100)-----------------------------
Block Number: 100
Block Size : 0x0e62799b40cc37228b74de6be9d6424277c7cc2ac50ad9370655851eea2e3feb
Extra Data : 0xda83010900846765746888676f312e31322e378777696e646f7773
Nonce : 5891392007347385592
Block Size : 538
There is a lot of other information that can be obtained, so I hope you will give it a try.
The information of the transaction captured in the block is stored in the EthBlock.Block class and can be obtained by using the getTransactions method.
For reference, it is a process to get transaction information.
SampleBlock.java
public static List<TransactionObject> getTransactionList(BigInteger blockNumber) {
List<TransactionObject> transactionList = new ArrayList<>();
try {
List<EthBlock.TransactionResult> txs = web3j.ethGetBlockByNumber(
new DefaultBlockParameterNumber(blockNumber), true).send().getBlock().getTransactions();
for(TransactionResult result: txs) {
transactionList.add((TransactionObject)result.get());
}
}catch(IOException e) {
e.printStackTrace();
}
return transactionList;
}
I think there might be a better way, but I can't get any information from the EthBlock.TransactionResult class. Since the TransactionObject class is held in TransactionResult, it is possible to get transaction information through this class.
It's easier than you think to get block and transaction information, I was able to create an ethereum blockchain explorer in a few hours.
Recommended Posts