首页>参考读物>计算机科学与技术>软件与程序设计

区块链编程
作者 : [美] 吉米·宋(Jimmy Song)著
译者 : 侯亮 潘凯阳 译
出版日期 : 2020-04-21
ISBN : 978-7-111-65203-8
定价 : 99.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 291
开本 : 16
原书名 : Programming Bitcoin: Learn How to Program Bitcoin from Scratch
原出版社: O'Reilly Media, Inc.
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

本书是一本区块链技术入门指南,内容涵盖密码学数学基础(包括有限域、椭圆曲线、椭圆曲线密码学)、序列化工具、交易数据的结构与传输,以及数字签名的构造与验证等。通过本书,读者将学习如何使用这种流行的加密货币及其区块链支付系统背后的基础知识,包括数学、密码学、区块、网络等。

图书特色

图书前言

本书将讨论比特币技术的基本内容。书中不包含有关货币、经济学以及社会进程的比特币话题,但是了解比特币背后的工作原理将给我们带来对各种可能性的深入洞察。当下有一种在不真正了解的情况下大肆鼓吹比特币和区块链的趋势。这本书将是这种趋势的“解药”。
毕竟现在有许多关于比特币的书籍,它们有的涵盖了比特币的历史与经济方面,有的提供了详细的技术说明。本书讲解如何编写一个包含所有必要组件的比特币库,以此让人们了解比特币。在本书中,编写这样一个库并不是为了使其完美或高效,而是为了让读者学习比特币技术。
本书的适用人群
本书适用于想通过编写代码来学习比特币的程序员。他们将通过从零开始编写比特币库的基础组件来学习比特币,但本书并不能用作查询某些特征细节的参考书。
书中大部分的内容都取自我教授开发者比特币知识的为期两天的讲座课程。在写作本书的过程中,我已经讲授过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和我的孩子在过去的两年中一直默默支持我。如果不是为了他们,我都不知道我是否有动力像现在这样工作。

上架指导

计算机\程序设计

封底文字

本书从软件工程的角度来剖析比特币的原理及结构,以编程的方式帮助你深入理解区块链技术。作者向Python程序员和开发人员介绍了如何从头开始编写比特币库。在本书中,你将学习如何使用这种流行的加密货币及其区块链支付系统背后的基础知识,包括数学、密码学、区块、网络和交易。
学完本书,你将通过编写比特币库所需的所有组件来了解这种加密货币的幕后工作方式,并将了解如何创建交易、从点对点网络中获取所需的数据以及通过比特币网络协议发送交易。无论你是为公司探索区块链应用还是在考虑新的职业道路,这本实用的书都可以帮助你入门。
? 解析、验证和创建比特币交易。
? 学习比特币背后的智能合约语言Script。
? 在每一章中进行练习,从零开始构建比特币库。
? 了解工作量证明如何保护区块链。
? 使用Python 3编写比特币。
? 了解简单支付验证(SPV)和轻钱包的工作机制。
? 学习使用公钥加密和加密原语机制。

“ 本书不仅教给你区块链的运行机制,还让你直观地感受到这项技术的优雅与美丽。”
——刘宇昆
星云、雨果和世界奇幻奖
的获得者。他关于区块链的
科幻故事Byzantine Empathy
(《拜占庭移情》)最初
由MIT出版社出版。

Jimmy Song拥有20多年开发经验,其中有5年的时间从事比特币的相关工作。他是bitcointechtalk.com的编辑,也为Bitcoin Magazine撰稿,同时是Blockchain Capital的合伙人以及得克萨斯大学比特币编程课程的授课教师。Jimmy是Bitcoin Core(比特币核心)以及其他比特币项目的贡献者。他曾是比特币钱包Armory的技术副总裁。

作者简介

[美] 吉米·宋(Jimmy Song)著:Jimmy Song 是一位拥有20多年经验的开发人员,其中有5年的时间从事比特币的相关工作。 他是 bitcointechtalk.com 的编辑,也为杂志 Bitcoin Magazine撰稿,同时也是 Blockchain Capital 的合伙人以及得克萨斯州大学比特币编程课程的授课教师。 Jimmy 是Bitcoin Core(比特币核心)以及其他比特币相关项目的开发贡献者。 他也曾是比特币钱包Armory的技术副总裁。

译者序

有别于Mastering Bitcoin一书(该书已由机械工业出版社引进出版,书号为978-7-111-62605-3),本书并不是通过使用软件来解读比特币,而是从软件工程的角度来介绍比特币的原理及结构。值得注意的是,本书涉及的内容多与技术实现相关,例如序列化工具、交易数据的结构与传输、数字签名的构造与验证等,书中关于共识算法与经济模型的讨论只有具体的实现与参数,并不涉及其背后的经济学原理。正如前言所述,本书最大的特点之一就是在前三章提供简单易懂的、有针对性的密码学数学基础,带领读者完成相应的推导过程,并且将推导的结果应用于各个章节之中。基于我们对区块链项目的研究,我们认为本书这样的知识安排也十分适合于理解除了比特币以外的区块链项目。本书的学习路径大致可总结为以下几个步骤:先理解数学工具;再基于密码学和公钥基础设施(PKI)建立账户体系;之后学习不同账户之间的相互操作,例如,完成一笔交易;最后学习数据间通信的格式(如区块)与方法(如共识算法)。
两位译者曾经在火币科技从事区块链技术研究等相关工作,因此有机会接触、了解许多区块链相关的技术知识。我们发现,一方面,区块链相关的新技术、新名词、新知识应接不暇,繁杂琐碎,对于很多技术,人们还没来得及掌握便已经过时了。以本书为例,作者单独以一章讨论的布隆过滤器已经在最新的比特币节点(0.19.0.1)中被默认关闭,而替换为隐私性更好的“compact client-side block filter”。另一方面,大部分技术没有脱离比特币最初定义的问题,比特币白皮书总是讨论新技术的合适起点,而比特币的实现和性能指标是必不可少的基准指标。我们相信比特币是区块链技术中的不动点,是读者理解区块链相关新知识的基础。还是以布隆过滤器为例,如果不理解布隆过滤器解决的问题及其缺点,则很难理解新技术加入比特币节点的原因和意义。
因此,我们希望这本书可以帮助读者在直面新的技术名词之前,打好基础,提高辨别能力和学习能力。我们相信本书包含的知识是蓬勃发展的区块链技术的不动点,熟练的工程师亦可随时阅读本书汲取知识。
本书由侯亮和潘凯阳翻译。本书得以顺利出版,有赖于许多人的支持和帮助。
十分感谢原书作者Jimmy认可我们的工作。除了都是区块链从业者以外,我们与Jimmy之间没有太多的关联,在翻译本书的过程中与他的几次简短邮件交流让我们感受到了他的关注与兴奋,这也大大地提升了我们翻译本书的热情。
感谢原火币科技技术专家刘鑫老师带我们踏入区块链技术的世界。我们的同事——优秀的工程师王金波、王美娟、王赛凭借丰富的工程实践经验,为本书的翻译工作提供了宝贵意见。
感谢火币科技CTO程显峰在促成本书出版的各方面提供的支持,及对我们研究工作的指导与认可。
感谢机械工业出版社华章分社的编辑王春华在整个翻译过程中对我们的帮助。

侯亮 潘凯阳
2020年1月

推荐序

成为一名科幻作家是一件非常有趣的事。倘若我想创造一个既不需要人与人之间的信任也无须向任何中间人支付费用就能进行价值交换的世界,一个集体决定不因集中化而扭曲的世界,我需要做的就是打开一个文本编辑器,并开始写下点什么。
仅仅拥有想象力就想写出一个引人入胜的故事可是远远不够的。我们往往还需要对这个“世界”的认知。“创造一个新世界”也可以并不只是纸上谈兵或者程序员之间的“黑话”。事实上,它更需要我们穿过表象,通过不断提出“假如这般,那么会怎样”的问题来带领我们慢慢靠近比特币世界运行的核心。作为一个“编写”比特币世界的人,对构成比特币世界的机制与原则理解得越多,所提出的问题也将越有趣。
改变世界可比写一本科幻小说要难得多,需要许多知识。除了聪明、有理想、勇气、自律,以及在被质疑时的决心,一个即将改变世界的人还需要对可用的工具及其功能和限制有所了解。
如今,比特币和区块链所描述的世界仍然是幻想乡的一部分。一贯兜售希望与炒作的所谓权威人士说起话来比那些真正在为改变而努力的人们要大声得多,也具有更大的影响力。基于某种动机,他们以恐惧与暴富为支撑,在天花乱坠的技术术语和各式各样的热门标签的助推下,吸引着人们来传递信息。
但你不可能通过阅读白皮书或者想象来理解区块链,就像你不可能通过去商学院学习或阅读PPT来创立公司一样。
如果想真正理解,你必须开始写代码。
除了利用一项新科技来构建一些对自己有用的东西外,再没有更好的办法来理解这项新技术了。在你亲自一点点地构建区块链应用程序的各个基础模块之前,你可能永远也无法直观地理解空洞炒作与真正可实现的可能性之间的区别。
通过编码来学习比特币和区块链是最有效和最全面的方法。凭借出色的技巧和洞察力,Jimmy Song精心设计了一条学习路径,引领你从比特币背后的基础数学走到最新的扩展和分叉。一路上,不仅会通过与现场学生的紧密合作设计出来的练习教给你区块链的运行机制,还会让你直观地感受到这项技术的优雅和美感。
这本书阅读起来并不会非常轻松。即使有一位像Jimmy一样资深的老师指导你,这也不是一本当你厌倦了Netflix时可以翻阅的书。为了充分利用它,需要你投入大量的精力,没有捷径,也没有小抄儿。而这恰恰与比特币的构成原则非常一致:作为一个节点,你必须参与,你也必须能够演示工作量证明。只有这样,你才能真正了解比特币世界。
最后,祝你编程愉快!
——Ken Liu(刘宇昆)
Ken Liu(刘宇昆http://kenliu.name)是星云、雨果和世界奇幻奖的获得者,魔术史诗幻想系列The Dandelion Dynasty(《蒲公英王朝》)以及The Paper Menagerie and Other Stories(《折纸和其他故事》)作品集的作者。他关于区块链的科幻故事Byzantine Empathy(《拜占庭移情》)(https://breakermag.com/kchail-science-ficition-premiere-byzantine-empathy/)最初由MIT出版社出版。

图书目录

前言 1
第1章 有限域 11
学习更高等的数学 11
有限域的定义 12
定义有限集合 12
使用Python构建有限域 13
练习1 14
模运算 14
Python的模运算 16
有限域的加法和减法 16
练习2 18
使用Python编写有限域的加法和减法 18
练习3 19
有限域的乘法和指数运算 19
练习4 20
练习5 20
使用Python编写乘法 20
练习6 20
使用Python编写指数运算 21
练习7 21
有限域的除法 21
练习8 23
练习9 23
重新定义指数运算 24
总结 25
第2章 椭圆曲线 26
定义 26
使用Python编写椭圆曲线 31
练习1 32
练习2 32
点的加法 32
点加法的性质 35
实现点加法 37
练习3 38
x1≠x2时的点加法 38
练习4 40
实现x1≠x2时的点加法 40
练习5 40
P1 = P2时的点加法 40
练习6 42
实现P1 = P2时的点加法 42
练习7 42
实现另一个特例 42
总结 43
第3章 椭圆曲线密码学 44
实数域上的椭圆曲线 44
有限域上的椭圆曲线 45
练习1 46
实现有限域上的椭圆曲线 46
有限域上的点加法 48
实现有限域上的点加法 49
练习2 49
练习3 49
椭圆曲线的标量乘法 49
练习4 51
再议标量乘法 51
数学上的群 52
恒等元 53
封闭性 53
可逆性 54
交换律 54
结合律 55
练习5 56
实现标量乘法 56
定义比特币的曲线 58
使用secp256k1 59
公钥密码学 61
签名和验证 61
雕刻靶坐标 62
验证的细节 64
验证签名 65
练习6 66
编程实现签名验证 66
签名的细节 67
创造签名 67
练习7 68
编程实现消息签名 68
总结 70
第4章 序列化 72
未压缩的SEC格式 72
练习1 73
压缩的SEC格式 73
练习2 77
DER签名 77
练习3 79
Base58 79
转录你的公钥 79
练习4 81
地址格式 81
练习5 82
WIF格式 82
练习6 83
再议大端序和小端序 83
练习7 83
练习8 83
练习9 84
总结 84
第5章 交易 85
交易的组成 85
版本号 87
练习1 88
输入 88
解析脚本 92
练习2 92
输出 93
练习3 94
时间锁 94
练习4 95
练习5 95
实现交易的序列化 96
交易手续费 96
计算交易手续费 98
练习6 98
总结 98
第6章 Script 99
Script机制 99
Script如何运作 100
几个操作符的例子 101
实现操作符 101
练习1 102
解析脚本字段 102
实现一个Script解析工具和序列化工具 103
合并脚本字段 105
实现合并命令集 106
标准脚本 106
p2pk 107
实现脚本计算 110
栈元素的本质 112
练习2 113
p2pk的缺陷 113
使用p2pkh修复问题 114
p2pkh 114
脚本可以被任意构建 118
练习3 120
脚本的使用 121
练习4 121
SHA-1 Pin躠ta 122
总结 122
第7章 交易的创建与验证 123
验证交易 123
校验交易输入是否可用 123
校验交易输入的总和与交易输出的总和 124
校验签名 125
练习1 129
练习2 129
校验交易的全部内容 129
创建交易 129
构建交易 130
制作交易 132
签名交易 133
练习3 134
在测试链上创建你自己的交易 134
练习4 135
练习5 135
总结 135
第8章 支付到脚本哈希交易 136
裸多签 136
实现OP_CHECKMULTISIG 140
练习1 140
裸多签的问题 141
支付到脚本哈希 141
实现p2sh 147
更复杂的脚本 148
地址 148
练习2 149
练习3 149
p2sh签名验证 149
练习4 152
练习5 152
总结 152
第9章 区块 153
创块交易 153
练习1 154
签名脚本 154
BIP0034 155
练习2 156
区块头 156
练习3 157
练习4 157
练习5 157
版本号 157
练习6 158
练习7 159
练习8 159
父区块 159
默克尔根 159
时间戳 159
工作量 160
序号 160
工作量证明 160
矿工如何生成新的哈希 161
计算目标 161
练习9 162
计算难度 162
练习10 163
校验工作量证明 163
练习11 163
计算难度调整 163
练习12 165
练习13 165
总结 165
第10章 比特币网络通信 166
网络消息 166
练习1 168
练习2 168
练习3 168
解析payload 168
练习4 169
网络握手 170
连接到比特币网络 170
练习5 172
获取区块头信息 173
练习6 174
区块头响应 174
总结 176
第11章 简单支付验证 177
动机 177
默克尔树 178
默克尔树的父哈希 179
练习1 180
默克尔父节点层数 180
练习2 181
默克尔根 181
练习3 182
区块中的默克尔根 182
练习4 183
默克尔树的使用 183
默克尔块 184
默克尔树结构 186
练习5 187
实现默克尔树 187
默克尔块命令 192
练习6 193
标记位和哈希的使用 193
练习7 197
总结 197
第12章 布隆过滤器 198
什么是布隆过滤器 198
练习1 200
布隆过滤器进阶 200
BIP0037布隆过滤器 201
练习2 203
练习3 203
载入一个布隆过滤器 203
练习4 204
获取默克尔块 204
练习5 205
获取相关交易 205
练习6 206
总结 206
第13章 隔离见证 207
支付到见证公钥哈希 207
交易的延展性 207
修复延展性问题 208
p2wpkh交易 209
p2sh-p2wpkh 212
实现p2wpkh和p2sh-p2wpkh交易 216
支付到见证脚本哈希 220
p2sh-p2wsh 223
实现p2wsh和p2sh-p2wsh交易 228
其他方面的改善 230
总结 230
第14章 高级主题和进阶 231
推荐的学习主题 231
钱包 231
支付通道和闪电网络 232
贡献代码 232
推荐的项目 233
测试链钱包 233
区块链浏览器 233
网上商店 233
工具库 234
寻找工作 234
总结 234
附录 练习答案 235

教学资源推荐
作者: 郑阿奇 主编 王燕平 汤玫 编著
作者: [美]肯尼斯·A.兰伯特(Kenneth A. Lambert)著
作者: [美]杰瑞 R. 汉丽(Jeri R. Hanly)埃利奥特 B. 考夫曼(Elliot B. Koffman) 著
参考读物推荐
作者: (美)Terry Winograd
作者: 张增强
作者: Andrew Koenig,Barbara E. Moo