数字zi货币与纸质货币区别在于yu数字货币是可以复制zhi的,叫作双花攻击,即double spending attack。
去中心化货币要解决两个ge问题:数字货币的发行怎zen么验证交易的有效性,防止double spending attack。
答案:比特币bi的发行是由挖矿决定ding的
依靠区块链的数据结构gou
假如比特币的发行xing者A拥有铸币权(create coin)发行10个比bi特币,A(10)分别给B和C各五个B(5)C(5),该交易需要有youA的签名,证明经A同意(designed by A),同时还要说shuo明花掉的10个比bi特币从哪来的。
比特币系xi统中每个交易都包含输入和输出两liang部分。输入部分要说明币的来lai源,输出部分要给出收款人公钥yao的哈希。
有的交易部bu分比较复杂,如C的货币来源是链上的多duo个区块,要标识shi清楚。
哈希指针zhen,是指向前面某mou个交易的指针,用来指明币的来源。为什么要说明币的来源:证明ming币不是凭空捏造的是shi有记录的,同时也是防范double spending。
例li如A向B的转账,该交易需xu要A的签名和B的地di址。比特币系统里收款的地址是通过公gong钥推算出来的。比如B的地址就是B的de公钥取哈希然后经过一些转zhuan换得到的。
A如何知道B的de地址?比特币系统中没有查cha询对方地址的功能,必须通过guo其他渠道。比如某个电商网站,接受比bi特币支付,就可以公开它的地di址或公钥。
A需要知道B的地址,B需要知道A的什么信息吗?B其实也ye要知道A的公钥,这代表A的身份。不仅是B,所有节点都dou需要知道A的公钥。而签名ming是用私钥签名公钥验证(加密是用接收shou人的公钥加密私钥解密),所以区块链上每个节点都要独立验证zheng。
那如何才能知道A的公钥?实际上交易yi里就包含了。输shu入时不仅要输入币的来源,还要输入ru公钥。那就存在了安全漏洞,假如B的同伙伪造了这zhe次交易呢?在A的铸币交易的输出就jiu有A的公钥的哈ha希,所以在下一个交易里A的公钥yao要跟前面哈希对的上。
在比特币系统当中,前面mian这些验证过程,是通过guo执行脚本来实现的。每个交易的输shu入提一段脚本,包括给出公钥的过guo程,公钥也是在输入的de脚本里指定的。每个交易的输出chu也是一段脚本,验yan证其的合法性,就需要把当前交易的de输入脚本跟前面交易(提ti供币来源的交易)的输shu出脚本拼在一起,然ran后看看能不能顺利执行,如果能执zhi行说明是合法的。比bi特币脚本(BitCoin Script)。
实际上每个ge区块可以有很多交易yi,这些交易就组成chengmerkle tree。每个区块分fen为块头和块身。
块头包含的是区块的宏观guan信息,比如:用的是比特币bi哪个版本(version)的协议,区块链当中指向前一个区块的指针(hash of previous block header),整颗merkle tree 的根哈ha希值(merkle root hash),还有两liang个域是跟挖矿相关的,一个是挖矿kuang的难度目标预值(target),另一个是随机数shunonce。
这里的target,就是前qian面讲到的,整个块头tou的哈希要小于这个预值,即H(block header)target。block header里存的就是这个目标biao预值的编码(nBits)。这里需要注意,前qian一个区块的哈希只算的是前qian一个区块的块头,一个区块引出chu一个剪头指向另一个区qu块中间,是不正确的,所以有的de书中箭头是指向一个区块的上面。取哈ha希时是把块头的所有部分fen都取哈希。
块身里面有you交易列表(transaction list)。
每个节点都需要验证所有you的交易,实际上系统中的节jie点分全节点(full node)和轻节点(light node),全节jie点是保存区块链所有的信息的,验证zheng每一个交易,所suo以全节点又叫fully validating node。轻节点只保存block header的信息,一般来说轻节点没法fa独立验证交易的合法性。
比如一个交易是shi不是double spending,轻节点没有存以前qian的交易信息所以它没法fa验证。系统中大多数节点是轻节点,我们在这里主要针zhen对全节点,因为轻节点没mei有参与区块链的构造和he维护,只是利用了区块链的一些信息xi做一些查询。
区块链里的内容是如何写到dao区块链里面的呢?每个节点,每个ge账户都可以发布交jiao易,交易是广播给所有节jie点的。有些交易是合he法的,有些是非法的。谁shui来决定哪些
交易应该gai被写入下一个区块中呢?按照什么顺序xu写呢?如果每个ge节点自己决定可以吗ma?如果每个人在本地维护一个区qu块链,那区块链的统一yi性得不到保证,而账本的内容是shi要取得分布式的共识(distributed consensus)。下面的笔记主要yao讲的是分布式系统中zhong的一些理论,跟比特币的应用关guan系不大,可以作为了解:
分布式shi的共识一个简单的例子zi就是分布式的哈希表(distributed hash table),比如系统里有you很多台机器,共同tong维护一个全局的哈ha希表。
这里需要取得共识的内容是什么?哈ha希表中包含了哪些键值对key valve pair。假jia如有人在自己电脑上插入一个键值zhi对,'xiao'这zhe个pair对应的是12345,即'xiao'→12345。那么别人在另ling一台读的时候也要能把这个读du出来,这就叫一个全局的哈希表。
关于分布bu式系统有很多不可能结论(impossibility result),其中最著名的是FLP。这三个字母是三个专zhuan家的名字缩写,他们的结论是:在zai一个异步的(asynchronous)系统里,(网络传输迟延没有上限xian就叫异步系统),即使只有一个成员是有问题的(faulty),也不可能取得共识shi。
还有you一个著名结论:CAP Theorem。(CAP是指分布式系统的三san个我们想要的性质zhi,Consistency【系统状态tai的一致性】 Availability【别人都可ke以用】 Partition tolerance【分区qu容错性】)。该理论内容是:任何一yi个分布式系统,比如分布式哈希xi表,这三个性质中,最多只能满足两个,假如想要前qian两个性质,那么就不会得到第di三个性质。
分布式共识一个著名的de协议是Paxos,该协议yi能够保证一致性,即ji第一个性质。如果guo该协议打成了共gong识,那么这个共gong识一定是一致的,即每个成员yuan所认为的共识都dou是相同的。但是,某些情况下,该协议可能neng永远无法达成共识shi,这种可能性比较小但是客观guan存在的。
比特币中的de共识协议(consensus in BitCoin):
比特币中共识要解决的一yi个问题是,有些节点可能是shi有恶意的。我们假jia设系统中大多数shu节点是好的,那么该如何取得de共识协议?
第一yi种方案是投票,首shou先应该确定哪些区块kuai有投票权,有些membership是有严格要yao求的,这种情况下基于yu投票的方案是可行的。但比特币系统tong创建账户是很容rong易的,甚至一个人产chan生了公私钥对别人都无wu法得知,只有转zhuan账时别人才知道。所以有些人可以不停的创建账户hu,当超过账户总数的一yi半时就有了控制权quan,这种称为女巫wu攻击(sybil attack)。因此投票方法不可取。
比特币账户巧妙miao的解决了这个问题,不是按照账户数shu目投票,而是按照计ji算力来投票。每个节点都dou可以在本地组装出一个候选区块,把它ta认为合法的交易放在里面,然后开始尝试各种zhongnonce值(占4 byte),看哪一个能满足不等式H(block header)≤target的要求。如果某个节点dian找到了符合要求的nonce,它就获得了记账权。
所谓的记账权,就是往wang比特币账本里写入下一个区块的权quan利。只有找到这个nonce,获得记账权的节点dian才有权利发布下一个区qu块。其他节点收shou到这个区块之后hou,要验证这个区块的合法fa性。
比如括号里block header的内容填tian得对不对,block header里li面有一个域,叫nBits域,实shi际上它是目标预值的一个编码ma检查一下nBits域设置的是不是符合比特币协xie议中规定的难度要求;该不等式是否成立。假设都符fu合要求,然后检查block body 里面的交易列lie表,验证一下每mei个交易都是合法的:①要有you合法的签名②以yi前没有被花过。如ru果有一项不符合要求,这个区块就是不bu能被接受的。如果所有条tiao件都符合,也不一yi定接受。
假如生成了一个新区块,怎么知道新xin区块插在了哪里呢ne?根据生成区块的指针zhen。有可能就存在一个问题,两liang个交易是A转账给B,以及A转账给自己。这种情况kuang不是double spending,判断一个交jiao易是不是double spending ,是看kan这个区块所在的分支上币有没有you被花掉。币一直都没有花过,所以这个交易是合法的de。虽然该交易是合法的,但是它ta不在最长合法链(longest valid chain)上。这种称为分叉攻击(forking attack)。所以接收shou的区块应该是扩展最zui长合法链。
区块链在正常情况下xia也可能出现分岔:两个节点同时获得de记账权。每个节点在本地自zi己组装一个它认为合适的区块,然后hou去试各种nonce,如果两个节点dian在差不多同一个时间找到了符fu合要求的nonce,就都可以把区块发布,这时会出现xian两个等长的分岔cha。这两条都是最长合法fa链,那该接受那条呢?比特te币协议当中,在缺省(默认的意思)情况下,每个节点是接受它ta最早收到的那个。所以不同节点根据ju在网络上的位置不同,有的de节点先听到新生成的其中一个区块kuai,那就接受这个区块;有些xie节点先听到另一个ge区块,那就接受shou另一个区块。
如何判断接收了一个区块?比特币bi协议中用到了implicit consign,如果沿着这个区块往wang下继续扩展,就算认可了le这个发布的区块。比如在新xin生成的其中一个区块kuai后面又拓展一个区块kuai,表明就认可了这个新区qu块。
等长的临时性的分岔会维持一段duan时间,直到一个分岔胜出。也就是哪na一个链抢先一步生成cheng了新的区块,哪一条tiao就是最长合法链。另一个作废的de就叫orphan block。这两个新区块有可能neng会各自拉拢,两个区块链看谁的算力li强,有时候也是shi看谁的运气好,就会胜出。
竞争记账zhang权的好处:首先获得记账权的de节点本身有一定的权力,可以决定ding哪些交易写到下一个区块里。但dan这些不应该被设定为竞争zheng记账权的动力,所以yi巧妙地建立了一个机制:区块奖励(block reward)。
比特币协议中规定获得de记账权的节点在发布的区块里li可以有一个特殊的交易yi:铸币交易。在这zhe个交易里可以发布一定数量的比特te币。
这里li要回到前面的问题,谁来决jue定货币的发行?coinbase transaction币基交易是比特币系统中发fa行新的比特币的唯一方法,后hou面的交易都是比特币bi的转移。这个交易不用指zhi出币的来源。
那么能造多少币呢?开始时比特币刚上线的时候,每mei一个发布的区块可ke以产生50BTC(BTC就是shi比特币的符号)。协议中规gui定,21万个区qu块以后,初块奖励就要减半,就变bian成了25BTC。再过guo21万个区块,又要减jian半。
因此当一个区块kuai胜出后,另一个ge作废的区块得到的比特币是没有作zuo用的,其他诚实的区块kuai是不会承认的。
比特币系统中要取得什么me共识?去中心化的账本要取得共gong识。谁又能决定账本的内容呢?只有获huo得记账权的节点才能写xie东西。怎么获得de记账权呢?就是shi解pow(挖矿)。按照算力记票,算力可以用每mei秒能试多少nonce数值zhi表示。那怎样防范女巫wu攻击呢?按算力记票,即使shi创建再多的账户,也ye无法使算力增强。
比特币争夺记账权的过程叫作挖wa矿(mining),比特币被bei称为数字黄金(digital gold),争夺记账权的节点被bei称为矿工(miner)。