



我(Andreas)与比特币首次偶遇是在2011年年中,最初我的反应基本上是“哼,程序员瞎搞的玩意!”因此,接下来的六个月我都没有对它给予更多的关注,也未能认识到它的重要性。而许多我认为非常聪明的人也是类似的反应,这让我对自己的看法多了一丝坚定。当比特币在一次邮件列表的讨论中再次出现在我的视野里时,我决定去阅读一下由中本聪撰写的白皮书,想要弄清楚它的真正内涵。我至今仍然记得读完那九页文档的那一刻——我突然意识到,比特币不仅仅是一种数字货币,更是一个能够提供远超货币本身的信任网络的基础。这种认识,即“这不仅仅是货币,它是一个去中心化的信任网络”,促使我开始了一个为期四个月的探索之旅,我试图吸收所有能找到的关于比特币的信息。我全身心投入,每天花超过12小时坐在计算机前阅读、写作、编程,力求学习尽可能多的内容。从这段近乎痴迷的沉浸式学习中回过神来,我发现自己因为学习而废寝忘食,导致体重减轻了20多磅
,这更坚定了我投身于比特币事业的决心。
两年后,我创建了一些探索各种比特币相关服务和产品的小型创业公司,我认为是时候写我的第一本书了。比特币这一主题激发了我前所未有的创造力,几乎占据了我所有的思索空间。自互联网时代以来,它是我遇到的最令人兴奋的技术。现在,我想要把我对这项非凡技术的热情传递给更多的人。
本书主要面向程序员。只要你会一门编程语言,这本书就能指导你了解加密货币的工作原理、使用方式以及如何开发能与之交互的软件。同时,书中的前几章也非常适合那些想要深入了解比特币和加密货币内部机制的非程序员读者阅读——这几章为他们提供了一份深入的比特币入门指南。
切叶蚁是一种群体行为高度复杂的超级有机体物种,但令人惊奇的是,每只个体蚂蚁都遵循一套由社交互动和化学气味(信息素)的交换驱动的简单规则。根据维基百科的说法:在地球上,切叶蚁社会的规模和复杂程度仅次于人类。有趣的是,切叶蚁并不直接食用叶子,而是用它们培养真菌,这种真菌是整个群落的主要食物来源。是的,你没有听错,这些蚂蚁在进行农耕活动!
尽管蚂蚁构建了一个基于工种的社会并有一个负责繁衍后代的蚁后,但蚁群中没有中央权威或领导者。一个拥有数百万成员的蚁群却能展现出高度智能和复杂的行为,这源自社会网络中个体间交互的叠加而涌现的特性。
自然界向我们证明,不需要中央权威、层级制度或精密的结构,也能构造复杂性与精妙性并存且更具韧性的去中心化系统。
比特币网络正是这样一个高度复杂的去中心化的可信网络,能够支撑无数财务流程。然而,比特币网络的每一个节点都遵循一些简单的准则。节点间的相互作用会引起组织的复杂行为,而不是某个单一节点自身具有复杂性和可信性。就像蚁群一样,比特币的弹性网络是一个由众多遵循简单准则的简单节点所组成的弹性网络,这些简单的节点准则聚合在一起可以完成惊人的事情,而不需要任何中枢协调。
本书中使用了以下排版约定:
斜体( Italic )
表示新的术语、URL地址、电子邮箱地址、文件名和文件扩展名。
等宽字体(Constant width)
用于程序清单,以及段落中的程序元素,例如变量名、函数名、数据库、数据类型、环境变量、语句以及关键字。
等宽粗体( Constant width bold )
表示应由用户直接输入的命令或其他文本。
等宽斜体( Constant width italic )
表示应由用户提供的值或由上下文确定的值替换的文本。
该图示表示提示或建议。
该图示表示一般性说明。
该图示表示警告或注意。
所有的代码片段都可以在大多数操作系统上复用,仅需相应语言的编译器和解释器的最小安装包。如有必要,我们将提供基本的安装说明以及说明的分步示例。
为了适应印刷格式,部分过长代码片段和输出结果已经进行了重新排版分行。在这种情况下,我们通过一个反斜杠字符(\)及一个紧挨的换行符来表示被分开的代码行。当复制这些示例时,删除这两个字符并合并代码行,你应该会看到与示例中相同的运行结果。
所有代码片段都尽可能使用了实际值与计算,这样你就可以逐步构建示例,并在编写代码时使用相同的数值得出相同的结果。
本书旨在帮助你学习并完成工作。通常情况下,如果本书提供示例代码,那么你可以在程序和文档中使用它。除非你需要复制本书大部分的代码,否则你无须联系我们获取授权。例如,编写一个程序使用本书中的几段代码是不需要授权的。销售或发行O'Reilly书籍中的示例则需要得到许可。通过本书并引用示例代码来回答问题,不需要获得授权。但如果将本书中大量的示例代码并入你的产品文档中,则需要获得授权。
我们心怀感激,但不强求归属权。归属权通常包括书名、作者、出版社和国际标准书号。例如: Mastering Bitcoin : Programming the Open Blockchain , Third Edition 作者Andreas M.Antonopoulos和David A.Harding,由O'Reilly出版(Copyright 2024 David Harding),书号为978-1-098-15009-9。
本书的某些版本可在开源许可证下提供,例如CC-BY-NC( https://oreil.ly/RzUHE ),在这种情况下,该许可证的条款将适用。
如果读者觉得对示例代码的使用超出了上面所给出的许可范围,欢迎通过 permissions@oreilly.com 联系我们。
第3版的一个重点是对2017年第2版和2014年第1版的内容进行了与时俱进的改写。此外,还增加了许多与2023年当代比特币发展更新相关的概念:
第4章
我们对地址信息进行了重新排列,按照历史顺序逐一处理,新增了一个P2PK(在这里,“地址”是指“IP地址”)部分,刷新了之前的P2PKH和P2SH部分,然后添加了针对segwit/bech32和taproot/bech32m的新内容。
前两版的第6章与第7章
将前两版第6章和第7章的内容进行重新排列和扩展,形成了四个新章节:第6章、第7章、第8章,以及第9章。
第6章
我们增添了几乎全新的内容,描述了交易的结构。
第7章
我们新增了有关MAST、P2C、无脚本多重签名、Taproot和Tapscript的内容。
第8章
我们修订了有关ECDSA的文本,并新增了关于Schnorr签名、多重签名以及阈值签名的内容。
第9章
我们新增了几乎全新的内容,涉及手续费、RBF和CPFP费用提升、交易固定、包转发以及CPFP分离技术。
第10章
我们补充了有关致密区块传输的内容,对布隆过滤器进行了重要更新,更准确地描述了它们所涉及的隐私问题,并新增了关于致密区块过滤器的文本。
第11章
我们添加了关于授权测试网络(signet)的内容。
第12章
我们增加了关于BIP8和快速试验的内容。
附录
我们删除了相关程序依赖库的附录。在保留原始白皮书附录的基础上,我们新增了一个附录,描述比特币的实际实现和特性与白皮书中的方案有何不同。
本书中使用的比特币地址、交易、密钥、二维码和区块链数据大部分是真实的。这意味着你可以使用区块链浏览器查看作为示例提供的交易,使用你自己的脚本或程序检索它们,等等。
然而,请注意,用于构建地址的私钥要么打印在本书中,要么已经被“销毁”。这意味着,如果你向这些地址中的任意一个转账,要么资金将永远丢失,要么在某些情况下,任何能阅读这本书的人都可以使用书中展示的私钥取走它。
请勿向本书中的任何地址发送资金。否则你的钱财将被其他读者领走或永远丢失。
40多年来,O'Reilly Media致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。
我们拥有独一无二的专家和革新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。O'Reilly的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及O'Reilly和200多家其他出版商提供的大量文本和视频资源。有关的更多信息,请访问 http://oreilly.com 。
对于本书,如果有任何意见或疑问,请按照以下地址联系本书出版商。
美国:
O'Reilly Media,Inc.
1005 Gravenstein Highway North
Sebastopol,CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
要询问技术问题或对本书提出建议,请发送电子邮件至 errata@oreilly.com.cn 。
本书配套网站 https://oreil.ly/MasteringBitcoin3e 上列出了勘误表、示例以及其他信息。
关于书籍、课程、会议和新闻的更多信息,请访问我们的网站 http://oreilly.com 。
我们在Facebook上的地址: http://facebook.com/oreilly
我们在Twitter上的地址: http://twitter.com/oreillymedia
我们在YouTube上的地址: http://youtube.com/oreillymedia
你可以在他的个人网站上联系Andreas M.Antonopoulos: https://antonopoulos.com 。
关注Andreas的Facebook主页: https://facebook.com/AndreasMAntonopoulos 。关注Andreas的Twitter: https://twitter.com/aantonop 。
关注Andreas的LinkedIn主页: https://linkedin.com/company/aantonop 。
非常感谢所有通过每月捐款支持Andreas工作的赞助者。你可以在此处关注他的Patreon页面: https://patreon.com/aantonop 。
有关本书的信息,以及Andreas的开放版和翻译版本,都可以在 https://bitcoinbook.info 上找到。
你可以通过David A.Harding的个人网站联系他: https://dtrt.org 。
作者:Andreas M.Antonopoulos
这本书汇聚了众多人的努力与贡献。我非常感谢那些在我致力于撰写这本加密货币与比特币权威技术指南的过程中给予我帮助的朋友、同事,以及那些我从未谋面的人。
比特币技术与比特币社区密不可分,这本书既是对技术的阐述,也是社区共同创造的成果。我的工作得到了整个比特币社区从头至尾的鼓励、支持和认可。更重要的是,撰写本书让我这两年有幸成为这个精彩社区的一员,对此我深感荣幸,并衷心感谢大家的接纳。我想感谢的人实在太多,他们不仅仅是我在各种会议、活动、研讨会、聚会、比萨聚会和小型私密聚会中遇到的人,还包括那些通过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 Snyder、Adam B.Levine、Sandra Gittlen、John Dix、Johna Till Johnson、Roger Ver和Jon Matonis。特别鸣谢Richard Kagan和Tymon Mattoszko,他们审阅了提案的早期版本,以及担任提案定稿编辑的Matthew Taylor。
感谢O'Reilly出版的 DNS and BIND 一书的作者Cricket Liu,是他向我介绍了O'Reilly出版社。同时也要感谢O'Reilly的Michael Loukides和Allyson MacDonald,他们花费数月的时间帮助出版这本书。Allyson对于错过的截止日期和因生活干扰而推迟的交付显示出了特别大的耐心。在第2版中,我要感谢Timothy McGovern指导整个过程,Kim Cofer耐心地进行编辑工作,以及Rebecca Panzer为许多新图表提供插图。
编写比特币的前几章初稿无疑是最具挑战的部分,原因在于比特币本身是一个复杂的话题。每当我尝试探索比特币技术的某个方面时,就仿佛触动了一张巨网,不得不全面深入地挖掘。在尝试将这些内容浓缩成易于理解的叙述时,我多次陷入僵局,心情也难免低落。最终,我选择以使用比特币的人们的故事作为切入点,让整本书的撰写变得轻松许多。在此,我特别感谢我的朋友兼导师Richard Kagan,他在我面临写作障碍时给予了我极大的帮助和启发。也感谢Pamela Morgan,她在本书的第1版和第2版中审阅了每一章的初稿,提出了精准的问题,让内容更加完善。对于旧金山比特币开发者聚会小组的开发者们,以及Taariq Lewis和Denise Terry在测试初期材料上的帮助,我同样心存感激。此外,还要感谢Andrew Naugler在信息图设计上的贡献。
在编写本书的过程中,我在GitHub上发布了早期草稿,并邀请公众发表评论。我收到了一百多条评论、建议、更正意见和贡献。我在“早期发布草稿(GitHub贡献者)”一节的第xxiii页上,对这些贡献者表示了感谢。我最真挚的感谢,要献给我的GitHub志愿编辑:Ming T.Nguyen(第1版)和Will Binns(第2版)。他们孜孜不倦地策划、管理、解决合并请求,处理问题报告,并在GitHub上进行错误修正。
本书的草稿完成后,还经过了几轮技术审查。特别感谢Cricket Liu和Lorne Lantz细致的审核、评论与支持。
多位比特币开发者不仅为本书贡献了宝贵的代码样例,还提供了审阅、有见地的评论和持续的鼓励。要特别感谢Amir Taaki和Eric Voskuil,他们提供的代码片段和深刻见解极大地丰富了内容;Chris Kleeschulte对Bitcore的详细介绍;Vitalik Buterin和Richard Kiss在椭圆曲线加密算法和代码开发方面的专业指导;Gavin Andresen不仅修正了错误,还提供了宝贵的意见和鼓励;Michalis Kargakis不仅提供评论,还对btcd进行了详细介绍;Robin Inge提交了勘误表,使得第2版的出版质量得到提升。在第2版的编写过程中,我再次得到了众多比特币核心开发者的大力帮助,包括Eric Lombrozo对隔离见证(Segregated witness,segwit)技术的深入解析,Luke Dashjr在交易章节上的改进建议,Johnson Lau对隔离见证和其他章节的精心审阅,以及其他许多人的协助。我还要特别感谢Joseph Poon、Tadge Dryja和Olaoluwa Osuntokun对于闪电网络的解释,他们不仅审阅了我的稿件,还在我遇到难题时耐心解答。
我对文字和书籍的热爱要归功于我的母亲Theresa,她在家中放置了很多书籍,几乎挤满了每面墙,我就是在这样的环境中长大的。尽管自称是个科技恐惧者,但她在1982年还是给我买了我的第一台计算机。我的父亲Menelaos是一位土木工程师,他在80岁高龄时出版了自己的第一本书,是他教会了我逻辑和分析思考,培养了我对科学和工程的热爱。感谢大家在这段旅程中一直以来的支持。
在8.2节介绍非交互式Schnorr签名协议时,首先描述了交互式Schnorr身份协议,这一部分深受Gregory Maxwell和Andrew Poelstra在2015年发表的“Borrommean Ring Signatures”一文的影响。非常感谢他们在过去十年中提供的所有无私帮助。
在本书草稿的技术审查过程中,Jorge Lesmes、Olaoluwa Osuntokun、René Pickhardt和Mark“Murch”Erhardt提供了宝贵的意见。特别是Murch深入、透彻且富有洞察力的审核,以及他不厌其烦地评估同一段落的多个版本,极大地提升了本书质量,超出了我的最高预期。
我也要特别感谢Jimmy Song推荐我参与这个项目,感谢我的合著者Andreas允许我更新他的畅销书,感谢Angela Rufino在O'Reilly出版创作中为我提供指导,感谢O'Reilly的所有其他工作人员,使第3版的写作成为一次愉快而富有成效的经历。
最后,我不知道如何才能感谢所有在出版过程中帮助过我的比特币开发者——无论是开发我所使用的软件,还是教会我理解它的工作原理,抑或是帮助我传递我所获得的那点知识。我无法一一列举他们的名字,但我经常感念他们——如果没有他们为我所做的一切,我对这本书的贡献就不可能实现。
David A.Harding
很多贡献者在GitHub上对初版草稿提供了评论、更正和补充。感谢大家对本书的贡献。
以下是GitHub主要贡献者名单,括号中是他们的GitHub ID:
· Abdussamad Abdurrazzaq(AbdussamadA)
· Adán SDPC(aesedepece)
· Akira Chiku(achiku)
· Alex Waters(alexwaters)
· Andrew Donald Kennedy(grkvlt)
· Andrey Esaulov(andremaha)
· andronoob
· AnejaBK
· Appaji(CITIZENDOT)
· ariesunny
· Arthur O'Dwyer(Quuxplusone)
· bargitta
· Basem Alasi(Bamskki)
· bisqfan
· bitcoinctf
· blip151
· Bryan Gmyrek(physicsdude)
· Carlos Sims(simsbluebox)
· Casey Flynn(cflynn07)
· cclauss
· Chapman Shoop(belovachap)
· chrisd95
· Christie D'Anna(avocadobreath)
· Cihat Imamoglu(cihati)
· Cody Scott(Siecje)
· coinradar
· Cragin Godley(cgodley)
· Craig Dodd(cdodd)
· dallyshalla
· Dan Nolan(Dan-Nolan)
· Dan Raviv(danra)
· Darius Kramer(dkrmr)
· Darko Janković(trulex)
· David Huie(DavidHuie)
· didongke
· Diego Viola(diegoviola)
· Dimitris Tsapakidis(dimitris-t)
· Dirk Jäckel(biafra23)
· Dmitry Marakasov(AMDmi3)
· drakos(Jolly-Pirate)
· drstrangeM
· Ed Eykholt(edeykholt)
· Ed Leafe(EdLeafe)
· Edward Posnak(edposnak)
· Elias Rodrigues(elias19r)
· Eric Voskuil(evoskuil)
· Eric Winchell(winchell)
· Erik Wahlström(erikwam)
· effectsToCause(vericoin)
· Esteban Ordano(eordano)
· ethers
· Evlix
· fabienhinault
· Fan(whiteath)
· Felix Filozov(ffilozov)
· Francis Ballares(fballares)
· François Wirion(wirion)
· Frank Höger(francyi)
· Gabriel Montes(gabmontes)
· Gaurav Rana(bitcoinsSG)
· genjix
· Geremia
· Gerry Smith(Hermetic)
· gmr81
· Greg(in3rsha)
· Gregory Trubetskoy(grisha)
· Gus(netpoe)
· halseth
· harelw
· Harry Moreno(morenoh149)
· Hennadii Stepanov(hebasto)
· Holger Schinzel(schinzelh)
· Ioannis Cherouvim(cherouvim)
· Ish Ot Jr.(ishotjr)
· ivangreene
· James Addison(jayaddison)
· Jameson Lopp(jlopp)
· Jason Bisterfeldt(jbisterfeldt)
· Javier Rojas(fjrojasgarcia)
· Jordan Baczuk(JBaczuk)
· Jeremy Bokobza(bokobza)
· JerJohn15
· jerzybrzoska
· Jimmy DeSilva(jimmydesilva)
· Jo Wo(jowo-io)
· Joe Bauers(joebauers)
· joflynn
· Johnson Lau(jl2012)
· Jonathan Cross(jonathancross)
· Jorgeminator
· jwbats
· Kai Bakker(kaibakker)
· kollokollo
· krupawan5618
· kynnjo
· Liangzx
· lightningnetworkstores
· lilianrambu
· Liu Yue(lyhistory)
· Lobbelt
· Lucas Betschart(lclc)
· Matt Wesley(MatthewWesley)
· Magomed Aliev(30mb1)
· Mai-Hsuan Chia(mhchia)
· Marco Falke(MarcoFalke)
· María Martín(mmartinbar)
· Marcus Kiisa(mkiisa)
· Mark Erhardt(Xekyo)
· Mark Pors(pors)
· Martin Harrigan(harrigan)
· Martin Vseticka(MartyIX)
· Marzig(marzig76)
· Matt McGivney(mattmcgiv)
· Matthijs Roelink(Matthiti)
· Maximilian Reichel(phramz)
· MG-ng(MG-ng)
· Michalis Kargakis(kargakis)
· Michael C.Ippolito(michaelcippolito)
· Michael Galero(mikong)
· Michael Newman(michaelbnewman)
· Mihail Russu(MihailRussu)
· mikew(mikew)
· milansismanovic
· Minh T.Nguyen(enderminh)
· montvid
· Morfies(morfies)
· Nagaraj Hubli(nagarajhubli)
· Nekomata(nekomata-3)
· nekonenene
· Nhan Vu(jobnomade)
· Nicholas Chen(nickycutesc)
· Ning Shang(syncom)
· Oge Nnadi(ogennadi)
· Oliver Maerz(OliverMaerz)
· Omar Boukli-Hacene(oboukli)
· Óscar Nájera(Titan-C)
· Parzival(Parz-val)
· Paul Desmond Parker(sunwukonga)
· Philipp Gille(philippgille)
· ratijas
· rating89us
· Raul Siles(raulsiles)
· Reproducibility Matters(TheCharlatan)
· Reuben Thomas(rrthomas)
· Robert Furse(Rfurse)
· Roberto Mannai(robermann)
· Richard Kiss(richardkiss)
· rszheng
· Ruben Alexander(hizzvizz)
· Sam Ritchie(sritchie)
· Samir Sadek(netsamir)
· Sandro Conforto(sandroconforto)
· Sanjay Sanathanan(sanjays95)
· Sebastian Falbesoner(theStack)
· Sergei Tikhomirov(s-tikhomirov)
· Sergej Kotliar(ziggamon)
· Seiichi Uchida(topecongiro)
· shaysw
· Simon de la Rouviere(simondlr)
· simone-cominato
· sindhoor7
· Stacie(staciewaleyko)
· Stephan Oeste(Emzy)
· Stéphane Roche(Janaka-Steph)
· takaya-imai
· Thiago Arrais(thiagoarrais)
· Thomas Kerin(afk11)
· Tochi Obudulu(tochicool)
· Tosin(tkuye)
· Vasil Dimov(vasild)
· venzen
· Vlad Stan(motorina0)
· Vijay Chavda(VijayChavda)
· Vincent Déniel(vincentdnl)
· weinim
· wenxiaolong(QingShiLuoGu)
· wenzhenxiang
· Will Binns(wbnns)
· wintercooled
· wjx
· wll2007
· Wojciech Langiewicz(wlk)
· Yancy Ribbens(yancyribbens)
· yjjnls
· Yoshimasa Tanabe(emag)
· yuntai
· yurigeorgiev4
· Zheng Jia(zhengjia)
· Zhou Liang(zhouguoguo)