电子说
区块链是不可变的,因为为交易计算SHA-256哈希。系统详情了解块的内容也会被散列,从而提供唯一的标识符。
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类型。这允许事务数据发生变化。此外, previousHash 属性将引用前一个块的哈希。 merkleRoot 和 nonce 属性将在稍后进行描述。,t>,t>
块散列
每个块可以计算一个块散列。这本质上是连接在一起的所有块属性的散列,包括前一个块的散列和由此计算出的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 链
区块链通过接受交易来管理区块。当达到预定阈值时,创建块。这是一个简单的Chain链。java部分实现:
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类型键入的块的列表。此外,在创建链时,无参数构造函数会创建一个初始的“ 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方法将创建一个新的block实例,为适当的值设定种子,并分配前一个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);
}
整个区块链通过链的循环进行验证,以确保一个区块的哈希仍然与前一个区块的哈希匹配。
这是 SimpleBlockChain.java 的 validate() 方法实现。
public boolean validate() {
String previousHash = null;
for (Block block : chain) {
String currentHash = block.getHash();
if (!currentHash.equals(previousHash)) {
return false;
}
previousHash = currentHash;
}
return true;
}
审核编辑:符乾江
全部0条评论
快来发表一下你的评论吧 !