前言
本文是对北京大学肖臻老师在B站上的区块链课程学习后的的一个读书笔记,仅供学习使用,不构成任何商业建议或商业用途,请勿转载。
在此,对肖臻老师的无私传授,表达最真诚的谢意。
简介
比特币是基于区块链技术以及比特币共识协议的一种加密货币。同样道理,以太坊也是基于区块链技术和以太坊共识协议的另外一种加密货币。
加密货币和区块链是两个概念,不要混淆。
货币与加密货币
传统货币的特征:交易、记账单位、价值储藏
传统货币的发行机构:各国央行。
发行数量的指导原则:金本位、主权信用货币制度(我国早期跟物资绑定,即饭票制度;美国以国债为锚点,发多少国债,就发多少美金;欧盟、英国、日本都以通胀2%作为锚点)、联系汇率制度(香港是港币与美元6.8的比例发行港币)。
货币的不可能三角:独立货币政策、浮动汇率、资本自有流动。
区块链的三大特征:去中心化、安全可验证、不可篡改
去中心化的三大不可能:去中心化、安全、高性能交易
当前用各种链来指代了各种协议,如下就是所说的各种公链。
很多公链发行了加密货币,就是所说的各种币,只是有的币是在自己的链上发行的,有的是通过公链上的智能合约发行的。
BTC-密码学原理
主要应用了2个密码学原理:哈希函数,数字签名。
哈希函数
- 哈希函数的重要特性:抗碰撞性,意思是:如果x=y 那么 Hash(x)=Hash(y);如果Hash(x)≠Hash(y),那么x≠y。
- 1、哈希函数在比特币中的一个重要作用就是生成消息摘要digest,每个区块的摘要都会生成一个哈希值,后续的区块只用验证这个区块的哈希函数,就知道这个区块是不是做过篡改,从而保证历史交易不可篡改。
- 2、信息隐藏,意思就是不用公布信息,只用验证Hash(x)=Hash(y)就可以了,不用知道x是多少。
- 3、puzzle friendly,就是在计算哈希的时候,如果你之前无论用哪一个nouce,都不影响你下次得到正确nouce的概率。
- 常用的哈希函数是SHA(256),意思是任何一个数据给定后,给出的结果就是一个256位的字符串,即2的256次方,大概是1后面77个0。可以类比的是双色球的总集合是2后面7个0,银行卡是16位数字,密码6位数字,综合是1后面22个0。假设一秒可以算1亿次,那一年的计算也才3后面15个0,算对银行密码都需要1千万年。可想而知,SHA(256)在当前算力情况下很难破解
数字签名
用户自己创建一个公私钥对,通俗的说,公钥就是自己的账户信息,私钥就是自己的密码。加密用的是公钥,解密用的是私钥。(非对称加密:A给B发送一条信息,用B的公钥加密 。公钥是公开透明的,这时加密后只有B自己有私钥解开。B解开后查看完信息回复给A用的是A的公钥加密,A再用自己的私钥解开。)
公钥是公开的。大致是指:A发给B一个文件,则A用用B的公钥把文件进行加密,B收到后在用自己的私钥进行解密。在BTC中,发布交易的时候会用私钥做一个签名,然后其他方用这个人的公钥去验证一下,就知道这个交易是不是真实的(利用了哈希碰撞)。在实际应用中,一串的英文单词就是公钥,这个加密之后一串字符串就会是加密后的BTC地址,私钥就是自己的密码。
问题:一个钱包APP中可以有多个钱包,每个钱包都有一个提现密码,如果忘记了怎么办?
问题:如果不小心将加密货币用以太坊协议转到了oec钱包的地址上,这笔钱还在么?
BTC-数据结构
区块链结构
每个区块的表头的hash都是前一个区块数据的hash值,因此变更区块内容后,后面的区块内容都会改变,形成一个多米诺骨牌,进而确保了区块链的不可篡改性。
比特币结构
轻结点就是保存根H(m)的值,而全结点就是指保存所有区块的结点。全节点的数目不多,大部分还是轻节点。举个例子:BTC的钱包就是轻结点只保存根哈希。
BTC-协议
1、比特币是怎么产生的。只能通过挖矿取得,挖矿成功会有一个出块奖励。
比特币中的共识机制—POW(Proof of Work)工作量证明
流程主要分为3步:
- 生成Merkle根哈希
- 组装区块头
- 计算出工作量证明的输出
出块奖励
在比特币系统中,通过挖矿获得区块记账权的矿工获得比特币奖励。在初始阶段,每个区块获得50 BTC,约定每隔21万个区块,奖励数减半。
210000∗10 / 365∗24∗60≈4
每个区块的出块时间约为10分钟,21万个区块约占用4年时间。2009年,BTC初始时出块奖励是50BTC,2013年时变为25BTC,2017年是12.5BTC。离我们最近出块奖励变化时间是2021年,BTC出块奖励降为6.25BTC。
按照这个公式来计算的话,总累计只有2100万个比特币,比特币的稀缺性是算法确定的(如果要想改也可以,需要全球51%的算力认可,可是已经挖到矿的人只会继续认可这个算法,不会变大,因为会让自己的比特币贬值)。这也就是被比喻为黄金的缘故,这也是ahr99看好比特币的缘故,全球财富假设是100万亿美元,那么一个比特币就价值476W美金。
2021年12月29日,1枚比特币的价格约为29.7W 人民币,那么出块奖励(当前是6.25个)折合成人民币就是185W多。挖1枚比特币要消耗8.6W~28.6W度电,大概是4W-14W块钱。因此可以看到利润还是非常高的,最低在50%左右。
2、比特币怎么使用,每一笔消费必须input=output,避免一笔钱被重复使用
最长合法链
合法的区块必须是在最长的链条上,如果不在最长的链条上,那么区块是不合法的,挖到的矿是不会被其他人认可的,相当于就白挖了,所以都会尽可能在最长的链条上挖矿,进而避免了区块链的分叉(分叉相当于交易的可回滚),进而进一步保证了交易的不可篡改,因为要篡改就得花很大的算力去制造一个更长的链条,得不偿失。
BTC-实现
比特币是基于交易的一个账本(传统银行是基于账户的一个账本)
区块链系统只处理所有的交易,而需要清算、查看余额等信息,由区块链节点自行处理。
比特币系统中,全节点负责维护UTXO(Unspent Transaction Output)数据结构,保存没有花费的交易。全节点将UTXO存储内容中,并用来验证收到的交易的正确性,当交易的输入是保存在UTXO中的未花费交易,那么交易来源的合法性是正确的。
比特币的第二个激励:交易费,不过当前交易费的金额都比较小,现在看的一个例子是大概3.7%,在未来有可能是主流。
要去计算nonce,就是一个随机的过程,但是也很公平,以刚才的例子,大概需要22亿次。
挖矿本身没有含义,他只是一个门槛,通过这种算力的方法来保证整个区块链的安全,如果有人想攻击、篡改区块链,就需要51%的全球算力,目前看是不现实的。
但是也有可能刚发生的交易被其他区块替代,因为一般情况下等6个确认(约1个小时左右),才算被认为是生效,才会被认为是不可篡改的。
BTC-网络
网络结构
新的交易要发布到比特币网络上,矿工将交易打包成的区块也要发布到比特币网络上。节点之间采用flooding泛洪广播,网络层采用p2p网络,应用层采用区块链协议。
应用层:Bitcoin Blockchain
网络层:P2P Overlay Network
比特币网络的设计原则是简单、鲁棒,而非高效。每个结点维护一个邻居结点的集合,消息在网络中采用flooding方式传播,结点第一次听到某个消息,会将它传播给所有邻居结点,同时记录一下自己已经收到过这个消息了。
新发布交易的传播
比特币网络中,每个结点要维护一个等待上链的交易的集合,这个集合中的交易都是要写入区块链的合法的交易,结点第一次收到这个交易的时候就会把它写入这个集合,并转发给所有邻居。
越大的区块在网络上传播越慢,比特币协议要求区块大小不能超过1M(大概是400个交易),因为比特币网络的效率比较低,一个1M大小的区块可能要几十秒才能传播给比特币网络上的大多数结点。
BTC-挖矿难度
难度
计算公式:difficulty = difficulty_1_target / current_target。目标(target)是一个256位长的数值。难度每过2016块改变一次。
为什么要有难度?就是为了控制出块的速度,避免有太多的分叉。
难度调整
出块时间
为保证比特币的出块时间在10分钟左右,比特币系统会根据前一段时间的出块时间调整target值。每隔2016个区块,采用下面的公式对target调整。expect_time就是14天,如果actual_time大于14天,target变大,降低难度;actual_time小于14天,target变小,难度增大。难度调整还有一个限制,调整幅度不能超过4倍和1/4。(比如出块时间如果大于八周了,我们也只按照八周来算,主要是为了避免系统出现意外情况 时间特别大,出块时间小于半周按照半周来算。)比特币系统中,如果区块时间设置的更短,例如5分钟,那么比特币系统中会更容易出现分叉,如图所示。系统中出现多分叉时,相当于系统中合法节点算力被分散,那么系统更容易被分叉攻击。10分钟是比特币设计者中本聪设定的。
BTC-挖矿
比特币的安全性是从两方面进行保证的。一方面是密码学上的保证 ,另一方面是共识机制。
挖矿
全节点尝试不同的nonce,使区块头哈希值小于等于target。挖矿的过程是无记忆性的memoryless,又称progress free。每尝试一个nonce,都是在一定概率下满足挖矿条件,和之前尝试了多少次nonce没关系。这种memoryless的特性,使得挖矿成功的概率等于节点占总算力的比例。
挖矿设备
比特币的mining puzzle是哈希算法,流行的运算工具有CPU、GPU、ASIC等。
CPU:CPU擅长逻辑控制,串行的运算。和通用类型数据运算
GPU:GPU擅长的是大规模并发计算,GPU还是有不少浪费,比如用于计算浮点数这些部件,挖矿只涉及整数计算。
ASIC:ASIC芯片是用于供专门应用的集成电路(ASIC,Application Specific Integrated Circuit)芯片技术,在集成电路界被认为是一种为专门目的而设计的集成电路。但是ASIC制作成本高、周期长,设计一款挖矿通常需要一年时间,投入巨大。而矿机的淘汰速度也很快,过一段时间就有更好的矿机问世,比老款矿机速度更快,老款矿机就会因电费的原因被淘汰,这种矿机除了挖矿不能干别的(因为设计的时候就这么设计的)。比如比特大陆就是专门在ASIC芯片的,还有美股上市的迦南科技等。
矿池
挖矿约等于买彩票,风险大(电费多),收益也大(比特币价值高)。
矿池可以将分散的算力集中起来,一个矿池可以管理很多个矿工,矿池负责打包区块,矿工负责接收矿池的任务进行hash运算。
矿池中的矿工按贡献率分配挖矿奖励,矿工的贡献也是采用工作量证明的方式。实际,矿池要求矿工提交一个较比特币puzzle难度低的结果,比如比特币puzzle要求包含70个0,而矿池要求puzzle是60个0。
从概率上分析,加入矿池的矿工的收入期望并没有增加,获得的收益任然是矿工占全部节点算力的比例。但是,通过加入矿池,矿工收入的稳定性提高了。一些矿池为了吸引矿工加入,会为矿工提供额外的奖励,这也导致了超大型矿池的出现。
超大矿池的可能影响
分叉攻击
Boycott
即对任意用户进行“封杀”,比如对A进行封杀,A进行的所有的交易都不让上链,比如上图,只要A进行一次交易 就进行一次分岔。和分岔攻击不同的是,boycott不需要等6个区块确认,只要A进行上链就发动分岔 越早越好。
【总结:】大型矿池的出现有一定的好处:给矿工减轻了负担,矿工仅需要计算哈希值即可。其他部分有矿组负责,收入分配也更加稳定了,原来相当于有很小的概率能够得到一大笔钱,有矿池后有很大概率得到一小部分钱。 也有一定的坏处:比如会发动上述的两种恶意攻击行为,这些行为会使得用户对比特币丧失信心,所以太大型的矿池会被抵制,也不应当出现。
BTC-比特币脚本
听不懂……
BTC-分叉
分叉指的是,原来的系统中为一条链,但分成了两条链。分叉形成的原因可能有多种:
1.挖矿时两个节点差不多同时挖出矿,都会发布区块(对比特币系统当前状态产生分歧导致的分叉——state fork);分叉攻击,同样也会导致分叉(forking attack,人为故意造成);也称为deliberate fork。
2.比特币协议改变,在分布式系统中不能保证所有节点同时升级软件,假设存在少数节点未升级,导致出现分叉(protocal fork);
根据对比特币协议修改的不同,可以将分叉分为硬分叉和软分叉。
硬分叉
硬分叉:如果区块链软件的共识规则被改变,并且这种规则改变无法向前兼容,旧节点无法认可新节点产生的区块,即为硬分叉。
从图中可看出,新节点(更新了比特币协议版本的节点)和旧节点(即没有更新比特币协议版本的节点)产生的区块分成了2条线路,但因为新节点的区块大小要求最大是4MB(假设),因此新区块构成的分支上除了可以接收新区块,同样也可以接收旧节点产生的旧区块。反之,旧区块构成的分支认为区块大小最大是1MB,那些新区块最大是4MB,对于旧区块构成的分支而言新区块是非法的区块,因此只能选择上面的分支接入,下面的分支只能接入旧区块。只要旧节点没有更新比特币协议版本,那么这两个分叉就会永久存在,这就是“硬分叉(hard fork)”。
对硬分叉的两条链各添加了一个chainID,将两个链区分开,才使得这两条链真正分开。
软分叉
软分叉:如果区块链的共识规则改变后,这种改变是向前兼容的,旧节点可以兼容新节点产生的区块,即为软分叉。
新区块只会认同新区块,也就是说如果产生的是旧区块不管是上面还是下面的分支都可以接入,但要是产生的是新区块,那么它只会从新区块处接入,久而久之新区块构成的分支将成为最长合法链,而旧区块分支将被舍弃,这就是“软分叉(soft fork)”。
需要注意的是,旧节点如果不升级软件,挖出的区块可能就白挖了(大于0.5MB),但对于系统来说,不会存在永久性分叉。
P2SH:Pay to Script Hash没听懂
总结
硬分叉和软分叉的核心区别:小算力的是否兼容大算力的规则,接受那就是软分叉,算力小的最终回归到大算力;不接受就永久分开,各行其道。
硬分叉:如果区块链软件的共识规则被改变,并且这种规则改变无法向前兼容,旧节点无法认可新节点产生的区块 特点:必须系统中所有节点更新软件,系统才不会产生永久性分叉 软分叉:这种改变是向前兼容的,旧节点可以兼容新节点产生的区块 特点:软分叉要求至少有半数以上算力的节点必须更新软件,才不会出现分叉,即使出现分叉了也是临时性分叉,软分叉不会出现永久性分叉
BTC-问答
1、交易所和钱包有什么区别?
交易所是中心化的,有自己的身份证明,个人忘记密钥,但是交易所记得,可以向交易所要回密钥,但是也有风险,就是交易所跑路。
钱包是个人的,如果密钥丢了,那就是真的丢了。
- 如果账户私钥丢失怎么办?
答:没有办法。因为比特币是去中心化货币,没有第三方中心机构可以重置密码,所以账户上的钱也就变成了死钱。
- 私钥泄露怎么办?
尽快将剩余BTC转到其他安全账户上,没有第三方中心机构重置密码或冻结账户,只能自己对自己负责。
BTC系统中账户便是公私钥对,密码就是私钥,无法更改。
5.转账写错地址怎么办?
答:没有办法,只能自认倒霉,无法取消已经发布的交易。如果转入不存在地址,则该部分比答:特币便成为了死钱。当然,比特币系统中UTXO会永久保存该交易,记录该并不存在的地址。因此,对全节点来说,这是不友好的。
每个区块链的不一样,同一个公钥产生的地址是一样的,如果你把oec的地址通过以太坊进行交易了,你的以太坊钱包里面是不会显示这个交易的。那么你可以重新导入你之前的字符串,在以太坊中重新生成一个钱包,你的加密货币就不会丢失。
BTC-匿名性
比特币的匿名性其实一般,因为他是线上的,不可能一直匿名的线上交易,只要跟线下产生关联,那就必然可以被追踪到。其实现金的匿名性更好,因为现金没有任何个人信息的标记。只是现金不适合大额交易,大额携带也不方便。
BTC系统中什么情况会破坏其匿名性?
1、虽然用户可以生成多个地址账户,但这些地址账户可以被关联起来。
2、地址账户与个人在真实社会中的身份也可能会产生关联。其中最明显的就是资金的转入转出。
3、BTC支付的时候。BTC只要进行支付,便和个人账户建立了联系,从而会泄露掉个人信息。
唯一可以实现匿名的方法那就是不使用。
如何提高比特币的匿名性
几乎不可能,但是一个简单的办法是用vpn,增加一点点难度。
同态隐藏——零知识证明的数学基础
没看懂
盲签方法
也没看懂
零币和零钞
也没看懂
BTC-思考
哈希指针
不是很懂
区块“恋”
如果按照这种方法,将私钥分为N份。但这样会有一系列问题。一. 如果N个人中任意一个人忘记私钥,则无法将钱取出。二.截断私钥长度,会降低安全性,因为私钥长度会直接影响破解难度(2^256 远远大于2的128次方),之间难度差距远远不止一倍。【可见,对于多个人账户,应该使用多重签名,而非截断私钥的方法。】三.如果分手,该钱变成死钱,一直保存在UTXO集合中,对矿工不友好。
分布式共识
理论和实际存在差异。不可能结论针对特定模型,实际中对模型稍微修改或添加线下方法即可将不可能变为可能。
知识改变命运,这句话本身没有错,但是对知识的一知半解可能让你的命运变得更差,搞科研是很有意义的,但是不要给学术界的思维限制头脑,不要为程序员的思维限制想象力。
BTC的稀缺性
BTC总量固定,有人认为其是一个精妙的设计。但实际上,总量固定的东西并不适合作为货币,这也就决定了BTC并不能在未来完全颠覆现有货币体系。
人类每年创造的价值,如果用总量固定的东西作为货币,则其只会越来越值钱,而这会导致拥有者不断看着其升值,其他没有的人无论如何奋斗都赶不上。这个时候就可能会有其他加密货币的出现来挑战比特币。
量子计算
一. 量子计算距离使用仍然有很长距离
二. 量子计算若真正使用到破坏现有加密算法,对传统金融业的破坏仍然是最大的。加密货币目前占有的市值只有很小一部分。
三. 实际中使用的并非公钥,而是可以用公钥哈希。而哈希函数一般都是不可逆的,所以即使量子计算也无法反推私钥。
加密和取哈希是不一样的:加密可逆、哈希不可逆;加密不损失信息、哈希破坏信息