前言
本篇文章希望以较短的篇幅和通俗易懂的比喻来向大家简单介绍一下比特币,学习比特币目的不是为了推荐大家投资,主要是为了学习它巧妙的设计思想,能够认识到它对社会所产生的深远影响。
一、什么是比特币?
起源:2008年,一位化名为中本聪的人,在一篇名为《比特币:一个点对点的电子现金系统》的论文中首先提出了比特币。中本聪结合以前的多个数字货币发明,如B-money和HashCash,创建了一个完全去中心化的电子现金系统,不依赖于通货保障或是结算交易验证保障的中央权威。
我们通常说的比特币可以从三个层面去理解,如下:
- 一种货币单位:
狭义的“比特币”代表了系统中的货币单位,用于储存和传输价值。用户主要通过互联网使用比特币系统。 - 一种约定协议:
比特币本身是一种协议,参与者通过互联网并基于这些协议构建了比特币系统。 - 一个货币系统:
比特币是由一系列概念和技术作为基础构建的数字货币生态系统。
定义:
比特币可以用来做一些传统货币做的事情,比如商品买卖、组织汇款等。比特币是完全虚拟的,具有安全、无国界的特性。比特币用户拥有的密钥能够证明他们在系统中的交易权,解密后可以使用比特币。
比特币是一个分布式的点对点网络系统,它没有“中央”服务器,也没有“中央”控制点。比特币是通过“挖矿”过程产生的,比特币中任何的参与者都是一个潜在的矿工,用他们的算力来验证和记录交易。每隔10分钟矿工找出一个能够被验证的区块,矿工将获得一定的比特币奖励。
二、如何使用比特币?
比特币的使用是凭借比特币客户端来完成的,客户端有很多种,用户可以自己选择一种客户端来创建自己的钱包以及支付其他账户比特币。
钱包里包含一个比特币地址(一个32位的字符串,比如:1Cdid9KFAaatwczBwBttQcwXYCpvK8h7FK),将地址分享给别人,别人可以通过你的地址将资金转到你的钱包里。整个转账过程别人只需要知道你的地址,这样的方式隐私性很高。当转账交易信息发出后将会被广播到全网,此时还是未确认状态,经过矿工的“开采”工作后加入到区块链中,在经过6个子区块以后状态才会变成“已确认”,才是被大家信任的。与此同时,钱包里的比特币地址还对应着一个私钥,这个私钥用来作为比特币所有权的唯一凭证,用户必须妥善保管自己的私钥,私钥一旦泄露,你的比特币资产也就不安全了。
三、比特币原理
了解比特币的原理先了解三概念
1.密码学原理:
1.1 非对称加密:
需要两个密钥:公开密钥(public key)和私有密钥(private key),简称公钥和私钥,它们是成对存在的。对于一段明文,公钥加密的数据只能用私钥解密,而通过私钥签名的数据只能用公钥验证。公钥需要公开,而私钥必须妥善保存。
1.2 散列哈希算法:
散列算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个二进制值称为哈希值。散列哈希算法的特点是针对不同的输入,其结果一定不同,要找到同一个输出的两个不同输入在计算上是不可能的。可以用来验证数据的完整性。
1.3 数字签名:
签名者使用自己的私钥对待发送的数据的摘要(哈希值)进行签名的结果就是数字签名。因为接受者可以用签名者的公钥进行验证,所以数字签名保证可以验证身份的真实性,具有不可抵赖的特点。
2.去中心化信任:
比特币系统是以去中心化信任为基础的。中心化的意思是中心决定了节点,所有节点必须依赖中心才能产生联系。而在一个去中心化的系统中是没有中心的,各个节点通过共识来维持正常的运转。我们将这种开放式、扁平化、平等性的系统现象或者结构称为去中心化。
举个通俗一点的例子,当我们在向另一个人转账的时候,通常是依赖记账机构(银行)进行记账,只有当记账机构对你的转账操作进行认可并且确认之后,本次转账操作才能成功,在转账过程中如果记账机构出现问题,你的这次转账将失败或者被篡改,你的转账是完全依赖于记账机构的。而在去中心化的货币系统中,全网每一个节点都维护了一个账本,该账本记录了全网所有的转账记录(类似流水账的记录方式),十分透明公正。你要给对方转账不需要等待记账机构的确认,只需要等待更新之后查询全网的总账本记录,查看自己转账是否到账,是否确认即可。
3.区块链技术
区块链是比特币的一个重要概念,它是一种包含分布式数据存储、点对点传输、共识机制、价目算法等计算机技术的新型技术模型。它本质上是一个去中心化的数据库,同时作为比特币的底层技术,其中包含了很多数据区块,它们使用密码学的方法让相互之间产生关联,每个区块包含了一段时间内的有效的网络交易信息,也包含了验证交易信息有效性的标记,该标记也用于生成下一个区块。
区块链技术也叫分布式总账技术,也就是我们上面的提到的总账本。再举个通俗的例子:
每一个支付中心后台都有一个数据库,数据库记录着每一笔交易记录,就像是一个总账本,只有数据库管理员有权修改这个总账本来进行记账,而普通用户无权参与记账工作。在区块链系统中,每个用户都可以参与到记账中来,区块链就是这个总账本。在某一个时间段内,系统会自动找出记账最好最快的用户,该用户会把这这段时间内的数据变化写到一个区块中,就像是写到账本中的一张账页上,并且把账页复制给系统中所有其他用户进行备份,系统每个时间段重复这样的流程,这样系统中每个节点都拥有了完整总账本的副本。区块与区块之间是通过密码学技术联系在一起保证了安全性和合法性。
四、比特币交易是怎么完成的?
下面用一个实际例子来介绍一下交易过程。
Alice想用比特币去Bob的咖啡店买一杯咖啡,在结账时他会在收银台看到一个Bob家的二维码,二维码包含了Bob的比特币地址、一杯咖啡的价格以及一些附加的信息,如下图所示。其实只有比特币地址是最关键的,其他信息是为了让交互更加友好,Alice拿出手机打开比特币客户端扫描这个二维码,然后输入应付的金额点击确认,支付请求发送,几秒钟后Bob将在他的商家客户端看到这笔交易并完成交易。
二维码信息
Alice作为比特币的持有者,授权将自己的比特币转账给Bob,而Bob也可以用相同的方式将比特币授权转给其他用户,后面的使用者也是用同样的方式花费比特币。通过这样的方式,交易就形成了链式结构,所以每一笔交易都可以一直往上追溯。
下面引用一张图来说明交易信息的结构。
交易
每一次花费行为就是记一笔账,包含了输入与输出,输入是其他人之前转给自己的比特币,而输出是对方或者自己的比特币地址。
Alice用在Joe那里换的0.1BTC去Bob的店里买了一杯,咖啡的价格是0.015。Joe转给Alice的那笔交易在使用之前是被Alice的私钥(前面创建前面时生成的,跟自己的地址对应)锁定的,必须使用Alice的密钥签名后才能使用,Alice使用自己的密钥解锁了该笔交易将比特币支付给Bob,同时锁定对他的那笔输出,需要Bob的密钥才能解锁使用。通常输入会大于输出,那是因为每笔交易包含了一笔交易费(输入-输出)。交易费是为了鼓励矿工将交易进行打包,矿工会将这个交易费作为自己酬劳一起写入区块。同时输出里也可能包含一笔输出的到自己的比特币,这样是为了找零,因为输入值不一定能刚好等于本次消费的数额。
五、如何证明和解锁交易?
私钥、公钥、比特币地址之间的关系在创建钱包时,用户有一个对应钱包地址的私钥,有了这个私钥可以通过椭圆曲线函数计算出对应公钥,公钥是公开给其他用户的,比特币地址则是公钥通过哈希函数计算出的结果,这两个计算都不具备可逆性。它们三者的关系如上图所示。
回到刚刚的例子中,思考两个问题:
- Alice发起的交易请求是如何被其他节点的用户验证其真实性的?
- Bob在使用时又是如何证明自己的持有权?
Alice在发起支付请求是会将消息用自己的私钥进行数字签名(数字签名的概念前面介绍了),这样就能保证该消息的发送者一定是Alice。Alice在包装这条消息的时候会向其中添加一个阻塞,该阻塞是写入了一个命题:给出一段文本,谁能给出用Bob的私钥进行签名的结果,那么就归谁所有。有了这个阻塞,除Bob外的其他用户自然是无法使用这笔比特币的,当Bob需要使用时只需要使用自己的私钥解答这个命题,给出证明结果即可。
六、什么是挖矿?
每条这样的交易生成后,起初的状态都是“未确认”,它会被广播到全网。“矿工”是一个系统中普通的节点,将会把一段时间内发生的交易按照约定规则进行打包,在被该矿工打包的区块中的第一笔交易是将本次“挖矿”的奖励转向矿工自己的比特币地址,奖励包括系统奖励和区块中所有交易中隐含的交易费。完成打包工作之后会将区块信息广播到全网中去,其他节点收到区块信息之后会对其进行验证,通过共识机制验证通过后会将区块加入到本地维护的区块链中去,下一个区块将基于这个区块进行计算,当全网中绝大多数节点完成确认且该区块的子孙区达到6个后,该区块中的交易状态就变为成了“已确认”,区块中包含交易(含“矿工”的奖励)才会被认可,这个过程就是“挖矿”。
然而挖矿并不是简单将交易打包那么简单,它需要提供所有交易进行密码学运算后的输出值,还需要提供工作量证明,这个工作量证明是通过解决一个具有一定难度的数学难题,极其消耗计算机资源,所以拥有越多的计算机资源,将更快的得出结果,反之更慢。尽管具有很大的挑战,在利益的驱使下,矿工们还是对“挖矿”乐此不疲,这也是比特币系统运行的驱动力所在。
当有一个矿工第一个宣布将这段时间的交易打包完毕并且解出数学难题给出工作量证明,其他节点收到消息验证无误后会将该区块加入到本地区块链中,意味着这些节点在本轮竞争中已经失败,将立即停止本轮的计算工作,直接开始下轮的竞争。
矿工众多,大家都在拼命的打包计算,当一个矿工节点未能及时接收到下一个正确区块信息,而继续基于原区块进行“挖矿”,再接受到其他“矿工”之前的区块信息后将出现区块链分叉,也就是出现了同一个父区块不止一个子区块,将分出两条子链,分叉问题的处理办法是将其中短的子链抛弃,选择其中长的子链为主链,这样只要不是硬分叉的话,随着时间推进总有一条分支成为主链。分叉问题是导致出现“双花”问题(指同一笔未被消费的交易被消费两次)的原因之一,为了尽量避免分叉问题出现,所以才会设置解答除数学难题这个环节,可以延缓打包的速度,尽量避免这样的问题发生。随着矿工的增多,装备的加强,计算能力会变得越来越强,比特币系统也会根据每次打包消耗的具体时间进行调整,不断增加数学难题的难度来保证每个区块产生的速度稳定,大概是10分钟/个。
七、什么是区块链?
区块链是由包含交易信息的区块从后向前有序连接起来的数据结构。区块被从后向前有序地链接在这个链条里,每个区块都指向前一个区块。区块经常被视为一个栈,第一个区块放在栈底,随后每个区块都被放置在其他区块上面,如下图所示。
区块链结构 区块数据
如区块的数据结构所示,每个区块都有一个区块头,将区块头进行SHA256哈希之后生成一个哈希值,可以通过哈希值快速定位到对应的区块。而区块头中也包含了其父区块的区块头的哈希值,通过这个父区块头的哈希的值,我们可以找到对应的父区块,因为每个区块只有一个父区块,所以我们可以一直追溯到以第一个区块(创世区块)。
当一个区块已经延续了超过6个子区块,即使其中一个节点将其篡改广播到全网中,其他节点也不会校验通过。由于区块头里面包含了父区块的哈希值字段,所以当前区块的哈希值也受到该字段的影响,所以父区块的改动将会影响到子区块,而子区块的改动将会影响孙区块,以此类推。当一个区块延续很多代之后,若再想将其改变,必须将其子孙后代区块全部改动,这样重新计算将会耗费巨大的计算资源,当其超过延续6个子区块之后被确认,想要通过这样的方式篡改区块几乎不可能。区块链就是这样来保证区块链的历史不可改变,这也是比特币安全的一个关键特征。
区块作为区块链的组成单位,它是一个包含了很多交易信息的数据结构。它是由一个区块头和接在后面的大量交易数据,区块头很小占整个区块的大小不到千分之一,之所以这样为了方便检索和验证。
下面是区块头的数据结构:
区块头数据
其中父区块哈希值用于与前一个区块相连接。Merkle根是用来保证该区块数据的正确性。时间戳、难度目标、Nonce与前面讲到的“挖矿竞争”有关。当一个节点从网络接受到新区块后,它会验证这些区块,通过区块头中父区块的哈希值来连接到区块链上。
如下图所示,Merkle树是一种哈希二叉树,它是一种用作快速归纳和校验大规模数据完整性的数据结构。生成Merkle树需要递归地对节点进行哈希,并将新生的节点插入到Merkle树种,直到只剩下一个哈希节点,该节点就是Merkle树的根。有了Merkle根,可以快速检验某一笔交易在区块中是否存在,当N个数据元素经过加密后插入Merkle树时,最多计算2*log2(N)次就能检查出任意某元素是否在该树种,这样的数据结构大大提高了效率。
merkle树结构
八、总结
比特币设计者的初衷是建立一个自由、无中心、有序的货币交易世界。然而我认为比特币的意义远远超出了它本身,它所依赖的区块链技术,可以在无需第三方背书情况下实现系统中所有数据信息的公开透明、不可篡改、不可伪造、可追溯,有效地解决信任问题,实现价值的自由传递。这更是提供了一种全新的思路,将会被应用到其他领域,例如金融资产交易结算、数字政务、存证防伪、数据服务等。区块链技术助力其他产业变革,具有十分广阔的前景。
参考资料:《精通比特币》Andreas M Antonopoulos(文章引用了书中部分例子和图片)
网友评论