区块链(Bitcoin)简介

前言

10月快结束了。这个月一直在调试hyperledger sawtooth,坑太多了,填都填不过来。最近也需要在部门做这方面的介绍,所以索性把这篇自己对区块链的理解文章贴上来凑数。
文章主要还是基于bitcoin来分析,最核心的材料是中本聪写的<BitCoin: A Peer-to-Peer Electronic Cash System>。看过bitcoin,自己工作中用的是sawtooth,本质原理上区块链都是一致的,核心区别是consensus算法。
这篇文章是briefly的介绍。想说明白blockchain设计初衷,解释blockchain最初想解决的痛点。希望可以区分虚拟的币和区块链之间的关系。

为什么需要区块链?

当前互联网上的交易(购物/购票等消费)需要依赖可信的第三方支付机构(支付宝,Paypal等)。
这种支付模式在大多数情况下都挺好用的,它以信任的第三方为基础。因为基于的是中心化的模型,所以天生就有某些缺点。比如:

A. Non-reversible transactions.

Bitcoin强调要做到交易不可撤销。我搜索了国外刷信用卡交易的一些rules。他们为了保护消费者,在刷信用卡交易过程中如果发生争议,可以通过charge back来请求撤销交易。且消费者请求charge back时可以绕过商家,直接找支付机构,提供相关理由和证据。支付机构仲裁后便会把钱直接退给消费者的。
在正常情况下,这种操作可以一定程度上保护消费者。但它很容易被人恶意利用,这对商户来说就是潜在的交易风险。
在这里插入图片描述

B. Increases transaction costs.

增加交易成本。以支付宝为例,不论使用APP支付还是当面付,商户都有一个支付费率的问题。举个贴近生活的例子,你在淘宝中购买商品,在某些店家如果选择信用卡支付,买家需要额外承担一个信用卡的费率。这和支付宝给商家定的费率是一个的道理,会在无形中增加了交易成本。
在这里插入图片描述
在这里插入图片描述

C. Limiting the minimum transaction size.

限制交易最低金额。这个和支付费率有关,从前两幅图的支付费率看,目前支付宝并没有限制交易最低金额,但它事实上有能力去做这个。先以银行转账为例说明这个问题。比如银行之间跨行转账会收取转账费,最低要求2块/笔。如果你转账1块,还得额外再支付2块转账费。所以这直接限制了小额转账的发生。类似的,假如某个支付工具限制最低交易费率为0.1元/笔。那基本限制了0.1元以下商品的交易,会卖一件赔一件,甚至0.2或者0.5元的商品都会绝迹,因为这个交易费率会占掉小额商品利润的大头!因为这个原因,现实中肯定也没人会去跨行转账1块钱,怎么也得大几百起步。
在这里插入图片描述

D. Relay on financial institutions to provide stable service

依赖支付工具提供稳定的服务。正常情况下支付工具都能稳定工作,但外界的因素就无法保障了。比如下图蓝翔毕业生KO支付宝。而且这种模型造成的后果一般都比较严重,比如商户直接不能进行交易,或者账户信息不能同步。
在这里插入图片描述

为了解决上述传统中心化支付系统中的问题,“中本聪”提出了一种peer-to-peer的电子支付系统,Bitcoin。也就是说,bitcoin的诞生是想通过P2P的模式来解决现在这种中心化支付模式中的问题,而不是专门给大家挖矿的。甚至于有些区块链根本都不需要币,比如我最近用的sawtooth。所以啊,懂点技术可以防身啊,不容易被传销大妈忽悠去炒币。。。

2. Peer-to-Peer支付系统(blockchain)的实现

虽然blockchain把中心化的支付模式变成了P2P的模式,但本质仍然是电子支付。一般电子支付过程中都需要解决以下问题:1.验证 2.安全 3.历史记录。
Bitcoin的诞生,意味着在 p2p模式下找到了解决了上述问题的方法。

2.1 Transactions

Bitcoin使用数字签名来解决信任问题。数字签名使用public key很容易就能验证transaction的真实性。具体过程如下:
Owner transfers coin to next时会把前一次的交易以及next owner的public key进行hash算出摘要。然后current owner对这个摘要进行签名,最后把这个签名添加到transaction的末尾发送给next owner。Next owner收到transaction便可以用前一个owner的public key来验证本次交易的真实性。
在这里插入图片描述

2.2 Double-spending

数字货币(或电子支付)除了验证真实性,还需要解决double-spending的问题。
因为数字货币(电子支付)传输内容是数字信息,所以它更容易被复制或者伪造。传统的中心化支付模式是因为所有交易都需要经过支付机构,所以支付机构有能力根据历史交易等信息来解决double-spending的问题。
但如果是P2P的支付系统,因为没有中心化的支付机构,所以要解决double-spending的问题必须想办法记录下所有交易,并且需要让大多数node使用同一套交易历史记录。
要达到这个目标,那所有交易都应该publicly announced,如果是合法的,那么大多数node都会把这个block添加到chain中,让所有node都拥有相同的交易信息记录,并且保证block的order也是一样的。在这个系统中,block与block之间连成一条交易记录的chain,并且这个chain会随着交易不断进行而增长,这就是blockchain。
PS: double-spending的问题和中心化或者去中心化的模式无关。它是由于数字信息更容易产生或者被复制。比如群发的垃圾邮件,发送给所有接收者的内容是一样的,但接收者不一样,这就是个典型的double-spending问题。Bitcoin解决double-spending就是参考了处理垃圾邮件的办法。

2.3 How to keep order?(timestamp server)

Bitcoin使用Timestap来保证block的顺序。Timestamp由timestamp server提供。
一个block包含一组交易数据,bitcoin会将这个block加上timestamp进行hash。
这使得block被破解的难度加大。因为要产生相同的哈希,除了知道交易内容外,还需要保证时时间也一致。
一个合法的timestamp需要保证其值大于blockchain中,前11个block的timestamp里的中位数,且小于network-adjust time + 2 hours。
所谓network-adjust time是,所有和你连接节点返回给你的UTC里的中位数。节点之间建立连接时会获取对方的UTC,本地会算出它和本地UTC之前的offset,并保存。所以,最终本地可以算出所有连接节点里的UTC中位数offset。这个中位数offset + local UTC就是network adjust time。不过这个offset不能超过70 min,也就是network adjust time的调整范围不能超过70 min。
这里取中位数而非平均值是为了避免极值带来的影响。不过Bitcoin的timestamp依然算不上精准,精度只有1~2小时。

2.4 Who can add a block?(Proof-of-Work)

Timestamp也只是保证block能按照时间先后顺序链接起来。还需要确定由哪个node(timestamp server)来添加这个block,否则所有node都同时添加block的blockchain会出问题。Node的选择由PoW算法来决定。
Bitcoin的PoW算法参考了,https://en.wikipedia.org/wiki/Hashcash
Hashcash的原理是:在邮件正文前加一个hashcash stamp的header。这个hashcash stamp需要满足一定的规则,比如前20bit必须是0。发送方为了能算出符合要求的stamp必须通过穷举法来暴力破解。所以只要发送方发送的邮件header前由这个stamp,就意味着发送方投入了CPU time去做这个事情,也就是stamp是Proof of Work。
因为垃圾邮件发送者的商业模式是以极低的成本发送一封邮件,只要增加每封垃圾邮件的发送成本,发送者就无利可图了。
在这里插入图片描述
上图就是Hashcash的header细节。Bits记录header的hash值中前导0的个数,这个例子是20,表示hash值的前20 bit必须是0;Date记录邮件发送时间;Resource记录接收者的邮箱;rand是随机数;counter是每进行一次hash运行+1,直到找到合规的hash值。
对每个接受者来说,邮箱是唯一的。所以发给不同接收这的垃圾邮件都要重新计算这个hash值。并且header中还用日期来指明邮件的发送时间。所以同样的邮件在不同时间发送给同一个接收者也需要重新计算hash值。这就提高了每封垃圾邮件的发送成本。
在发送邮件之前,发送者先根据header内容计算出hash值。如果hash的前20 bit都是0,那么这个hash值就是合规的(换句话说header的内容也是合规的)。如果不是,那么counter +1之后继续运算hash,如此往复直到找到合规的hash(header)。
如果bits是20,采用的是160bit的SHA1算法,那么total的hash值有2160个,符合要求的hash值由2140个。所以找到符合要求的hash的概率是1/220,大约计算一百万次可以找到合规的hash和header。对现在的PC来说,一百万次hash运算大约需要花费1秒钟。普通用户可以接受这个时间,但对于需要发送大量垃圾邮件者来说,这个成本就提高了。
Bitcoin的PoW类似于Hashcash,但还是由区别。Hashcash中通过rnd和counter来猜hash值,Bitcoin中只用一个nonce。如果hash没有猜中,nonce +1后进行下一轮hash运算。合规的hash值由网络中所有node共享的target来指定。这个target是一个前导为指定个数0的hash值中的最大值。比如要求前导两个0,target就是0x00FFFFxxxx,要求前导6个0,target就是0x000000FFFFxxxx。由于硬件的发展等原因,整个网络的算力是动态调整的。所以Bitcoin为了控制网络中block的添加速度,需要动态调整target,也就是调整target前导0的个数。通过控制0的个数,hash计算难度就会成指数倍的变化。比如Bitcoin初始化时,要求前hash的前32bit为0。到了2017年8月,已经变成前72bit为0。
由于只有猜中了hash值后,nonce才不会变,否则nonce会一直累加,所以nonce也等于CPU的工作量证明。
在这里插入图片描述
并且这个nonce值会添加到block中。假如有恶意者想修改block中的内容,他必须重新计算这个hash值,而因为每个block都把之前的block hash include进来,所以想修改一个历史block,除了重新计算这个block本身,还需要计算这个block之后的所有block的hash。

扫描二维码关注公众号,回复: 3920592 查看本文章
2.5 Network

Bitcoin的运行过程如下:

  • 向网络中所有node广播一个新的transactions。
  • 每个node把收到的transactions打包到block中。
  • 每个node进行PoW运算来找到合规的hash值。
  • 找到hash值的node将block广播到所有node。
  • 接受到block的node开始验证transaction的合法性。
  • Node把这个block记到账本中,然后基于这个block的hash计算下个hash值。
2.5.1 Chain split

Chain还需要解决分叉的问题。
所有node都把最长的chain作为是正确的chain,并把产生的block加到这条chain上。但有可能在同一时间点,两个node都各自算出了一个block,然后它们被同时广播到Bitcoin网络中。这样一部分节点可能会收到这个block,另一部分会收到另外一个block。在这何种情况下,node就把先收到的block添加到chain上,并且也会暂时把另外一个block保存起来。如果最后,基于另一个block的chain变得更长了,那么node会切换到更长的那条chain上。
在这里插入图片描述

2.5.2 Transaction or block dropped

新的transaction也并不需要保证必须到达所有node。因为有可能在它到达其它node之前,它就已经被添加到block中了。同样,Block也可以drop。如果一个node没有收到一个block,那当它收到next block时很容易发现node缺少一个pre hash。此时,它会向网络请求这个丢失的block。

2.6 Incentive

为了鼓励node以honest的方式运行,Bitcoin设置了奖励规则。Block中的第一个transaction必须是 coinbase transaction或者叫generation transaction。它用来保存添加block成功的奖励,或者block中其他transaction支付的transaction fee,它由创建block的node自己创建。一个block可以包含一个或多个transactions,但第一个transaction必须是coinbase transaction。
Transaction中coin的流向如下图所示。transaction的支出来源于之前transaction的收入,所以每个transaction的output作为下一笔transaction的input。
在这里插入图片描述
一个transaction中可以创建多个output给不同的地址。为了避免double-spending的问题,每个output只能做一次input。
如果input的小于output,这是一个无效的transaction。但是input可以大于output,多余的作为transaction fee给添加block成功的那个node。上图中的transaction fee就是10K。
Node从Coin base中获取的coin有锁定期,必须等到添加100 block之后才能使用。这样做是为了解决blockchain fork问题。因为这个block在将来可能会因为分叉问题而被丢弃,如果block丢弃,coinbase的coin应当是无效的。

2.7 disk space

随着Block的不断添加,blockchain的size会不断增长,Bitcoin通过merkle tree来减轻磁盘存储空间的压力。
在这里插入图片描述
交易以hash值的方式保存在merkle tree中,Block Header中只存放一个root hash。删减历史交易信息并不会改变root hash。如图删除了tx0~2的交易。默克尔树的原理可以参考其他资料。

2.8 简便验证

根据默克尔树的特性,Bitcoin可以实现简便验证(这是比特钱包的基础)。一个节点可以删除交易信息,所以它没有办法自己做验证,它做验证需要连接到full node上(保存历史信息)。具体不展开分析了。

猜你喜欢

转载自blog.csdn.net/rockrockwu/article/details/83443180