敏捷测试转型 聊聊区块链和比特币 上

鼎叔 · November 17, 2025 · 419 hits

这是鼎叔的第一百二十八篇原创文章。行业大牛和刚毕业的小白,都可以进来聊聊。
欢迎关注公众号《敏捷测试转型》,星标收藏,大量原创思考文章陆续推出。
大约八九年前,区块链和比特币在国内掀起一轮高潮,鼎叔学习过一段时间,后来因为业务方向变化就中止了,今年重新学习相关知识,累积写了 1.5 万字的系统学习笔记和思考,感觉认知上提升了一个台阶。在和 web3/区块链/加密货币从业人员交流时,自己俨然可以冒充该领域的理论专家了。
本文内容参考了肖臻的《区块链的技术和应用》。
鉴于相关内容博大精深,该热门行业的更新故事也很多,如果没有 Deepseek 的帮助,写作过程会很艰难。系列文章写下来,鼎叔至少问了 AI 几十个关于区块链的有意思的问题,几乎每个回答都有闪光点,帮我进一步补充了细节,填补了深坑。
贯穿全篇始终的概念:对于去中心化的区块链和加密货币领域,存在两种人,“投机者” 和 “信仰者”,缺一不可,区块链技术在两者的博弈中快速发展和完善。很多精巧的设计和烧脑的哲思,都映射了现实金融社会的心理博弈。

理解加密货币
加密货币的信息其实是完全公开的,包括源代码,白皮书和交易数据都是全网可查的,这种公开性既是交易安全的保障手段,也是彻底去中心化的金融业务的需要。
所谓 “加密” 是指区块链技术中用到的密码学知识,更具体而言,就是求 “哈希值” 和 “签名”。
任何加密算法都没有绝对意义上的不能破解,只是看破解概率是不是足够小,耗费时间是不是足够长。如果用目前的先进计算机要计算到地球爆炸才能破解的算法,我们就可以认为它足够安全。
算法要做到:针对不同的输入,函数(在长到地球爆炸的时间内)都不会出现同样的输出,这叫 Collision resistance,即不可能通过人为规则实现哈希值的碰撞,这也是不可篡改性的根源。
哈希算法的主要性质就是不能反推:从输入到输出可以被公众验证,但是给一个输出值,公众无法推导出输入值。
这种性质是如何形成的呢?一是因为输入空间远远比输出空间大,二是输入取值很均匀。
鼎叔想到一个例子是宇宙生命理论,宇宙虽然有无穷无尽的星球(输出空间),但宇宙的尺度更大,且宏观上分布均衡,所以要发现其他星球的生命现象难度超级高。

挖矿的过程
比特币的挖矿过程,就是一个成功概率极低的计算过程,矿工找到一个随机数(nounce),用它参与自己区块头的哈希运算,得到一个满足难度要求的哈希值,这样的值就是前面有足够多的连续一串 0,比如 0x00000000000000000001a8d8a36221d7e5b3f3a8a5c1e5。
这个计算密题符合前面说的均匀性质。通过这种计算获得本区块记账权的方式就叫工作量证明(PoW,Proof of Work)。
虽然挖矿寻宝的过程很困难,但其他区块节点要验证该区块的结果(nounce)是很容易的。比特币采用的是 256 位哈希加密算法(SHA256),采用公钥和私钥对的方式进行签名和验证。公钥在全网公开,私钥则本人保存。
虽然破解 SHA256 是几乎不可能的事,但产生随机数(nounce)的方法一定要足够好,否则很容易泄漏私钥从而导致资产被盗。

区块链的链表结构
区块链就是一个个区块连接在一起形成的链表结构,它和大学计算机课上学的链表看着类似,但每个区块都是通过哈希指针串联起来的。这样的好处是既能找到前一个区块,又能检测是否被篡改,因为只要前面任意一个区块被改动,哈希值就会发生变化。
比特币被挖出来的第一个区块叫 “创世块” Genesis Block,最新挖出的区块叫 most recent block,每个区块都有哈希指针,把前一个区块内容和指针一起进行哈希计算。

在每一个区块中都有 Merkle tree 的结构,它和普通二叉树的区别也是用哈希指针代替了普通指针。这棵树的最下面一层(叶子)就是存放交易的数据块。这棵树的根部(merkle root)就是存放了根哈希的 block header,通过根哈希可以检测出树中的任何部位是否发生了篡改。

比特币中的树结构没有循环依赖,不需要排序。

比特币网络中的区块分为全节点和轻节点。全节点保存所有的交易内容,而轻节点占大多数,它们只保持 Block header,并不需要保存交易内容,需要的时候询问全节点即可。全节点保存的交易数据越来越多,但就总体积而言,装进普通服务器里还是绰绰有余的。

金融安全 - 双花攻击
现实社会的央行可能会量化宽松,新投放大量货币,但是在比特币世界中,货币总量是一定的。那坏人能否把同一个比特币消费两次呢?这被称为双花攻击:double spending attack。
中心化的银行把账户和交易金额统计在数据库中,防范重复交易。而去中心化的比特币则没有账户概念,但是要说明币的来源,以便其他节点验证交易的有效性,验证的方法就是把交易的输入脚本和提供来源的输出脚本进行配对。
比特币中,假设 A 给 B 转账,B 要公开自己的地址,而 A 需要让其他人(节点)知道自己的公钥。比特币的每笔交易都有输入和输出部分,输入部分记录了交易的来源 A,输出部分记录了 B 的公钥哈希,这样能确保每一笔交易都能被全网溯源,找不到来源的交易不会被其他区块认可,从而达到防范双花攻击的目的。

区块奖励
在比特币的初期,每挖出一个新区块的矿工,可以得到 50 个比特币的奖励,这放在今天是一笔巨款。系统规定,每挖出 21 万个区块后,奖励减半。整个比特币系统的平均出块时间要控制在 10 分钟,这是预先设计的,照此计算,出 21 万个区块需要约 4 年时间。
2025 年的今天,挖出一个区块的奖励已经降低到 3.125 个比特币了。
挖矿的难度从数学上来说还没有发现捷径,这也说明比特币激励机制没有大的漏洞。可以认为,挖矿获得的财富和矿工的算力成正比。
所以,矿工通过尝试 nounce 计算来获得财富,与真实的挖矿淘金是有类似性质的。矿工都是非常辛苦,成功概率很低,但一旦挖到矿就有很高的回报。
矿工求解 nounce 的过程中,每尝试一次都是无记忆性的,即挖矿成功的概率不会随着尝试次数的增加而增加。这样的好处是避免算力高的矿工获得超出比例的暴利。因此矿工算力占比决定了挖矿的平均时间。
nounce 随机数只是一个 32 位无符号整数,所以矿工的探索空间并没有想象的大,存在着被穷举破解的可能,但区块还有其他字段是可以被修改的,这些字段可以作为 extra nounce,给矿工提供无穷的探索空间。

比特币的交易实现
比特币采用基于交易的账本模式(transaction-based ledger),全节点要维护一个 UTXO 数据结构,用户资产由多个地址对应的 UTXO 总和构成。
UTXO:Unspent Transaction Output,未花费交易输出。
每笔比特币交易都包含输入和输出,例如 A 对 B 转账,输入会引用 A 的 UTXO,输出会生成新的 UTXO,分配给 B,或者作为找零返回给 A。一旦交易完成,UTXO 一旦作为后继交易的输入后,就被标记为 “已花费”,退出 UTXO 集合。

这张图就是两个 UTXO 交易的示例。一个交易可能有多个输出,UTXO 要给出产生这个输出的交易的 hash 值,以及它在交易里是第几个输出。
UTXO 的特性确保了交易的唯一性,交易完成后不可逆,还能支持多交易的并行验证。

区块交易的手续费
以上 UTXO 的交易 Input 的币值,不完全等于 Output 的币值,中间有一点小差距,这就是付给挖出该区块的矿工的手续费。
为什么要给矿工手续费?据说是防止矿工的自私行为,不给好处就可能只打包自己的交易(很现实呀)。
每个区块的第一个交易,被称为 Coinbase 交易,由挖出本区块的矿工创建,就是把出块奖励和本区块内所有手续费汇总后付给矿工。这几年有个最热门的交易所也叫 Coinbase,真是会抢占名字。
更有甚者,有些矿工会在 coinbase 预留字段中写下自己的专属信息,在区块链中永久储存,这就类似以太坊智能合约中的不可篡改内容。
挖矿的矿工,主要收益是挖出新区块的出块奖励,其次才是这些交易手续费(约占出块奖励的 1/100)。随着出块奖励每四年减半,将来交易手续费可能就成为主要收入了。
出块奖励定期大幅减少,但是矿工的热情并没有下降,因为比特币的价值提升了,同时技术改进也带来了挖矿效率的大幅提高。
前些年比特币算力(hash rate)增长呈指数发展,这也说明它始终被热捧。而有些新加密货币总算力还会下降,说明它快没人玩了。

分叉攻击
矿工在挖新区块时,可能出现两个矿工同时挖到新区块,链接到最近的区块链上,形成一对分叉。那哪一个分叉会被其他网络节点所认可呢?
图片
其他矿工默认会在最长的合法区块链上继续往下挖。一旦有一个更长的分支胜出,另一条分支及其交易内容就被遗弃了,上面的区块也就白挖了。挖矿机制提供了让矿工们投票选择的安全手段,只要多数矿工是诚实的,诚实的矿工不会接受虚假交易。

黑客想通过双花牟利,只能采取分叉攻击,比如:电商交易中支付了比特币,拿走商品,马上再发起该比特币的转账给自己,这两个交易写入不同的新区块,让后者所处的分叉成为最长合法链。

所以在现实世界,电商平台接受到付款后,不用急着发出商品,可以等待 6 个新的区块被确认上链后,再发出商品,这样就可以尽可能防范分叉攻击,这个时间也就一个小时左右。

从这个例子可以看出,去中心化的支付体系很慢,用慢来保障安全。

不诚实的矿工有可能故意不写入合法交易么?

这样的话,其他诚实节点会写入最新的合法交易。而矿工分布在全球大量节点,合谋的可能性也非常低。

那矿工有可能挖出了新区块故意不发布,等别人发布新区块后再发布,从而故意形成新的分叉么?这个行为感觉损人不利己,有很大的几率让自己挖出的区块作废了,因为其他矿工都是顺着最长合法链继续挖的。

挖矿的难度调整

比特币网络‌每生成 2016 个区块‌会自动调整一次挖矿难度,以维持平均每 10 分钟生成一个新区块的设计目标,这个调整周期约为 2 周(2016*10 分钟)。‌

全节点是一直在线的,它在内存中维护 UTXO 集合,监听比特币网络的交易信息,快速检验交易的合法性,一是检测是否有篡改,二是看发布区块是否符合难度要求,并在每两周调整难度,决定哪个交易打包进区块,判断沿哪个链路往下挖,选哪个分叉。

轻节点则不需要一直在线,不用保存所有数据,只保存 header 即可,需要的存储空间是全节点保存所有区块的千分之一。轻节点只保存和自己相关的交易,无法检测合法性,但能验证难度,也能检测出最长链(但不能确定是否最长合法链)。如果轻节点在挖矿过程中发现新发布区块,就停止已有挖矿,重新组装一个区块重新挖。

下一篇继续聊聊比特币挖矿芯片的演进,交易,以及更多思考。

No Reply at the moment.
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up