这几天调研了Web3技术,知识如果不梳理很快就成了过眼云烟。计划用两篇文章梳理web3技术, 这一篇文章先从比特币说起。比特币是区块链的应用,区块链是比特币的底层技术,区块链又是web3技术的一种)。本文尝试以故事讲述比特币诞生的背景,以问答的形式阐述比特币的运行机制。
2008年9月15日,美国雷曼公司破产,次贷危机爆发,800万人失业,600万人无家可归,财产损失大约5万亿美元。
为什么雷曼公司破产有这么大的反应?
举一个不太恰当的例子,拿中国房地产举例。
如果恒大宣布破产,会有很多烂尾楼,很多家庭不仅无家可归还要还房贷,买房的人瞬间消失, 会有更多房地产开发商破产,开发商的钱是通过抵押物(楼盘、公司股票)等抵押给银行换来的,抵押物(楼盘、股票等)价格下跌,银行会要求开发商补充抵押物,加剧开发商的破产, 开发商破产,银行的钱要不回来,储户担心银行破产排队从银行取款,储户挤兑加剧银行破产,储户取不出钱,会降低消费,企业没有利润会将本增效(裁员),失业导致经济进一步下滑,,,金融是一个很复杂的事情,开发商的破产不仅是购房者的损失,通过资产证券化,很多投资人、保险机构都会受到影响,这是一个多米乐骨牌倒塌的过程,最终影响到每一个人。
大家有没有想到1929经济大萧条?先别着急喷我,拿中国举例确实不恰当,我并不是唱空中国,对我没有任何好处,相反目前情况我比任何人都希望中国经济赶紧复苏。我写博客第一目的是梳理自己的知识体系,自我提高,第二目的是传播知识、启发思考,仅此而已。
说偏了,回归正题,美国硅谷银行、第一共和银行破产,美国政府都对储户进行了兜底,这才导致银行危机没有蔓延,中国政府也不会让恒大破产,还等着许老板组织还债呢。
那么这个故事告诉我们什么呢?
前几年大家都认为“房子永远会涨,国家不会让房价下跌”,后半句我信,但经济是有周期,有规律的,不存在永远的上涨,那么中国股市是否永不涨呢?我只是启发你思考,仅此而已,别多想,别人不会为你的行为买单。
又说偏了,金融危机让大部分人认识到,原来银行也会破产,存钱也非绝对安全。为了不让经济危机发生,美国政府为银行买单,政府的钱一方面来自纳税人,另一方面来自印钞机。当然也不可能无限印钱,那么不就成为玻利瓦尔货币了呢?美国政府使用纳税人的钱给银行兜底,也是一种变相的全民买单。
这里有没有看到主权货币有什么缺点?
金融危机让人们认识到主权货币的问题,这正是这个时候,2008年11月1日有一个日本的网络极客,化名中本聪,他在网络上发布一篇文章《比特币,一种点对点的电子现金系统》。
他提出一种构想,我们可以设计一种去中心化的电子记账系统。支持这个电子记账系统运作的就是比特币BTC, ⽐特币实际上是⼀种电⼦货币或者叫数字货币,他是基于密码学的⼀种货币。它有以下特点:
看起来很完美,我们来深入研究一下它。
个人推测,中本聪应该是早已设计好BTC系统,之所以在金融危机时发布,应该是为了获得更高效的推广。
如果在现实世界中,拿A、B、C、D四个人做生意来说,传统的记账方式是,每个人手中都有一个账本(去中心化),每次交易四个人都会记账。如果账单有问题,则按少数服从多数的原则,除了偶尔有几记几笔交易存在误差,没有人敢改动账本,不然大家都不跟他玩了。那么电子货币如何运作呢?以下问题都值得思考。
先说一下大致思路
UTXO表记录还没有被花出去的BTC,如果你花过了BTC会从UTXO表中删除,别人得到的BTC会记录在UTXO表中。中本聪设计了一种特殊的分布式数据库,叫做区块链,交易信息就存储在每一个区块中,所有区块通过链表的方式连接到一起,被称为区块链。

任何人都可以假设服务器,加入区块链网络,成为一个节点。区块链的世界里面,没有中心节点,每个节点都是平等的,都保存着整个数据库。你可以向任何一个节点,写入/读取数据,因为所有节点最后都会同步,保证区块链一致。
区块链没有管理员,它是彻底无中心的。
为什么这样设计,你可以想一下主权(中心)货币有什么缺点。 美国前总统特朗普在位期间推特账号仍然可以被禁言,一个拥有百万粉丝大V的视频号可以瞬间被封,所有视频下架;你在平台创作的任何内容都归平台所有,平台下限或倒闭,这些资源都没有了,如QQ家园下线、QQ宠物下线,游戏中你的数据也都消失了。区块链设计就是不会被大公司大集团或财阀控制。
我们看一下区块链的结构

所谓哈希Hash就是任意长度的任意内容计算出摘要,每个摘要的长度都是固定的(这里是256位二进制)。比如123的哈希是 a8......d0只有123能得到这个哈希,哈希有两个特征。
123得到a8......d0容易,反向推到就很困难,比如我给你个公式你试试看 。 这样就可以保证挖矿很困难,验证很容易注意:理论上,其它字符串也有可能得到这个哈希,但是概率极低,可以近似认为不可能发生。
因此可以通过哈希标识区块。Hash = SHA256( 区块头 )
如果当前区块体的内容发生改动或前一个区块的hash发生改动,该区块的hash一定会改变。结合哈希的两个特性可以得出结论是区块的内容是不可以篡改的。


区块体是一个二叉树结构, 每笔交易tx都会签名生成hash, 每两笔交易的hash合并在生成一个hash,hash会一直两两一起直到根节点MekleRoot, 根节点的hash 即Merkle root hash被包含在区块头中,区块头中的内容还有 上一个区块的hash、当前时间,合在一块再进行hash运算,得到当前区块的hash
通过hash指针的作用(下一个区块头必须包含前一个区块的hash)确保了任何历史区块中的交易不可篡改。因为篡改交易会引起Merkle root hash改变 --> 当前区块hash改变 --> next区块的hash改变, 除非你有全网51%以上的算力。
如何使用比特币钱包转账?
比特币钱包是轻节点,没有交易信息,轻节点要往全节点请求信息和同步信息。所有请求的过程使用私钥加密,你还需要提供公钥,这样全节点才能知道请求的意思。
登录比特币钱包,钱包会请求比特币网络的全节点,全节点收到请求会查询UTXO表中与你有关的没有花费的BTC记录,钱包会根据这些记录计算出你的BTC余额。
假设A转账给B
Merkle Tree中的路径为什需要A的地址(其实是公钥推导的),因为BTC没有找零机制,如果A只有一个整钱10BTC,转账给B 3BTC A则发起两笔交易
3BTC7BTC有了这些信息 就可以往BTC网络发送请求了, 矿机(全节点)收到请求又如何验证你的请求是否合法呢?
拿到 A的公钥 解密签名得到hash1, 再对内容进行hash运算得到的hash2,对比两个hash,如果一致说明,A的消息没有被篡改。
在验证A的BTC来源是否合法, 全节点会依次验证每一笔BTC的来源是否合法。全节点根据该交易在Merkle Tree中的路径,查找该交易相邻的交易hash,递归往上计算出Merkle Tree hash是否正确,如果正确还要通过UTXO表验证这笔钱没有花掉。
A还要支付手续费, 因为BTC协议没有规定矿工必须处理该时间段内产生的每一笔交易,每个区块最多1M, 约4000笔交易,矿工会优先处理手续费高的交易,所以为了保证你的交易写入数据库,手续费必须给,也不能太少, 不然要等很久才能写入区块链甚至迟迟没有写入区块链。
整个过程 中本聪给你提供了输入和输出脚本
先执行输出脚本获得所有BTC来源信息,在再加上本次交易信息传入输入脚本,如果正确则转账成功。
区块链无中心化,没有管理员,谁来维护这个区块链?
中本聪设计了一种策略,简单说大致思路是这样的,由矿工们来维护整个区块链,系统每隔大约10分钟产生一个target,矿工可以通过调整时间戳和铸币信息从而调整个区块的hash使得当前区块的hash < target,先找到答案的矿主将获得奖励,所有矿主停止工作,同步当前区块信息,然后去挖下一个区块。
补充知识点
矿工会得到两笔奖励, 一笔是系统奖励的。根据BTC协议,每产生一个区块,矿工将获得50个比特币的铸币权,比特币奖励的数量每四年减半,大约共有2100万个比特币
另外一笔是交易佣金, 这个由发起交易的人自定义费率,矿工会优先选择收益高的交易去记录,如果你给的少,你的交易可能迟迟不能完成。
目前的情况矿工挖矿的目的主要是为了获取系统奖励,交易佣金的占比很小。挖到比特币获得铸币权是BTC的唯一来源。
这里有一些问题
第一和第二问题。
中本聪设计的这道题是memory less。好比掷硬币,你掷了99次正面,第100次掷出反面的概率仍旧是;如果一个矿工拥有的矿机总共平均一天能挖一个区块,而现在他已经六天没挖到矿了,它还仍需要一天才能挖到矿,如果继续在当前区块挖下去,不仅仅是落后一个区块的问题,其他矿工都会沿着最长链去挖,除非这个矿工拥有全网51%的算力,所以他也会放弃当前区块转向去挖下一个区块。
那么我可以先把挖到的N个区块藏着,等到积攒了一定的数量后再接到从前面数第N区块链上,这样最新的N-1的区块作废掉,我不就可以获得挖矿优势了吗?
实际这样是不行的,因为hash指针的特性,next区块头必须包含当前区块的hash,所以只有挖出当前区块才能接着挖下一个区块。
第三个问题。
即使恶意节点抢占了记账权,它也不能记假账,前面介绍转账的过程说过交易的验证过程,也是利用hash算法保证交易不可篡改,如果他胡作非为别的矿工会重新挖当前区块。
既然不能记假账,恶意可以不记账啊?恶意节点可以选择不记某个交易记录,但是挖掉下一个区块的矿工回去记账。毕竟恶意节点抢到记账权是小概率事件。
BTC系统会产生一个数字target,矿工需要对交易数据、前一个区块hash、时间戳、铸币(每个BTC的CoinBase区域可以写任意内容)等信息计算当前区块的hash,要求该hash小于target。
矿工可以通过不断调节时间戳、铸币信息来使得该区块当前区块hash小于target。
如果target越小,hash的前缀限制就会越长,难度就会变大。
BTC协议规定每挖出2016个区块(约2周)动态调节一次难度系数。
还有一个限制
jsif(新挖矿难度 > 老挖矿难度*4) {
新挖矿难度 = 老挖矿难度*4
} else if(新挖矿难度 < 老挖矿难度/4) {
新挖矿难度 = 老挖矿难度/4
}
结合哈希的特性,正向计算容易,反向计算困难,所以不用担心别的节点验证最新区块的时间开销,让他们转向下一个区块的挖掘。
sybil attack
因为挖矿比拼的是算力, 并不是靠注册用户来投票,所以不用担心攻击者通过注册用户的方式攻击区块链
BTC协议的奖励机制确保了矿工在任何时候都是往主链(最长链)去挖收益最大,除非某个矿主或机构拥有超过BTC网络的50%的算力。
hash签名也保证了矿工不会藏着区块,只有挖出当前区块才能去挖下一个区块,只有挖出当前区块立即公布才能获得最大收益。
BTC的匿名性是相对的。注册BTC账号时,需要填email、name等,每笔交易信息、所有有交易的用户的账户余额等都是公开的。你可以架设服务加入区块链成为全节点,就可以下载区块链上的所有内容。
它的安全性:
与银行卡相比,只有银行人员知道你的账户信息,而BTC是所有人都知道你的账户信息,你可以通过化名、交易一次换一个钱包地址的方式增加隐私性。
但是一旦你与实体世界产生交集,到交易所兑换BTC为美元,就可能被追踪。
保密最好的一个人应该是中本聪,中本聪是一个化名,根据化名推测是一个日本人,应该是男性,没人知道他的真实身份。早期为了推广BTC,他在论坛上写了大量文章进行宣传,早期BTC系统跑在他自己的电脑上,挖矿也容易,积攒了大量的BTC,他应该是没有花过。不为名,不为利,可能是因为信仰。
早的时候都用个人电脑CPU挖矿,但是你仔细想一想,使用计算机挖矿非常浪费,其实你只是用了计算机很小的一部分功能,内存、主存、屏幕和外设都没有用到,CPU大部分功能也是闲置的,因为挖矿只用到了通用CPU很少一部分指令,随着挖矿难度增加,很快使用CPU挖矿便无利可图了。
第二代设备使用GPU, GPU可以并行计算,但是使用GPU挖矿也是有一些浪费,GPU是用来通用并行计算,使用GPU挖矿仍旧有很多部件闲置,比如数浮点数运算,这些对于深度学习很重要,对于挖矿不需要。
目前,第三代设备使用ASIC芯片挖矿。ASIC芯片研发周期很长至少一年的周期,而且ASIC这能用于BTC挖矿。如果BTC价格暴跌,前提投入的钱就打水漂了,如果比特币价格暴涨,ASIC厂商可能找各种理由延迟交付,自己先挖矿几个月再交付,等到交付后,定制的ASIC可能又过时了,矿主已经无力可图了,需要研发新的ASIC芯片。 所以最后真正赚大钱的不是挖矿的,而是卖铲子的。
有人吐槽挖矿耗电、浪费资源,ASIC挖矿只能用于BTC,除此之外别无用途,这与中本聪去中心化设计理念不符,使用CPU挖矿才是真正的去中心化,人人都可以参与
所以很多新生的加密货币使用Alternative Plzzle 代替 Mining Plzzle(工作量证明),通过增大对内存的访问,来抗ASIC芯片化,使CPU挖矿成为可能。比如以太坊,但是Alternative Plzzle只是以太坊不断对外的宣称,最终还是得用GPU挖矿。(补充:最近几年以太坊已经实现了Alternative Plzzle挖矿算法)。
但是又有人吐槽CPU挖矿不安全,大的互联网企业可以利用自己的云服务器,集中某一段时间挖矿获得超过全网51%的算力,进而控制区块链;再或着个人通过短期租赁多个互联网公司的云服务进行挖矿。所以挖矿工具的专业化是对区块链的保护,维护整个区块链不被个人或组织控制。
尽管使用ASIC挖矿,历史上曾经出现某个挖矿机构占有全网51%的算力,但是消息公布后,该机构为了维护比特币的稳定主动减少挖矿占比, 即便如此,几家大的挖矿机构仍旧占有全网大部分算力,能确定他们背后不是一个金主吗?不会联合吗? 所以区块链的安全性、不可篡改性只是相对而言。
民主一定是对的吗?少数服从多数一定是公平的吗?
曾经有个国家就推行绝对的民主所有法律条款全部投票决定,解决凡事与福利相关的政策都能通过,凡事与税收有关的政策都不能通过,没有税收,国家的机制如何运行?
区块链本身效率就很低,全节点越多效率越低,BTC每秒只能进行6笔交易,大的交易要等待6个区块确认(1个小时)的时间,这与中国某电商网站每秒百万级笔并发交易,效率低多了。BTC系统想升级区块的大小为2M(仅扩大一倍,每笔交易增加一倍),但是只能通过硬分叉的方式(存在永久性的分叉),最后阶段没有达成共识,被取消了。
比特币钱包的钥匙是私钥,如果丢了,没有任何补救方案,钱就只能烂在里面,UTFO也在不断增长。
BTC总量2100万?总量固定一定是好事吗? 以下内容来自北大肖臻老师《BTC思考》
稀缺的东西是不适合作为货币的,我们总觉得通货膨胀是坏事,因为钱变得不值钱了,但是一个好的货币其实要有通胀功能的,黄金在古代有段时间确实用来做货币,但是现在社会基本都废弃了金本位,虽然每年都有新产量,但是黄金增长的速度远远比不上新创造财富的速度,如果用黄金作为货币,黄金变得越来越值钱,如果某人家里祖上拥有金矿,那么这个人就不用工作了,天天坐在家里吃喝玩乐,后来的人永远也赶不上,国内这些年的房地产就是这种情况,如果房地产保持这种态势疯长,那么已经买房的人变得越来越富,没有买房的人永远也买不起,个人奋斗变得没有意义,一个健康的社会是不应该出现这样的状况
吐槽了这么多BTC得缺点,为什么BTC系统能运行至今?为什么还有那么多人相信BTC? 其实加密货币与主权货币并非对立,加密货币也是一个不断发展的过程,它是互联网信息与价值交换的完善,在跨国转账方面,BTC的手续费和转账周期远比主权货币方面很多。
对于 区块链、Web3 很多人持有皆然相反的态度,在引用肖臻老师的名言 “我们说知识改变命运,但是对知识的一知半解可能会是你的命运更差!”
本文是基于 北大公开课肖臻老师《区块链技术的应用》 一门课程 的前半部分(BTC)的深入总结
本文作者:郭敬文
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!