文章目录
- 前言
- 区块链的结构
- 区块链的交易过程
- 区块链的共识机制
- 区块链交易存在的问题
- 特性总结
前言
上文《认识区块链》中可以知道区块链是一个通过各种加密算法、共识机制以及其他技术可以实现一个点对点的电子现金系统,从而达到去第三方的效果(通常称之为去中心化)。本文将从区块链的内部结构、交易的过程、如何对一笔交易达成共识以及交易存在的问题详细介绍区块链是如何运行的,并且在此过程中了解区块链更多的特性。
区块链的结构
在我们网购过程中,当一笔交易发生时,第三方交易平台(淘宝、京东)会对用户的账户进行资产增减操作并记录交易信息,这些数据都会存储在平台的数据库中。那么在区块链的世界中这些信息是怎样被记录的?
首先在区块链的世界中用户的账户密码是以私钥和公钥的形式存在。私钥是随机生成的,相当于密码,由用户自己掌握,如果私钥丢失后无法像平台一样找回密码,就相当于丢钱。而公钥则是曲线加密生成,相当于账户,在全网公开,用于账户之间的转账,二者存在数学验证关系,只能通过私钥单向的计算出公钥,所以通过私钥可以证实你是这个公钥的持有者。
当两个账户(公钥)发生交易后,交易记录最终会被打包到一个区块中,而区块会按照时间顺序连接成一条链,最终形成了逻辑上的区块链。
这里要提一下在区块链中是如何记录账户余额的。
在传统账户中余额就是一个账户的最终状态,改变余额直接在其基础上增加或减少即可。而在区块链中记录账户余额有个专业的名词 UTXO(Unspent Transaction Output ),翻译过来就是未花费的交易输出。
如何理解?如上图,当账户A像账户B转账30个BTC,那么账户A会将自己的余额作为交易的输入,而输出则是给账户B的30,剩余的20又作为输出转给了自己,那么账户B的余额则为未花费的交易输出30,账户A的余额则为未花费的交易输出20。
区块链的交易过程
在区块链中达成交易需要经过以下几个环节:
发起交易:如果A要向B转账,那么A会全网广播一条消息,这条信息中包括付款人A的账户地址、收款人B账户地址、付款人A的资金来源、转账的数量以及A的数字签名。
验证交易:在网络中的记账者们(矿工)在接收到交易消息后会验证付款人/收款人的地址是否存在、付款人A资金是否足够以及通过数字签名验证消息的真实性,验证通过后会将该交易消息记录下来,组成备用区块。
竞争记账权(挖矿):由于在网络中存在大量的记账者,且都会维护一本账单,那新的区块应该记录哪个记账者的账本呢?区块链中通过共识机制对此行为达到共识。
打包区块:当某个记账者竞争到记账权后,会将自己本地某一段时间的交易打包到区块,并让全网的记账者接受这个区块。
验证区块:当其他的记账者接收到区块后会验证几点来证明区块的真实有效。
- 验证父哈希是否与自己的匹配 。
- 验证区块中所记录的所有交易。
- 验证区块中的头哈希是否与账单匹配。
当区块被验证通过后,其他记账者们也就很遗憾的将这个区块同步到区块链上,并且基于新的区块进行记账。为什么遗憾呢?因为竞争到记账权的矿工会得到相应的奖励,比特币的网络中现在每挖一个区块会奖励6.25个BTC,也就是18万美元而已。
区块链的共识机制
说到共识,大家应该都知道Paxos、raft一致性算法,为了某个值达成一致,但是使用该算法的前提是不存在拜占庭将军问题(即网络中的节点都是可信的,不会发送假的消息,没有叛徒、作恶者),而在区块链的网络中这一情况是无法避免的,每个可以进行网络通信的节点都可以加入到区块链网络中,对于可能存在作恶者节点的网络,区块链中通过以下几点达到对同一本账本统一记账的的共识:
- 随机性:不能所有记账者都记账,随机选择记账者。
- 抗女巫攻击:提高作恶成本。
- 激励机制:激励遵守规则的记账者。
应用在区块链中的共识机制有 Pow(Proof of work)工作量证明、Pos(Proof of stake)权益证明、 DPos(Delegated Proof of stake)代理权益证明。
工作量证明中的随机性是通过哈希解谜选择一个记账者,哈希解谜需要大量的算力、电力,从而提供了作恶成本,当解谜工作完成后对工作者进行区块奖励和手续费奖励,代表有BTC、ETH1.0、莱特币。
权益证明中的随机性是通过VDF、VRF随机算法确保随机数的生成是有效的,通过锁定代币的数量以及时间来提高作恶成本,同样用区块奖励和手续费奖励激励记账者遵守规则,代表有ETH2.0。
代理权益证明与权益证明类似,不同的是代理权益证明通过锁定代币获得投票权,给其他节点投票,代表有EOS。
区块链交易存在的问题
在点对点交易的电子现金系统中很容易出现“双花”问题,什么“双花”?双花就是一份钱花了两次,在现实的现金世界中,我们线下交易是不会将一份钱同时花两次的,都是一手交钱一手交货,而在区块链中,付款者是可以同时发送两条合法的交易消息,一个向账户A转走所有余额,一个向账户B转走所有余额,因为还没被验证,所以可以这样做。由于网络是存在延迟、丢包现象,且有多个记账者,所以可能记账者Z收到了第一条消息,记账者X收到第二条消息,与此同时两个记账者几乎同时完成了哈希解谜的过程,获得了记账权,那么都会把自己的区块放在区块链上,这个时候就发生了分叉,也就是有两个区块接在了一个区块的后面。
但是,在区块链中最终只会承认一条链,解决该问题的办法就是少数服从多数,也叫最长链原则。由于更多的记账者会在认可的链上继续记账,所以在经过一段时间后,就会有一条链明显长于另一条,矿工们就会遵循最长链原则在长链上区块继续记账。
基于最长链原则以及挖矿的成本来讲,作恶者们也会放弃作恶的念头,不然辛辛苦苦浪费的算力、电力、时间挖出来的矿不被承认,得不偿失。
那对于被淘汰的链上的区块,其合法交易不也丢失了?对于这种情况,区块链中解决方案是:区块中的所有的交易在6个区块后才会被确认,也就是说在如果发生分叉了,账户上的资金以最长链的区块交易为准。
特性总结
首先根据分布式记账的本质:互相不信任,不希望任何一个个体单独控制账本,可以知道的是区块链是去中心化的。
根据公钥、地址公开透明,但是没有关联实际人的信息,所以说区块链是具有匿名性的。但是如果经过链上交易查询,定位分析到某个地址来源某个交易所,且进行了KYC认证,依然是可以查到相关信息,所以也可以说是伪匿名。
根据私钥完全由自己掌控,不需要第三方监管,所以说区块链是具有安全性的。但是如果私钥丢失了或者被盗取了,资产依然存在不安全性。
根据UTXO模型,记录的是交易过程而不是余额最终状态,我们可以沿着交易过程追溯,所以区块链是可溯源性的。但是如果在上链时数据就做假了,即使溯源了,也没有任何意义。
根据区块之间有哈希关联以及共识机制,我们知道要修改一个数据成本是非常高的,所以区块链是“难以篡改”的,而不是“不可被篡改”。