比特币很热门——这是多么轻描淡写的说法啊。虽然加密货币的未来有些不确定,但用于驱动比特币的区块链技术也非常流行。
区块链的应用范围几乎无穷无尽。可以说,它还有可能破坏企业自动化。关于区块链是如何运作的,有很多信息。我们有一份免费白皮书,介绍区块链技术(无需注册)。
本文将重点关注区块链体系结构,特别是演示“不可变、仅附加”分布式账本如何与简化的代码示例一起工作。
作为开发人员,与简单地阅读技术文章相比,在理解代码的工作原理时,从代码中看到东西要有用得多。至少对我来说是这样。那么,让我们开始吧!
简言之,区块链
首先让我们快速总结一下区块链。一个块包含一些标题信息和一组或一块任何类型数据的事务。链从第一个(起源)块开始。在添加/追加事务时,将根据一个块中可以存储的事务数量创建新的块。
当超过块阈值大小时,将创建一个新的事务块。新区块与前一区块相连,因此称为区块链。
不变性
区块链是不可变的,因为为交易计算SHA-256哈希。块的内容也会被散列,从而提供唯一的标识符。此外,来自链接的前一个块的散列也被存储并散列在块头中。
这就是为什么试图篡改区块链区块基本上是不可能的,至少在目前的计算能力下是如此。下面是一个显示块属性的部分Java类定义。
... public class Block<T extends Tx> { public long timeStamp; private int index; private List<T> transactions = new ArrayList<T>(); private String hash; private String previousHash; private String merkleRoot; private String nonce = "0000"; // caches Transaction SHA256 hashes public Map<String,T> map = new HashMap<String,T>(); ...
请注意,注入的泛型类型是Tx类型。这允许事务数据发生变化。此外, previousHash
属性将引用前一个块的哈希。 merkleRoot
和 nonce
属性将在稍后进行描述。
块散列
每个块可以计算一个块散列。这本质上是连接在一起的所有块属性的散列,包括前一个块的散列和由此计算出的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字符串,以便在散列之前将其附加到块属性中。