區(qū)塊鏈是不可變的,因為為交易計算SHA-256哈希。系統(tǒng)詳情了解塊的內(nèi)容也會被散列,從而提供唯一的標識符。
public class Block {
public long timeStamp;
private int index;
private List transactions = new ArrayList();
private String hash;
private String previousHash;
private String merkleRoot;
private String nonce = "0000";
// caches Transaction SHA256 hashes
public Map map = new HashMap();
請注意,注入的泛型類型是Tx類型。這允許事務數(shù)據(jù)發(fā)生變化。此外, previousHash 屬性將引用前一個塊的哈希。 merkleRoot 和 nonce 屬性將在稍后進行描述。,t>,t>
塊散列
每個塊可以計算一個塊散列。這本質(zhì)上是連接在一起的所有塊屬性的散列,包括前一個塊的散列和由此計算出的SHA-256散列。
下面是塊中定義的方法。計算散列的java類。
public void computeHash() {
Gson parser = new Gson(); // probably should cache this instance
String serializedData = parser.toJson(transactions);
setHash(SHA256.generateHash(timeStamp + index + merkleRoot + serializedData + nonce + previousHash));
}
塊事務被序列化為JSON字符串,以便在散列之前將其附加到塊屬性中。
Chain 鏈
區(qū)塊鏈通過接受交易來管理區(qū)塊。當達到預定閾值時,創(chuàng)建塊。這是一個簡單的Chain鏈。java部分實現(xiàn):
public class SimpleBlockchain {
public static final int BLOCK_SIZE = 10;
public List> chain = new ArrayList>();
public SimpleBlockchain() {
// create genesis block
chain.add(newBlock());
}
chain屬性包含使用Tx類型鍵入的塊的列表。此外,在創(chuàng)建鏈時,無參數(shù)構(gòu)造函數(shù)會創(chuàng)建一個初始的“ genesis ”塊。下面是 newBlock() 方法的源代碼。
public Block newBlock() {
int count = chain.size();
String previousHash = "root";
if (count > 0)
previousHash = blockChainHash();
Block block = new Block();
block.setTimeStamp(System.currentTimeMillis());
block.setIndex(count);
block.setPreviousHash(previousHash);
return block;
}
這個新的block方法將創(chuàng)建一個新的block實例,為適當?shù)闹翟O定種子,并分配前一個block的hash(即鏈頭的hash)。然后它將返回塊。
在將塊添加到鏈之前,可以通過將新塊的上一個哈希與鏈的最后一個塊(頭)進行比較來驗證塊,以確保它們匹配。這是一個簡單的鎖鏈。java方法描述了這一點。
public void addAndValidateBlock(Block block) {
// compare previous block hash, add if valid
Block current = block;
for (int i = chain.size() - 1; i >= 0; i--) {
Block b = chain.get(i);
if (b.getHash().equals(current.getPreviousHash())) {
current = b;
} else {
throw new RuntimeException("Block Invalid");
}
}
this.chain.add(block);
}
整個區(qū)塊鏈通過鏈的循環(huán)進行驗證,以確保一個區(qū)塊的哈希仍然與前一個區(qū)塊的哈希匹配。
這是 SimpleBlockChain.java 的 validate() 方法實現(xiàn)。
public boolean validate() {
String previousHash = null;
for (Block block : chain) {
String currentHash = block.getHash();
if (!currentHash.equals(previousHash)) {
return false;
}
previousHash = currentHash;
}
return true;
}
審核編輯:符乾江
-
JAVA
+關注
關注
19文章
2952瀏覽量
104493 -
源代碼
+關注
關注
96文章
2943瀏覽量
66623
發(fā)布評論請先 登錄
相關推薦
評論