區(qū)塊鏈是不可變的,因?yàn)闉榻灰子?jì)算SHA-256哈希。系統(tǒng)詳情了解塊的內(nèi)容也會(huì)被散列,從而提供唯一的標(biāo)識(shí)符。
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();
請(qǐng)注意,注入的泛型類(lèi)型是Tx類(lèi)型。這允許事務(wù)數(shù)據(jù)發(fā)生變化。此外, previousHash 屬性將引用前一個(gè)塊的哈希。 merkleRoot 和 nonce 屬性將在稍后進(jìn)行描述。,t>,t>
塊散列
每個(gè)塊可以計(jì)算一個(gè)塊散列。這本質(zhì)上是連接在一起的所有塊屬性的散列,包括前一個(gè)塊的散列和由此計(jì)算出的SHA-256散列。
下面是塊中定義的方法。計(jì)算散列的java類(lèi)。
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));
}
塊事務(wù)被序列化為JSON字符串,以便在散列之前將其附加到塊屬性中。
Chain 鏈
區(qū)塊鏈通過(guò)接受交易來(lái)管理區(qū)塊。當(dāng)達(dá)到預(yù)定閾值時(shí),創(chuàng)建塊。這是一個(gè)簡(jiǎn)單的Chain鏈。java部分實(shí)現(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類(lèi)型鍵入的塊的列表。此外,在創(chuàng)建鏈時(shí),無(wú)參數(shù)構(gòu)造函數(shù)會(huì)創(chuàng)建一個(gè)初始的“ 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;
}
這個(gè)新的block方法將創(chuàng)建一個(gè)新的block實(shí)例,為適當(dāng)?shù)闹翟O(shè)定種子,并分配前一個(gè)block的hash(即鏈頭的hash)。然后它將返回塊。
在將塊添加到鏈之前,可以通過(guò)將新塊的上一個(gè)哈希與鏈的最后一個(gè)塊(頭)進(jìn)行比較來(lái)驗(yàn)證塊,以確保它們匹配。這是一個(gè)簡(jiǎn)單的鎖鏈。java方法描述了這一點(diǎn)。
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);
}
整個(gè)區(qū)塊鏈通過(guò)鏈的循環(huán)進(jìn)行驗(yàn)證,以確保一個(gè)區(qū)塊的哈希仍然與前一個(gè)區(qū)塊的哈希匹配。
這是 SimpleBlockChain.java 的 validate() 方法實(shí)現(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
+關(guān)注
關(guān)注
19文章
2971瀏覽量
104853 -
源代碼
+關(guān)注
關(guān)注
96文章
2946瀏覽量
66799
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論