内容简介
本书深入剖析比特币底层技术架构,涵盖去中心化网络、点对点架构、交易生命周期及安全原则等核心内容。同时,作者对诸如隔离见证、支付通道和闪电网络等前沿发展也进行了全面阐释。对于开发者而言,书中丰富的代码示例、深入浅出的讲解,能助力读者掌握比特币客户端代码编写技巧;对于普通爱好者而言,书中通俗易懂的类比和案例,使读者无须具备深厚技术背景,也能理解比特币的运行机制与魅力。通过阅读本书,读者将全面参与到这场数字货币的革命之中,开启一段充满惊喜与收获的学习旅程。本书适合程序员以及那些想要深入了解比特币和加密货币内部机制的非程序员读者阅读。
目录
目录
前言1
第1章 概述13
1.1 比特币的历史15
1.2 入门基础16
1.2.1 选择比特币钱包16
1.2.2 快速入门19
1.2.3 恢复码19
1.2.4 比特币地址20
1.2.5 接收比特币20
1.2.6 获取你的第一枚比特币21
1.2.7 探寻比特币的当前价格22
1.2.8 发送和接收比特币23
第2章 比特币的工作原理25
2.1 比特币概览25
2.2 在线购物26
2.3 比特币交易27
2.3.1 交易输入与输出27
2.3.2 交易链28
2.3.3 如何找零29
2.3.4 组合支付30
2.3.5 常见交易形式30
2.4 交易的构建31
2.4.1 获取正确的输入31
2.4.2 创建交易输出32
2.4.3 打包交易到区块链32
2.5 比特币挖矿33
2.6 支付交易费用36
第3章 比特币核心:标准实现版本37
3.1 从比特币到比特币核心37
3.2 比特币开发环境39
3.3 从源代码编译比特币核心39
3.3.1 选择比特币核心版本40
3.3.2 配置比特币核心构建40
3.3.3 构建比特币核心可执行文件42
3.4 运行比特币核心节点43
3.5 配置比特币核心节点44
3.6 比特币核心API48
3.6.1 获取比特币核心状态信息49
3.6.2 探索与解码交易过程50
3.6.3 探索区块52
3.6.4 使用比特币核心的可编程接口53
3.7 其他客户端、库和工具包57
3.7.1 C/C++57
3.7.2 JavaScript57
3.7.3 Java57
3.7.4 Python57
3.7.5 Go58
3.7.6 Rust58
3.7.7 Scala58
3.7.8 C#58
第4章 密钥与地址59
4.1 公钥密码学60
4.1.1 私钥60
4.1.2 椭圆曲线密码学解析62
4.1.3 公钥64
4.2 输出和输入脚本65
4.3 IP地址:比特币的原始地址(P2PK)66
4.4 支付到公钥哈希的传统地址68
4.5 base58check编码70
4.6 压缩公钥72
4.7 传统的支付到脚本哈希74
4.8 bech32地址76
4.8.1 bech32地址问题78
4.8.2 bech32m79
4.8.3 私钥格式83
4.8.4压缩私钥84
4.9 高级密钥和地址85
4.9.1 靓号地址85
4.9.2 纸钱包87
第5章 钱包恢复89
5.1 独立密钥生成89
5.1.1 生成确定性密钥90
5.1.2 公开子密钥派生91
5.1.3 生成分层确定性密钥(BIP32)92
5.1.4 种子与恢复码93
5.1.5 备份非关键数据96
5.1.6 备份关键派生路径97
5.2 详解钱包技术栈99
5.2.1 BIP39恢复码100
5.2.2 从种子创建HD钱包105
5.2.3 在网络商店使用扩展公钥110
第6章 交易115
6.1 序列化的比特币交易115
6.2 版本117
6.3 标记和标志118
6.4 输入118
6.4.1交易输入列表的长度118
6.4.2 输出点119
6.4.3 输入脚本121
6.4.4 序列121
6.5 输出124
6.5.1 输出计数124
6.5.2 金额125
6.5.3 输出脚本126
6.6 见证结构127
6.6.1 循环依赖128
6.6.2 第三方交易可延展性128
6.6.3 双方交易可延展性129
6.6.4 隔离见证130
6.6.5 见证结构序列化131
6.7 锁定时间132
6.8 币基交易132
6.9 权重和虚字节133
6.10 传统序列化135
第7章 授权和身份验证136
7.1 交易脚本和脚本语言136
7.1.1 图灵不完备性137
7.1.2 无状态验证137
7.1.3 构建脚本137
7.1.4 支付到公钥哈希140
7.2 脚本化多重签名142
7.3 支付到脚本哈希145
7.3.1 P2SH地址147
7.3.2 P2SH的好处147
7.3.3 赎回脚本和验证147
7.4 数据记录输出(OP_RETURN)148
7.4.1 交易锁定时间限制149
7.4.2 检查锁定时间验证(OP_CLTV)149
7.4.3 相对时间锁151
7.4.4 使用OP_CSV的相对时间锁152
7.5 带流程控制的脚本(条件子句)152
7.5.1 条件子句与VERIFY操作码153
7.5.2 在脚本中使用流程控制154
7.6 复杂脚本示例155
7.6.1 隔离见证输出和交易示例157
7.6.2 升级到隔离见证160
7.7 默克尔化替代脚本树162
7.8 支付到合约165
7.9 无脚本多重签名与阈值签名166
7.10 Taproot167
7.11 Tapscript169
第8章 数字签名171
8.1 数字签名的工作原理171
8.1.1 创建数字签名171
8.1.2 验证签名172
8.1.3 签名哈希类型172
8.2 Schnorr签名175
8.2.1 Schnorr签名的序列化179
8.2.2 基于Schnorr的无脚本多重签名180
8.2.3 基于Schnorr的无脚
前言/序言
前言
关于编写比特币方面的著作
我(Andreas)与比特币首次偶遇是在2011年年中,最初我的反应基本上是“哼,程序员瞎搞的玩意!”因此,接下来的六个月我都没有对它给予更多的关注,也未能认识到它的重要性。而许多我认为非常聪明的人也是类似的反应,这让我对自己的看法多了一丝坚定。当比特币在一次邮件列表的讨论中再次出现在我的视野里时,我决定去阅读一 下由中本聪撰写的白皮书,想要弄清楚它的真正内涵。我至今仍然记得读完那九页文档的那一刻,我突然意识到,比特币不仅仅是一种数字货币,更是一个能够提供远超货币本身的信任网络的基础。这种认识,即“这不仅仅是货币,它是一个去中心化的信任 网络”,促使我开始了一个为期四个月的探索之旅,我试图吸收所有能找到的关于比特币的信息。我全身心投入,每天花超过 12小时坐在计算机前阅读、写作、编程,力求学习尽可能多的内容。从这段近乎痴迷的沉浸式学习中回过神来,我发现自己因为学习而废寝忘食,导致体重减轻了20多磅,这更坚定了我投身于比特币事业的决心。
两年后,我创建了一些探索各种比特币相关服务和产品的小型创业公司,我认为是时候写我的第一本书了。比特币这一主题激发了我前所未有的创造力,几乎占据了我所有的思索空间。自互联网时代以来,它是我遇到的最令人兴奋的技术。现在,我想要把我对这项非凡技术的热情传递给更多的人。
目标读者
本书主要面向程序员。只要你会一门编程语言,这本书就能指导你了解加密货币的工作原理、使用方式以及如何开发能与之交互的软件。同时,书中的前几章也非常适合那些想要深入了解比特币和加密货币内部机制的非程序员读者阅读,这几章为他们提供了一份深入的比特币入门指南。
排版约定
本书中使用了以下排版约定:
斜体(Italic)
表示新的术语、URL 地址、电子邮箱地址、文件名和文件扩展名。
等宽字体(Constant width)
用于程序清单,以及段落中的程序元素,例如变量名、函数名、数据库、数据类型、环境变量、语句以及关键字。
等宽粗体(Constant width bold)
表示应由用户直接输入的命令或其他文本。
等宽斜体(Constant width italic)
表示应由用户提供的值或由上下文确定的值替换的文本。
示例代码
所有的代码片段都可以在大多数操作系统上复用,仅需相应语言的编译器和解释器的最小安装包。如有必要,我们将提供基本的安装说明以及说明的分步示例。
为了适应印刷格式,部分过长代码片段和输出结果已经进行了重新排版分行。在这种情况下,我们通过一个反斜杠字符(\)及一个紧挨的换行符来表示被分开的代码行。当复制这些示例时,删除这两个字符并合并代码行,你应该会看到与示例中相同的运行结果。
所有代码片段都尽可能使用了实际值与计算,这样你就可以逐步构建示例,并在编写代码时使用相同的数值得出相同的结果。
本书第 1 版与第 2 版致谢
这本书汇聚了众多人的努力与贡献。我非常感谢那些在我致力于撰写这本加密货币与比特币权威技术指南的过程中给予我帮助的朋友、同事,以及那些我从未谋面的人。
比特币技术与比特币社区密不可分,这本书既是对技术的阐述,也是社区共同创造的成果。我的工作得到了整个比特币社区从头至尾的鼓励、支持和认可。更重要的是,撰写本书让我这两年有幸成为这个精彩社区的一员,对此我深感荣幸,并衷心感谢大家的接纳。我想感谢的人实在太多,他们不仅仅是我在各种会议、活动、研讨会、聚会、比萨聚会和小型私密聚会中遇到的人,还包括那些通过 Twitter 、reddit 、bitcointalk.org 和 GitHub 与我交流的朋友,他们每个人都以某种方式对这本书产生了影响。书中的每个想法、比喻、问题、答案和解释都曾受到社区互动的启发、检验和完善。感谢所有人的支持,没有他们,这本书不可能问世。我将永远怀着感激之心。
此外,我成为作者的旅程远在撰写本书之前就已开始。我的母语(及教育背景)是希腊语,因此我在大学首年参加了英语写作辅导课程。在这里,我要特别感谢我的英语写作 老师 Diana Kordas,是她在那一年帮我树立信心并提升了我的写作技巧。随后,作为一名专业人士,我在数据中心领域提升了自己的技术写作技能,并为 Network World 杂志撰稿。我非常感激 John Dix 和 John Gallant,他们为我提供了在 Network World 成为专栏作家的首份工作机会。同时也感谢我的编辑 Michael Cooney 以及我的同事 Johna Till Johnson,他们对我的专栏进行了编辑,使之顺利发表。四年来,每周撰写 500 字的经历为我累积了足够的经验,让我最终考虑成为一名作家。
也要感谢在我向 O’Reilly 提交书稿提案时给予我支持的人,他们为我提供推荐信并参与了提案的评审。特别感谢 John Gallant 、Gregory Ness 、Richard Stiennon 、Joel Sngder