摘要
大喜大悲看清自己,大起大落看清朋友。没有一个足够宽容的心,就看不到一个春光明媚的世界
# 一:前言
# 1.1 去中心化
现代软件系统主要采用两种架构:中心化架构 与 去中心化架构。
在一个中心化系统中,一个中心模块连接了其他所有的模块。对应地,一个去中心化的系统中没有任何一个中心节点可进行节点间的协调与控制。
上图形象地描绘了这两类架构。图中的每个圆圈代表了系统的一个模块,也称之为 "节点",圆圈之间的线表示了两个模块之间的联系。左半部分是一个去中心化的系统,其中的各个节点彼此相连,没有一个中心节点同时连接所有其余的节点。而在右半部分的中心化系统中,除了中心节点之外的节点都不和其余节点直接相连,它们只与中心节点直接相连。
去中心化系统的优势:
- 计算能力更强:一个去中心化系统的计算能力表现为系统中所有互联计算机的计算能力之和。因此,去中心化系统可以拥有比中心化系统更强大的计算能力;
- 成本更低:一台超级计算机的搭建、维护与运营成本会远远高于相同能力的去中心化系统;
- 可靠性更好:一个计算机节点奔溃,整个系统依然可以工作,影响微乎其微,因为其他节点可以接替坏节点的工作;
- 自增长:去中心化系统的计算机能力可以通过加入新的计算机来提升。
去中心化系统的劣势:
- 节点间的协调:系统的协调协议各节点的参与,难度大,会产生额外的开销,占用计算机资源;
- 节点间的冗余通信:各节点需要频繁通信,需要建立在可靠完善的通信协议,才能发送接受并且处理信息,会产生额外开销并且占用一定计算机资源;
- 对网络的过度依赖:媒介负责系统各节点的通信过程,依靠网络作为媒介,因此对网络的选择和依赖会影响整个去中心化系统;
- 系统编程的较高复杂度:由于前面提到的3个劣势,任何一个运行在去中心化系统上的软件都需要解决额外的问题(节点间协调、通信,以及对网络产生依赖),这就带来了较高的编程复杂度;
- 安全问题:计算任务需要直接在网络上进行通信协调与数据传递,所以存在可靠性的问题,系统对节点的使用网络的权限限制越大,可靠性越高。
# 1.2 混合系统
两种结合中心化与去中心化系统的架构:拥有中心节点的去中心化系统 和 去中心化系统作为作为中心节点的中心化系统。
左图是一个拥有中心节点的去中心化系统,因为所有的小圆圈均与中间的大圆相连,实际是中心化系统,右面的系统中心节点是一个去中心化系统。两种架构拥有双重特质,即均具有去中心化系统与中心化系统的优点
识别去中心化系统
混合架构的出现,使得我们有时候很难分辨系统是不是去中心化的。有一种简单判定,在系统中是否能寻找到一个组成部分(数据库,用户等级,登入/登出模块或者是紧急停止按钮)可以直接关闭这个系统。找到说明不是去中心化系统。
区块链的用途:是实现且维护去中心化系统的完备性。
区块链是去中心化软件系统实现层的一部分
# 1.3 点对点系统
点对点系统:相对于中心化系统的优势在于前者直接在交易双方之间进行交互,不通过中间人,因此处理时间低,成本低。由若干节点(PC)组成的分布式软件系统,系统中单一节点的计算资源(比如CPU处理能力、存储容量)可直接被其他节点调用。所有用户的计算机均为计算机资源的供应者与提供者。
- 点对点系统是分布式计算机系统,由共享计算机资源的各个节点组成。
- 中心化系统通过维护中心节点以促进系统成员之间的交互,同时维护不同节点提供的服务目录,或执行节点的查找和标识等任务。
- 完全分布式的点对点系统可使用区块链技术来实现和维护系统的完备性。
完全去中心化的点对点系统可以取代中心化系统下靠信息中介建立起来的商业模式。
点对点系统可以是中心化的,也可以是完全去中心化的
# 1.4 核心问题
满足并确保一个完全去中心化系统的完备性,需要具备很多条件,其中最重要的为以下两个。
- 了解系统中的节点数目。
- 了解节点的可信任程度。
两个主要的点对点系统的完备性威胁:
- 技术性故障
- 恶意节点:部分节点会出于私利而剥夺整个系统,
人们要解决的问题是,通过使用区块链技术,让一个不知道内部节点数量,也不知道节点可信度的点对点系统也可以实现并确保整个系统的完备性。
# 1.5 所有权
区块链可以用来管理和区分所有权
所有权证明三要素:
- 对所有者的证明
- 对事物被拥有的证明
- 提供一个所有者与事物之间的连接
区块链是一个能够被任何人访问,拥有类似账本功能的巨大去中心化点对点系统,也可以将它理解为一个去中心化的账本
区块链算法确保了单个节点在每一次投票之后,能够同步到同一个状态。系统的完备性是系统具备提供真实且正确所有权描述的关键。
完全去中心化点对点账本系统的完备性,是其进行正确的所有权证明并且确保只有合法所有人才能够进行资产转移的坚实基础。
# 1.6 双花问题
设想一个情景:A将房屋卖给B,房屋从A到B的所有权变更会被记录在去中心化点对点系统的一个账本中,维护这个账本的节点需要将这条信息告知它所知道的其他所有的节点,并进一步通过这些节点让这条信息扩散出去,直到所有节点都知道从A到B的房屋所有权变更为止。但是,这时A迅速访问了存有另一个账本的节点,并且将他刚转让给B的房屋的所有权在这个账本中记录为转让给C。如果发生这件事的时候这个节点还没有得知A已经将房屋的所有权转让给了B,该节点就会记录下A将房屋的所有权转让给了C,并为此次转让提供证明。此时就意味着A利用去中心化系统中同步信息需要时间这个潜在漏洞,将自己的房屋出售了两次,而事实上B和C是不能够同时拥有房屋的,他们之中只有一人能够成为房屋新的合法拥有者。A的所作所为导致的问题,称之为双花问题。
双花有以下3种含义:
- 复制数字商品引起的问题。复制 "加密货币" 这一行为会伤害 "货币" 的核心原则:同一笔钱在同一个时间不能给予两个不同的人。
- 去中心化的点对点分布式账本中可能存在的问题。将信息同步到整个去中心化系统上需要花费时间,这导致了在同一个时间并不是所有的节点上都记录了完全一致的所有权信息。因为,不是所有节点都拥有最新的信息,同步信息慢的节点就可能会被其他拥有最新信息的节点所利用,导致在这个系统中出现同一个所有权在同一时间内的多次转移,即发生 "双花" 问题。
- 完全分布式点对点系统中违反完备性的一个例子。双花问题可以看作去中心化点对点系统中数据一致性的问题。
如何解决双花问题:
- 解决复制数字商品引起的双花问题。 因为 "加密货币" 或其他数字资产的可复制性,所带来的双花问题事实上和所有权的特性有关。如果不限定实现方法的话,任何可接受的将数字商品映射到其所有者的方法都可解决这个问题。
- 解决去中心化的点对点分布式账本中潜在的双花问题。 "区块链" 就可以看作去中心化的点对点分布式账本中潜在双花问题的解决方案。
- 解决分布式点对点系统中违反完备性的双花问题。 在其他一些去中心化的点对点系统应用场景下,其他的诸如通过设计数据结构和特殊算法等方法,更适合用来实现并确保系统的完备性。
# 二:区块链如何工作
# 2.1 设计区块链
目标: 设计一套在一个完全开放且不可靠环境下运行的软件,让其去管理运行在去中心化点对点系统上的分布式账本。管理所有权。
所研究系统的特征:
- 完全去中心化的点对点系统,计算机资源由系统用户提供。
- 节点通过互联网连接。
- 节点数量,节点是否值得信任,以及节点的可靠性均未知。
- 设计初衷是为了管理数字资产的所有权,如消费积分或者加密货币。
要完成的任务:
- 描述所有权:交易是描述所有权转移的好方法,交易的完整历史记录是识别当前所有者的关键。
- 保护所有权:密码学提供了一种在个人层面保护交易的方法,就像门锁保护你的汽车或房屋一样。(有3个主要部分:识别所有者、认证所有者并限制其他人获得这一数字资产)
- 存储数据:区块链类似对于账本的数字化。
- 账本可以发送到一个不可信任的环境:将在不可信网络种拥有在不可信节点上运行的账本副本,将账本的控制权交给整个网络。结果是一个只能添加新区块的链式数据结构:可以添加新区块,但是几乎不可能改变过去已添加区块内的数据。
- 分发账本:将账本的副本提供给想维护账本的节点。除此之外还涉及对等节点之间的交互问题。
- 向账本添加交易记录:必须确保只允许添加有效和经过授权的交易记录。所有计算机节点互相监督。
- 决定那些账本代表了真实的交易记录:通过让点对点系统中的每个节点决定那些记录代表真相,少数服从多数节点的决定。
# 2.2 记录所有权
把交易历史记录作为当前所有权的证明依据。
问题:找到一份不仅是声称某人是某物所有者的账本记录,而且还提供所有权的证据文件,从而作为所有权的证明。
方案:通过 所有权数据 或 交易数据 来描述所有权两种不同的记账方式。所有权数据描述当前的所有权状态,它更类似于只显示当前可用余额的银行账户。交易数据则可描述所有权的转让,它更类似于列出银行账户的每笔提款、存款和转账记录的对账单。可以通过汇总交易数据来导出所有权数据。
交易是将所有权从一个所有者转移给其他人的行为。区块链用于描述交易的信息如下:
- 原所有权拥有者账户的标识符;
- 交易目标账户的标识符;
- 要交易的资产数量;
- 交易完成的时间;
- 支付给系统的费用;
- 证明原所有权拥有者的确同意进行交易。
区块链是一个没有任何中心控制点的分布式系统。因此,区块链系统不能提供固定的收费表,当使用区块链系统时,每个用户必须事先告诉系统他愿意为执行该交易而支付多少费用。
历史交易记录的完备性:历史交易记录是任何管理所有权的区块链账本系统的核心。
审查交易数据的有效性涉及3个方面的内容:
- 形式正确性:交易的描述包含所有必需的数据,并且数据以正确的格式提交。
- 语义正确性:侧重于交易数据所代表的意义及预期结果。因此,验证语义正确性需要业务领域的知识。 检查交易数据的语义正确性,通常基于以下业务规则来完成。
- 确保账户不会一次支出超过其拥有的数字资产;
- 防止双花问题;
- 对交易中数字资产的数量进行限制;
- 限制交易次数;
- 限制同一时间内发生的总交易量;
- 强制用户在一段限定时间内不能将持有的数字资产进行二次交易。
- 授权正确性:只有拥有账户所有权的人,才能通过区块链触发一笔交易。因此,每笔交易都要携带被交易数字资产的原账户所有者同意进行该笔交易的证明信息。
# 2.3 哈希算法
无论输入数据的大小及类型如何,均可以将输入数据转换成固定长度的输出。
加密哈希算法拥有的特征:
- 能为任意类型的数据快速创建哈希值;
- 确定性:相同输入必定产生相同哈希值,换句话说,输入不同则得到的哈希值绝对不同;
- 伪随机:输入数据被改变则返回的哈希值的变化是不可预测的,即不可能根据输入预测哈希值;
- 单向函数:不可逆,不能通过哈希值恢复原始的输入数据;
- 防碰撞:同数据块产生相同的哈希值的机会很小,则哈希算法是防碰撞的。
哈希算法只能在给定的时间接受一个数据。没有哈希算法能够一次接受一堆独立的数据。区块链需要一次处理许多交易数据,还要对同一批交易数据产生一个哈希值,可以将以下模式运用到哈希值的生成:
- 独立哈希:将哈希算法独立用在每一个数据块上;
- 重复哈希:将哈希值输入哈希函数来获得哈希值的哈希值;
- 组合哈希
- 一次为多个数据块生成单个哈希值;
- 只能在单个数据块较小时使用;
- 将所有的独立的数据块组合成一个总数据块,计算哈希值;
- 单个数据片段的哈希值不可用,因为只有组合后才会被交给哈希函数。
- 顺序哈希
- 随新数据的产生,将现有哈希值与新数据组合,将其再次输入哈希算法,以获得更新数据后的哈希值;
- 适用于希望随时间推移,保持一个独立的哈希值,在任意固定时间均存在一个哈希值,通过该值可以追溯与其对应的新数据。
- 分层哈希
- 将分层哈希应用于一对哈希值可以形成一个哈希值组成的树状结构,其顶部将产生一个新的哈希值;
- 效率更高;
- 组合的总是两个固定大小的哈希值;
- 在每个步骤中只组合两个哈希值。
例子
- 独立哈希
"Hello World!" 分别独立计算两个单词,"Hello" 哈希值 "185F8DB3","World!" 哈希值 "514B6BB7";
- 重复哈希
"Hello World!" 哈希值 "7F83B165",在其基础上再进行哈希运算就产生了 "45A47BE7";
- 组合哈希
"Hello World!" 将单个单词首先组合起来,并在它们之间加上一个空格,之后对新生成的句子 "Hello World!" 进行哈希,哈希值 "7F83B165"。
- 顺序哈希
"Hello" 哈希值 "185F8DB3"。一旦新数据 "World!" 到达,它与现有哈希值组合并作为哈希函数的输入。即文本 "World!185F8DB3" 哈希值为 "5795A986"。
- 分层哈希 "Hello World!" 分别独立计算两个单词,"Hello" 哈希值 "185F8DB3","World!" 哈希值 "514B6BB7",再将二者哈希值组合哈希,最重哈希值 "C59C4224"。
# 2.4 哈希在实现世界的应用
常见使用场景:
- 根据哈希值进行数据对比,计算并且对比数据的哈希值,如果得到的哈希值不同则数据不同。如果两个或者两个以上的哈希值相同,则对应的输入数据也相同,是基于哈希计算的防碰撞上的;
- 可以检测数据变化,为了检查证明类文件或者交易数据等固定不变的文件在发送或者存储到数据库中是否发生变化;
- 哈希引用,数据的哈希值就类似于衣帽间寄存衣物的小票。这些小票一一对应着存放衣服的位置,你需要小票才能取走自己的衣服。计算机上哈希引用的工作原理与之相似:它们是一种对应着其他数据的数据。简单来说,可以把哈希引用当成衣帽间的小票,只不过上面展示的是哈希值,而不是普通数字罢了。
- 为了确保存储在数据库中的数据不发生改变,是一种对应其他数据的数据;
- 如果数据改变,哈希引用会禁止对数据进行引用,同时这些数据会视为无效;
- 防止用户使用系统误操作或者人为破坏后产生的数据;
- 可以应用在任何需要维护数据原貌的场景中。
- 及时发现数据的改变,安全存储大量的数据。利用哈希引用存储数据,每个哈希引用对应一个数据,形成一条复杂的长链。如有任何数据或者哈希引用被修改,则其后的哈希引用都将改变。
- 两种经典的使用哈希引用的方式,可以及时发现数据是否被修改:
- 链状结构
- 树状结构
- 两种经典的使用哈希引用的方式,可以及时发现数据是否被修改:
See More
链状结构
相互关联的数据形成的链又称之为链表,链表中的每份数据都包含着其他数据的哈希引用。这种存储数据的结构尤其适用于不能一次性获取所有数据的情况。
Data1和哈希引用R1是这种数据链表的开端。作为最初的数据,Data1没有任何哈希引用。在新的数据到来时,通过哈希引用把前后的数据连接到一起,哈希引用R2表示新到达的数据Data2和哈希引用R1的哈希引用。哈希引用R3表示Data3和哈希引用R2的哈希引用。R3又被称之为链头,因为它代表着最新的数据。这里的术语 "链头" 表示最新的数据,要注意与 "区块头" 这一术语的区分.
树状结构
这种数据结构是科学家默克尔率先提出的,由于这种数据结构看起来更像是一棵倒过来的树,故又称之为默克尔树。把同一时间到达的不同区域的数据进行分组非常重要,这样可以通过单一的哈希引用来关联这些数据。上图树状结构是这样形成的:底部的4个方框代表着4笔交易,对每一笔交易分别进行哈希引用(R1-R4),并两两成对进行分组。接下来,对这两组哈希引用再进行哈希引用,即R12和R34。重复这个过程,直到最后只有一个哈希引用,也就是得到默克尔树的根(R)。原理:通过哈希引用把所有的数据连接到一起,这样可以及时发现任何数据的改变。数据被修改后,对应的哈希引用就不再完整。因此,只要发现哈希引用不完整就表明树状结构中的数据被修改了。相反,我们就可以认为数据在产生后未被修改过。
- 消耗大量运算,哈希引用不仅在对比文件等简单操作上能发挥作用,同时也可让数据存储变得更加安全高效。哈希引用还可以让数据之间进行复杂的计算。
创造一个需要大量计算机运算资源才可破解的难题
一个哈希难题包括以下几个要素:
- 未经更改的已有数据;
- 可以随意修改的数据,即随机数;
- 使用哈希功能;
- 限制哈希值,即难度值。
上图是哈希难题的图示。对数据和随机数都进行哈希,随后的哈希值必须要满足特定限制条件。 解答哈希难题只能够不断去试错。首先要猜一个随机数,并计算数据与随机数构成的数据集合的哈希值,然后根据限制条件去评估得到的哈希值。如果哈希值满足这些限制条件,你就成功解决了这个哈希难题;否则就只能重新选取随机数,从头开始新哈希值的计算。能够满足最终限制条件的随机数就是这道哈希难题的解。想解决这个哈希难题就必须找到这个特定的随机数。
求解过程:
"Hello World!"的缩短版哈希值为 "7F83B165"。这个哈希难题为:找到一个能与 "Hello World!" 相结合,得到以3个0开头的哈希值的随机数。
首先尝试一些随机数。下表是进行哈希计算的随机数和文本,以及其共同产生的缩短版的哈希值。如下表所示,随机数614解决了这一难题,这意味着从随机数0开始尝试,需要615次尝试才能得出最终的解。如果这个难题是找到一个以0开头的哈希值,那么只需要4次尝试就可以了。
难度:获取能够满足限制条件的随机数是解哈希难题的关键。哈希难题使用的限制条件是有着标准格式的,这样一台计算机就能够与其他计算机就解哈希难题来进行竞赛。在哈希难题中,限制条件常被称之为难度。难度通常使用自然数字来表示哈希值中必须包含多少个0。比如,难度为1表示哈希值的开头至少有1个0,难度为10表示哈希值的开头至少有10个0。难度越大,哈希值开头的0越多。哈希难题的难度越高,需要的计算机运算能力越高。
具体原理:哈希难题中的哈希值是单一方向的。不可能反方向执行哈希算法来找到满足限制条件的随机数,比如从输出反推输入。哈希难题只能通过不断试错来解决,这一过程需进行大量的运算。难度会影响计算机试错的平均次数。
可以给任意数据产生哈希值。因此,只要哈希难题得到解答,计算机就能够确认这个带有随机数的数据的确产生了一个满足所有限制条件的哈希值。如果计算出的哈希值不满足这些限制条件,并不意味着哈希引用本身存在问题,只不过是这个哈希难题还没有解开而已。
在区块链中,哈希难题的解答过程被称为是工作量证明
在区块链中可以这样使用哈希引用:
- 存储交易数据,及时发现数据的改变;
- 提取交易数据的指纹;
- 想要修改数据就要解哈希难题。
# 2.5 确认并保护用户账号
区块链使用非对称加密技术。是为了确认所有者跟资产的对应关系,确保只有合法所有者才能获取他的资产,用户使用公钥来确认给某账户转移资产,只有拥有私钥的人才能获取这些资产。就好比邮件地址是公开的,人人都可以向该邮箱发送邮件,但只有用户本人才能使用钥匙读取邮箱中邮件的内容,这就相当于非对称加密。
加密学是为了保护数据安全,防止未授权的人获取用户数据,使用密钥保护数据安全。加密流程:产生数据,使用密钥加密数据成文档,保存文档或者把文档发送给某人,利用密钥读取加密文档
对称加密:用同一种密钥进行加密和解密;
非对称加密:使用两种对应的密钥。注意,使用一种密钥加密数据以后只能使用另一种密钥解密。
非对称加密的妙处在于,无法使用加密文档的密钥来解密文档。可以自己来决定使用哪个密钥进行加密,哪个密钥进行解密。可以在加密新数据时转换公私钥的角色,只要确保加密和解密是相互对应的即可。如果只有一对公私钥中的一个,那么你的权利就会受到限制。你可以使用这个密钥加密数据,却无法使用对应的密钥解密。单独的一个密钥就像是一条单行道:你只能沿着一个方向行驶,不能原路返回。因为公私钥功能不同,也就把能够加密和解密文档的人划分成了两类。公钥人人皆有,私钥非公开
使用公私钥的方法,区别在于数据流通方向:
- 公开到私密,信息经过公钥加密后发送出来,为了安全地传送信息。人人都可以使用公钥来创建加密文档,但是只有私钥的拥有者才能打开加密文件,读取信息;
- 私密到公开,信息通过私钥加密以后再使用公钥来进行解密。这种方法类似一个公共的信息公告栏,人人均有公钥来读取信息,但是只有私钥的所有者才能发布信息。使用这种方法是为了证明所有权。
区块链中的非对称加密目标:
- 确认账户,确保用户与财产的对应关系;
- 授权交易,完成交易需要能证明用户确实同意转移资产的所有权。
# 2.6 交易授权
数字签名可用于识别一个账户,表明他的所有者同意对特定的交易数据的内容进行授权,并通过允许将新的交易数据添加到历史交易数据中来批准它的执行。
数字签名等同于手写签名。它利用了哈希引用以及非对称加密技术中的公私钥对交易进行授权。数字签名的三个主要元素:
- 创建数字签名;
- 利用数字签名验证信息;
- 所有数字签名识别伪造的问候语。
数字签名
创建数字签名
假设通过数字签名授权的方式,向世界发送 "Hello World!" 这个问候语。首先创建了问候语的哈希值—7F83B165
,并使用私钥对其进行加密。这个数字签名在两个方面上是独一无二的:第一,它是唯一一种可以追溯到我的方式,因为它是使用我的私钥创建的。第二,就问候语的文本内容而言,它也是独一无二的,因为它是基于这个问候语的哈希值创建的。问候语和数字签名都放在一个文件(灰色框)中,就构成了我向世界发送的数字签名信息。
利用数字签名验证信息
首先,这条消息的接收者需自己计算问候语的哈希值,得到7F83B165
。然后,这条消息的接收者使用我的公钥解密消息中的加密文档(数字签名)。这样可得到7F83B165
,也就是问候语的哈希值。接收者通过对比两个哈希值来完成验证。由于这两个哈希值是相同的,因此接收人可得出以下结论:第一,这条消息是由我签名的,因为他能够用我的公钥解密我用私钥生成的加密文档;第二,消息中发现的问候语文本,确实是我想要发送的文本,因为解密后的文本与消息中的问候语的哈希值相同。
所有数字签名识别伪造的问候语
上面问号替换了原问候语中的感叹号。修改后的问候语并不是我想要发送给世界的消息。数字签名会向每个人指出,这条消息已经违背了我的意愿,且已发生了改变。首先,消息的接收方会自己创建问候语的哈希值,得到 8A0B7C66
。然后,消息的接收者使用我的公钥对这个数字签名进行解密得到 7F83B165
,它是我想要发送给世界的问候语的哈希值。对比这两个哈希值,会发现它们是不同的。这清楚地指出,消息中的问候语已不是我想向世界发送的问候语。因此,每个人都可得出我没有授权这条信息的结论。因此,也就没有人会让我对该消息中的问候语的内容负责。
区块链中的数字签名满足以下要求:
- 可以说明账户所有者同意转移特定交易数据的所有权;
- 可防止未经账户所有者同意而用于授权其他交易;
- 只有同意转移所有权的账户才能创建这样的签名;
- 很容易被被交易的另一方核实。
数字签名在区块链的用途:
- 签名交易,要为交易创建一个数字签名,同意转移所有权的账户所有者需要执行以下步骤。
- 对交易进行描述,包括所有必要的信息,如所涉及的账号、转移的金额等,但签名本身除外,因为它尚不可用;
- 创建交易数据的哈希值;
- 使用同意转移所有权的账户的私钥加密交易数据的哈希值得到加密文档;
- 将在第3步中创建的加密文档添加到交易中作为其数字签名。
- 验证交易
- 创建要进行验证的交易数据的哈希值,除了数字签名本身;
- 使用同意转移所有权的账户的公钥来解密交易数据中的加密文档(数字签名);
- 对比步骤1生成的哈希值和步骤2获得的哈希值。如果两个值相同,那么这笔交易就是由同意转移所有权的账户所对应的私钥所有者授权的,反之则不是。
交易数据的数字签名内容:
- 交易数据的哈希值;
- 可追溯到账户对应私钥的加密文档。
数字签名有以下两个用途:
- 识别独一无二的签署人
- 证明签署人同意文件中的内容,并且授权执行
区块链中的数字签名可以追溯到一个特定私钥授权了一笔特定的交易
# 2.7 存储交易数据
目标:利用区块链技术,以有序的方式维护书本借阅数据的整个历史记录。
书的一些重要属性:
- 存储内容:书籍内存储有特定的内容。
- 排序:书籍中的句子和页码都是按顺序排列的。
- 连接:书籍内的纸张通过书脊进行物理连接,并通过内容和页码进行逻辑连接。
更改其中的一些属性
改变1:使页面依赖关系显式化
下图展示了一本书中非常简单的两页内容,其中每一页都包含一个显示页码的顶部边框,和一个只包含一个单词的内容区域。
页码有一个重要的用途,通过检查页码的连续性来确定是否有人从书籍中删除了一页。但是,如果作者或出版社决定使用不同的页码标注方法,那上面的假设就不再成立了,此时该怎么办?在这种情况下,我们验证前一页没有被删除的方法就是失效的。为了便于确定没有从书中删除任何页面,我们可以更明确地指出每一页与其前一页的连接。如下图显示了如何在书籍中这样做。每页不仅显示自己的页码,还显示其上一页的页码。这种页面编号模式可使任何一页与其上一页之间的依赖关系都更为明确。对前一页页码的直接引用使得确定没有任何一页被删除变得非常容易。
改变2:外包内容
下图显示了外包内容之后书籍内页面的样子。这些页面不再包含任何内容,而只包含指向外包内容的特定编号。
这一步我们把书变成了一个小型数据库。更进一步地将内容和页码存储在一起的书变成了仅记录内容编号的"目录",而内容则存储在由唯一编号标识的独立于书籍的页面上。
改变3:替代页码
用参考编号来代替用于标注页码的自然数。例如,此前带有页码 42
的页面现在用参考编号 8118E736
来标识。以类似的方式,现在使用参考编号 B779E800
来标识页码为 41
的页面。
下面发生改变前后这本书的一些属性
属性 | 原书 | 发生改变后的书 |
---|---|---|
存储的内容 | 在页面上 | 在单独的内容页上;每个内容页都用一个内容编号标识 |
序列化目录 | 物理上:基于书中各页的物理位置 逻辑上:基于页码 | 逻辑上:通过参考编号标识 |
内容页 | 物理上:在书脊上固定的页面 逻辑上:基于页码 | 逻辑上:通过内容参考编号 |
页面的浏览 | 通过页码向前向后面,或跳着进行阅读 | 只能向后阅读:通过顺着参考编号找到前一页 |
改变后的书籍与区块链数据结构的比较
改变后的书籍 | 区块链数据结构 |
---|---|
序列化目录中的一个页面 | 区块头 |
整个序列化的目录 | 由区块头组成的链 |
序列化目录中页面的参考编号 | 区块头的哈希值 |
指向前一页的参考编号 | 前一个区块头的哈希值 |
页面内容 | 交易数据 |
内容页 | 包含交易数据的默克尔树 |
内容页参考编号 | 包含交易数据的默克尔树的根 |
序列化目录及其相应内容页的一个页面单元 | 区块链数据结构中的一个区块 |
整个序列化的目录和所有内容页 | 区块链数据结构 |
序列化的目录页面及其对应的内容页面组成的单元
序列化的目录页面及其对应的内容页面组成的单位,与区块链数据结构中一个单独的区块很相似。所有这些区块一起构成了区块链的数据结构。需要指出的是序列化的目录页面和相应的内容页面组成的单元仅仅是一个抽象的概念,因为序列化的目录页面和内容页面在物理上是不同的实体。由于前者包含后者的内容编号,因此构成了抽象的单元。
序列化的目录
改变后书籍中序列化的目录,等同于区块链数据结构中由区块头组成的链。序列化的目录中的每一个页面等同于区块链中一个单一区块头。由于区块头通过引用上个区块头的哈希值来相互像链条一样连接,故可形成一条由区块头构成的链。类似于上文中书籍的序列化的目录,区块头也不直接存储交易数据,而是只存储交易数据的哈希值。
内容页面 改变后书籍的内容页面,相当于区块链所维护的交易数据。在现实的区块链应用中,并不存在内容页面;现实中的区块链应用直接将内容数据(例如交易数据)存储在数据库中,我们将它们称为默克尔树,然后将默克尔树的根存储在区块头中。
目录页面的参考编号
改变后的书籍中用于标识序列化的目录页面的参考编号,等同于区块链数据结构中单个区块头的哈希值。区块头的哈希值与前一个区块的哈希值被用来唯一标识每个区块头及其引用的前一个区块头。一个区块头对它前一个区块头的引用实际是通过哈希引用完成的。
内容编号
用于识别内容的内容编号等同于区块头组成的链中的哈希引用。更具体地说,存储在区块头中的内容编号是存储在数据库中交易数据的默克尔树的根。这就构成了序列化的目录(区块头),及其对应的内容(包含交易数据的默克尔树)。
在区块链数据结构中存储交易
上图描述一种存储了4笔交易的区块链数据结构,展示了一个由标记为区块1和区块2的两个区块构成的简化后的区块链数据结构。为了强调区块的重要性,它们被用虚线进行了标识。
两个区块都包含一个区块头,分别被标记为 区块头1 和 区块头2。区块1 是这个数据结构中的第一个区块,因此它不存在前一个区块,故 区块头1 中不包含对前一个区块头的任何引用。由于 区块2 前面 还有一个区块,所以 区块头2 保留了对前一个区块头的哈希引用,并将其标记为 B1。图中所描述的区块链数据结构保留了对两个不同的默克尔树的哈希引用,它们的根分别标记为 R12 和 R34。默克尔树的根的标签可以给我们一种关于它们包含的交易数据的标示(例如,根R12 的默克尔树包含了被标记为 交易1 和 交易2 的两笔交易,以及指向它们的哈希引用 R1 和 R2)。
如果加入到一个保留了区块链数据结构的分布式点对点系统当中,你将收到所有交易数据、所有哈希引用值和所有区块头。基于这些数据,你的计算机将可根据区块链数据结构构造出系统的历史交易记录。有了这些数据和对最新区块头的引用,你可以浏览自系统创建以来所有交易数据的历史记录,在例子中只有4笔交易。请注意,对最近添加的区块头的引用称为 "区块链数据结构的头",因为它是添加下一个块的位置。有时,最近添加的区块头和指向它的引用都称为 "块链数据结构的头"。在上图,标记为 B2 的引用是区块链数据结构的头(Head)。重要的是不要混淆术语 "Head" 和 "Header":区块链数据结构由许多区块组成,每个区块都有自己的Header(区块头),但是整个区块链数据结构只有一个 Head。
综上:区块链数据结构包括两个主要方面: 区块头和包含交易数据的默克尔树
# 2.8 区块链的数据存储
下图是只有一个区块,且其中只包括两笔交易的一个区块链数据结构。最下面的 交易3 和 交易4,还没有添加到现有的区块链数据结构当中。要添加新的交易,步骤如下。
- 创建一个新的默克尔树,把新的交易数据添加进去:
- 创建一个新的区块头(区块头2),其中包括上一个区块(区块头1)的哈希引用(B1),以及新交易数据对应的默克尔树的根(R34)的信息。
- 给新的区块头创建一个新的哈希引用(B2),这也就是区块链数据结构新的头部。
上图展示了创建新区块的哈希引用的过程。接下来讨论以下的情形:
See More
- 改变交易数据的内容
改变 交易2 的某些特征(如交易数量或账户名称),就会相应地改变其在默克尔树上的哈希引用。也就是说,指向原始交易数据的哈希引用R2会被破坏。最初引用的交易数据发生了变化,也就违背了区块链中已上链数据不能更改的规则。整个区块链数据结构也就无效了。
- 改变默克尔树的哈希引用
如果改变一笔交易对应的默克尔树的根信息,就会相应地改变对该交易的哈希引用。交易2对应的哈希引用R2是有效的,因为它正确地指向新的交易数据。然而,更新后的哈希引用R2也是默克尔树的一部分。默克尔树的根R12对应的数据包括对R1和R2的哈希引用。R2被修改了,因为要跟更改后的交易2保持一致。因此,更新后的R2所对应的哈希值也就发生了变化。这样一来,默克尔树的根R12也就无效了。
- 替换一笔交易
基本同上类似
- 改变默克尔树的根
被修改的默克尔树的根R12,是区块头1的一部分。默克尔树的根R12被修改后,区块头1的哈希值会随之改变,就是说区块头2中对区块头1的哈希引用B1会变得无效。最终,整个区块链数据结构都会变得无效。
- 改变对区块头的引用
如果 区块头1 的 哈希引用B1 改变了,从 哈希引用B1 开始,所有受到影响的交易数据所对应的哈希引用都要做出改变,才能够与更改后的 B1 保持一致。然而,修改后的哈希引用 B1 本身是 区块头2 的一部分,因此对 区块头2 的哈希引用的值也会发生变化。这样一来,原先指向 区块头2 的哈希引用 B2 会变得无效。因此,整个区块链数据结构都会变得无效。
将新的交易数据添加到区块链数据结构的步骤:
- 创建一个包含所有交易数据的默克尔树
- 创建一个包含上个区块头的哈希引用与新交易数据的默克尔树的根的新区块头
- 创建新区块头的哈希引用
想要改变区块链上一个区块内的交易数据,需要从需要改动的地方向后依次改动哈希引用,一直修改完整条区块链上最新区块中的哈希引用为止。区块链数据结构对数据修改的高敏感度是 哈希引用 这一特征决定的。
# 2.9 保护数据的安全
Q:区块链是一个完全分布式的且对所有人开放的点对点系统。不诚实的节点有可能通过操纵或伪造交易数据来为自己谋利。如何保证系统在对所有人开放的同时,还能够保护历史交易记录不被伪造或操纵。 A:为保护历史交易记录不被不诚实节点操纵,首先要阻止所有人操纵历史交易记录。如果任何人都不能更改历史交易记录,那么无论是遇到诚实节点还是不诚实节点,都不必再担心数据会被操纵了。因此,让历史交易记录不可更改就解决了这个问题。由此,系统也就能够保证对所有人开放,同时也不用担心不诚实节点会操纵历史交易记录了。
让历史交易记录不可变的三个要素:
- 以对的方式存储历史交易记录,并让对任何交易记录的更改都变得十分醒目且引人注意;
- 强制加入修改历史交易记录需要重新编写大部分历史交易记录的要求;
- 使更改记录的成本变得很高很高。
将新区块添加到区块链数据结构的过程,需要的计算成本并不高,仅仅需要向新区块头增添指向当前区块的哈希引用,并将其作为区块链新的末端
为使添加新区快的成本增加,需要考虑以下几点:
- 区块头的哈希引用
- 计算每个区块头的哈希引用必须要有以下数据:
- 包含交易数据的默克尔树的根;
- 前一个区块头的哈希引用;
- 哈希难题的难度等级;
- 开始解决哈希难题的时间;
- 解决哈希难题的随机数。
- 计算每个区块头的哈希引用必须要有以下数据:
- 创建新区块的过程
- 创建一个新区块包含以下几个步骤:
- 获取包含要添加的交易数据的默克尔树的根;
- 创建新区块头对前一个区块头的哈希引用;
- 获取所需哈希难题的难度等级;
- 获取当前时间;
- 创建一个包含前四步中所提到的数据的区块头;
- 解决区块头中的哈希难题;
- 将解决哈希难题的随机数添加到创建的区块头中便完成了新区块的创建。
- 创建一个新区块包含以下几个步骤:
- 区块头的验证规则
- 每个区块头必须满足以下规则:
- 必须满足对前一个区块的有效哈希引用;
- 必须包含有效交易数据的默克尔树的根;
- 必须包含正确的哈希难度等级;
- 其时间戳需在之前区块头标记的时间戳之后;
- 必须包含一个随机数;
- 上面五个数据组合在一起计算出的哈希值满足难度等级。
- 每个区块头必须满足以下规则:
修改区块链的成本:
- 重写修改后的交易数据所属的默克尔树;
- 重写被修改的默克尔树的根所属的区块头;
- 重写所有后续的区块头,一直到区块链数据结构的末端。
设计一条区块链面对的挑战就在于,确定恰当的哈希难题的难度等级
# 2.10 点对点系统中数据的存储与分发
区块链可看作纯粹用于实现所有权管理的分布式点对点系统,由独立的计算机组成,旨在维护存储着完整历史交易记录的账本。那么如何确保组成这个点对点系统的独立计算机知晓交易的存在,并且能自己维护历史交易记录?构建一个点对点系统所需成本最低的方式,就是让各节点在互联网上实现相互沟通。因此,分布式点对点系统将互联网作为交流媒介具有以下特点:
- 计算机通过互联网相连接;
- 每台计算机都能通过独特的地址进行辨别;
- 每台计算机都能在任意时间与系统断开或重新建立连接;
- 每台计算机都能独立维护与其保持连接的一系列对等节点;
- 节点之间相互沟通收到的信息;
- 节点之间完成信息传递,是通过各自持有的独特的地址实现的。
节点通过网络沟通,且能够随时断开连接,或重新建立连接的这一特点,会影响系统中信息的传递。信息在这类网络中的传递具有以下特点:
- 无法保证信息能够到达特定地址,信息可能丢失;
- 信息可能被重复传送;
- 信息的传送顺序可能发生改变。
这些特点会造成节点间的沟通障碍,但可以通过以下方式来解决:
- 信息通过类似人们闲聊的方式进行传递。每个接收到信息的节点都会把它传递给能与其沟通的对等节点,而对等节点也会以同样的方式来处理接收到的信息;
- 通过哈希值来检查交易数据或区块是否重复,如有,就进行剔除;
- 每个节点都能对信息进行排序,因为交易数据和区块头中都包含时间戳。
分布式点对点系统中的节点之间进行沟通的目的:
- 确保现有连接有效,每台计算机都会定期验证这些对等节点是否可用,这一过程通常是通过向对等节点发送一小段要求回应的信息的方式进行的。
- 建立新的连接,每台计算机都能通过向系统中的任意节点发送相应的请求信息,来要求加入这个点对点系统。收到此类信息的节点会在自己的对等节点列表中添加询问者的地址,并且回复确认信息。收到回复之后,这个节点就会添加发送方地址到自己的对等节点列表中。这样,一个新的连接就建立完成了,系统中也就新增了一个新的节点。与系统只建立一次连接是有风险的,因为每个节点随时都可以终止、关闭甚至破坏一次连接。因此,在加入一个点对点系统之后,一台计算机应该与系统中多个不同节点建立连接。这样一来,就算与单个节点断开连接或关闭连接,也能确保自身与整个系统的有效连接。
- 分发新的信息,这类沟通方式代表了系统的应用目标,即对所有权进行管理。这一过程是通过新交易数据在系统中的传递,以及新区块在区块链数据结构中的添加来完成的。与所有权相关的信息会在以下3种情况中进行共享。
- 一种持续的模式:新信息(也就是新的交易数据和新区块)一旦产生就会被分发出去。每个连接到这个系统的节点最终都将接收到所有消息。
- 作为一种更新:在断开一段时间之后与系统重新建立连接的节点,将会接收它们错过的所有交易数据和区块。
- 作为加载程序的一部分:新加入系统的节点没有机会构建自己的历史交易记录,因为它们之前并未与系统相连。因此,它们需要获得完整的历史交易记录。向新的节点发送完整的区块链数据,能够确保其成为成熟的节点。这类信息传递的形式,可看作特殊情况下节点对数据的更新。
# 2.11 核实并添加交易数据
区块链是完全开放的。所有人,即使是最不诚实的人都能把计算机连接到这个系统,并创建交易,同时把交易发送给系统中的其他节点。因此,并不能保证网络中传送的交易都是正确的。所以,如何保持系统开放的同时,还要确保新添加交易的有效性?为了确保唯一有效的交易被添加到系统中,所有节点都需要承担监督者的职责。既奖励其他对等节点添加有效交易,又需发现对等节点添加的无效交易。因此,系统中的所有节点都有动机来正确地处理交易,同时监督并指出其他节点的错误。
前提是不集体对规则进行抵制,如果集体协议不互相监督,那么就会出现大量无效交易。
区块链算法负责管理节点处理新交易和区块的方式。规则与流程的基本构成如下:
- 验证规则:区块链算法的最终目的是确保区块链数据结构中仅仅包含有效的区块。有效区块由有效交易数据和有效区块头组成。数据有效性评估基于两种规则:
- 交易数据的验证规则:流程为形式纠正、语义纠正以及授权。
- 区块头的验证规则:主要关注的是区块头的形式和语义纠正。只有区块头包含正确哈希难题答案的区块才会被进一步处理。区块头没有通过验证的区块将被立刻丢弃
- 奖励,区块链算法规定了节点提交有效区块将得到奖励。奖励是用来鼓励那些维护系统诚信的节点的;
- 惩罚,常见的惩罚是收回区块奖励,但后来被证明是无效且无用的。另一种是取消奖励,让节点做工作量证明的同时不给它们奖励,而这些节点仍会去辨别出重复的旧的无用的区块,这本身就是一种惩罚。创建区块而不能收回奖励就意味着不能收回成本;
- 竞争,通过奖励对系统维护有显著贡献的节点,就可以避免浪费资源。最好方法是建立一个基于明确标准的奖励机制。分为 速度竞争 与 质量竞争。只有同时赢得这两场竞争的节点,才能因为提交新区块而收到奖励。这场竞争的奇妙之处在于,速度竞争的失利者将会成为质量竞争的裁判,它们将负责验证速度竞争胜利者提交的区块。这样就能确保提交上来的区块通过了严格的检查。
- 速度竞争: 速度竞争基于对哈希难题的解答。创建一个有效区块的核心组成部分就是进行基于计算的工作量证明,也就是解答这个新区块独有的哈希难题;
- 质量竞争: 指对已提交的区块进行纠错。一旦某节点提交了新区块,这个区块就会被发送给系统中的所有其他节点。收到新区块之后,每个节点都必须在质量竞争中担任裁判的角色,即基于交易数据和区块头验证规则对新区块进行验证。
- 对等节点控制,区块链算法能够让系统中所有节点都监督其他节点。系统中的节点是工人同时也是监工,因为它们在验证交易和创建新区块的同时会接收、审核以及验证其他节点创建的区块。每个节点的工作都会为新的有效区块的创建以及检查、拒绝或者移除无效交易数据及无效区块做出贡献。
在任意时间点,系统中的所有节点都处于以下任一阶段:
- 评估其他节点创建并且提交的新区块
- 努力成为下一个负责创建新区块的节点,并且把自己创建的区块提交给其他节点进行评估
区块链算法最重要的作用之一,就是它不仅能确保交易数据和区块的有效性,还能确保所有节点的工作节奏保持一致。保持工作节奏的秘诀是,只要节点收到包含验证信息的新区块,其就能切换到评估阶段;只要评估阶段完成,节点就能切换到验证新交易数据和创建新区块的阶段。
节点处理从对等节点接收到的新交易数据和区块头信息,需要遵守以下规则:
- 新交易数据以及新区块以类似闲聊的方式被传送给所有节点;
- 每个节点都在其 "收信箱" 中收集新的交易数据,并选择对其进行处理;
- 每个节点都会马上优先处理新区块;
- 每个节点都会通过验证其有效性和形式及语义纠正的方式来处理新的交易数据;
- 每个节点仅仅收集有效交易数据到默克尔树中,并且开始通过解答其包含的哈希难题来创建一个新的区块;
- 一旦某节点完成了哈希难题的解答,就会发送新创建的区块给其他所有节点;
- 每个节点都会通过验证哈希难题的答案,以及验证其包含的所有交易数据来确保以正确的方式处理新区块;
- 每个节点都在自己的区块链数据副本中添加有效区块;
- 如果一个新的区块被证明是无效的,那么它将会被丢弃,节点就会继续处理交易数据,或去完成一个新区块中的哈希难题;
- 如果一个新的区块被证明是有效的,节点就会在自己的收信箱中移除那些来自这个新区块的交易,并且开始处理新的交易数据,努力创建新区块;
- 如果一个被添加到区块链中的区块被证明是无效的或者无用的,则这个区块和之后的区块都会被移出区块链,这些区块中的交易会被重新放到 "收信箱" 中然后再次进行处理;
- 提交被接纳区块的节点将会收到区块中所有交易包含的手续费作为奖励;
- 如果某区块被移出区块链,则相应的奖励也会从指定节点撤回。
运行原理
上述规则之所以行得通,原因如下:
- 由于规则1,所有节点都会收到所有需要验证的交易数据;
- 由于规则2,节点会处理它们收到的新交易数据;
- 由于规则3,在到达节点 "收件箱" 之后,其他节点创建的区块会马上得到处理;
- 由于规则4,只有有效的交易数据才会被添加到区块链数据结构中;
- 由于规则5,所有节点都会参与到解题比赛当中。由于哈希难题的特点,哪个节点能够率先解谜是不可预测的;
- 由于规则6,当某节点解答出一个新区块的哈希难题时,所有节点都会收到通知;
- 由于规则6和规则3,所有节点都会收到新创建的区块,并且认可哈希难题竞争的胜利者;
- 由于规则7,系统中所有节点都会审核和验证新创建的区块,确保只有正确的区块才会被接受;
- 由于规则8,所有节点都会把新区块添加到它们自己的区块链数据副本中;
- 由于规则9,这个共同维护的历史交易记录中不会出现无效交易,因此保证了真实性;
- 由于规则10,没有任何交易数据会被重复添加;
- 由于规则11,即使之前已经被处理过的区块又被重复处理,也不会出现有效交易丢失的情况;
- 由于规则11,该系统能够对历史交易记录进行事后有效性检查,并对其进行纠正;
- 由于规则12,节点快速处理交易和创建新区块是具有经济动力的;
- 由于规则12,所有节点都有动机将一个新区块发送给其他节点,因为获取奖励的前提是其他节点检查和接受其中的交易;
- 由于规则13,节点有动力正确工作以避免接受任何无效交易,或者产出无效区块;
- 由于规则13,节点有动力审核并回过头来重新验证区块和交易。
区块链的目标是在完全公开的点对点系统中创建信任,系统是由可靠性和可信度均未知的节点维护的
系统中不诚实的行为有:
- 伪装成其他人提交交易;
- 接受无效的交易数据或者区块;
- 向某节点传送大量交易数据使其崩溃;
- 解决处理特定的交易数据;
- 拒绝传递信息。
解决不诚信的行为方式:
- 交易安全的核心(身份验证、认证和通过非对称加密技术,以及数字签名的方式进行授权)在于限制了相应私钥所有者之外的人对某账户的访问权。
- 类似人类闲聊的沟通模式,确保了每个节点最终都能接收所有信息。
- 即使部分节点崩溃或停止处理交易数据,系统也能正常运作。
- 区块链算法。
区块链应对不诚实节点的最重要武器,就是其诚实的绝大多数节点以及奖励和惩罚的措施。即使部分节点发送了虚假交易,或接受了无效交易数据或区块,大多数诚信节点及其追求奖励的目标也不会允许不诚实节点破坏系统的诚信。显然,这一方法奏效的前提就是假定大多数节点的确是诚实的。
# 2.12 选择交易数据的历史
在所有网络节点之间,如何维护一个明确的历史交易记录?这样在澄清所有权请求时,无论请求哪一个节点,都会得到相同的结果。区块链算法要求系统的所有节点必须完成两个部分的工作。在任何给定的时间点,系统的每个节点都在检查一个新的区块(它是由另一个节点或努力成为下一个创建新区块的节点创建的)。虽然这个区块随后必须由所有其他节点来检查,但是系统并没有规定在任何给定的时间内必须完成这两种工作中的哪一种。单个节点收到的新区块更像是控制任何特定节点所做工作的 "指挥棒"。然而,新区块的到达时间会受到网络信息传输能力的影响。网络本身也是有其自身缺陷的,这些信息在传输过程中可能会丢失、延迟,或者出现到达节点的顺序颠倒等情况。因此,网络中的节点在同一时间收到的信息可能不同。此外,两种工作之间的切换不会在所有节点上同时发生。相反,每个节点会根据消息到达节点的时间来控制两种工作之间的切换。这将导致单个节点间的工作状态相互重叠。因此,需要找到一种确定一个明确的历史交易记录的方法,而不至于重新使用一种中心化的解决方案。解决方案:分布式共识,在无中央控制或者协调因素存在的独立行动个体之间达成的协议称为分布式共识,是完全分布式点对点系统中成员之间达成的一种协议。
区块链的设计思路是让所有节点都能独立地参与投票,从而就选择哪一个版本的历史交易记录达成一个集体共识。区块链完成集体决策需要4个前提条件:
- 所有节点都在相同的网路环境中运行,这些节点维护各自的账本,以及控制节点行为的区块链算法;
- 对一个历史交易记录进行集体选择;
- 所有节点都努力向账本中添加新的有效区块以获取奖励,从而将自身的收入最大化;
- 为了实现目标,节点会向其他节点发送它们发现的新区块,并让它们检查这一新区块。因此,网络中的每个节点都会参与到维护一个统一账本的工作当中。
然而,还缺失第5个要点:一种可以让所有节点根据环境的变化做出决策的标准。这个如何选择历史交易记录的标准,应基于如何将新区块添加到区块链数据结构当中,并保护数据不受节点操作的影响。由于采用工作量证明,故添加一个新区块的计算成本是昂贵的,并且会使得试图操纵历史交易记录的尝试付出更加昂贵的成本。因此,当存在不止一种有冲突的历史交易记录版本时,花费在创建历史交易记录上的累计计算成本似乎是选择历史交易记录的自然标准。如果系统中的所有节点都应用相同的标准来选择历史交易记录,那么系统的所有节点最终会在同一版本的历史交易记录上达成一致。集体选择哪个版本的历史交易记录的过程通常被称为达成共识的过程。
根据创建交易所需的计算量来选择历史交易记录的设想,导致了以下两个标准的出现。
- 最长链标准,基于包含最多区块的区块链代表付出最多计算量的设想。用最长链标准很明显可剔除最短的那条链,然后此标准也不会产生一个明确的结果。区块链并不是一条笔直的链,有分支。分支代表了交易记录中各种有冲突的版本,但是基于最长链标准,所有节点都可以最终确定相同的历史交易记录。
- 最重链标准,每条链花费的计算量可以通过其添加的所有区块的难度级别来衡量,可以通过使用区块头包含的哈希难题的难易程度来计算得到。一条链积累的难度称为重量 。
说明
最长链标准
下图代表两个区块,每个区块都通过一个缩短的哈希值来标识。箭头表示将区块头连接到前一个区块的哈希引用。在这种初始情况下,所有节点都同意交易数据的这一历史记录,并努力使用另一个新的区块对现有链条进行扩展。
展示了在一个节点解决了一个新区块中的哈希难题,并将新区块发送给其他节点之后,大多数节点所维护区块链的数据结构。
上图所示系统中的节点努力通过提交新区块对现有区块链进行扩展。该新区块引用它的前一个区块的 哈希AB12 来标识自己。通常看来,由3个区块构成的区块链的数据结构只有一个版本。然而,通过网络发送一个新区块需要花费时间,并且会遇到各种各样的问题。由于消息传递的延迟,少数节点还没有收到 AB12区块。因此,它们仍然尝试扩展最初所示的链。最终,其中一个成功地解决了一个带有 DD01哈希值 的新区块中的哈希难题,并将其传递给其他节点。最终,大多数节点都接收了AB12区块 和 DD01区块。因此,大多数节点会维护下图所示的一个区块链数据结构,它由位于一个公共主链之上的两个分支组成。在这种情况下,最长链标准不会产生明确的结果,因为两条链(AB12→A397→33FF
和 DD01→A397→33FF
)一样长。
上图所示情况下,系统中的节点可以自由决定扩展主链的哪条分支。一些节点可能会努力寻找一个引用 AB12区块 作为前一个区块的新区块,而其他节点则会努力寻找一个引用 DD01区块 作为前一个区块的新区块。突然间,大多数节点接收到两个新的区块(BB11和CCC1),它们都引用AB12区块作为自身的前一个区块。如果两个节点几乎同时解完了哈希难题,这种情况就有可能出现。将这两个新的区块合并到区块链上之后就会产生一种包含3条链的数据结构,如下图所示。其中一条链只由3个区块组成,另外两条由4个区块组成。
用最长链标准很明显可剔除最短的那条链,也就是 DD01→A397→33FF
这条链。然而,最长链标准并不会产生一个明确的结果,因为仍有两条相同长度的链。因此,一些节点可能会努力寻找一个引用 BB11区块 作为前一个区块的新区块,而其他节点可能会努力寻找一个引用 CCC1区块 作为前一个区块的新区块。最终,一个引用 BB11区块 作为前一个区块的新区块出现,生成了如下图所示的区块链数据结构。该区块链数据结构中包含了许多相互冲突的链,但最长链标准产生了一个明确的结果,也就是 0101→BB11→AB12→A397→33FF
这条最长链。大多数节点以及最终系统的所有节点都将使用这条链来澄清与所有权相关的请求。大多数节点以及最终系统的所有节点都将努力通过寻找一个引用 0101区块 作为前一个区块的新区块来扩展这个分支。
结论:区块链数据结构实际上并不像一条笔直的链,看起来更像一棵树或一个柱状的仙人掌。树的分支代表了历史交易记录中的各种有冲突的版本,但是基于最长链标准,所有节点最终都可确定相同的历史交易记录。
由于其形状,区块链数据结构通常被称为树状数据结构。在区块链数据结构中,第一个区块(也就是最古老的区块)是没有前一个区块的,它通常被称为树状结构的 根。没有继承者的区块称为 叶,从根到叶的连接称为 路径。
最重链标准
如下图所示,最长的链(从根33FF到叶0101的链)的重量为5,而第二长的链(从根33FF到叶CCC1的链)的重量为6。因此,下图展示的区块链数据结构列举了采用最长链标准将导致节点选择一个不代表最多计算量的链的情况。
结论:动态地确定哈希难题的难度的区块链不能利用最长链标准,相反应该利用最重链标准。选择最重链的历史交易记录。在所有区块的难度相同的情况下,最长链与最重链相同,且最长链标准和最重链标准均可得到相同的结果。
在冲突的链中选择一条特定的链,并且将其确定为权威会带来以下结果:
- 孤块,区块链数据结构看起来像一棵树,它的分支代表了不同版本的历史交易记录。确定选择标准实际上意味着选择该树的一条路径,并将其设立为历史交易记录的权威版本。不属于权威版本的树状数据结构中的所有区块都会被节点所抛弃,这些被抛弃的块被称为孤儿块。例如上面几个图中的 DD01区块等;
- 重新收回奖励,孤块对于澄清所有权是无用的,所以它们对权威版本的链并没有贡献。因此,对创建并提交孤块的节点的奖励会被回收;
- 澄清所有权,只有那些属于权威链上的交易才会被认为是已经发生的交易,并且被用来澄清与所有权有关的请求。孤块不是集体选择的链的一部分,故它们记录的交易将不是历史交易记录的一部分。相反,它们记录的交易将被认为是从未发生过的,在澄清与所有权相关的请求时,这些记录也将被视为不存在;
- 重新处理交易,孤块中的交易数据会被重新放到节点的收信箱中,重新处理,然后再添加到区块链数据结构中,从而成为权威链历史交易记录的一部分;
- 不断增长的共同主干,采用一个选择权威链的标准并不总是会产生一个明确的结果。有可能存在不止一条最长链。因此,即使选择标准产生了模糊的结果,一个不那么明确的共同主干也会产生冲突的版本。查看的区块越新,确定区块是否属于最长链就越难;
- 最终一致性,树状区块链数据结构的增长表现出一种随机性,由解决哈希难题的速度竞赛和通过网络传递信息的随机波动所决定的。发现新区块的节点确定哪条路径被扩展,那些区块被抛弃。随时间,权威链中已添加的区块的确定性会不断增加,并且最终会添加更多的区块,被称为最终一致性;
- 健壮的抗操纵性,想操纵一个区块,攻击者需要重新解决区块的哈希难题,然后重新解决该区块之后所有区块的哈希难题,最后还需要赶上并且超过诚实节点所维护的权威链。试图建立一个包含欺诈性交易的尝试都会失败。结果是,权威链维护的历史交易记录抵抗操纵能力越来越强。
区块链被操纵的目标:把权威链中的一部分区块变成孤块,并且建立一个新的对攻击者有利的权威链
51%攻击指控制整个分布式系统的集体决策过程,旨在将现有权威链中的区块变成孤块,并建立一条包含对攻击发起者更有利的历史交易记录的新权威链。
51%攻击具有以下特点:
- 在经济上,操纵者试图通过改变历史交易记录来改变所有权的分配;
- 对于集体决策的系统,这些操纵者试图收集大多数节点的投票权利,以执行期望的结果;
- 从技术角度来看,任何操纵集体决策过程的企图都是在破坏系统的完整性;
- 对于分布式系统,试图至少建立一个隐藏的中心控制节点,从而改变系统的状态。
哈希难题的作用:
- 是使区块链数据结构不可更改的一种手段;
- 在达成有关历史交易记录的过程中,组成区块链的个体区块可以视为一种投票,而哈希难题可以被视为是一种选票,而哈希难题使得提交选票成本昂贵,从而使不诚实的选民无法参与投票;
- 区块链通过哈希难题将投票权和计算能力结合在一起,故任何试图控制大多数投票权的尝试,实际上意味着要收集整个点对点系统中大部分的计算能力;
区块链达成共识的可靠性依赖于这样一种假设,即没有一个人或组织能够获得或控制整个系统中的大部分计算能力。 参加投票的费用是解决哈希难题所必需付出的,一个节点将通过提交自己发现的新区块来获得奖励。
区块链的集体决策的特点:
- 所有节点都在相同的环境中运行,维护着分布式网络中的区块链数据结构,以及控制节点行为的区块链算法;
- 决策问题是在所有节点上选出相同的历史交易记录;
- 所有节点都在努力向区块链数据结构中添加新的有效区块以获得奖励使自身的利益最大化;
- 为了实现目标,节点会将它们发现的新块发送给其他所有的节点,以让它们检查这一新区块。因此,网络中的每个节点都参与到维护一个统一的账本的工作当中;
- 所有节点都使用相同的标准来选择历史交易记录。
# 2.13 为诚信买单
奖励和惩罚作为两种使系统中的节点能够有序验证交易的力量,可以使节点选出聚集最多计算量的权威链,是通过交易手续费和区块奖励来实现的。这种机制在所有区块链中都是通用的。
给予节点验证和添加添加新区块奖励的支付工具的影响:
- 对系统完备性的影响,用于补偿维护系统完备性的支付工具直接影响到区块链本身的可信度;
- 对系统开放度的影响,支付工具引入的限制性会抵消系统的开放性(限制性可以想象仅在特定国家可用的支付工具);
- 对系统分布式特征的影响,如果由一个中心化的机构来控制和管理用于补偿节点的支付工具,会抵消整个系统的分布式特性;
- 对系统设计哲学的影响,一个分布式点对点系统如果因为使用一种补偿节点的支付工具而抵消了其主要的价值,怎么能被认为是可信的,这就产生了矛盾,即设计哲学问题。
用于补偿节点的支付工具的理想属性:
- 以数字形式提供;否则,它就不能被包含在区块链中;
- 在现实世界中被视为一种支付工具;否则,节点就不能利用它们的收入在现实世界中支付为维护系统完备性而产生的账单;
- 在所有国家均被接受为一种支付手段;否则,将对生活在那些不接受它作为支付工具的国家的节点失去吸引力;
- 不受资本流动的限制:否则,它从其他节点获得的奖励将受到限制;
- 具有稳定的价值;否则,节点就会面临丧失购买力的经济风险;
- 是值得信赖的;否则,它会削弱区块链创造信任的能力;
- 不受任何一个组织控制;否则,它会与区块链的分布式特性发生严重冲突。
比特币是一个纯粹的分布式点对点系统,管理着一种新型 "数字代币" 的所有权,反过来又可被用来补偿系统的节点,以验证和增加区块链数据结构中的新区块。这种特殊的代币将其应用目标与一种新型的代币所有权的管理联系起来,作为一个值得信赖的支付工具来补偿其系统贡献者。
# 2.14 将所有"碎片"整合在一起
区块链中的技术概念,及其作用和类比:
概念 | 作用 | 类比 |
---|---|---|
交易数据 | 描述所有权的转让 | 银行转账记录 |
交易历史 | 证明所有权的当前状态 | 银行账户中的余额 |
哈希值 | 独特地识别任何类型的数据 | 人类指纹 |
非对称加密技术 | 加密和解密数据 | 带锁的公共邮箱 |
电子签名 | 声明与交易数据内容一致 | 手写签名 |
哈希引用 | 当引用的数据被更改时,哈希引用将变得无效 | 衣帽间用于标识衣服的小票 |
对更改敏感的数据结构 | 以某种方式存储数据,使任何操纵立即显露出来 | 口袋里装着衣帽间小票的夹克衫 |
哈希难题 | 强加一项需付出昂贵计算成本的任务 | 通过反复试验打开一个数字密码锁 |
区块链数据结构 | 以一种对更改敏感的方式存储交易数据和维护它们的顺序 | 有图书借阅卡的图书馆 |
不可更改性 | 使对历史交易记录的更改成为不可能的事情 | 试图建立一个伪造的家族史 |
分布式点对点网络 | 在网络的所有节点之间共享历史交易记录 | 独立见证人 |
消息传递 | 确保系统中的所有节点最终接收到所有信息 | 在人与人之间传播八卦 |
区块链算法 | 确保只有有效的交易数据才会被采用 | 采取胡萝卜加大棒的方法约束合约双方 |
分布式共识 | 确保所有节点使用相同的历史交易记录 | 游客在公园随意踩踏出的小径 |
补偿 | 给节点一个维护系统完备性的动力 | 为员工提供面包作为工资的面包店 |
区块链的应用层和实现层中的功能特征与非功能特征:
层 | 功能性特征 | 非功能性特征 |
---|---|---|
应用层 | 明确所有权 转让所有权 | 高抗操纵 可用性 可靠性 开放性 匿名性 安全性 |
实现层 | 所有权逻辑 交易安全性 交易处理逻辑 存储逻辑 一致性逻辑 完全分布式点对点系统架构 | 弹性 系统最终一致性 系统完备性 |
区块链有以下两个应用目标:
- 明确所有权,明确所有权意味着回答构成所有权的主要问题,即:谁拥有,拥有多少,拥有什么和什么时候拥有的?
- 转移所有权,转移所有权意味着改变所有权的当前状态。就这一作用而言,区块链可以让所有者将他们的财产转让给其他人。因此,它回答了另一个证明所有权的重要问题:谁在什么时候获得了谁的所有权?
区块链的非功能性特征:
- 高可用性,区块链不会停机,甚至没有一个可将它关闭的按钮。
- 抗操纵,没有人能单独决定区块链中交易数据的内容,也没有人可以关闭整个系统。
- 可靠性,区块链以良好的机制来实现它的功能。
- 开放性,区块链并不会拒绝某些用户使用其服务,相反,它对所有人都开放。
- 匿名性,区块链能准确地识别其用户,但它既不维护也不揭示用户在真实世界中的身份。
- 安全性,区块链在个人交易级层面以及整个系统层面都是安全的。就个人层面而言,区块链能确保所有权只保留在合法所有者的手中。从整个系统层面来看,区块链保护所有使用者的所有权不受操纵、伪造、双重支出和未经授权的访问。
- 系统弹性,即使在开放的网络中,区块链也能正确地明确和转移所有权。区块链能够抵抗广泛的针对所有权的攻击,比如伪造、双花以及通过伪装成别人来获取财产。
- 最终一致性,区块链不会始终产生一致的结果。相反,获得一致结果的机会将随着时间的推移而增加,最终会使整个系统具有一致性。
- 保持系统完备性,区块链可保持数据的一致性,并确保单个交易和交易数据的整个历史记录的安全性。
区块链内部的功能性特征可分为以下几个部分:
- 所有权逻辑,决定了所有权是如何被明确和转移的。区块链利用单个交易数据来描述所有权的转移,并维护整个交易数据以明确所有权。
- 交易安全性,确保了只有合法的所有者才能够访问并将其所有权转移到另一个账户。
- 交易处理逻辑,确保只有有效的交易数据才会被添加到交易数据的历史记录当中。系统中的每一个节点都可以对交易数据进行验证。
- 存储逻辑,有效交易处理完之后会被添加到交易数据的整个历史记录当中。整个系统的完备性和它实现其明确和转移所有权的能力依赖于交易数据存储的完备性。因此,存储逻辑是通过维护交易数据的整个历史记录来实现的,并通过使数据变更成本变得极其昂贵的设计来保护它们不被操纵或伪造。
- 点对点架构,系统架构方式决定了节点是如何相互关联并相互连接的。
- 一致性逻辑,由于分布式系统中的所有节点都独立地维护历史交易记录,因此它们所维护账本的内容可能因延迟或通过网络传递消息的其他不利因素而有所不同。因此,区块链的数据存储实际上形成了一个树状数据结构,其中每个分支代表了交易历史记录的一个版本。
# 三:区块链的局限以及如何克服这些局限
# 3.1 了解区块链的缺陷
区块链最主要的技术缺陷包括以下几点:
- 缺乏隐私,所有交易细节,比如货物数量以及转账金额、涉及的账户,还有转账时间等信息所有人都可以查到,因此缺乏隐私成为了区块链的一个缺陷;
- 安全模式,账户私钥被故意泄露则这个独立账户的安全性无法保证。除了使用非对称加密,区块链未采用其他安全措施能防止用户丢失或泄露私钥;
- 延展性的限制,在新区块添加时,需要解答哈希难题,采用这一措施的代价就是交易处理速度的下降,在高处理速度、高延展性、以及高吞吐量环境的应用中,限制了延展性;
- 高成本,工作量成本极高,包括电力时间的投入。成本高低取决于哈希难题的难度;
- 隐藏的中心化属性,原本数量庞大且成员多样化的节点会演变为小部分由企业控制的节点。因为他们能够获得专业硬件而持有大量的算力,最终会垄断系统,构成了潜在的中心化属性;
- 缺乏灵活性,区块链开始运作以后没有有效方法来改变或者升级其主要部件。由于区块链的不可更改性,会使得难以修复区块链的漏洞或者对区块链协议进行调整;
- 临界值,达到一定节点规模来防止51%算力攻击的出现,是区块链必须考虑的问题。
区块链最主要的非技术缺陷包括以下两点:
- 缺乏法律认可
- 缺乏用户接受度
# 3.2 重构区块链
区块链的主要冲突:
- 透明度与隐私(读取区块链数据的操作),一方面需要透明度来明确所有权,另一方面系统用户又需要有一定的隐私;
- 安全与速度(向区块链写入数据的操作),哈希难题的解决减慢了新交易数据被添加到区块链中的速度。一方面需要根据耗时的工作量证明算法来确保历史交易记录的安全,另一方面又面临着用户对速度及系统可扩展性的要求。
解决冲突
区块链的技术局限及其产生原因:
技术局限 | 冲突 | 基本功能 |
---|---|---|
缺乏隐私 | 透明度与隐私 | 读取交易数据的历史记录 |
缺乏可扩展性 | 安全性与速度 | 将交易数据写人历史记录当中 |
解决冲突:可以选择找一个平衡所有冲突的折中方案,也可以选择让其中一方以压倒性的优势削弱另一方从而解决冲突。区块链支持透明度以及安全性,从而削弱了隐私与速度。有其他方法可解决这些冲突,如下:
- 在透明度与隐私之间做出选择,实际上意味着决定向谁授予查看交易数据的权限。如果仅考虑授予读取权限的极端情况,则有两种选择:将读取权限授予所有人,或者授予有限的节点或用户。人们可以根据哪些用户或节点有权读取区块链数据或创建新交易来区分以下类型的区块链。
- 向所有用户或节点授予读取权限以及创建新区块权限的为公有链。
- 向预先选定的一组用户或节点授予有限读取权限以及创建新区块权限的为私有链。
- 在安全性与速度之间做出选择,实际上就意味着决定向谁授予写入交易数据的权限。如果仅考虑授予写入权限的极端情况,则有两种选择:将写入权限授予所有人,或者向预先选定的一组被确定可信任的用户或节点授予写入权限。基于写入权限的授予情况来区分以下两种类型的区块链。
- 向所有人授予写入权限的无须许可的区块链。每个用户或节点都可以验证交易,向并向区块链添加新区块。
- 仅向预先选定被确定为可信任的一组数量有限的节点或用户授予写入权限的许可区块链。因此,只有具有写入权限的一组节点才能够验证交易,并参与分布式系统的共识过程。
4种类型的区块链:
以及上述所有各讲中讨论的区块链都是公有无须许可的区块链。对于读取或创建交易权限的任何限制都将产生其中一种类型的区块链。私有链有较高的处理速度,以及对交易数据进行保密的能力,最适合用于商业环境中。
影响:限制历史交易记录的读取或写入权限会对区块链以下几个方面的特征产生影响。
- 点对点架构,单个节点就其贡献的资源而言可能会有所不同,但系统中的所有节点都具有相同的功能和责任。然而,如上所述的4种类型的区块链在向组成系统的节点授予读取及创建交易权限时却存在不同。如果节点在读取或创建交易时的能力不同,那么它们就不再平等。因此,对系统的读取及写入权限进行限制,似乎违反了点对点系统的一大重要特性。
- 分布式性质,不存在任何类型的中央控制或协调机构,常被认为是分布式系统的一个主要特征。然而,如上所述的4种不同类型区块链的出现却基于向预先选定的一组节点或用户授予读取或写入权限,而不是向所有人都授予这些权限。谁来决定授予或拒绝授予系统的读取或写入权限呢?谁又来制定授予或拒绝授予读取及写入权限的规则呢?读写权限分配的规则不是由纯粹的分布式系统来管理和执行的,那么系统就将拥有一个中央要素,这反过来又会与区块链的分布式特性产生矛盾。这就意味着,要么存在一个隐藏的中央控制机构,要么系统成为所有拥有有限权限节点组成的中心化系统,但同时又在内部使用分布式的组织方式。在这两种情况下,整个系统就十分类似于由分布式与中心化要素组成的一个混合系统。
- 用途,对读取及写入权限设限不仅改变了分布式点对点系统的构成属性,还改变了节点的可信度。如果对能够向区块链写入数据的节点的可信度进行评估,那么最终系统中可能不包括可信度未知的节点。因此,可以得出结论:这样的系统本身不再需要区块链在不可信赖的环境中创建信任的这一能力了。由于以下原因,区块链即使在由数量已知、可靠性及可信度也大概已知的节点组成的系统中也能创造价值。首先,由于技术故障,此类系统中的节点数量可能会有所变化。其次,每个分布式系统都会面临一些可让单独消息层面的通信变得不可靠的网络问题。最后,即使通过适应过程也不能保证节点百分之百可信。此外,由于技术故障,即使可信节点也可能会得出错误的结果。
# 四:如何使用区块链,区块链技术的总结及展望
# 4.1 如何使用区块链
区块链是一种分布式点对点数据存储系统,具有以下特征:
- 不可更改
- 仅可追加数据
- 有序
- 具有时间戳
- 开放和透明
- 安全(识别、认证和授权)
- 一致性
根据区块链的特征和它能够存储各种数据的特点,可以总结出以下通用的应用场景:
- 存在证明,区块链的这种用途主要用来存储数据,唯一的目标就是证明数据的存在。因此,这种应用没有利用顺序和区块链的时间戳特征。具体的应用包括专利注册(如专利中的品牌名称的保存、执照编码、互联网中电子邮箱地址的保存);
- 非存在证明,为了证明特定的账目或物品不存在(如用于投诉记录、罚款或判决的保存);
- 时间证明,区块链的时间戳特征,可以用于追踪事件发生的顺序,如生活中快递追踪、支付追踪、竞拍开始和结束流程的追踪和预测管理等场景;
- 顺序证明,借助区块链中区块有顺序的特征,可以用来追踪事件发生的顺序而非具体的时间。比如,追踪快递的邮寄,审计公开招标流程和公证服务。顺序证明在资源按照同一标准进行分配时尤其重要,如大学证书、专利号和版权号等;
- 身份证明,用来存储证明某人身份或者某事已发生的数据,包括对人、动物进行数字身份验证;
- 作者证明,用到了区块链可证明特定的人或机构在其上添加了特定的数据这一功能。区块链之所以能够做到这一点,是因为它可以通过数字指纹来验证数据,并且提供识别、验证和授权等基本功能。识别和验证对核实作者的信息至关重要。授权的存在是为了防止没有权限的人在区块链上添加数据。这方面的应用包括电子出版、追踪文档内容的变化和版权保护;
- 所有权证明,用于认证和管理所有权。这种功能的实现需要依赖之前提到的所有模式(如存在证明、顺序证明、身份证明、作者证明)和3个基本的安全要素:识别、验证和授权。可应用于需管理所有权的场景,如房产证、公司股份、证券或 "加密货币"。
特定的使用场景:
- 加密货币:管理数字资产的所有权;
- 微支付:使用传统的支付方式进行小额支付的成本很高;
- 数字资产:管理数字资产所有权的转移。这些数字资产具有特定的价值,或在现实世界中代表具有价值的商品;
- 数字身份:根据独特的数字签名来验证身份从而进行授权;
- 公证类服务:数字化地存储和验证文件或合同的所有权;
- 合规和审计:审计个人或组织的商业活动,以合规的方式进行追踪;
- 税收:根据交易或者所有权来收税,减少逃税或双重收税;
- 投票:创建选举、分配选票并进行投票;
- 档案管理:比如创建和收集就医记录。
# 4.2 总结与展望
区块链涉及软件工程和计算机科学中的多种技术,如哈希引用,数据结构,数据存储,加密学,网络结构,点对点通信,哈希难题等。 要提高区块链的扩展性,需要集中研究网络传输效率、存储、数据的使用和共识算法。闪电网络 和 跨链 是两种可行的扩展方法,能够让交易时间减少到商家可接受的范围内。
区块链重要概念:
- 使用权:对区块链的读写限制可催生出对各种区块链版本的需求。对数据读取的限制演化出公有链和私有链,而对写入数据权限的限制又诞生出了开放和不开放的区块链。
- 隐私:私有链限制读取功能,任何人都不能凭借历史交易记录来获得对交易数据的控制权。其他保护隐私的方法包括把隐私数据存储在专业保护隐私的分布式计算平台上。另外,零知识证明可以不用获取所有的数据就能证明声明的正确性(比如证明一种数据类商品的所有权)。这种技术使用在区块链上可以让任何人不用读取所有的交易细节就可以证实与所有权相关的声明。
- 共识:工作量证明通过计算机计算提供一些基本的衡量标准来选择一种交易数据的历史记录,解决不同历史版本的冲突问题。但是这种依据计算能力的方式让很多计算机科学家不满,他们认为计算能力是可以被攻破的。因此,区块链演进出了多种不同的共识算法。股权证明(POS) 和 股权授权证明(DPOS) 就是另外两种共识算法,具体操作原理是把投票权和商品的所有权或者移交权联系起来。另外一些 "另类" 的共识算法包括 Paxos 和 Raft。这些算法在区块链诞生前就存在了。工作量证明(POW) 之外的其他共识算法的问题在于它们概念上非常复杂,难以证实。如果这些算法存在理论上的漏洞,就会导致区块链系统中 "腐败" 的发生,从而影响区块链创造出的信任。
- 交易:事实上,交易本身就是一个自治合约。交易本身包含一切实现所有权转移所需的信息。这种理念促进了智能合约的发展,并且让人们尝试通过区块链来执行智能合约。与交易数据相似,智能合约是使用机器可以读取的语言来描述各参与方意志的方法。但是与简单的交易数据不同,智能合约针对不同的物体、主题、行为和条件,对如何实现所有权转移的操作非常灵活。从技术角度而言,智能合约就是用特定编程语言写在区块链里的自治计算机程序。写入智能合约后,区块链可通过执行合约中的代码来实现拓展。这种拓展实现了区块链从存储数据的分布式系统到执行智能合约的虚拟机的转变。能够在区块链上运行代码意味着可以在上面构建应用,而不只是简单地用来存储数据。智能合约的灵活性,使它的使用范围变得非常广:如定期支付房租、借贷、还贷,以及在出现危害时支付保险赔偿。所以未来几年智能合约将是最重要的一个区块链发展方向。
- 存储数据:可以通过交易数据或历史交易数据来管理所有权。前者多用来管理少量数据,后者多用在有智能合约的场景中,整个系统包含多种随机信息,如账户余额、保险合同,或者代表物理世界物体的数据。这样一来,整个系统的状态都被存储在历史交易数据当中,并且可通过智能合约来实现状态转变。
- 数据结构:区块链的数据结构不是由区块构成的一条直线;相反,区块链的数据结构实际上是树状的,不同的分支代表交易数据的不同历史版本。区块链算法的主要挑战就在于让分布式系统的节点挑选一条分支来作为权威链。另外一种存储交易数据的方法就是使用有向无环图表来展示这个树状的数据结构。
区块链的主要发展方向:
- 去中介化
- 自动化,区块链的使用场景越多,越是能够通过点到点之间的自动互动来替代中介之间的手动操作;
- 标准化,进一步加强交易的标准化;
- 流水线处理,商业流程变得更加透明和流水线化;
- 提高处理速度
- 降低成本
- 信任协议和共识,区块链把人类对人类组织的信任转移到对计算机共识的信任;
- 让信任成为一种商品,自动化和标准化不仅减少了多个行业的生产时间和成本,同样让过去消费者承担不起的商品走进千家万户。
- 提高技术意识,区块链是一种高度复杂的技术,它借助极难篡改的数据结构和共识算法来解决信任问题,实现点对点系统的一致性。
潜在劣势:
- 缺少隐私性,公有链不隐藏交易数据,任何人都可以读取历史交易数据。
- 缺少责任制,去中介化会导致个人责任的缺失。
- 减少就业,自动化和标准化不仅改变了商品制造流程,降低了制造成本,同样也冲击了就业市场。
- 再中介化,区块链的复杂性和法律是否认可等问题让很多人和组织对其望而却步,这不利于实现去中介化。
# 五:参考文献
- 《区块链基础知识25讲 - 丹尼尔·德雷舍》