把北大肖臻老师的《区块链技术与应用》公开课中跟BTC相关的内容重新刷了一遍,很多原本以为记住的名词,在逐字逐句回放时被我推倒重来。整理到第十三篇笔记时,我发现最值得写下来的其实不是某个协议细节,而是那些“我原以为懂了、但换个问法就露馅”的思考。
所以这篇文章大致可以分为三块:先聊我在听课过程中反复纠正的几个底层概念,比如数字签名和地址的关系、UTXO和“账户余额”的差别;再回到BTC的共识与脚本设计,聊一聊为什么整个系统要这样取舍;最后把我课后自己做的一个双花验证实验完整记录下来。整个过程不涉及投资分析,也不评价币价,纯粹从工程和技术原理出发。适合刚看完公开课、但还没有把BTC整体逻辑串起来的学习者,也适合准备做区块链开发、想建立正确心智模型的从业者。
1. 反复“回炉”之后,我才意识到BTC的门槛不是代码,而是概念
1.1 从“数字货币”到“记账系统”的转折
我第一遍看肖老师的课时,注意力全放在“比特币怎么支付、怎么挖矿”这些操作层,笔记里记满了各种哈希算法和出块时间,觉得自己好像已经懂了。真正让我停下来的是肖老师反复用“账本”打比方的一个说法:区块链不会记录“张三拥有多少比特币”,而是记录每一笔钱的来源和流向。
这句话当时让我愣了一下。因为我过去一直在用银行账户的心智模型去理解比特币,总以为每个地址背后有一张余额表,交易就是余额表的加减。但BTC不是这么运作的,它维护的是一套“谁付给谁、付了多少、钱从哪一笔来”的交易链。所有地址里到底有多少钱,其实是根据未花费交易输出临时算出来的。
这个转折非常重要。后面的UTXO、脚本、双花验证,全部建立在这个“面向交易”而不是“面向账户”的模型上。如果不先把这里掰过来,看后面的代码和协议就会一直觉得别扭。
1.2 整理笔记前,我一直没有回答上来的三个问题
为了检验自己是不是真的理解了,我在重新听课之前先给自己提了几个问题,结果回答得很勉强。
第一个问题是:转账时,你拿私钥签名的到底是什么?我第一反应是“签一个付款指令”,但更准确地说,你签名的是“对某个未花费交易输出的处置权”。这个输出指向你的地址,你有权决定它下一步去哪里。第二个问题是:节点的“全节点”到底在验证什么?不是简单验证签名,而是要验证交易引用的UTXO是否真实存在、是否没有被花过、锁定脚本能否被解锁。第三个问题是:为什么BTC都说要用六个区块确认,而不是像以太坊那样用十几个?这些问题在公开课里其实都有对应答案,只是我第一遍没有把概念串起来。这篇文章,就是我把这些概念重新排好序之后的笔记。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数字签名和地址是两回事:我走了很久才绕出来的弯路
2.1 BTC里的“加密”其实不是加密,而是防伪
很多人第一次听到“比特币是基于密码学的”,会顺理成章认为交易过程是“加密传输”。但肖老师提醒过一个非常重要的区分:BTC的大多数数据本来就是公开的,区块、交易、地址全部在链上,根本不需要保密。它真正需要的是“防伪造”和“防篡改”,也就是让任何人都能验证一笔钱确实被合法拥有者转走,且没人能冒名顶替。
所以BTC用的核心密码学工具不是对称加密或非对称加密,而是哈希函数搭配数字签名。哈希函数在这里承担的是“指纹”功能:给任意长度的数据生成一个定长结果,很难从结果反推原文,也很难找到两个不同输入得到同一个输出。交易里的“一笔钱从哪里来、到哪里去”会被哈希后固定在区块中,一旦有人改动哪怕一个字节,后续所有引用它的结构都会暴露问题。
2.2 地址不是公钥,而是公钥的哈希指纹
这是我过去最容易混淆的一点。我最早做开发时,潜意识里觉得地址就是公钥,或者至少是公钥的某种缩写。直到自己手动构造交易时才发现,BTC地址的生成过程是多步哈希的结果:私钥通过椭圆曲线算法secp2
