这几天调研了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则发起两笔交易
3BTC
7BTC
有了这些信息 就可以往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 许可协议。转载请注明出处!