共计 6266 个字符,预计需要花费 16 分钟才能阅读完成。
一、BTC 密码学原理
比特币用的主要有密码学的两个功能,一个是哈希,一个是签名。
哈希 Cryptographic hash Function
- Collision resistance 哈希碰撞不可避免
X!=Y, H(x) = H(y)
因为输入是无穷大,输出有限的。其作用: 用来多一个message求digest。
一个信息M,H(M)用于检测M是否被篡改。理论上输入的M无穷个,一定会找到M1使得H(M1)=H(M),但是由于现实中成本太大,从而实现难度很高。目前密码学专家没有找到有效的方法去实现这种碰撞,不代表不能实现。
例如MD5,MD5已经可以通过人为方法实现这种碰撞,从而变得不太安全。 - Hiding 哈希函数计算过程是单向的。特点是输入空间足够大,分布比较均匀。
给定x, 算出H(x)。无法给定H(x) 算出x
作用: 可以和Collision resistance结合实现digital commitment或者digital equivalent of a sealed envelope
检测一个结果的正确性。细节: H(x || nonce) 一般情况是一个信息+一个随机数进行哈希 - BTC里面的第3个性质Puzzle Friendly
事先并不知道输出结果的值是在什么范围。例如000000….0000xxxxxx,以K个0为结果,后面是随机的值.这就是挖矿的机制,挖矿就是找nonce随机数使得结果满足条件。
H(block header)< =target space
同时找这个nonce的过程也是工作量的证明。挖矿很难验证很容易。
BTC中用到的哈希是哈希256
签名 Sign
1. 本地创建一个公钥与私钥,其来源于非对称加密学。
加密用的是接收方的公钥,解密用的接收方的私钥。公钥相当于就是银行账户,别人对这个公钥进行转账加密,私钥就相当于银行密码。
转账方需要用自己的私钥对交易进行签名,其他人可以用转账方的公钥进行验证是否是本人发起的转账。
理论上是可以用不停的产生无穷个公私钥对,来获得相同的公私钥,从而达到窃取别人账号的目的,但是这种出现2个相同的公私钥的概率是可以忽略不计的。
预防攻击的方法是有一个很好的随机源产生公私钥,每一次签名都要用好的随机源,否则一次签名导致私钥泄露的可能性是存在的
二、BTC 数据结构
- 哈希指针
既要保存位置,还要保存哈希值,防止交易内容被篡改,一个区块被修改,之前的所有区块都会对不上
区别1,哈希指针替代了普通指针;区别2,可以只保存最新的几千个区块的链条
- MerKle Tree
与binary tree 区别是BTC使用的是哈希指针,binary tree为普通指针。
最顶的也能存为hash,为root hash。
data blocks 一个个交易区块,其中区块包含全节点与轻节点
全节点包括block header与block body就是交易的内容。而轻节点只有block header。
merkel proof 是找到交易所在的位置也是一种交易证明,可以查看到交易路径。
黄色区块证明过程:全节点收到请求,只需要把三个红色哈希值发送给这个轻节点。黄色节点可以先算出本身哈希值,通过结合红色哈希计算出三个绿色哈希值进行验证
这里有个攻击点,如果算力足够大是可以Collision resistance,篡改交易内容使得黄色的哈希与旁边节点红色哈希形成的上一级哈希值保持不变。但实际中难度极大,也许量子计算机能实现这个功能。
sorted merkle tree是为了方便区块链做不存在证明的方法。即都data blocks做排序。BTC中并未使用该方法,BTC不需要做不存在的证明。
哈希指针无法实现环的链表
三、BTC 协议
防范double spending attack(花两次钱的攻击)。而区块链可以解决这一个问题并且同时节省到中心化的验证成本。
B进行了两次交易,验证后发现后面的交易为不合法交易。
1 block header 包括version, 前一个区块头的hash,根的哈希,target, nonce,block boby 包括交易列表
2 账本的内容要去的分布式的共识。 例如:分布式的哈希表。所有计算机共同为一个全局的哈希表。
FLP不可能结论,即在异步系统存在一个网络传输延时无上限,即使只有一个成员有问题也不可能共识。
CAP Theorem 不可能结论,任何一个分布式系统,这三个性质最多只能满足两个。(Consistency, Availability, Partition tolerance)
Paxos这个协议能保证一致性。如果协议达成共识,一定是一致性的,某些情况下这个协议可能一直没有办法达成共识,概率小客观存在。
3 BTC共识协议,大部分节点是好的,只有少部分节点是恶意的。
基于联盟链(即符合条件的大公司才有投票权)投票方案是可行的。
BTC并不是投票方案。因为无法防止“女巫攻击”,即不停的产生新的账户(新的公私钥)来达到总数的一半,从而获得投票结果的控制权。
BTC是通过计算力来投票,即计算力大的来发布下一个区块信息H(block header)<= target(nBits)
BTC保持最长区块为合法链,会摒弃掉短的链上区块。通过解Puzzle Friendly获得记账权,即出新的区块,而出块奖励会得到铸币权,获得新的BTC。每21万个区块奖励减半,初块奖励是50BTC
hash rate越高获得记账权的概率越大,但并不是一定获得。争夺记账权的过程叫挖矿。
四、BTC 实现
Transaction-based ledger
UTXO(Unspent Transaction Output)数据结构,表示还没有被花出去的交易的输出。
一个交易可以包含多个输出,有的输出在utxo集合里面有的不在。utxo集合每个元素要给出产生这个输出的交易的哈希值,以及它在这交易里是第几个输出
作用:为了检测double spending,在UTXO集合里的才是合法的,不在就代表已经使用过了,为不合法交易
所有交易是输出要打等于输入。total inputs = total outputs
但是有的交易输入会稍微大于输出,而大于的部分作为交易费给获得记账权的节点(即给矿工)
比特币交易不单单有记账权获得出块奖励,还有第二个权利获得交易的交易费。
Account-based ledger (例如以太坊)
基于账户的模式,系统显示每个账户上的记录有多少个B
每隔一段时间就会调整nonce的难度,但是nonce是32位的数字,但是随着挖矿难度增加,就算遍历2的32次方也不能得到有效的值
所以最后可能需要修改root的哈希值来解决这个问题
所以真正挖矿的时候有两层循环,外层循环是调整这个CoinBase域的extranice算出blockheader里的哈希值之后,内层循环在调整header的nonce值
这是交易的例子
这是求解puzzles的过程
BTC的挖矿机制是不成比例的优势,即过去的算力并不计入下一个出块。即保证了挖矿的公平性。为了保证安全性BTC的交易一般要等6个区块节点后确认。
selfish mining 既是恶意的矿工利用算力优势(51%以上算力),提前准备7-8个区块进行攻击,在正常6个区块形成时在前面分叉攻击交易。从而使得自己的区块成为最长的链条最后达成交易合法化。
四、BTC 网络
工作原理
BTC工作在应用层, 底层是一个P2P Overlay net work,利用TCP协议交易。
特点:简单,健壮。 simple,robust。
BTC维护一个等待交易的集合。 best effort
五、BTC 挖矿难度
挖矿就是不断的尝试block header里面的nonce值,使得整个block header的哈希值小于等于给定目标阈值。
H(block header)<= target(nBits)
利用的是sha-256加密方法
如果挖矿难度不调整,会出现出块时间越来越短,会出现N分叉情况,且为了保证大多数算力是好的节点前提。
ETH的交易是15秒一个区块,有一个ghost协议。
综述,调整挖矿难度是为了保证系统的稳定性,不能无限的减少出块时间。
BTC每隔2016个区块调整一次阈值,大约2星期。
target = target * ( 实际2016个区块产生的时间 / 2016*10min )
target 越小挖矿难度越高。【实际2016个区块产生的时间】的最大值是4,即实际2016个块的出块时间大于8个星期,按照8星期计算。同理最小是1/4
上面的图表示是挖矿的难度
六、BTC 挖矿
全节点
轻节点
挖矿的性质是无记忆性。
BTC的安全性,1. 密码学的保证(同时合法矿工占比大于50%以上);2. 共识机制的保证。
CPU->GPU->专业矿机ASIC芯片
现在新的币反而为了让通用计算机进入挖矿而设计,让只ASIC这种芯片因为算力不足而过时被变为电子垃圾、
现在单个矿工挖矿的概率已经非常低了,就跟中彩票的概率是一样(1-2年可能挖到一个区块)。所以出现了大型矿厂。
单个旷工还需要承担全节点的责任。大型矿厂的架构是一个全节点驱动很多的轻节点矿机,ASIC芯片只用于计算哈希值,不能做全节点。
大型矿厂解决了收入不稳定的情况,而单个旷工只能根据算力来分配收入的比例。
矿工的工作量证明是通过提交share数量,即降低难度后的计算nonce值。
但存在恶意旷工挖到真正的nonce值后丢弃,让整个矿厂损失,这是一种商业的竞争。无法避免
而大型矿厂的出现使得51%的攻击反而变得更加容易。 攻击的方式有来两种,1. 分叉攻击。2. Boycott封锁禁欲(封锁某个账号,让其不让上链)
七、BTC 脚本
23个确认。1个输入2个输出。
txid表示前一个币的来源。vout表示第0个输出
如何执行
第一种形式:P2PK(最简单)
PUSHDATA(Sig) #输入脚本
PUSHDATA(PubKey) #输出脚本
CHECKSIG #输出脚本
#处于安全考虑一般是脚本分开执行
第二种形式:P2PKH(最常用)
脚本执行就是从上往下执行。结果是TRUE
第三种形式:P2SH(最复杂)
具体例子
P2SH作用是对多重签名的支持。例如以前的
红色的X是代表多余元素。下面是执行过程
False表示红X。多重签名中比如5个合伙人可以给定只需要3个按顺序的公钥就可以使用该币。其中N=5,M3。需要在脚本中指出
P2SH实现多重签名
第四种形式:POB(最特殊)
作用: 证明销毁BTC的一个方法。
用途:1, 销毁一定BTC,得到一些其他小的币种(AltCoin)。2.往区块链添加一些永久保存的内容(0知识证明)。
OP_CHECKSIG
OP_DUP
八、BTC 分叉
临时分叉state fork
- 分叉攻击forking attack;
- 人为造成的分叉deliberate fork
协议分叉protocd fork
1. hard fork硬分叉 (必须所有节点都更新)
BTC增加了新的特性,比如BTC区块的大小(block siza limit)
例如1mb->10mb
只要旧的节点不更新,那么这个更新造成的分叉就是永久性的。形成两条平行的链,BTC数量也会因此分裂。相当于分裂成两个账户
2. soft fork软分叉 (50%以上更新)
如果给协议加一些限制,即原来合法的交易,变为不合法了。
例如1mb->0.5mb
系统不会永久性的分叉,只会出现临时分叉。
coinbase之前是没有含义的。因为在挖矿的时候nonce为2的32次方可能也没有挖到结果,这个时候可以调整coinbase,来实现挖矿出块。
coinbase拿出前8字节加上extra nonce的4字节。两个加起来就有2的96次方可能性,增加了出块概率。
coinbase后面字节有人提议增加为UTXO的根哈希值。
例如:P2SH协议就是软分叉。
OP_return是输出脚本
九、BTC 匿名性
BTC一般用化名,提供隐私保护。匿名性不是绝对的。
1. BTC在任何与实体世界产生交易的时候都有可能破坏隐私。
2. BTC支付的时候一般会破坏隐私,一个BTC账户一般会在交易中关联多个账户。
BTC运用在应用层,底层是网络层。
IP在现实中是有关联性的,网络层的匿名性是TOR,应用层的匿名性是coin mixing,但是coin mixing本身也需要诚实。
本质BTC有不可篡改性与隐私性,但是一旦某个交易破坏隐私,都会永久保存与公开
零知识证明
零知识证明是指一方(证明者)向另一方(验证者)证明一个陈述是正确的,且无需透露除该陈述是正确之外的任何信息。
同态隐藏
盲签
零币与零钞
十、BTC 结尾
BTC的数据库是一个Key,value的levelDB数据库。
哈希指针在实际中头部,只有哈希,仅仅保证整个区块的不可篡改性
多账户用多重签名保证账户的私密性。
哈希指针
BTC系统中很多地方使用到了哈希指针。指针保存的本地内存地址,只有本地计算机上才具有意义,如果发送给其他计算机就没有意义了。那么在区块发布时候,哈希指针如何通过网络进行传播?
所谓哈希指针,只是系统中一种形象化的方法。实际应用时候,只有哈希而没有指针。在block header中只有hash值,没有指针。那么如何查找到前一个区块的内容?
全节点一般将区块存储于一个k-V数据库中,key为哈希,value为区块内容。常用的K-V数据库为levelDB,只需要掌握最后一个区块的哈希值即可依据哈希值一直往前找到区块链所有内容。
有些节点只保存区块链部分信息,如果需要用到前面的区块,可以问其他节点要。哈希指针性质保证了整个区块链内容是不可篡改的。
分布式共识
之前有提及,理论上来说,分布式系统不可能达成共识。但是集中为何变成可能了?严格来说,BTC系统分布式共识随时可能被推翻,例如分叉攻击导致系统回滚。
此外,理论和实际存在差异。不可能结论针对特定模型,实际中对模型稍微修改或添加线下方法即可将不可能变为可能。
BTC的稀缺性
为什么要挖矿?因为有收益,且收益大于开销。早期BTC难度低且出块奖励高,从而吸引矿工。
之前有提到,BTC总量固定,有人认为其是一种精妙的设计。但实际上,总量固定的东西并不适合作为货币,这也就决定了BTC并不能在未来完全颠覆现有货币体系。以太坊中便没有BTC出块奖励定期减半的做法,此外,某些新型货币会自带通货膨胀的属性。
对个人来说,通货膨胀并非好事,因为钱不值钱了。但人类每年创造的价值吗,如果用总量固定的东西作为货币,则其指挥越来越之前,而这会导致拥有者不断看着其升值,其他没有的人无论如何奋斗都赶不上。
量子计算
会不会BTC这种建立在密码学上的加密货币,在量子计算出来后会不会变得不安全。
1.量子计算距离使用仍有很长的距离。
2.量子计算若真正使用到破坏现有加密算法,对传统金融业的破坏仍是最大的。
3.实际中使用并非公钥,而是采用公钥哈希。而哈希函数一般都是不可逆的,所以即使量子计算也无法反推私钥。
BTC中用的SHA-256,无论输入多大,最终结果都为256位,必然会导致信息丢失,无法反推原本数据。
总结:加密可逆,哈希不可逆;加密不损失信息,哈希破坏信息。
参考连接:
1. BTC开发文档(https://developer.bitcoin.org/devguide/block_chain.html)
2. 北京大学肖臻老师《区块链技术与应用》公开课(https://www.bilibili.com/video/BV1Vt411X7JF/)
3. 《区块链技术与应用》公开课系列笔记——目录导航页(https://blog.csdn.net/Mu_Xiaoye/article/details/104299664)