一、实现
1.区块链是去中心化的账本,比特币采用的是基于交易的账本模式
区块链的全节点需要维护一种名叫UTXO的数据结构,所有未花掉的交易的输出的集合,可以有效检测双花攻击
交易的总输入略微大于总输出,这是因为比特币的第二个激励机制,获得记帐权的节点可以收取一定的交易费用
*还有另一种基于账本的账本模式,以太坊正是使用这种模式
下面是某个区块的具体信息
![](https://img-blog.csdnimg.cn/27ec4adda2374726b76613fc6908e6b4.png)
其中的hash值是根据block header计算的,不包括块身的交易
![](https://img-blog.csdnimg.cn/5fa1663c31524d448efab3266f79f580.png)
在实际情况中,由于挖矿难度提高,很大概率会出现找不到4个字节的随机数满足target,因此节点可以改变铸币交易中coinbase的值从而改变merkel tree root hash作为额外的随机数
2.挖矿的概率分析
每次尝试一个随机数计算哈希值都是一次伯努利实验(Bernoulli trial),大量的伯努利试验组成伯努利过程(bernoulli process)。伯努利过程具有无记忆性,无论前面结果如何都不会影响到最新一次试验的结果
挖矿的试验次数很多,每次试验成功的概率很小,可以用泊松过程近似。出块时间的概率密度满足指数分布,且具有process free的性质,无论已经挖了多长时间,接下来的平均出块时间依然是十分钟
3.比特币总量
包括以挖出的和未挖出的比特币总量是2100万
区块链的节点刚发布时交易是更加容易被修改的,理论上如果某些恶意的节点在发布一个正常交易之后购买了某种商品,之后又发布另一个交易并想通过增长其后节点的个数的方式将包含正常交易的节点废弃,是可以达到双花攻击的。于是在比特币系统中存在缺省为6的6个确认,即当包含交易的节点后已经连接了六个节点之后方可认为之前的交易是不可修改的。
*Selfish Mining
自私挖矿是一种欺骗性的加密货币挖矿策略,其中一名矿工或一组人解决一个哈希值,打开一个新区块,并将其从公共区块链中扣留。此操作创建一个分叉,然后将其挖掘以领先于公共区块链
二、网络
比特币网络的应用层运行比特币协议,网络层运行的是P2P Overlay network。比特币的P2P网络中没有超级节点和主节点,所有节点都是平等的,加入网络的前提是要知道一个种子节点。
比特币网络的设计原则是简单、鲁棒而不高效
三、挖矿难度
当前挖矿难度等于targte为1时的挖矿难度除以当前目标阈值
difficulty=difficulty_1_target/target
出块时间并不是越短越好,当总算力越来越强,如果不调整挖矿难度,在极短时间内被挖出多个区块会造成多个分叉,而且网络传播具有延迟,这对达成比特币系统的共识是不利的,调整挖矿难度能够有效控制平均出块时间保持稳定。
每2016个区块(约14天)调整一次目标阈值
调整target的公式:target=target*(actual time/expected time),expected time为2016*10min
每个节点验证新区块的合法性时会验证块头中target的nBIts编码是否正确,以防某些恶意节点故意不更改target
*
![](https://img-blog.csdnimg.cn/601ef64b065540af887a7c5259aede27.png)
![](https://img-blog.csdnimg.cn/2159d95129604ab9afc3b9310f1895e5.png)
四、比特币脚本
![](https://img-blog.csdnimg.cn/8ef44fed8d3d4646bda8f21ba87f107b.png)
![](https://img-blog.csdnimg.cn/00a9aeffe9a640dbbdf22c1bc4169cb7.png)
1.P2PK
![](https://img-blog.csdnimg.cn/91a3ca3427424f2d9cbae2c8ae17f904.png)
![](https://img-blog.csdnimg.cn/7d043aa58d2e458cac6ac9f5210fcb97.png)
2.P2PKH
![](https://img-blog.csdnimg.cn/b73b76c632b74ca2acb51616aa035293.png)
![](https://img-blog.csdnimg.cn/d15edf9130e448a5aeba318d0a899c52.png)
3.P2SH
![](https://img-blog.csdnimg.cn/a6cf2d52d38c4fa19c085bdd309c3f0c.png)
![](https://img-blog.csdnimg.cn/3437383d9b524c178daa567998721e8d.png)
多重签名
![](https://img-blog.csdnimg.cn/6b300cbafd6d44e7b236c6d193190398.png)
![](https://img-blog.csdnimg.cn/d6d67735d2b041b48213081577678f1f.png)
![](https://img-blog.csdnimg.cn/3751807a700a4da3b63aaaf4c51b6b71.png)
![](https://img-blog.csdnimg.cn/f578b0ce6a6a469db1be4b92684d9534.png)
五、分叉
1.state fork
区块链由一条链变为两条链就叫分叉。分叉可能是多种原因造成的,比如挖矿的时候,两个节点差不多同一个时候挖到了矿,就会出现一个临时性的分叉,我们把这个分叉叫作state fork,是由于对比特币区块链当前的状态有意见分歧而导致的分叉。
前面还讲过分叉攻击(forking attack),它也属于state fork,也是属于对比特币这个区块链当前的状态产生的意见分歧,只不过这个意见分歧是故意造成的,人为造成的,所以我们又叫它deliberate fork。
2.protocol fork
还有一种产生分叉的情况是,比特币的协议发生了改变,比特币系统需要软件升级。在一个去中心化的系统里,升级软件的时候没有办法保证所有的节点同时都升级软件。
假设大部分节点升级了软件,少数节点因为种种原因可能没有升级,有可能是还没来得及升级,也可能是不同意对这个协议的修改。即假如你想把协议改成某个样子社区中可能是有人不支持的,这个时候也会出现分叉,这种分叉叫protocol fork(协议分叉)。因为对比特币协议产生了分歧,用不同版本的协议造成的分叉,我们称作protocol fork。
1)硬分叉
如果对比特币协议增加一些新的特性,扩展一些新的功能,这些时候那些没有升级软件的这些旧的节点,它是不认可这些新特性的,认为这些特性是非法的,这就属于对比特币协议内容产生了意见分歧,所以会导致分叉,而且这种分叉是永久性的。
目前已有的例子当中,分叉后新旧节点在两条链上各持己见,分别在不同的链上挖掘新的区块,因此原有的币分为两种新的币。当有交易被写入时,因为私钥是相同的,为防止同一笔交易在上下两条链中被重复写入,解决方法是加入一个chain id信息
2)软分叉
如果对比特币协议加一些限制,加入限制之后原来合法的交易或区块在新的协议当中有可能变的不是合法了,这就引起软分叉。
旧节点会接受新节点的区块,但新节点不会接受旧节点的区块,而且在大部分算力的节点都更新了软件的情况下,旧节点挖出的区块最终都不会变成最长合法链,因此软分叉都是临时的分叉。
六、匿名性
1.一般来说,匿名是跟隐私保护联系在一起的。比特币交易中不要求用真名,可以用公钥产生的地址,所以比特币具有一定的匿名性。
有可能破坏比特币匿名性的第一个方面:一个人可以生成很多个地址账户但这些地址账户是有可能被关联起来的。第二个方面:是这个地址账户跟现实世界中的身份也可能产生关联。比特币系统一旦跟现实世界联系起来,就可能泄露你的真实身份,最明显的例子就是资金的转入和转出。
2.提高匿名性:
1)网络层的匿名性。网络层的匿名性学术界已经有了很好的方案:多路径转发。跟洋葱路由(TOR)是一样的原理。即消息不是由发出者直接发送给接收者,中间要经过很多次转发。中间的每一个节点,只知道它的上一个节点是谁,但并不知道最早发出消息的人是谁。当然中间一些节点可能是坏的,但路径上只要有一个节点是诚实的,就能够把最初发起人的身份隐藏起来。这也是洋葱路由的基本原理。
2)应用层的匿名性。把不同人的币混在一起(coin mixing),即把你的身份跟别人的身份混在一起,让别人分不清楚谁是谁。不光是区块链,在其他各个需要匿名的领域都能用到。
*coin mixing真正实施起来有一定的复杂性,如果设计不好的话,别人可以根据你当初存进去币的数额,推断出来哪些币是你存进去的。
3.零知识证明:
零知识证明是指一方(证明者)向另一方(验证者)证明一个陈述是正确的,而无需透露除该陈述是正确的外的任何信息。
4.同态隐藏:
零知识证明的数学基础是同态隐藏。
![](https://img-blog.csdnimg.cn/000500f380904c558a8687fe261ac6d0.png)
第一个性质说明加密函数值E不会出现碰撞,这跟哈希函数有所不同,哈希函数是可能出现碰撞的。这个性质反过来说明如果E(x)和E(y)是相等的,那么x、y也是相等的。(该语句是上面语句的逆否命题)
第二个性质说明加密函数是不可逆的,知道加密后的值,没办法推出加密前的值。
第三个性质是最重要的,叫作同态运算。它说的是对加密之后的函数值进行某些代数运算,等价于对这些输入直接进行代数运算然后再加密。
同态加法:加密值的和等于和的加密。
同态乘法:加密值的乘积等于积的加密。
5.零币和零钞
![](https://img-blog.csdnimg.cn/2e3dd36b80064da798f5710606399645.png)