本书将讨论比特币技术的基本内容。书中不包含有关货币、经济学以及社会进程的比特币话题,但是了解比特币背后的工作原理将给我们带来对各种可能性的深入洞察。当下有一种在不真正了解的情况下大肆鼓吹比特币和区块链的趋势。这本书将是这种趋势的“解药”。
毕竟现在有许多关于比特币的书籍,它们有的涵盖了比特币的历史与经济方面,有的提供了详细的技术说明。本书讲解如何编写一个包含所有必要组件的比特币库,以此让人们了解比特币。在本书中,编写这样一个库并不是为了使其完美或高效,而是为了让读者学习比特币技术。
本书的适用人群
本书适用于想通过编写代码来学习比特币的程序员。他们将通过从零开始编写比特币库的基础组件来学习比特币,但本书并不能用作查询某些特征细节的参考书。
书中大部分的内容都取自我教授开发者比特币知识的为期两天的讲座课程。在写作本书的过程中,我已经讲授过20多次该课程,学生超过400人。
当你读完这本书后,你将不仅会创建一笔交易,而且能够从连接节点中获取所有你需要的数据,然后通过网络发送一笔交易。本书涵盖了完成该行为所需的所有知识,从数学基础到解析数据,再到比特币网络连接和最后进行的区块验证。
预备知识
阅读本书的前提条件是你了解编程语言,尤其是Python。比特币库本身是用Python 3编写的,许多练习都可以在特定的环境(如Jupyter笔记本)中完成。熟练掌握Python有助于阅读本书,但即使只具有Python的基础知识也足以学习书中的许多概念。
阅读本书也需要一定的数学知识,第1章和第2章介绍了与本书相关的数学概念,非数学专业的人可能不熟悉这些概念。拥有代数知识应足以帮你理解新概念,并完成这些章节中涵盖的练习。
诸如哈希函数这样的常见计算机科学知识将派上用场,但这些知识对于完成本书中的练习并不是必需的。
本书的结构
本书共分为14章。每一章都是在前一章的基础上构建的,因此我们能从头至尾了解构建比特币库的全过程。粗略地说,第1~4章建立我们需要的数学工具。第5~8章介绍交易,这是比特币的基本单位。第9~12章介绍区块和网络。最后两章涵盖一些高级主题,但实际上并不需要你编写代码。
第1章和第2章介绍我们需要的一些数学知识。 要了解第3章中的椭圆曲线密码学,需要有限域和椭圆曲线知识。在第3章后半部分介绍了公钥密码学之后,第4章增加了解析和序列化,这是存储和传输加密文本的方式。
第5章介绍交易的结构。第6章介绍比特币背后的智能合约语言Script。第7章以前面的章节为基础,展示如何基于前面四章中的椭圆曲线密码学来验证和创建一笔交易。第8章建立支付到脚本哈希(p2sh)交易的工作方式,这是一种制作更强大的智能合约的方式。
第9章介绍区块,它是一组有序交易。第10章介绍比特币中的网络通信。第11章和第12章讨论一个轻节点或者一个无法访问整个区块链的软件如何向存储整个区块链的节点请求数据或向其广播数据。
第13章介绍隔离见证,这是2017年推出的比特币软件向后兼容的升级。第14章提供进一步研究的建议。这两章是选读章节,希望为你学习更多知识提供一个起点。
第1~12章的练习要求你从头开始构建库。答案在本书附录和GitHub存储库(https://github.com/jimmysong/programmingbitcoin)的相应章节目录中。你将编写许多Python类,不仅要验证交易/区块,还要创建自己的交易并将其广播到网络上。
第12章中的最后一个练习特别要求你连接到测试链上的另一个节点,计算你可以花的钱,构造和签名交易,然后在网络上广播。前11章为你完成此练习打下了基础。
你的代码需要通过很多单元测试。本书是按照这种方式设计的,因此你可以写一些代码中的“有趣”部分。为了帮助你进步,我们将在整个过程中加入大量代码和图表。
配置
. 为了充分利用本书,你需要创建一个环境,在其中可以运行示例代码并进行练习。以下是设置这一环境所需的步骤:
1. 在你的机器上安装Python 3.5或者更高版本:
Windows
https://www.python.org/ftp/python/3.6.2/python-3.6.2-amd64.exe
macOS
https://www.python.org/ftp/python/3.6.2/python-3.6.2-macosx10.6.pkg
Linux
请查看你的版本文档(许多Linux版本如Ubuntu都预先安装了Python 3.5以上的版本)。
2. 通过下载脚本安装pip工具,下载网址为https://bootstrap.pypa.io/get-pip.py。
3. 使用Python 3运行该脚本:
$ python3 get-pip.py
4. 安装Git工具。下载及安装该工具的方式可以在https://git-scm.com/downloads上找到。
5. 下载本书的源代码:
$ git clone https://github.com/jimmysong/programmingbitcoin
$ cd programmingbitcoin
6. 安装virtualenv工具:
$ pip install virtualenv
7. 安装Python依赖:
Linux/macOS
$ virtualenv -p python3 .venv
$ . .venv/bin/activate
(.venv) $ pip install -r requirements.txt
Windows
C:\programmingbitcoin> virtualenv -p
C:\PathToYourPythonInstallation\Python.exe .venv
C:\programmingbitcoin> .venv\Scripts\activate.bat
C:\programmingbitcoin> pip install -r requirements.txt
8. 运行Jupyter笔记本:
(.venv) $ jupyter notebook
[I 11:13:23.061 NotebookApp] Serving notebooks from local directory:
/home/jimmy/programmingbitcoin
[I 11:13:23.061 NotebookApp] The Jupyter Notebook is running at:
[I 11:13:23.061 NotebookApp] http://localhost:8888/?token=
f849627e4d9d07d2158e3fcde93590eff4a9a7a01f65a8e7
[I 11:13:23.061 NotebookApp] Use Control-C to stop this server and
shut down all kernels (twice to skip confirmation).
[C 11:13:23.065 NotebookApp]
Copy/paste this URL into your browser when you connect for
the first time, to login with a token:
http://localhost:8888/?token=
f849627e4d9d07d2158e3fcde93590eff4a9a7a01f65a8e7
计算机应该会自动打开一个浏览器,如图P-1所示。
图P-1:Jupyter
在这里,你可以导航到章节目录。要做第1章中的练习,可链接到code-ch01(见图P-2)。
你可以在这里打开Chapter1.ipynb(见图P-3)。
如果你以前从未见过此界面,那么可能需要熟悉一下它,但是Jupyter的要旨是它可以通过一种使实验变得容易的方式从浏览器运行Python代码。你可以运行每个“单元”(cell)并查看结果,就好像这是一个交互式Python脚本。
图P-2:Jupyter目录
图P-3:Jupyter笔记本
练习中的很大一部分将是本书中介绍的编码概念。单元测试是为你编写的,但是你需要编写Python代码才能使测试通过。你可以直接在Jupyter中检查你的代码是否正确。通过单击诸如图P-3中的“this test”之类的链接可编辑相应的文件。这将带你进入浏览器选项卡,如图P-4所示。
图P-4:ecc.py
为了使测试通过,请在这里编辑文件并保存。
答案
所有的答案都在本书附录中。你也可以在code-ch/answers.py文件中找到各章的具体答案,这里的指的是当前章节。
排版约定
本书使用以下排版约定:
斜体(Italic)
表示文中穿插的小标题、URL、邮件地址、文件名以及文件扩展名。
等宽字体(Constant width)
用于表示程序,以及在段落中引用的程序元素,例如变量或函数名称、数据库、数据类型、环境变量、语句和关键字。
等宽粗体(Constant width bold)
显示应由用户直接输入的命令或其他文本。
等宽斜体(Constant width italic)
显示应由用户提供的值或由上下文确定的值替换的文本。
提示或者建议。
一般注解。
警告或者注意事项。
示例代码
可以从https://github.com/jimmysong/programmingbitcoin下载补充材料(示例代码、练习等)。
这里的代码是为了帮助你更好地理解本书的内容。通常,可以在程序或文档中使用本书中的代码,而不需要联系O扲eilly获得许可,除非需要大段地复制代码。例如,使用本书中所提供的几个代码片段来编写一个程序不需要得到我们的许可,但销售或发布O'Reilly的配套CD-ROM则需要O'Reilly出版社的许可。引用本书的示例代码来回答一个问题也不需要许可,将本书中的示例代码的很大一部分放到自己的产品文档中确实需要获得许可。
非常欢迎读者使用本书中的代码,不用注明出处。注明出处的形式包含标题、作者、出版社和ISBN,例如:“Programming Bitcoin by Jimmy Song(O'Reilly). Copyright 2019 Jimmy Song, 978-1-492-03149-9”。
如果读者觉得对示例代码的使用超出了上面所给出的许可范围,欢迎通过permission@oreilly.com联系我们。
O'Reilly线上学习(O'Reilly Online Learning)
近40年来,为了助力企业,O扲eilly Media提供了技术和业务培训、知识和洞察。
我们独特的专家和创新者网络通过书籍、文章、会议和在线学习平台分享知识和专家经验。O扲eilly的在线学习平台提供了实时培训课程、深入的学习路径、交互式编码环境以及O'Reilly和其他200多家出版社的大量教材和视频。有关更多信息,请访问http://oreilly.com。
如何联系我们
对于本书,如果有任何意见或疑问,请按照以下地址联系本书出版商。
美国:
O'Reilly Media,Inc.
1005 Gravenstein Highway North
Sebastopol,CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
要询问技术问题或对本书提出建议,请发送电子邮件至bookquestions@oreilly.com。
本书配套网站http://bit.ly/programmingBitcoin上列出了勘误表、示例以及其他信息。
关于书籍、课程、会议和新闻的更多信息,请访问我们的网站http://www.oreilly.com。
我们在Facebook上的地址:http://facebook.com/oreilly
我们在Twitter上的地址:http://twitter.com/oreillymedia
我们在YouTube上的地址:http://www.youtube.com/oreillymedia
致谢
一路走来,有许多人帮助过我,我汲取经验和知识的来源多种多样,很难一一列举帮助过我的人。换句话说,我可能会忘记感谢很多人,为此我深表歉意。
首先,我要感谢我的父母。我八岁时,我的父母Kathy和Kyung-Sup移民美国。爸爸给我买了第一台计算机,妈妈请了某个我已不记得名字的老师给我提供了六年级和七年级的私人编程辅导。我不知道当我热衷于编程时,妈妈是如何找到这位老师的。虽然我不记得她的名字了,但她激发了我的潜能,我希望她能理解我对她的认可。
求学路上遇到了很多老师,我当时也曾讨厌其中的一些老师。高中时,Marain先生、Edelman夫人和Nelson夫人教我数学和计算机科学,在这些课程中学到的知识使我更加热爱数学和编程。
我的高中同学Eric Silberstein帮我找到了大学毕业后的第一份工作—在Idiom Technologies公司做程序员。我原本打算一直从事咨询工作,然而1998年的一通电话改变了我的命运,使我走上了程序员/创业之路。从某种意义上说,我从未离开过编程。
在Idiom Technologies公司,我遇到了Ken Liu,令我惊讶的是,我们都在边工作边写作。他不仅为我提供了有关图书出版的出色建议,还为本书写下了精彩的推荐序。他是一位出色的顾问,也是一位了不起的朋友,我很荣幸认识他。
说到比特币,匿名开发者中本聪证明了我以前认为不可能的事情:去中心化的数字稀缺性。比特币是一项重大发明。Slashdot网站(http://slash dot.org)于2011年向我介绍了比特币,2013年Alex Mizrahi给了我第一份比特币开发的工作。我当时并不知道自己在做什么,但我从他的指导中学到了很多有关比特币的知识。
我在2013年的奥斯汀比特币大会上认识了很多比特币业内人士,在随后的2014年得克萨斯州比特币大会上,我遇到了很多时至今日仍在交往的人。尽管在此之后我没再参加类似会议,但我对在会议上遇到的人深表谢意,其中包括Michael Goldstein、Daniel Krawisz和Napoleon Cole。
早在2014年Alan Reiner就将我招募到Armory,我很感激能够有机会为如此重要的项目做出贡献。
之后我来到Paxos / itBit公司就职。工作期间,Chad Cascarilla是CEO,Raj Nair是工程部副总,与他们共事使我备感欣慰。Raj让我为Paxos撰写了一些博客文章,令我惊讶的是,我发现自己很享受写作过程。我开始在自己的个人网页上写一些博客文章,最终促成了我的比特币课程,然后有了这本书。
我在Paxos遇到的三位同事尤其重要。pycoin的创建者Richard Kiss是我写这本书的动力,感谢他给我出了写书这个主意。Aaron Caswell是一位出色的开发者,他在我教授的课程上为我提供了帮助,并审阅了本书。据我所知,他是一位出色的程序员和数学家,并且是一位非常优秀的空手道战士。Michael Flaxman审阅了我写的几乎所有与比特币相关的内容,包括我的博客、许多GitHub库和这本书。他还帮助我改进课程,他是一个能使他人变得更加敏锐的人,在此我深表感谢。
2017年,Vortex、Thomas Hunt和Tone Vays将我带入了世界加密网络,这开启了我的YouTube职业生涯。特别地,Tone给了我努力工作以及专注于一件事的灵感。
John Newbery在我第一次为比特币核心(Bitcoin Core)做贡献时给予我非常大的帮助。他在相对较短的时间内就成为非常重要的贡献者,这充分说明了他的才华和奉献精神。我也感谢其他Core开发人员,例如Marco Falke、Wladimir van der Laan、Alex Morcos、Pieter Wuille、Matt Corallo、Suhas Daftuar和Greg Maxwell,他们审阅了我的一些代码和博客文章。
David Harding在对本书进行技术审查时表现出色。他对本书进行了三遍审阅,并发表了很多精彩的评论。我建议他最好也写一本关于比特币的书,因为他对比特币历史上发生的所有事情都了如指掌。
Jim Calvin帮助我与O'Reilly的人建立了联系,Mike Loukides是为该项目“开绿灯”的编辑。Andreas Antonopolous给了我一些很好的指导,并将我推荐给O'Reilly的人。在长达一年的写作狂欢中,Michele Cronin使我笔耕不辍。Kristen Brown是本书出版编辑,他做了很多工作使本书得以按时出版。James Fraleigh进行了文字编辑。我是O'Reilly的忠实读者,感谢Tim O扲eilly通过提供出色的书籍为科技界做出的巨大贡献。
奥斯汀的比特币工作人员帮我找准努力的方向。感谢Bryan Bishop、Will Cole、Napoleon Cole、Tipton Cole、Tuur Demeester、Johnny Dilley、Michael Flaxman、Parker Lewis、Justin Moon、Alan Piscitello和Andrew Poelstra。值得一提的是,在一个Slack频道(TAAS),Saifedean Ammous宣布他正在写一本书,他的成功启发了我。
除GitHub上的比特币用户外,我教授的课程Programming Blockchain的学生也对我的书进行了技术审阅。发现问题的人包括Jeff Flowers、Brian Liotti、Casey Bowman、Johnson Lau、Albert Chen、Jason Les、Thomas Braunberger、Eduardo Cobain和Spencer Hanson。Katrina Javier是我忠实的助手,帮助我制作了许多图表。
我在YouTube上的订阅者、在Twitter上的关注者,以及在Medium上的读者都在帮助我找到自己的方向,并有力地帮助我成为一名企业家。
最后,感谢我的妻子Julie和我的孩子在过去的两年中一直默默支持我。如果不是为了他们,我都不知道我是否有动力像现在这样工作。