所有的交易都被分组为“区块”。区块链就是一系列链接在一起的这样的块。首先,我先带大家看下此类的全貌,它都包含哪些核心属性和方法。
类地址:org.ethereum.core.Block
/* 区块头 */
private BlockHeader header;
/* 交易列表 */
private List<Transaction> transactionsList = new CopyOnWriteArrayList<>();
/* Uncle列表 */
private List<BlockHeader> uncleList = new CopyOnWriteArrayList<>();
一个区块包括:
每个块都有一个块“区块头”,区块头是一个区块的一部分:
类地址:org.ethereum.core.BlockHeader
private byte[] parentHash;
private byte[] unclesHash;
private byte[] coinbase;
private byte[] stateRoot;
private byte[] txTrieRoot;
private byte[] receiptTrieRoot;
private byte[] logsBloom;
private byte[] difficulty;
private long timestamp;
private long number;
private byte[] gasLimit;
private long gasUsed;
private byte[] mixHash;
private byte[] extraData;
private byte[] nonce;
private byte[] hashCache;
现在,我们对该类进行简单的使用。我们直接写一个测试用例进行测试。我写测试用例的目的是告诉大家该怎么用,里面的加密我这里先不讲,后续统一将区块里面的加密转移等等,你们自然就懂了,你也跟着我一样,不要在意里面的具体加密实现,先学会这么用这个类。
package org.ethereum.core;
import org.ethereum.trie.Trie;
import org.ethereum.trie.TrieImpl;
import org.ethereum.util.RLP;
import org.junit.Test;
import org.spongycastle.util.encoders.Hex;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class BlockTest {
@Test
public void test() {
byte[] parentHash = new byte[0];
byte[] uncleHash = new byte[0];
byte[] minerCoinbase = Hex.decode("fffefd"); // {-1, -2, -3}
long blockNumber = 0;
byte[] GasLimit = new byte[0];
byte[] extraData = new byte[0];
byte[] calcTxTrie = new byte[0];
Block block = new Block(
parentHash,
uncleHash, // uncleHash
minerCoinbase,
new byte[0], // log bloom - from tx receipts
new byte[0], // difficulty computed right after block creation
blockNumber,
GasLimit, // (add to config ?)
0, // gas used - computed after running all transactions
0, // block time
extraData, // extra data
new byte[0], // mixHash (to mine)
new byte[0], // nonce (to mine)
new byte[0], // receiptsRoot - computed after running all transactions
calcTxTrie, // TransactionsRoot - computed after running all transactions
new byte[]{0}, // stateRoot - computed after running all transactions
null,
null);
block.getEncoded();
/**
* 加载区块
*
* 注意,我通过上面的block的`block.getEncoded()`生成的block1。
* 然后进行参数打印。
*/
Block block1 = new Block(block.getEncoded());
System.out.println("ParentHash : " + block1.getParentHash());
System.out.println("uncleHash : " + block1.getUnclesHash());
// 注意这里,把16进制转化为我们之前传的【字符串】
System.out.println("coinbase : " + Hex.toHexString(block1.getHeader().getCoinbase()));
System.out.println("log bloom : " + block1.getLogBloom());
System.out.println("difficulty : " + block1.getDifficulty());
System.out.println("blockNumber: " + block1.getNumber());
System.out.println("Gas Limit : " + block1.getGasLimit());
System.out.println("Gas Used : " + block1.getGasUsed());
System.out.println("timestamp : " + block1.getTimestamp());
System.out.println("extraData : " + block1.getExtraData());
System.out.println("mixHash : " + block1.getMixHash());
System.out.println("nonce : " + block1.getNonce());
System.out.println("Receipts Root : " + block1.getStateRoot());
System.out.println("state Root : " + block1.getStateRoot());
System.out.println("transaction List : " + block1.getTransactionsList());
System.out.println("uncle List : " + block1.getUncleList());
}
}