链客,专为开发者而生,有问必答!
此文章来自区块链技术社区,未经允许拒绝转载。
应用技术
算法加密1
比特币采用椭圆曲线加密算法(ECC)来产生公钥和私钥对,钱包地址即是公钥,私钥由用户保存。
比特币还用到哈希算法,Hash,就是把任意长度的输入通过散列算法变换成固定长度的数据信息摘要的函数。
区块链系统一般采用Hash算法来快速验证用户的身份。如果用户宣称对某个钱包具有所有权并且要改变钱包对应的信息(在比特币中,就是使用钱包中的余额),他必须提交一个请求,这个请求包括三个部分:钱包地址、明文请求、明文请求由钱包对应的私钥Hash过的签名。这个请求将被发送要区块链网络中。
相比非对称加密,Hash算法一般快几个数量级以上,从而使得验证的过程可以非常快速。常用Hash算法有MD5、SHA1、SHA256、SHA512、HMAC等。
点对点通信技术(Peer to Peer)
1、所有节点参与提供资源,包括带宽,存储空间和计算能力; 2、网络的分布式,增加了系统的防故障的健壮性,消除了单点故障;
分布式共识技术
理解分布式共识算法,需要理解下面两个名词,分别是“异步”和“共识”。
异步:此处的异步不同于通常技术术语中的异步调用的异步,而是指在一个分布式系统中,对消息的处理速度或者消息送达时间不做任何假设。此就是著名的FLP不可能性定理。
(FLP不可能性:(FLP Impossibility)是分布式领域中一个非常著名的定理。该定理的论文是由Fischer, Lynch and Patterson三位作者于1985年发表,之后该论文毫无疑问得获得了Dijkstra奖。FLP给出了一个令人吃惊的结论:在异步通信场景,即使只有一个进程失败,也没有任何算法能保证非失败进程达到一致性!)
共识:当多个主机通过异步通讯方式组成网络集群时,这个网络默认是不可靠的,那么在这些不可靠主机之间复制状态需要采取一种机制,以保证每个主机的状态最终达成相同一致性状态,即取得共识。
共识一致性算法
Paxos
Paxos是最初、最简单的分布式共识算法,是Leslie Lamport(也是LaTeX的实现者)于1990年提出的一种基于消息传递的一致性算法,是通过节点之间来回两次实现状态复制。
Paxos 算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。
Raft
Raft正是因为Paxos算法不容易理解和实现而提出的,Raft通过在系统中引入强势领导者来解决相互系统之间的协调问题,Raft是Paxos的简化版本。Paxos和Raft的区别在于选举的具体过程不同。
在Raft中,任何时候一个服务器可以扮演下面角色之一:a) Leader: 处理所有客户端交互、日志复制等,一般一次只有一个Leader; b) Follower: 类似选民,完全被动; c) Candidate候选人: 类似Proposer律师,可以被选为一个新的领导人。
Raft阶段分为两个,首先是选举过程,然后在选举出来的领导人带领进行正常操作,比如日志复制等。
PBFT
PBFT也称为拜占庭攻击容错算法。这里的拜占庭攻击,学术名称也称为主动型攻击,即它不是被动型攻击,不是简单的数据窃取和数据窃听,拜占庭攻击实现的是对消息的窃听,同时对消息进行恶意修改的目的。
是第一个比较广泛的BFT算法,在PBFT算法中至多可以容忍不超过系统全部节点的数量的三分之一拜占庭节点,即如果有超过三分之二的正常节点,系统就可以正常运转。
PBFT采取三阶段协议进行工作,包括pre-prepare、prepare和commit三个阶段。
POW
POW,全称为Proof of work,也即POW证明机制是基于工作量的,通过工作量的证明来实现系统的数据共识。
POW机制在比特币系统出现之前已经有研究人员在使用,主要是用在防垃圾邮件方面。
在比特币系统中POW证明机制决定了系统数据共识的来源方,也就是比特币系统中区块链的记账方的争夺,只需要向系统证明节点能够快速提供相应的工作量,节点就有向区块链中写入数据的权利。
POW证明机制基于的是数学上难以快速计算的问题,包括Hash碰撞问题、大数分解问题、椭圆曲线问题等。
由于这些数学上“难”的问题没有计算的捷径,每个节点只能通过大量的穷举才能找到对应的答案,这是POW证明机制的优点,同时也是POW证明机制的缺点。由于POW是一种赢者通吃的模式,就容易导致系统中弱小的参与方只是陪练的角色,同时也浪费了系统大量的资源,是一种不“绿色”的机制。
POW现在的主要实现系统是比特币系统和以太坊系统。
POS
POS,全称为Proof of Stake,由Quantum Mechanic于2011年在bitcointalk论坛上面提出。
POS需要系统中运行一种代币,使用这种代币来表示系统中各个节点的权利,节点拥有更多的代币就拥有更多的发言权、更多的责任,同时也获得更多的收益。POS证明机制称为股权证明机制,黑客要攻击系统需要获得足够多的系统代币,这和算力无关,POS机制比POW机制环保,这是它的优点,同时也是它的缺点所在。
POS机制的权利是由代币天然固定在系统中,使得POS系统运行产生的区块成本比POW低,所以POS代币的内在价值没有POW凝聚的价值大,所以人们对POS产生的代币多少持不信任态度。
POS机制一般和POW结合来使用,通过POS来控制POW工作量证明的难度,纯粹的POS机制实现比较困难。
以这些技术为基础,区块链实现了它去中心化的本质特征。
通过非对称密码技术,实现了区块链的历史可信;
通过点对点通信,实现了区块链网络的不可停止;
通过共识机制,实现了区块链网络链条的唯一、数据的唯一,保障了系统的正常运行。
共识
第一个概念,叫做 consensus,中文叫做共识,就是大家对一个事件,都 同意,不光是发生了事件 A 和 B,而且事件 A 先于事件 B 的顺序,都一致认同。
第二个概念,叫做 consensus finality,就是终极共识,意思就是我们在做 下一个决定之前,现有这个决定必须是终极的,不能改变的。
分叉
比特币采取的pow,原理就是在进行哈希碰撞, 那么在这个过程中,基本上会出现几个人同一时间,达到哈希碰撞的结果。那么 pow 其实是没有终结共识的,一旦出现共识分叉,比特币原则是最长链获胜。 那么短的分叉,就会被放弃。但是在理论上,如果有一帮人,决定就是将这个短 分叉持续下去,那么真正的两条链就分出来了,当然事实上大家没有这样做。
软硬分叉涉及到的问题是去中心的化的节点软件、协议、版本升级的问题(软硬分叉都是由于软件升级导致的问题,而不是共识分歧导致的)。
一开始,所有的节点运行同样的软件,遵循着同样的共识协议,维护着同样的一条链(blockchain)。这时,一部分节点升级到了新版本的软件,拥有了新的共识协议,这时会出现下面四种情况:新节点认为老节点发出的区块/交易合法;新节点认为老节点发出的区块/交易不合法;老节点认为新节点发出的区块/交易合法(没察觉变化);老节点认为新节点发出的区块/交易不合法(察觉出了变化);
注意:不合法会分为所有交易都不合法和部分交易不合法。这里为了简化模型,把有部分交易不合法的都归为交易不合法。实际情况是上面4种情况的组合,除此以外,我们还要增加一个维度,就是新节点和老节点的算力比,又分为下面两种类型:新节点算力>50%;新节点算力<50%;
注意,我们目前在网站上看到的各种关于软硬分叉的资料,都是基于新节点算力>50%的情况下讨论的。这里我们也只讨论新节点算力>50%。要注意,另一种情况下,即新节点算力<50%,情况会完全不一样。
软分叉是一个后来才出现的词,之前并没有。我们首先来讲一下什么是硬分叉(hard-fork)。
硬分叉(hard-fork)
硬分叉是指:当系统中出现了新版本的软件(或称协议),并且和前版本软件不能兼容,老节点无法接受新节点挖出的全部或部分区块(认为不合法),导致同时出现两条链。尽管新节点算力较大,比如99%的算力为新节点,1%的老节点依然会维护着不同的一条链,因为新节点产生的区块老节点实在是无法接受(尽管它知道网络上99%的节点都接受了),这称为硬分叉。注意:以上情况基于新节点算力>50%。
当必须硬分叉时,我们需要要求所有节点同时升级软件,未升级的节点将不能正常工作。如果有较多老节点不愿意升级,他们将工作在另外一条完全不一样的链上。
硬分叉产生的原因:新的节点要求比老的节点要宽松很多。
软分叉
软分叉是指:当系统中出现了新版本的软件(或称协议),并且和前版本软件不能兼容,新节点无法接受老节点挖出的全部或部分区块(认为不合法)。因为新节点算力较大,老节点挖出的区块将没有机会得到认可,新老双方从始至终都工作在同一条链上,这称为软分叉。注意:以上情况基于新节点算力>50%。
软分叉产生的原因:新的节点要求比老的节点要严格很多。
软硬分叉的优缺点
上面的定义可以看出软硬分叉有各自的优缺点,首先软分叉和硬分叉相比拥有下面的优点:软分叉总是只有一条链,没有分成两条链的风险;软分叉不要求所有节点同一时间升级,允许逐步升级,且并不影响软分叉过程中的系统稳定性和有效性;但软分叉也有缺点:软分叉的前提是老的节点总是能够接受新节点的区块,这就要求把系统设计成向前兼容(forward compatible);软分叉总是建立在对老节点进行欺骗的基础上,它让老节点没有察觉实际上已经发生的变化,某种程度上违背了单点完整验证的原则;
向前兼容(forward compatible)
向前兼容是非常有意思的术语,它不同于我们通常说的软件设计中向后兼容(backward compatible)的方式。它要求对于新可能出现的区块形态、共识机制有个预先的判断,并在老的系统中留有余地或后门。当新的节点被部署时,老的节点能够接受新节点所产生的区块。
那么,比特币里是如何实现向前兼容的?
答案是:非标准交易(non-standard transaction)。
比特币中设定了如下规则:将所有交易分类为:标准交易、非标准交易和非法(invalid)三种;如果发现非法交易,一律拒绝,如果该非法交易在某个区块中,则拒绝整个区块;在标准配置下,所有节点对非标准交易采取以下态度:a. 不转发 b. 不接受 c.不打包 对于已经进入区块的非标准交易采取以下态度:接受该区块;对区块中的所有交易,包含该非标准交易按既有规则进行验证;