中文精炼导读

核心观点

  • Karpathy 用纯 Python、零第三方依赖,从零实现了"创建密钥 → 推导地址 → 构造交易 → 数字签名 → 广播上链"的完整比特币交易流程,践行"我不能创造的东西,我就不理解"。
  • 区块链的本质创新在于:它把开源软件开发扩展成"开源 + 状态"——大家共享的不只是代码,而是一台任何人都可以无许可使用的运行中的计算机。
  • 比特币身份体系的核心是一对密钥:私钥是一个随机整数(谁掌握谁就拥有对应地址的全部资金),公钥是椭圆曲线 secp256k1 上由私钥做标量乘法得到的一个点,地址则由公钥经 SHA-256 + RIPEMD-160 双重哈希和 Base58Check 编码而来。
  • 一笔交易由"输入 + 输出"构成:输入必须整笔消费一个未花费交易输出(UTXO),输出则把价值拆分成若干份并指定各自的主人;解锁脚本(script_sig)与锁定脚本(script_pubkey)在比特币虚拟机里拼接执行来验证所有权。
  • 数字签名用 ECDSA 对整笔交易的字节编码签名,被签名的"消息"要用指向的 UTXO 的锁定脚本临时替换本输入的 script_sig,整个机制浓缩下来只有 225 字节。

内容精讲

文章从生成密码学身份开始。比特币使用椭圆曲线密码学(ECC)而非 RSA,采用的是 secp256k1 曲线,方程 y² = x³ + 7 (mod p)。作者指出,密码学社区对 NIST 推荐的曲线有戒心,担心其中可能预留了后门,因此倾向选用 secp256k1 这类曲线。椭圆曲线只需三个整数就能定义(p、a、b),再加上一个公开约定的生成点 G 及其阶 n,就构成了全部数学基础。私钥就是一个满足 1 ≤ key < n 的随机整数;公钥则是把 G 与自己相加私钥次——即 key × G——得到曲线上的另一个点。这里"加法"有专门定义,涉及有限域上的模逆运算(extended Euclidean algorithm),而反复相加则用"double-and-add"算法加速,否则要加天文数字次。

身份生成的第二步是从公钥推导比特币钱包地址。地址不是公钥本身,而是对公钥做 SHA-256 再 RIPEMD-160(合称 hash160)得到 20 字节摘要,加上 1 字节网络版本号(主网 0x00、测试网 0x6f)和 4 字节校验和(对"版本+摘要"再做双重 SHA-256 取前 4 字节),最后做 Base58 编码。Base58 特意去掉了 0、O、I、l 这类手写容易混淆的字符,校验和则让输错地址有 99.99999998% 的概率被直接报错。为了"零依赖"的承诺,作者甚至用纯 Python 按 NIST FIPS 180-4 规范手写了 SHA-256。文章还展示了一个有趣的验证:私钥为 1 对应的地址(公钥就是生成点 G)在测试网上被交易过 1,812 次但余额为零,因为任何知道私钥是 1 的人都能花掉它。

第三步是构造交易。比特币的记账单位是 satoshi(1 BTC = 1e8 sat)。作者先从水龙头获取种子资金,然后构造一笔将 0.001 BTC(100,000 sat)打给目标钱包的交易:手续费按"市场价"定得慷慨些(10 sat/字节,交易约 250 字节,即 2,500 sat),其中 50,000 sat 发给目标地址,47,500 sat 找零回自己。交易输入用(prev_tx, prev_index)两个字段指向要消费的 UTXO,这里有个关键规则:UTXO 必须整笔花掉,不能只花一部分,但可以在输出里自由拆分价值。sequence 字段是当初为中本聪设想的"高频交易"设计的,如今基本闲置。

第四步是数字签名,也是最有技术含量的部分。构造签名时需要先把整笔交易序列化成字节"消息",但这有个鸡生蛋问题:交易还没完成,没有 script_sig。比特币的规则是:签名时把本输入的 script_sig 临时替换成它所指 UTXO 的 script_pubkey,其他输入的 script_sig 则置空。编码后的消息经双重 SHA-256 后,用 ECDSA 生成(r, s)签名对。文章特别提醒了一个著名的安全隐患:签名过程中若每次用随机生成的临时密钥,同一个密钥签两条不同消息,攻击者就能反推出私钥——PlayStation 3 就栽在这上面,正确做法是 RFC 6979 确定性生成(作者为了简化只用"消息哈希做随机种子"的朴素版本,并明确警告不要用于生产)。签名序列化为 DER 格式,再附上类型字节(SIGHASH_ALL 表示签了整笔交易)。

第五步是组装并广播。脚本_sig 由"签名+类型字节"和"完整公钥"两个元素组成。验证时,矿工会把 script_sig 和 script_pubkey 拼接成单个脚本放进"比特币虚拟机"用栈式机器执行:先压入签名和公钥,OP_DUP 复制公钥,OP_HASH160 哈希,OP_EQUALVERIFY 与锁定脚本里的公钥哈希比对,最后 OP_CHECKSIG 验证签名的确来自对应私钥。整笔交易最终编码为 225 字节,作者用 blockstream 的 tx/push 端点广播到测试网,成功进入第 2,005,515 号区块(该区块共 31 笔交易),矿工扣走了手续费。文章最后还用一个"整合钱包"的交易把所有资金归集到一个新地址,完整演示了多输入交易的构造与签名。

阅读价值

适合对区块链原理好奇、想彻底搞懂比特币"到底是怎么运转"的开发者:文章用可运行、可验证的代码把椭圆曲线、地址编码、UTXO、脚本系统、ECDSA 签名、广播协议一次讲透,比任何"概念科普"都更接近本质;读完你不仅能读懂区块浏览器的每个字段,还能自己动手构造并广播一笔真实(测试网)交易。

阅读英文原文 → 返回 AI 技术文档

本文为中文精炼导读,由 AI 基于原文整理,内容与图片版权归原作者所有。原文: http://karpathy.github.io/2021/06/21/blockchain/