2023-10-02
Web3
00
请注意,本文编写于 194 天前,最后修改于 55 天前,其中某些信息可能已经过时。

目录

比特币诞生的背景
比特币是如何运作的?
区块的数据结构
区块链的结构
区块体的数据结构
转账
首先要知道你的账户余额
转账的要提供的信息
验证交易的合法性
区块链的维护
区块链的激励机制
如何保证区块的安全
为什么控制10分钟内产生一个区块?
如何控制每10分钟产生一个区块?难度系数的调节
女巫攻击
分叉攻击
BTC的匿名性
挖矿真的能赚钱吗?
关于比特币的思考

这几天调研了Web3技术,知识如果不梳理很快就成了过眼云烟。计划用两篇文章梳理web3技术, 这一篇文章先从比特币说起。比特币是区块链的应用,区块链是比特币的底层技术,区块链又是web3技术的一种)。本文尝试以故事讲述比特币诞生的背景,以问答的形式阐述比特币的运行机制。

比特币诞生的背景

2008年9月15日,美国雷曼公司破产,次贷危机爆发,800万人失业,600万人无家可归,财产损失大约5万亿美元。

为什么雷曼公司破产有这么大的反应?

举一个不太恰当的例子,拿中国房地产举例。
如果恒大宣布破产,会有很多烂尾楼,很多家庭不仅无家可归还要还房贷,买房的人瞬间消失, 会有更多房地产开发商破产,开发商的钱是通过抵押物(楼盘、公司股票)等抵押给银行换来的,抵押物(楼盘、股票等)价格下跌,银行会要求开发商补充抵押物,加剧开发商的破产, 开发商破产,银行的钱要不回来,储户担心银行破产排队从银行取款,储户挤兑加剧银行破产,储户取不出钱,会降低消费,企业没有利润会将本增效(裁员),失业导致经济进一步下滑,,,金融是一个很复杂的事情,开发商的破产不仅是购房者的损失,通过资产证券化,很多投资人、保险机构都会受到影响,这是一个多米乐骨牌倒塌的过程,最终影响到每一个人。

大家有没有想到1929经济大萧条?先别着急喷我,拿中国举例确实不恰当,我并不是唱空中国,对我没有任何好处,相反目前情况我比任何人都希望中国经济赶紧复苏。我写博客第一目的是梳理自己的知识体系,自我提高,第二目的是传播知识、启发思考,仅此而已。

说偏了,回归正题,美国硅谷银行、第一共和银行破产,美国政府都对储户进行了兜底,这才导致银行危机没有蔓延,中国政府也不会让恒大破产,还等着许老板组织还债呢。

那么这个故事告诉我们什么呢?

前几年大家都认为“房子永远会涨,国家不会让房价下跌”,后半句我信,但经济是有周期,有规律的,不存在永远的上涨,那么中国股市是否永不涨呢?我只是启发你思考,仅此而已,别多想,别人不会为你的行为买单。

又说偏了,金融危机让大部分人认识到,原来银行也会破产,存钱也非绝对安全。为了不让经济危机发生,美国政府为银行买单,政府的钱一方面来自纳税人,另一方面来自印钞机。当然也不可能无限印钱,那么不就成为玻利瓦尔货币了呢?美国政府使用纳税人的钱给银行兜底,也是一种变相的全民买单。

这里有没有看到主权货币有什么缺点?

  1. 滥发货币导致本币的贬值,进而引发通货膨胀、主权危机
  2. 假币、磨损、交易手续高
  3. 私有财产安全问题(银行存款转账都是实名制)

金融危机让人们认识到主权货币的问题,这正是这个时候,2008年11月1日有一个日本的网络极客,化名中本聪,他在网络上发布一篇文章《比特币,一种点对点的电子现金系统》

他提出一种构想,我们可以设计一种去中心化的电子记账系统。支持这个电子记账系统运作的就是比特币BTC, ⽐特币实际上是⼀种电⼦货币或者叫数字货币,他是基于密码学的⼀种货币。它有以下特点:

  1. 总量固定,约2100万个BTC,不存在滥发货币引发通货膨胀的问题。
  2. 通过密码学问题解决假币问题,电子货币不存在磨损问题,跨国转账效率高,手续费极低。
  3. 因为它机遇基于区块链去中心化的实现,具有无法篡改的特性,还有一点就是匿名,也就不用担心私有财产安全问题。

看起来很完美,我们来深入研究一下它。

个人推测,中本聪应该是早已设计好BTC系统,之所以在金融危机时发布,应该是为了获得更高效的推广。

比特币是如何运作的?

如果在现实世界中,拿A、B、C、D四个人做生意来说,传统的记账方式是,每个人手中都有一个账本(去中心化),每次交易四个人都会记账。如果账单有问题,则按少数服从多数的原则,除了偶尔有几记几笔交易存在误差,没有人敢改动账本,不然大家都不跟他玩了。那么电子货币如何运作呢?以下问题都值得思考。

  1. 如何存储这些账单,谁来维护?
  2. 账单以谁为准?A、B、C、D都有账单, 为什么每个人都愿意记账?用自己的电脑存储记录一个与自己无关的账单?
  3. 交易数据、个人隐私如何保密?
  4. 发起交易,如何验证验证转账当事人钱包有足够的BTC?
  5. 如何防止篡改?A冒充B的身份给C转账
  6. 如何防止双重支付?A说B转了10个BTC,又说给C转了10个BTC,但A只有10个BTC。
  7. 我只是进行交易,不想去维护区块链可以吗?(历史所有区块的交易信息很大,比特币钱包如何实现?)

先说一下大致思路

  1. 账单存储在区块链中,每个人都可以架设服务加入整个区块链,成为矿工,由矿工负责记账和维护整个区块链
  2. 系统每隔约10分钟产生一个区块,谁最先挖到矿,谁就有权记录这段时间的交易,打包成区块,加入到区块链中。记账有奖励,这种奖励机制也考虑了如何保证区块链的“链”结构,避免分叉,形成共识去维护最长链(主链)。
  3. 通过hash签名,保证交易数据的不可篡改。通过非对称加密保证个人隐私和使用自己钱包的权利。
  4. 转账钱要你提供花费的这些BTC的来源,矿工会验证你提供的这些BTC有没有花费。
  5. 奖励机制确保所有矿工都去维护最长区块链,区块之间通过hash指针连接,hash指针也确保了区块的不可篡改,越是前面的区块,越难篡改,一般大的交易需要等待6个区块的确认。交易信息包含BTC得来源,该来源中包含当事人的公钥,转账要提供当事人的公钥,两者必须一致,这确保了A不能冒出B的身份转账给C
  6. 系统中有一个UTXO表记录还没有被花出去的BTC,如果你花过了BTC会从UTXO表中删除,别人得到的BTC会记录在UTXO表中。
  7. 区块链中包含轻节点和全节点,全节点包含所有区块的区块头和区块体,轻节点只有最近区块的区块头信息,比特币钱包就是轻节点应用,发生交易请求要去询问全节点,只有全节点才能参与挖矿,维护整个区块链

区块的数据结构

中本聪设计了一种特殊的分布式数据库,叫做区块链,交易信息就存储在每一个区块中,所有区块通过链表的方式连接到一起,被称为区块链。 image.png

任何人都可以假设服务器,加入区块链网络,成为一个节点。区块链的世界里面,没有中心节点,每个节点都是平等的,都保存着整个数据库。你可以向任何一个节点,写入/读取数据,因为所有节点最后都会同步,保证区块链一致。

区块链没有管理员,它是彻底无中心的。

为什么这样设计,你可以想一下主权(中心)货币有什么缺点。 美国前总统特朗普在位期间推特账号仍然可以被禁言,一个拥有百万粉丝大V的视频号可以瞬间被封,所有视频下架;你在平台创作的任何内容都归平台所有,平台下限或倒闭,这些资源都没有了,如QQ家园下线、QQ宠物下线,游戏中你的数据也都消失了。区块链设计就是不会被大公司大集团或财阀控制。

区块链的结构

我们看一下区块链的结构 image.png

  • 区块头: 记录当前区块的特征值
    • 生成时间
    • 上一个区块的Hash
    • 实际数据(当前区块体)的Hash
    • 当前区块的hash
    • ......
  • 区块体: 记录交易信息

所谓哈希Hash就是任意长度的任意内容计算出摘要,每个摘要的长度都是固定的(这里是256位二进制)。比如123的哈希是 a8......d0只有123能得到这个哈希,哈希有两个特征。

  1. 123得到a8......d0容易,反向推到就很困难,比如我给你个公式你试试看 x3+log2x+sinx=yx^3+log2^x+sinx=y。 这样就可以保证挖矿很困难,验证很容易
  2. 任何微小的更改都会导致hash的雪崩(hash的一半左右的二进制位发生改动)。

注意:理论上,其它字符串也有可能得到这个哈希,但是概率极低,可以近似认为不可能发生。

因此可以通过哈希标识区块。Hash = SHA256( 区块头 )

如果当前区块体的内容发生改动或前一个区块的hash发生改动,该区块的hash一定会改变。结合哈希的两个特性可以得出结论是区块的内容是不可以篡改的。

区块体的数据结构

image.png

image.png

区块体是一个二叉树结构, 每笔交易tx都会签名生成hash, 每两笔交易的hash合并在生成一个hashhash会一直两两一起直到根节点MekleRoot, 根节点的hashMerkle root hash被包含在区块头中,区块头中的内容还有 上一个区块的hash、当前时间,合在一块再进行hash运算,得到当前区块的hash

通过hash指针的作用(下一个区块头必须包含前一个区块的hash)确保了任何历史区块中的交易不可篡改。因为篡改交易会引起Merkle root hash改变 --> 当前区块hash改变 --> next区块的hash改变, 除非你有全网51%以上的算力。

转账

如何使用比特币钱包转账?

首先要知道你的账户余额

比特币钱包是轻节点,没有交易信息,轻节点要往全节点请求信息和同步信息。所有请求的过程使用私钥加密,你还需要提供公钥,这样全节点才能知道请求的意思。

登录比特币钱包,钱包会请求比特币网络的全节点,全节点收到请求会查询UTXO表中与你有关的没有花费的BTC记录,钱包会根据这些记录计算出你的BTC余额。

转账的要提供的信息

假设A转账给B

  • 转账内容
  • A公钥(矿工需要你的公钥,才知道转账的内容)
  • A的地址(找零使用,这里说明一下,钱包地址是公钥进行hash运算得到的摘要)
  • B的钱包地址(这里说明一下,钱包地址是公钥进行hash运算得到的摘要)
  • A的BTC来源
    • 区块的hash
    • 该交易的hash
    • 当前交易在Merkle Tree中的路径
  • A的签名
  • 手续费
  • 其他还有协议版本等额外信息

为什需要A的地址(其实是公钥推导的),因为BTC没有找零机制,如果A只有一个整钱10BTC,转账给B 3BTC A则发起两笔交易

  1. A转给B 3BTC
  2. A转给A 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的唯一来源。

如何保证区块的安全

这里有一些问题

  1. 我是矿工为什么要停止当前工作,同步你的信息?我可以继续挖,把我的这条链挖成最长成为主链
  2. 什么机制驱使矿工们朝着最长链区去挖矿
  3. 有坏人怎么办,我往区块中记录假的交易信息,或者就是不记录某条信息怎么办?
  4. 为什么要控制约10分钟产生一个区块?又如何做到10分钟内产生一个区块?

第一和第二问题。

中本聪设计的这道题是memory less。好比掷硬币,你掷了99次正面,第100次掷出反面的概率仍旧是1/21/2;如果一个矿工拥有的矿机总共平均一天能挖一个区块,而现在他已经六天没挖到矿了,它还仍需要一天才能挖到矿,如果继续在当前区块挖下去,不仅仅是落后一个区块的问题,其他矿工都会沿着最长链去挖,除非这个矿工拥有全网51%的算力,所以他也会放弃当前区块转向去挖下一个区块。

那么我可以先把挖到的N个区块藏着,等到积攒了一定的数量后再接到从前面数第N区块链上,这样最新的N-1的区块作废掉,我不就可以获得挖矿优势了吗?
实际这样是不行的,因为hash指针的特性,next区块头必须包含当前区块的hash,所以只有挖出当前区块才能接着挖下一个区块。

第三个问题。
即使恶意节点抢占了记账权,它也不能记假账,前面介绍转账的过程说过交易的验证过程,也是利用hash算法保证交易不可篡改,如果他胡作非为别的矿工会重新挖当前区块。
既然不能记假账,恶意可以不记账啊?恶意节点可以选择不记某个交易记录,但是挖掉下一个区块的矿工回去记账。毕竟恶意节点抢到记账权是小概率事件。

为什么控制10分钟内产生一个区块?

  1. 每个区块约1M大小,在分布式网络上传输需要一些时间,传输到所有的节点正常情况下也要几十秒到1分钟,如果设计的时间太短,容易造成分叉,分叉不利于区块链的安全,当然交易时间太长也不利于比特币的推广。10分钟、1M大小、每两周调节难度,应该是中本聪根据以往经验(在比特币之前有20多种失败的加密货币)结合理论估算的大致参数值,这些参数从比特币系统能够成功运行下去的角度说还是比较靠谱的。

如何控制每10分钟产生一个区块?难度系数的调节

BTC系统会产生一个数字target,矿工需要对交易数据、前一个区块hash、时间戳、铸币(每个BTC的CoinBase区域可以写任意内容)等信息计算当前区块的hash,要求该hash小于target

矿工可以通过不断调节时间戳、铸币信息来使得该区块当前区块hash小于target

如果target越小,hash的前缀限制就会越长,难度就会变大。

BTC协议规定每挖出2016个区块(约2周)动态调节一次难度系数。

新的挖矿难度=老挖矿难度(2/老挖矿时间)新的挖矿难度=老挖矿难度*(2周/老挖矿时间)

还有一个限制

js
if(新挖矿难度 > 老挖矿难度*4) { 新挖矿难度 = 老挖矿难度*4 } else if(新挖矿难度 < 老挖矿难度/4) { 新挖矿难度 = 老挖矿难度/4 }

结合哈希的特性,正向计算容易,反向计算困难,所以不用担心别的节点验证最新区块的时间开销,让他们转向下一个区块的挖掘。

女巫攻击

sybil attack

因为挖矿比拼的是算力, 并不是靠注册用户来投票,所以不用担心攻击者通过注册用户的方式攻击区块链

分叉攻击

BTC协议的奖励机制确保了矿工在任何时候都是往主链(最长链)去挖收益最大,除非某个矿主或机构拥有超过BTC网络的50%的算力。

hash签名也保证了矿工不会藏着区块,只有挖出当前区块才能去挖下一个区块,只有挖出当前区块立即公布才能获得最大收益。

BTC的匿名性

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 许可协议。转载请注明出处!