第2讲:BTC-密码学原理 北大肖臻老师客堂笔记

这节课系统讲清了支撑比特币的两大密码学支柱:哈希函数和公钥密码/数字签名,并用这些工具解释"比特币为什么能防伪、防篡改、防冒充"。

一、密码学在比特币中的角色

  • 课程先强调电子货币系统必须解决四个核心问题:如何保密、如何防篡改、如何确认"你就是你"、以及如何防止事后否认自己转过账。密码学正是用来给这些问题提供"工程级"的技术解法的基础设施。
  • 讲课中多次提醒:不要带着"传统银行系统"的思路看比特币,而要意识到在完全开放的网络环境下,只能依赖数学和算法来建立信任,这为后面所有技术细节定下了基调。

例子:如果你在QQ群里转账给别人,没有任何中心机构背书,那么其他人如何确认这笔"转账记录"是真的?这就需要密码学来保证这条记录既不能被别人随便伪造,也不能被你自己事后篡改或否认。

二、哈希函数:区块链的"指纹机"

  • 课程用"给任意数据生成短小指纹"的比喻解释哈希函数:无论原始数据多长,丢进哈希函数得到的值长度固定、看起来随机,却对输入极度敏感,一点点改动都会导致截然不同的输出。
  • 重点强调哈希的三大性质:单向性(从结果几乎推不回输入)、抗碰撞(几乎不可能找到两个不同输入有同样输出)、以及雪崩效应(输入微变输出大变),这些性质保证了"只看指纹就能检查内容是否被篡改"。

例子:

  • 把"转账给张三 10 BTC"文本当作输入,计算出哈希值 H1。哪怕只是偷偷把"10"改成"11",重新算出的哈希 H2 与 H1 完全不同。于是网络里的节点只要对收到的交易重新算一遍哈希,就能立刻发现数据有没有被动过手脚。

三、哈希在比特币中的具体用法

  • 讲到比特币时,老师把哈希函数变成一个"命名工具":每笔交易、每个区块都通过哈希得到一个"名字",这个名字长度固定、便于传播,又很难和别的数据重复,因此非常适合在点对点网络中当作标识符使用。
  • 此外,课程还会提到:区块头里包含上一个区块的哈希,从而形成一条哈希链;区块内部为了一次性概括所有交易,会用到更复杂的结构(默克尔树),让一个哈希值就能代表"这一整个交易集合"。

例子:

  • 某一区块包含 2000 笔交易。通过默克尔树把这 2000 条记录逐层哈希,最终得到一个"总哈希"写在区块头中。以后任何人若想证明"某笔交易确实包含在这个区块内",只要提供一条从这笔交易到树根的哈希路径即可,验证效率非常高。

四、公钥密码与数字签名:谁在花钱

  • 在解决"谁在花钱"之前,老师先介绍公钥密码体系:每个人有一对密钥,私钥自己保存,公钥可以公开。用私钥做的数学运算(签名),只有对应公钥能验证;反之,没有私钥的人无法伪造同样的结果。
  • 课程以"签名"而不是"加密"来解释比特币的用法:用户用自己的私钥对交易内容签名,所有节点利用公开的公钥来检验这笔交易是不是由该用户发起,从而实现"谁对转账负责"的认证和不可否认性。

例子:

  • 你要把 1 BTC 转给小王。你构造一条交易信息:"从我的某个 UTXO 转出 1 BTC 给小王的地址",然后用私钥对这条消息做数字签名。全网节点收到后,用你的公钥验证签名。如果签名对得上,说明确实是你发的,而不是别人冒充你乱花你的钱。

五、比特币地址、私钥、公钥的关系

  • 老师会说明:普通用户看到的是"地址",但底层是从公钥经过一系列哈希和编码得到的结果,这样做既缩短了长度,又通过多次哈希增加了安全性和容错性。
  • 这一设计带来两个效果:一方面,拿到地址无法反推出公钥甚至私钥,保护了用户安全;另一方面,一旦用户用对应私钥签名,网络就能通过地址映射出公钥,再进一步验证签名是否有效,从而把"地址"和"控制权"对应起来。

例子:

  • 可以把地址理解成"银行卡号",公钥类似"卡的某些公开参数",私钥则是"只有你知道的 PIN+签名设备"。别人看到你的地址可以给你转账,但无法从地址推回你的私钥;只有你能对"从这个地址花钱"的交易签字。

六、两大工具如何共同保证安全

  • 课程最后把哈希和数字签名串联起来:哈希保证了"账本上写的内容一旦确定,任何微小篡改都会暴露";数字签名保证了"只有真正所有者才能发起有效的转账"。合在一起,就构成了一个无需中心机构也能维持的"公开、可验证的账本系统"。
  • 进一步讲,比特币通过"哈希链"让区块彼此捆绑,通过"全网节点验证签名"来过滤非法交易,再在后续章节用工作量证明、共识协议等机制解决"谁来写下一个区块"的问题,这一讲则是后面所有机制的密码学地基。

概念总结

这一讲的内容可以按你说的三块来记,既有概念,也有内在结构,还有"为啥这套东西能跑起来"的直觉。

一、记概念:几个核心密码学积木

  • 哈希函数:输入任意长度数据,输出固定长度"指纹",特点是单向(不能反推原文)、抗碰撞(几乎找不到两个不同输入同哈希)、雪崩效应(改一位结果大变),在比特币里用来给交易、区块、交易集合"起名字"和做完整性校验。
  • 公钥 / 私钥:每个用户有一对密钥,私钥自己保管,公钥可以公开;任何人能用公钥验证"这条消息确实由对应私钥签过名",但不能从公钥算出私钥。
  • 数字签名:用私钥对"具体的交易内容"做数学运算,生成一段签名;别人拿到交易内容和签名,用公钥一验就知道是不是你签的,既可以防伪造,又让你事后不能否认自己发过这笔交易。
  • 地址:对公钥做多次哈希和编码得到的短字符串,用来当"收款账号";别人看到地址可以给你打币,但既不能从地址推出私钥,也不能单凭地址花你的钱,必须配合私钥签名才行。

小例子:

  • 你写了一条消息:"给张三 1 BTC",算出哈希是 H1,后来有人把 1 改成 2,再算一次变成 H2。由于 H1≠H2,任何节点都能一眼知道中间有人动过手脚。
  • 你用私钥对"从地址 A 给地址 B 1 BTC"签名,得到 Sig。全网节点只需拿交易内容 + Sig + 你的公钥,就能验证是否真是你签的,而不是别人伪造的。

二、记关系:交易、签名与哈希链

  • 交易和签名的绑定:一笔比特币交易里,写清楚"花掉的是哪些之前收到的币、要转给谁、转多少",然后对"这整条消息"做数字签名;因为签名和具体内容强绑定,任何人想改金额、改收款人,都会导致原来的签名立即失效,只能重新让持有私钥的人再签一次。
  • 区块和哈希的绑定:每个区块除了交易,还包含上一个区块头的哈希值,这样一来,如果你改动历史上任何一个区块的数据,对应哈希就变了、后面所有区块里"引用的那个哈希"也会错,从而整条链都露馅,形成所谓"哈希链"。

小例子:

  • A 在第 100 号区块里给 B 转了 1 BTC。有人想把这条记录改成"转 10 BTC",那么 100 号区块的哈希会变,101 号区块里"前一区块哈希"字段就不对了,必须连带修改 101、102、103......所有后续区块,代价巨大。
  • 一棵默克尔树可以把几千笔交易"压缩"成一个哈希根写入区块头,只要任何一笔交易被改动,重新计算出的树根就不一致,说明区块被动过手脚。

三、记直觉:数学+广播网络=去中心化信任

  • 数学替代人治:传统银行系统里,是银行这个中心机构告诉你"这笔账是真的";在比特币里,哈希和数字签名保证"只要式子对上,这就是原始持币人亲自授权、且记录未被篡改",不需要相信某个机构,只需要相信算法的难解性。
  • 广播+多数验证替代单点记账:每笔交易发到全网,节点各自用公钥验证签名、用哈希检查数据一致性;谁来写入下一个区块交给后面的共识和挖矿机制,但所有人都用同一套数学规则来判断"哪条链、哪些交易是有效的",于是形成一种"公共账本",任何人都能检验、没人能轻易作假。

直觉例子:

  • 想象一群人围成一圈记账,任何人都可以大声宣布"我给小王 1 BTC";但只有你能拿出针对这句话的正确数字签名,别人无法伪造你的"声音",而所有人都用同样的哈希和签名规则来判断这句话是否被篡改、是否真是你说的。
  • 久而久之,这群人按照统一规则选出"本轮记账代表"写下一个区块;但即便如此,他也改不了既有记录,因为一改就会破坏哈希链,被其他人立即识破。
相关推荐
能不能送我一朵小红花1 小时前
基于uniapp的PDA手持设备红外扫码方案
前端·uni-app
风止何安啊1 小时前
别被 JS 骗了!终极指南:JS 类型转换真相大揭秘
前端·javascript·面试
拉不动的猪1 小时前
深入理解 Vue keep-alive:缓存本质、触发条件与生命周期对比
前端·javascript·vue.js
|晴 天|1 小时前
WebAssembly:为前端插上性能的翅膀
前端·wasm
孟祥_成都1 小时前
你可能不知道 react 组件中受控和非受控的秘密!
前端
火车叼位1 小时前
ast-grep:结构化搜索与重构利器
前端
over6971 小时前
深入理解 JavaScript 原型链与继承机制:从 instanceof 到多种继承模式
前端·javascript·面试
烂不烂问厨房1 小时前
前端实现docx与pdf预览
前端·javascript·pdf
GDAL1 小时前
Vue3 Computed 深入讲解(聚焦 Vue3 特性)
前端·javascript·vue.js