夹子机器人系统app技术开发功能详解

电子说

1.3w人已加入

描述

区块链是不可变的,因为为交易计算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;

}

审核编辑:符乾江

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分