什么是区块链blockchain

    区块链是一个虚拟分类帐,其中每条记账明细记录都是一个区块,这些记录在网络中分发给每个人,他们可以读和追加,但不能修改,增删改查CRUD中无法进行删和改,如果想删改,就追加一条新记录对原来数值进行冲抵,比如财务做账时前面“借入错”一笔账,后面就追加一条“贷出”一笔相同金额的记录冲抵;又比如上市公司经常发布季度报表修正,上个月盈利500万(中国上市公司卖一套房),次月发布公告,上个月盈利修正为300万,这类似说出的话如同泼出去的水,不能收回了,不能用橡皮擦去修改,财务中如果你想像改数据库记录一样使用SQL的update去修改记录,涂改财务账本属于犯罪。区块链中区块就是这样一条记录链接到上一条记录,如同幼儿园小朋友手拉手,一个盯着一个,如同一个链表LinkedList,这样任何人无法篡改这个链,当然这种高度串行化如同事务ACID的串行化一样造成性能限制,因此制约区块链的广泛应用的一个瓶颈就是它的吞吐量和并发性能,这些都是其高度事务安全导致的的牺牲方面。

    区块链它其实也是一个保证高一致性的分布式事务数据库,维护一个不断增长的有序的事务(transaction)记录列表,它的分布式事务实现与集中式的数据库分布式事务实现不同,后者通常以Paxos或Raft进行共识凝聚,最终将所有服务器节点的状态修改成一致状态;区块链的分布式事务机制也与传统的2PC两段式事务机制不同,后者主要依靠对事务参与者资源进行锁定实现的,区块链的事务机制非常类似于事件溯源Event Sourcing的事务机制。区块链不但保证交易的高度事务完整性,还同时结合或耦合了安全加密算法,这种一体化的设计非常适合和钱有关各种转账交易、智能合约或加密货币等应用。

    区块链中每个块包含一个头部和一个正文:

       这些是每个块具有的数据。除此之外,每个块都有一个由开发人员定义的最大字节数。达到此最大大小时,此块将添加到区块链中,并开始创建新区块。

块号BlockNumber

      区块链中的每个区块都有一个代表区块在整个链中位置的数字,链中的第一个块有一个特殊的名称,它们被称为genesis块,也就是起始块,创世块。

前一块号PrevBlockHash

   每个块在头部中都有前一个块哈希号的引用,这非常重要,因为这就是区块链保持一致并控制不变性的方式,创世块没有任何引用前一个块的内容,因为它是第一个块。

MerkleRoot

      merkleRoot是块内所有事务的散列结果,如果在块内部更改了任何内容,则此哈希值也会更改并使更改的块和下一个块无效。
      现在你可以想想:为什么这个字段被称为MerkleRoot而不是blockHash?这是因为比特币使用Merkle树算法从块的数据生成哈希值的。

nonce

     这是一个与块的挖掘过程相关的32位数字。此数字仅用于查找与区块链难度相匹配的哈希值

CreationTimestamp

     这是块创建的时间戳。

数据

     这是所有交易数据的保留位置。

哈希

哈希算法实际上取决于区块链的每个实现,比特币使用长度为256位的SHA-256(安全哈希算法)。

 

区块链

      区块链通过prevBlockHash将块链接在一起:

    merkleRoot值是从Data信息生成的,如果有任何变化,merkleRoot也会改变,并且在更改的块之后链接prevBlockHash的其余块将不再有效。这就是区块链不可变的原因。

工作证明

    工作证明对于区块链是一个重要特征,而且是必须的;区块链中其他经常被提及特征(如安全性)反而是次要的,虽有用但非必须。

    任何分类账都绝对需要顺序。一个人不能花没有收到的钱,也不能花已经花了的钱。区块链交易(或称区块链事务)必须明确顺序,并且不需要可信任的第三方来协调顺序,这就是前面讲的分布式事务机制。如果交易是由世界各地的匿名参与者产生的,并且没有中心化组织负责交易之间的顺序排列(不同于集中式的分布式事务数据库),但事实确实需要一个排序,那么该怎么办呢?虽然一个交易(或块)可能包括时间戳,但这些时间戳怎么可信?

    在分布式系统中不可能将事件与时间点关联起来,这是一个未解决的问题,直到中本聪发明了区块链的工作证明这个解决方案之后,分散的分类帐才可能得以实现。

    区块链的工作证明是一个符合某个要求的SHA-2哈希值,这个值是非常难以找到的。困难之处在于哈希小于一个特定数字,数字越小,输入值越稀少并且发现它的难度就越高。它被称为“工作证明”,就是因为已知具有这种哈希的值已经非常罕见,这意味着找到新的这样的值需要大量的试错,即“工作”。反过来,这意味着 消耗"时间"。比特币寻找难度是动态调整的,这样每十分钟平均能找到一个正确的哈希值。

    也就是说,区块链没有办法决定谁最快算出哈希值(因为每个参与者的服务器时钟不可能像对手表那样对得精确),那么延后一段时间比如10分钟,谁先算出谁获胜,然后迅速繁衍,谁的链越长越有优势,这是对于10分钟内可能有两个获胜者的附加判断条件。

    事件溯源是通往区块链最便捷有效地手段,首先使用事件聚合概念对系统建模,然后决定是采取统一共享式存储事件日志?还是采取复制方式存储事件日志?统一共享方式比较简单切实可行;而分布式存储则需要选举一个主节点进行专门的事件日志追加,从而才能保证事件日志的顺序性,其他节点再复制保存这份新的事件日志备份,这样的好处是没有单点中心化风险,在去单点中心化方向上,区块链则是更极致完美的实现,与其自己投入巨资建立数据中心或数据湖,不如通过区块链实现全球平等共享数据。

 

相关文章

区块链与分布式数据库的比较

Django作者阐述比特币和区块链的主要技术主张

用Javasctipt代码简单模拟解释区块链概念

改变CRUD认知:Web3去中心化亮点在哪里?

从CRUD编程切换到事件溯源和区块链编程

程序员眼中的区块链

区块链的工作证明其实是一个分布式时钟

Hyperledger Fabric v1架构简介

区块链的几种共识算法简介

分布式共识如何运作?

面向对象与区块链的哲学源头:培养OO思维和区块链意识需要改变三观 – Brad Cox

 

分布式事务 #区块链 #事件溯源