精通区块链编程:加密货币原理、方法和应用开发(原书第2版)
定 价:119 元
前言我第一次偶遇比特币是在2011年年中,当时的反应大概是哈!书呆子的钱嘛!因为没能领会它的重要性,我忽视它长达六个月之久,而让我稍感宽慰的是,我认识的许多聪明绝顶的人也是这种反应。在一次邮件列表讨论时,我再次接触到比特币,于是决定阅读中本聪(Satoshi Nakamoto)写的白皮书,研究比特币的权威解释,看看到底是怎么一回事。我仍记得刚刚读完那九页内容的一刻,我才终于明白了:比特币不单单是一种数字货币,还是一种给货币及其他很多东西提供基础的信任网络。对不是货币,而是去中心化信任网络的领悟,让我开启了为期四个月的比特币沉醉之旅。我如饥似渴地寻找任何关于比特币的点滴信息,变得越来越着迷,每天都会花12个小时以上紧盯屏幕,竭尽所能地阅读、写作、学习和编程。从这段着魔的状态中走出来的时候,我的体重由于饮食没有规律而轻了20多磅,同时我也坚定了要全心投入比特币事业的决心。随后的两年,我创立了一系列开发比特币相关服务和产品的公司,之后我决定写第一本书。书的主题就是激发了我疯狂的创造力并让我冥思苦想的比特币,它是我在继互联网之后遇到的最为振奋人心的技术。现在是时候跟更广大的读者分享我对这项惊人技术的热情了。阅读对象本书主要面向程序员。如果你能使用一门编程语言,本书将会告诉你加密货币的原理、使用方法,以及如何开发与之相关的软件。对希望理解比特币及加密货币内在工作机制的非程序员读者,本书前几章作为对比特币的深入介绍依然适用。封面故事在群居生物物种中,切叶蚁表现出高度复杂行为的物种特征。但是群落中的每一只蚂蚁个体仅仅遵循一些社会互动和化学气味(即信息素)交换的简单规则。维基百科提到:切叶蚁形成地球上仅次于人类的最为庞大且复杂的动物社会。实际上,切叶蚁不吃叶子,而是使用叶子制造一种真菌来充当蚁群主要的食物来源。意识到了吗?它们在耕作!虽然切叶蚁形成的是阶级社会,且依靠蚁后繁衍后代,但是在蚁群中不存在中央集权体制或领导人。通过切叶蚁我们可以看到,群落中数百万成员所展现的高度智能且复杂的行为是社会网络中个体互动这一性质的凸显。大自然向我们证明,去中心化体制具有弹性并能创造出意想不到的复杂性和难以想象的精妙,而不需要中央集权体制、等级制度或复杂的组织结构。比特币网络正是这样一个高度复杂的去中心化可信网络,能够支撑无数财务流程。然而,比特币网络的每一个节点都遵循一些简单的数学准则。节点间的相互作用促成并引起组织的复杂行为,而不是某个单一节点自身具有复杂性和可信性。就像蚁群一样,比特币的弹性网络是一个由众多遵循简单准则的简单节点所组成的弹性网络,这些简单的节点准则聚合在一起可以完成惊人的事情,而不需要任何中枢协调。排版约定本书采用以下排版约定:斜体(Italic)指示新的术语、URL链接、email地址、文件名和文件扩展名。等宽体(Constant width)用于程序清单的显示,也用于段落中涉及的程序要素,如变量或函数名、数据库、数据类型、环境变量、语句和关键字。等宽粗体(Constant width bold)显示需要由用户输入的命令和其他文字。等宽斜体(Constant width italic)显示需要由用户提供的或根据上下文环境修改的值。这个标志表示提示或建议。这个标志表示通用注释。这个标志表示警告或提醒。代码示例本书示例是基于类Unix操作系统(例如Linux或Mac OS X)的命令行,用Python或C 编程语言来编写。全部代码段均可在GitHub主代码库中的code子目录获得。读者可以通过GitHub库(https://github.com/aantonop/bitcoinbook)创建自己的代码分支,尝试书中示例,或者提交代码更正。所有代码段在大多数操作系统上都可以通过最小化安装对应语言的编译器和解释器来重现。在必要的地方,本书还提供了基本的安装指令以及每步指令输出的结果。为了适应版面,本书重新格式化了部分代码段和代码输出。在所有此类例子中,每行代码以反斜杠(\)字符和换行符分开。当你需要尝试这些示例时,请删除这两个字符把被分隔的两行重连起来,这样就可以得到与例子中一致的结果了。本书所有代码段尽可能地采用实值计算,因此你可以通过重复构建本书提供的代码示例,用你自己写的代码计算出相同的结果。譬如,书中出现的私钥和对应的公钥及地址也都是真实存在的。示例中的所有交易、区块和区块链均被记录在实际的比特币区块链中,是公共账目的一部分,因而你可以在任何比特币系统中检查它们。使用代码示例本书的目的是帮助你完成工作。总之,你可以在程序和文档中使用本书的代码示例。除非你要复制代码的关键部分,否则不需要联系我们获得许可。例如,使用程序中的几段代码,或者引用本书及代码来回答问题是不需要获准的;而售卖或分发包含O扲eilly书中代码示例的光盘,或者将书中的大量代码合并于你的产品或文档则必须获得我们的许可。我们鼓励但不强制要求你在引用本书时表明出处。书目引用格式通常包括书名、作者、出版商、ISBN。例如:Mastering Bitcoin,Andreas M. Antonopoulos(O扲eilly, 2017),978-1-491-95438-6。本书某些版本提供了开源许可,如CC-BY-NC(https://creativecommons.org/licenses/by-nc/4.0/ ),这种情况下,开源许可条款适用。如果你觉得你对本书代码示例的使用超出了合理范围或上述许可,请随时与我们联系:permissions@oreilly.com。书中涉及的比特币地址与交易书中的比特币地址、交易、密钥、二维码、区块链数据大部分都是真实的。这意味着你可以通过脚本或程序等方式在比特币区块链中查看示例给出的交易。然而,需要注意的是创建地址的这些私钥要么写入书中,要么已经被焚毁。这就意味着如果你往这些地址中转入比特币的话,这些比特币要么永远丢失,要么会被本书的其他读者通过书中给出的私钥拿走。不要向书中给出的任何地址转比特币。否则你的钱将永远消失或被本书其他读者拿走。Safari在线图书O扲eilly Safari(正式名称为Safari在线图书)是一个为企业、政府、教育家以及个人提供会员制的培训与参考的平台。会员可以在该平台获取来自超过250家出版社提供的成千上万的书籍、培训视频、学习路径、交互教程、策划播放列表,这些公司包括:Prentice Hall Professional、Addison-Wesley Professional、MicrosoftPress、Sams、Que、Peachpit Press、Adobe、Focal Press、Cisco Press、John Wiley& Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、 Adobe Press、FTPress、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett以及CourseTechnology,除此之外还有其他很多公司。要获取更多信息,请访问:http://oreilly.com/safari。如何联系我们美国:O扲eilly Media, Inc.1005 Gravenstein Highway NorthSebastopol, CA 95472中国:北京市西城区西直门南大街2号成铭大厦C座807室(100035)奥莱利技术咨询(北京)有限公司讨论或提出关于本书的技术问题,可发邮件至bookquestions@oreilly.com。要想更多了解我们书籍、课程、会议和新闻的信息,可以登录我们的官网:http://www.oreilly.com。我们的Facebook账号:http://facebook.com/oreilly。关注我们的Twitter账号:http://twitter.com/oreillymedia。我们在YouTube上的视频:http://www.youtube.com/oreillymedia。联系作者你可以在我的个人网站联系我,网址为https://antonopoulos.com/本书的信息以及开放版本与翻译的信息可以在https://bitcoinbook.info/获取。请关注我的Facebook账号https://facebook.com/AndreasMAntonopoulos。请关注我的Twitter账号https://twitter.com/aantonop。请关注我的领英账号https://linkedin.com/company/aantonop。特别感谢所有的赞助人,他们支持我数月的工作。你可以访问我的赞助人网站:https://patreon.com/aantonop。致谢这本书的出版浓缩了很多人的努力与付出。在写书的过程中,我很感激来自朋友、同事,甚至陌生人的帮助,是他们的加入与努力帮助我完成了这本关于数字货币和比特币的纯技术类书籍。我们不可能将比特币技术与比特币社区区分开,因为这本书不仅是社区的产品,也是比特币技术的产品。我写这本书的工作自始至终都得到了整个社区的鼓励、欢呼、支持与奖励。最重要的是,这本书让我两年来成为这个极好社区的一部分,我无法用语言表达你们接纳我成为社区成员的感激之情。在写书的过程中有太多的人需要感谢,以至于无法一一列举,这些人包括我在会议、重大事件、研讨会、聚会、比萨聚会以及小型私人集会相识的人,同时还有那些在Twitter、reddit、bitcointalk.org以及GitHub上与我联系,并对本书成稿有影响的人。你在本书中找到的每个想法、类比、问题、回答以及解释,都是在我与社区人员沟通交流时产生并得到验证和优化的结果。谢谢所有支持过我的人,没有你们的支持就不会有这本书的存在。对此,我将永远心存感激。当然,我是经过了很长一段时间才成为作家并写作了第一本书。我(在校学习)的第一语言是希腊语,因此我需要在大学一年级时学习英语写作补习课程。我要感谢英语写作老师Diana Kordas,那年是他帮助我建立了自信并提升了写作技能。随后,作为教授,在为《*NetworkWorld》杂志撰稿时,我提升了自己在数据中心方面的写作技能。我要感谢John Dix和John Gallant,他们给了我第一份写作方面的工作,让我成为《*Network World》杂志的专栏作者,还要感谢编辑Michael Cooney和同事Johna Till Johnson,是他们帮我编辑专栏文章,让它们得以发表。四年每周500字的写作经验最终给了我成为一名作家的足够信心。还要感谢在我提交本书稿件至O扲eilly出版社时那些帮助过我的人,他们为我提供参考和稿件审阅。特别要感谢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,Richard Kagan和Tymon Mattoszko帮我审阅了本书早期稿件,MatthewTaylor帮我修改了稿件。感谢《DNS and BIND》的作者Cricket Liu,是他将我介绍给了O扲eilly出版社。还要感谢O扲eilly的Michael Loukides和Allyson MacDonald,是他们花费数月时间帮助我出版本书。当最终稿件因为种种原因未按计划提交而错过出版截止日期时,Allyson表现得特别耐心。对于第2版,我要感谢Timothy McGovern的全程指导、Kim Cofer的耐心编辑以及 RebeccaPanzer帮助插入了许多新图表。最初一些章节的草稿是最难写的部分,因为比特币是一个很难说清楚的主题。每次研究比特币中某个主题时,我还得考虑整体的技术内容。当我努力想将主题说得简单易懂,围绕这样一个密集型技术主题展开叙述时,我不断地被卡住并有点沮丧。最终,我决定以讲述人们使用比特币的故事为主线,从而让我可以轻松地写作本书。我要感谢我的导师兼朋友Richard Kagan,是他帮助我想到了以故事方式来编写此书,让我跨过了编者的阻碍。我要感谢PamelaMorgan,他审阅了本书第1版与第2版早期草稿的每个章节,并且提出了很好的改进意见,让本书内容质量更高。同时,还要感谢San Francisco比特币开发者组织小组,还要感谢帮助测试早期材料的Taariq Lewis和Denise Terry。感谢Andrew Naugler帮助设计信息图标。在本书编写的过程中,我在GitHub上制作了早期草稿,然后邀请公众对其进行评论。收到了100多条评论、建议、修改和捐赠等方面的回应。那些捐助者在文末的早期发布草稿的GitHub捐助者中进行了公布,并表达了我的感激之情。真诚地感谢我的GiuHub志愿者编辑Ming T. Nguyen(第1版编辑)和Will Binns(第2版编辑),他们不辞辛劳地组织、管理和解决GitHub上的pull requests、issue reports,并且执行bug修复工作。当完成草稿撰写后,本书经历了多轮技术审阅与修改。感谢Cricket Liu和Lorne Lantz的全程审阅、评论和支持。许多比特币开发者贡献了示例代码、审阅、评论和鼓励。感谢Amir Taaki和Eric Voskuil提供了示例代码片段和许多很好的评论。Chris Kleeschulte编写了附录E;Vitalik Buterin和Richard Kiss帮助提供椭圆曲线数学解析和实现代码;感谢GavinAndresen对本书的修订、评论和支持;感谢Michalis Kargakis的评论、捐赠和btcd简介;感谢Robin Inge修订本书的勘误,改进了第2版的印刷效果。在第2版中,我再次得到了很多比特币核心开发人员的帮助,包括让隔离见证通俗易懂的Eric Lombrozo,帮助改进交易章节的Luke-Jr,帮助审阅隔离见证和其他章节的Johnson Lau,还有其他很多要感谢的开发者。我深深地感谢帮助解释闪电网络的Joseph Poon、Tadge Dryja和Olaoluwa Osuntokun,他们还帮助我审阅文章,解答了我无法回答的问题。我将这本书和深爱之词献给我亲爱的母亲Theresa,她在我家房子的每面墙上放满了书籍。尽管自认为是科技产品排斥者,我母亲还是在1982年给我买了第一台电脑。我的父亲Menelaos是一名土木工程师,刚在80岁时出版了他的第一本书,我的父亲也是一名科技和工程技术爱好者,他教会了我逻辑思考与分析。感谢在写书过程中所有支持我的人。
目录前言1第1章 比特币介绍91.1 比特币是什么91.2 比特币历史111.3 比特币的使用、用户及用户场景121.4 入门131.4.1 选择比特币钱包131.4.2 快速入门151.4.3 获取比特币171.4.4 查询比特币当前价格181.4.5 发送和接收比特币18第2章 比特币的工作原理212.1 交易、区块、挖矿和区块链212.1.1 比特币概述212.1.2 购买一杯咖啡222.2 比特币交易242.2.1 交易输入和输出242.2.2 交易链252.2.3 找零252.2.4 常见的交易形式262.3 交易的构建272.3.1 获取正确的输入272.3.2 创建交易输出292.3.3 将交易加入账簿302.4 比特币挖矿312.5 在区块中挖掘交易322.6 消费交易33第3章 比特币核心客户端:参考实现353.1 比特币开发环境363.2 从源码编译比特币核心363.2.1 选择比特币核心版本373.2.2 配置比特币核心生成383.2.3 生成比特币核心可执行文件403.3 运行比特币核心节点413.3.1 首次运行比特币核心423.3.2 配置比特币核心节点433.4 比特币核心客户端应用程序编程接口(API)463.4.1 获得比特币核心客户端状态信息473.4.2 探究和解码交易483.4.3 探究区块503.4.4 使用比特币核心的编程接口513.5 其他替代客户端、库和工具包543.5.1 C/C 类543.5.2 JavaScript类543.5.3 Java类543.5.4 Python类543.5.5 Ruby类553.5.6 Go类553.5.7 Rust类553.5.8 C#类553.5.9 Objective-C类55第4章 密钥和地址564.1 简介564.1.1 公钥密码学和加密货币574.1.2 私钥和公钥584.1.3 私钥584.1.4 公钥604.1.5 椭圆曲线密码学604.1.6 创建公钥634.2 比特币地址644.2.1 Base58和Base58Check编码664.2.2 密钥的格式694.3 用Python实现密钥和比特币地址744.4 高级密钥和地址784.4.1 加密私钥(BIP-38)784.4.2 P2SH和多重签名地址794.4.3 靓号地址804.4.4 纸钱包85第5章 钱包885.1 钱包技术概述885.1.1 非确定性(随机)钱包895.1.2 确定性(种子)钱包905.1.3 分层确定性钱包(BIP-32/BIP-44)905.1.4 种子和助记词(BIP-39)915.1.5 钱包最佳实践915.1.6 使用比特币钱包925.2 钱包技术细节935.2.1 助记词编码标准(BIP-39)935.2.2 从种子中创造HD钱包995.2.3在网店中使用扩展公钥103第6章 交易1086.1 简介1086.2 交易细节1086.3 交易的输出和输入1106.3.1 交易输出1116.3.2 交易输入1136.3.3 交易费1176.3.4 把交易费加到交易中1186.4 交易脚本和脚本语言1206.4.1 非图灵完备性1216.4.2 无状态验证1216.4.3 脚本构建(锁定与解锁)1216.4.4 P2PKH1246.5 数字签名(ECDSA)1266.5.1 数字签名如何工作1276.5.2 验证签名1286.5.3 签名散列类型(SIGHASH)1296.5.4 ECDSA数学1316.5.5 随机性在签名中的重要性1326.6 比特币地址、余额和其他摘要133第7章 高级交易及脚本1367.1 简介1367.2多重签名1367.3 P2SH1387.3.1 P2SH地址1407.3.2 P2SH的优点1407.3.3赎回脚本和标准确认1417.4 数据记录输出(RETURN操作符)1417.5时间锁1437.5.1交易锁定时间1437.5.2检查锁定时间验证1447.5.3相对时间锁1467.5.4 带nSequence的相对时间锁1467.5.5 带CSV的相对时间锁1477.5.6 过去中位时间1487.5.7针对费用狙击的时间锁1497.6 具有条件控制的脚本(条件语句)1497.6.1带有VERIFY操作码的条件语句1507.6.2 在脚本中使用流控制1517.7复杂的脚本示例153第8章 比特币网络1558.1 点对点网络架构1558.2 节点类型和角色1568.3 扩展比特币网络1588.4 比特币中继网络1588.5 网络发现1608.6 全节点1638.7 交换库存清单1648.8 简易支付验证(SPV)节点1658.9 Bloom过滤器1688.10 SPV节点如何使用Bloom过滤器1718.11 SPV节点和隐私1728.12 加密与认证连接1738.12.1 Tor传输1738.12.2 P2P认证和加密1748.13 交易池174第9章 区块链1769.1 简介1769.2 区块结构1779.3 区块头1779.4 区块标识符:区块头散列值和区块高度1789.5创世区块1799.6 链接区块链中的区块1809.7 默克尔树1829.8 默克尔树和简单支付验证1869.9 比特币的测试链1879.9.1 testnet比特币的试验场1879.9.2 segnet隔离见证测试网1899.9.3 regtest本地区块链1899.10 使用测试区块链进行开发190第10章 挖矿和共识19110.1 简介19110.2 去中心化共识19410.3 交易的独立校验19510.4 挖矿节点19610.5 打包交易至区块19710.5.1 创币交易19810.5.2 创币奖励与矿工费19910.5.3 创币交易的结构20110.5.4 创币交易数据20210.6 构造区块头20310.7 挖掘区块20510.7.1 工作量证明算法20510.7.2 难度目标值表示21010.7.3 重定目标实现调整难度21110.8 成功挖出区块21310.9 验证新区块21410.10 区块链的组装与选择21410.11 挖矿和算力竞争22110.11.1 随机数升位方案22310.11.2 矿池22310.12 共识攻击22610.13 改变共识规则22910.13.1 硬分叉22910.13.2 硬分叉:软件、网络、挖矿和链23010.13.3 分离矿工和难度23110.13.4 有争议的硬分叉23210.13.5 软分叉23210.13.6 对软分叉的批评23410.14 使用区块版本发出软分叉信令23410.14.1 BIP-34信令和激活23410.14.2 BIP-9信令和激活23510.15 共识软件开发237第11章 比特币的安全23911.1 安全原则23911.1.2 安全地开发比特币系统24011.1.3 信任根24111.2 用户安全最佳实践24111.2.1 比特币物理存储24211.2.2 硬件钱包24211.2.3 平衡风险24311.2.4 分散风险24311.2.5 多重签名和治理24311.2.6 生存能力24311.3 结论244第12章 比特币应用24512.1 简介24512.2 基础模块(要素)24512.3 源于基础模块的应用24712.4 染色币24812.4.1 使用染色币24912.4.2 发行染色币24912.4.3 染色币交易24912.5 合约币25212.6 支付通道和状态通道25312.6.1 状态通道基本概念和术语25412.6.2 简单支付通道示例25412.6.3 制造无须信任的通道25712.6.4 非对称可撤销承诺26012.6.5 散列时间锁合约26312.7 路由支付通道(闪电网络)26412.7.1 闪电网络示例26412.7.2 闪电网络传输和路由26712.7.3 闪电网络优势26912.8 结论270附录A 比特币白皮书271附录B 交易脚本语言操作符、常量和符号282附录C 比特币改进建议287附录D 隔离见证296附录E Bitcore308附录F pycoin库、实用秘钥及交易程序311附录G 比特币浏览器命令320