轻松读懂区块链(txt+pdf+epub+mobi电子书下载)


发布时间:2020-09-18 20:25:55

点击下载

作者:杜经农 杜江天

出版社:人民邮电出版社有限公司

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

轻松读懂区块链

轻松读懂区块链试读:

前言

当前,随着比特币的知名度不断攀升,其底层技术——区块链技术也经常出现在大众的视野。区块链作为一种去中心化的分布式计算技术,将在互联网发展中占据重要地位,很可能从根本上改变互联网的运行模式,其重要性不言而喻。在国家层面,很多国家都非常重视区块链技术的研究与开发。德国、美国、日本、俄罗斯、新加坡等国家高度关注区块链技术及其产业发展,不断加大研究和支持力度。我国也出台了区块链相关技术标准,并在《“十三五”国家信息化规划》中明确提出需加强区块链等新技术的基础研发和前沿布局。

对于大众来说,区块链仍然是一个神秘的名词,由于其技术具有一定的复杂性,技术专家们也很难向大众解释清楚到底什么是区块链。在互联网上,有些人试图用通俗的比喻来解释区块链,其中一个比较浪漫的解释是这样的:某年某月某日,你的男友对你说“我爱你一生一世”,这句话被自动发给你的闺蜜、爸妈、邻居、朋友等,并且他们也都记录了下来,你的男友再也无法否认。他们分别以区块的形式(区块链上保存信息的形式)记录这句话,而记录这句话的各个区块形成了一条链,这就是区块链。这个解释确实很浪漫、很吸引眼球,但它的缺点和优点一样明显——虽然通俗易懂,但并没有揭示出区块链在设计上的精妙。大部分人看后的第一反应是,原来这就是区块链,好像也没什么了不起的,不就是大家一起记个账嘛!

区块链本质上确实是一种公共记账的技术,但是和上文这个浪漫的解释有所不同的是,参与记账的人不一定是可信任的亲朋好友,反而大部分是陌生人,甚至还会有一些心怀不轨的人,比如说你的情敌,或者更糟糕的如小偷、诈骗者等,很难保证这些人会规规矩矩地记下你的原话。那么,在没有一个权威管理者的情况下,怎么保证大家最终的记账结果忠于事实,并且“不易篡改”“不易伪造”“不易抵赖”呢?区块链的巧妙之处,就是利用密码技术在一个不可信任的环境中,创造出一个可信任的记账体系。以著名的区块链技术成果——比特币为例,其十年来运行的结果表明:虽然无人管理,且被众多黑客攻击并受到种种限制,但其全球体系还是保持稳定运行,这不得不说是一个了不起的成就。正因如此,区块链也得到广泛重视。它不仅仅可以承载数字资产,也可用于需要建立信用的人类活动,例如产权登记、资格认证、文化娱乐、供应链管理等。未来,这些活动将很可能不再需要中介或者管理机构进行信用保障,而是运行在区块链上,使陌生人之间直接建立信用关系。

区块链非常精妙,并且涉及密码学、数学、对等网络等知识,比较难以理解。如果只是用通俗的比喻来解释它,大众可能根本无法认识到它的技术优势和发展潜力;如果用艰深的专业论文来描述它,大众又可能根本就看不懂。因此,本书致力于用通俗易懂的语言来阐明区块链的技术原理,并对其未来在生活中的应用做一些介绍。本书力争达到以下目标。

·趣味性。本书力争写得通俗、有趣,使人们能够轻松阅读,且不会被枯燥难懂的术语弄得晕头转向。

·科学性。本书说清讲透区块链的技术原理,使人们对区块链的底层技术有一个清楚明晰的认识,而不是通过一些似是而非的比喻来描述问题,让人们看得似懂非懂。

·前瞻性。除比特币的核心技术外,本书还讨论了其他一些正在发展中的区块链技术,对各类区块链技术的发展及其未来如何改变我们的生活,进行探讨和展望。

本书由杜经农、杜江天合作编写,其中杜江天编写了比特币UTXO数据结构、区块链共识机制、以太坊智能合约,以及附录A至附录C等内容,杜经农编写了其余章节内容。编者第1章 呼之欲出:神秘组织的诞生

1992年,一个对普通人来说非常神秘的组织“密码朋克”在美国悄悄成立。当时谁也不会想到,从这么一个小众且神秘的组织中,后来会走出许多对互联网乃至人类社会影响巨大的赫赫有名的人物,其中就包括区块链之父中本聪(见图1.1)。图1.1│什么是密码朋克1.1 三大高手创建密码朋克

1992年,住在加州旧金山的英特尔公司高级科学家蒂姆西·梅(Timothy C. May,通常昵称Tim May)在家中招待了两位朋友,一位是数学家兼程序员埃里克·休斯(Eric Hughes),另一位是约翰·吉摩尔(John Gilmore)。这三人都是高智商的IT技术专家,都反对大型信息集团对个人信息的掌控,主张在电子时代的开放社会中,通过密码学来保障个人隐私。三人谈得非常投机,于是决定由蒂姆西·梅牵头成立一个小型组织,商议大家一个月见一次面,讨论相关问题。

此后,计算机专家兼作家朱迪·米尔洪(Jude Milhon)加入这个小组,她是一个充满活力的、幽默的女人。加入这个小组之后,她充分发挥想象力,“生造”了一个单词“密码朋克”(cypherpunk),送给这个小组当作名字。Cypherpunk这个单词由密码(cipher)和数字朋克(cyberpunk)结合而成。这个单词既体现了专家们的密码学背景,又体现了朋克文化的个性与自由,于是原组织成员就“笑纳”了这份见面礼(见图1.2)。图1.2│密码朋克的成立“密码朋克”创建了一个邮件列表,用来讨论各类话题,主要包括数学、加密技术、计算机技术、政治和哲学等。比特币和区块链技术就诞生于这个组织。“密码朋克”在随后几年中快速发展起来,目前已达到了1400多人的规模。1993年,埃里克·休斯写了一本书,叫《密码朋克宣言》,其中一段话为比特币系统的出现埋下了伏笔:“我们致力于建立匿名系统。我们用密码学、匿名邮件转发系统、数字签名和‘数字货币’来捍卫我们的隐私。我们也编写代码。因为我们知道必须有人编写软件来保护隐私。我们发布我们的代码,以便我们的同人可以练习并使用它。全世界所有人都可免费使用我们的代码。”“密码朋克”中涌现出了许多IT精英,比如万维网之父蒂姆·伯纳斯·李(Tim Berners-Lee)、BT下载的创始人布拉姆·科恩(Bram Cohen)、Facebook的创始人之一肖恩·帕克(Sean Parker)、维基解密的创始人朱利安·保罗·阿桑奇(Julian Paul Assange)、提出智能合约概念的尼克·萨博(Nick Szabo)等(见图1.3)。这些信息学界的大咖们发明了很多开创性的东西,比如优良保密协议(Pretty Good Privacy,PGP)邮件加密系统、对等网络(Peer to Peer,P2P)、RSA129加密的破解算法等。但是,却有一件事情让他们屡遭失败,这就是“数字货币”系统。

在基于区块链技术的比特币系统出现之前,密码朋克的成员讨论、发明过失败的“数字货币”和支付系统多达数十个。蒂姆西·梅曾经提出过不可追踪的“数字货币”——加密信用(Crypto Credits),用于奖励那些致力于保护公民隐私的技术专家们。大卫·乔姆(David Chaum)提出过注重隐私安全的密码学网络支付系统,即后来的Ecash(当时某种“虚拟货币”的名称),当时引起了很大的反响,包括微软、维萨等公司都要收购Ecash。此后,亚当·拜克(Adam Back)在1997年发明了哈希现金(Hashcash)算法机制。1998年,另一名密码朋克戴伟(Wei Dai)提出了匿名的、分布式的“数字货币”系统B-money,这被认为是比特币系统的雏形。随后,尼克·萨博也提出了Bitgold的“数字货币”设想,但由于他找不到愿意帮他写代码的人,Bitgold系统最终也没有诞生。总之,这些“数字货币”系统由于各种各样的原因,都没有成功发展起来。图1.4所示为电子货币系统及相关技术的发展历程。图1.3│密码朋克里的IT精英图1.4│“数字货币”系统及相关技术的发展历程1.2 中本聪的逆袭

在数十次失败后,当时在密码朋克中还默默无闻的中本聪闪亮登场了。2008年11月1日,秘密讨论群“密码学邮件组”里出现了一个新帖子:“我正在开发一种新的‘数字货币’系统,采用完全点对点的形式,而且无须授信第三方的介入。”该帖子的署名正是萨托西·中本聪(Satoshi Nakamoto)(见图1.5)。密码朋克圈内一开始对中本聪嗤之以鼻:这么多专家研究了几十个系统都没有做到的事情,你一个无名小辈能成功吗?中本聪倒是挺有底气,细致入微地对所有疑问一一进行了解答。他综合了前人的成就,创造性地融合了P2P技术、非对称加密技术和工作量证明算法,最终创造了一种去中心化的、无须中介机构的“数字货币”系统:比特币(Bitcoin)系统,并通过论文《比特币:一种点对点的电子现金系统》完整地阐述了他的思想。图1.5│密码学邮件组

中本聪是一个神秘的人物(见图1.6),在任何情况下,他都未暴露过自己的真实姓名、住址、职业,他使用洋葱路由器上网,所以其他人无法追踪到他的IP地址,他使用优良保密协议邮件加密系统来发邮件,在注册比特币网站时,他也没有使用真实姓名。他从未在现实生活中和其他密码朋克见过面。他像一个古代的大侠,神龙见首不见尾,在2009年开发出比特币系统并成功运行后,他于2011年4月在网上发布了最后一项公开声明,宣称自己“已经开始专注于其他事情”,然后慢慢消失于网络,再也没有出现。图1.6│中本聪画像

中本聪是一个天才人物,他做到了密码朋克中那么多精英人物没有做成的事情,他利用自己对金融及货币的深刻理解,再加上拥有密码学和软件开发的专业知识,成功创造了基于区块链技术的比特币系统。这个系统没有任何中心机构来管控,完全靠个人参与者在机器上运行程序,从而形成了一个全球化的网络,至今已经稳定运行10年,并产生了巨大的影响,很多国家、很多互联网公司都纷纷投入到区块链技术的研发与应用中,这可以说是互联网历史上的一个奇迹。

那么,到底什么是区块链?比特币系统是怎样运行的?对于这些问题,很多人都试图给普通读者进行讲解。但是,由于区块链具有一定的复杂性,要向普通读者解释清楚确实有一定的难度,如果讲得太专业,普通读者会被众多陌生的专业词汇弄糊涂;如果只是简单用生活中的实例作类比,又很难讲清技术原理。要正确理解区块链,必须先具备一些密码学和计算机的基础知识。中本聪自己也抱怨很难向普通读者描述比特币。但实际上,中本聪的论文写得非常简洁清晰,可以说是解释区块链的最佳范本。俗话说“解铃还须系铃人”。要真正理解区块链和比特币,还是应该从中本聪的原始论文中去找答案。因此,本书致力于以中本聪的论文为出发点,带领读者逐步了解区块链的本质,以及区块链是怎样改变未来的。对于其中的一些专业术语和密码学知识,本书将尽量用通俗易懂的、有趣的语言去解释,尽量保证读者能够轻松愉快地看懂区块链的基本技术原理,并清楚地了解比特币系统到底是怎样运行的。

说明:比特币是一种通过特定计算机程序计算出来的“虚拟货币”,它具有没有集中发行方、总量有限、使用不受地域限制和匿名性等主要特点。虽然比特币被称为“数字货币”,但由于其不是由货币当局发行,不具有法偿性与强制性等货币属性,因而不是真正意义上的货币。从性质上看,比特币是一种特定的虚拟商品,不具有与货币等同的法律地位,不能且不应作为货币在市场上流通使用。第2章 风云变幻:中心化与去中心化

如果你找一个IT专家,问他什么是区块链,他可能会不假思索地回答:“区块链是一个运行在非信任环境中的分布式、去中心化的信息系统。”通常听到这个回答,一般人可能会不理解。那么,到底何谓分布式?什么又叫去中心化?为什么要追捧这样一个东西,它有什么优缺点呢?其实,中心化系统和去中心化系统各有特点,它们在应用中处于竞争状态。那么双雄逐鹿,谁能胜出呢?2.1 中心化系统

有这么一句话,要了解一个人,就要先了解他的“敌人”。谈到“去中心化”,首先来了解一下它的对立面——中心化。中心化的信息系统是我们传统使用的,且在日常生活中非常熟悉的系统。当我们浏览一个新闻网站时,会看到许多不同的页面,这些页面都是从网站的Web服务器上获取的,由网站公司的人员制作并提供给我们看。因此,这是一个中心化系统,由专门的公司和专门的Web服务器提供服务,如图2.1所示。

当我们使用网上银行转账时,实际上是通过网络连接了银行的服务器,发送转账命令给服务器,然后服务器操作相关的数据库,把钱从你的账上转到另外一个人的账上。这就是一个中心化系统,银行和它的服务器是系统的中心,称为中心节点。

如果你平时玩网络游戏,你在游戏中可能会有虚拟资产,例如游戏币、游戏道具等,这些资产也都放在游戏服务器上,由游戏公司运维,因此,你拥有一些中心化的虚拟资产。图2.1│中心化系统:Web服务器

中心化系统有很多好处,具体如下。(1)中心化系统处于可信任的环境中。银行是符合法律要求的,有监管机构保障它按规范来运营。银行的服务器处在一个受保护的环境中,银行的工作人员会保障它不受到破坏,保障它的金融信息系统按规则运行。如果某个工作人员违规操作,会受到法律的惩罚,因此,你可以相信你的资金是安全的。这种信任可以称之为基于法律的信任。(2)中心化系统运行方便且快速。你在某个银行做行内转账,实际上只是在银行服务器上修改了数据库的记录,把记录在你名下的资金减少,然后增加收款人的资金,操作非常快捷。(3)中心化系统容错性很好。如果你存在银行的钱被坏人用恶意手段骗取转走,你可以通过银行体系把这些钱再转回来。如果银行的信息系统在开发时有某些问题,导致在运行中进行了错误的转账,那么银行技术人员也很容易修复错误,把你的账户还原。

中心化系统架构如图2.2所示。图2.2│中心化系统架构图

但是,中心化系统也存在一些问题,具体如下。(1)中心节点自身的安全会影响你的利益。虽然银行的工作人员会保护银行服务器的安全,但是仍然可能会有黑客入侵银行系统,把你的钱盗走;或者虽然防住了黑客,但是银行的计算机因为火灾、地震等不可抗力损坏了,且同时所有的数据备份都损坏了,那么你的钱也就消失了。假如你喜欢玩网络游戏,并且花了很多钱在网络游戏里购买了虚拟资产,但是游戏公司由于经营不善倒闭了,那么这些虚拟资产将一文不值,于是你的钱就“打水漂”了。(2)中心节点掌握了不对等的信息,影响到你的隐私和利益。我们现在已经习惯使用大型的电商网站购物、订餐、旅游,习惯使用导航软件出行,习惯使用即时通信软件进行社交。由于使用这些中心化系统,你的姓名、住址、年龄、爱好、经济情况、活动习惯、社交圈子等私人信息,会被中心节点获取并进行大数据分析。甚至可以说,这个世界上最了解你的人不是你的亲人,而是中心节点。如果这些信息泄露,就可能会被不法分子用来实施欺诈。即使没有泄露,中心节点也可能会利用你的个人信息牟利,你的隐私被侵犯,利益也将受到损害。实际上,过去曾经发生过多起大型IT公司泄露和滥用用户隐私数据的丑闻,这充分反映出中心节点可能存在滥用隐私信息的严重问题。(3)中心节点掌握了不对等的权力,如果作恶,后果会很严重。这里用游戏经济学举个例子:某个武侠游戏中有个神奇的宝物——屠龙刀,价格是1万元/把,你花钱买了1把,以为从此可以笑傲江湖。没料到过了不久,游戏中出现大量屠龙刀,价格变成100元/把。因为游戏公司发现卖屠龙刀有利可图,于是动动手指,修改了游戏代码,增加了屠龙刀的数量,导致游戏中出现通货膨胀,使你的投资损失了99%。在现实世界中,也会出现类似的情况,一些国家就出现过恶性通货膨胀的问题。

中心化系统的优点与缺点对比如图2.3所示。图2.3│中心化系统的优点与缺点对比2.2 去中心化系统

中本聪是一个充满理想主义的密码朋克,他看到了中心化系统的一些缺点,于是致力于开发去中心化系统。在去中心化系统中,并不存在拥有特权的中心节点,每个网络节点拥有的信息和权力都是一样的,称其为对等节点。对等节点组成的网络称为对等网络,也叫P2P网络,如图2.4所示。对等网络上运行的信息系统叫作分布式系统,比特币系统所依托的区块链就是一个分布式的数据库系统。而比特币本身从技术上来说,可以看成是运行在这个区块链上的一个资产交易记录链。图2.4│对等网络(去中心化系统)示意图

在中心化的银行系统中,银行的中心节点服务器享有特权,只有它才能够记账,每一次货币交易都作为一条记录记在银行系统的数据库中。而在比特币系统中,不存在一个记账中心,所有的计算机节点都是平等的,它们都参与记账,每当一个节点发生交易时,它会把交易数据向全网广播发送,全网的节点都会把这次交易记录下来。每一个节点(包括交易者的计算机)都存储所有记账的数据库,而且所有节点记录的数据库账本都是一模一样的。这样带来了以下好处。(1)你再也不用担心你的资产会因中心节点损坏而消失,因为账本数据在整个区块链网络的计算机中都有留存。大家都可以证明你拥有这笔资产。(2)因为大家拥有的信息都一样,不存在信息不对称,也就不会产生某个节点因为拥有特权而侵犯大家权益的问题。(3)区块链通过加密技术保障数据不易篡改、不易伪造;通过账本的分布式存储技术保障交易公开、透明、可追溯;通过智能合约技术保障交易的自动化、智能化执行。因此,区块链解决了网络上人与人之间的信任问题。当你和一个陌生人交易时,你不再需要一个中心化的中介系统,而是可以直接在区块链上进行点对点交易,这样就节省了大量的中间成本和信用成本。

去中心化的分布式系统虽然有很多好处,但设计并运行这样的系统是很难的,因为和中心化系统相比,它运行在一个不可信任的环境中,要保持系统的一致性、完整性、安全性是非常困难的。往往中心化系统很容易做到的事,在去中心化系统中会非常困难。这个道理很简单,一个团体如果有一位领导,大家都信任他并服从他的命令,那么这个团体很容易开展活动;如果这个团体中没有领导,大家各干各的,甚至还有人恶意搞破坏,那么就会很难办成一件事。

中心化系统与去中心化系统的对比如图2.5所示。图2.5│中心化系统与去中心化系统的对比

那么,在去中心化的比特币系统中具体有哪些需要解决的问题呢?总结起来,主要有以下几点。(1)去中心化系统中成千上万个节点都拥有记账和存储账本数据的权力,节点的加入和退出都是完全自由的,没有人来管控和认证,这样难免就会出现心怀不轨的破坏分子。那么怎样防止有人恶意篡改数据或者伪造账本呢?(2)比特币系统的节点分布在全球各地,在网络中同时会产生成千上万个交易数据需要记账,各地的网络有快有慢,有时部分网络还有可能断线,要全网所有的节点保持所记录的交易账目都是一模一样的,即保持全网的一致性,也是非常困难的。(3)双重支付防不胜防。通俗地讲,双重支付是指把一份资产使用两次,也称其为“双花”。例如地球村里有3位村民在进行商品交换,他们是二黑、翠花和小明。当前全网的区块链账本上都记录着二黑有1个比特币,他把这个币发送给了翠花,并向全网进行广播。于是,大家记下这笔交易,把二黑的比特币从他的账目记录中除去,在翠花的账目记录中增加1个比特币。现在二黑没有比特币了,但是由于网络传输不同步,二黑广播这次交易后小明并没有及时收到信息,小明的账本上仍然记录着二黑有1个比特币。于是,二黑又向小明发送这个比特币,用来交换某些物品。二黑把自己的1个比特币同时交换给2个人的行为就是双花攻击,这构成了交易欺诈,如图2.6所示。图2.6│区块链中的“双花”攻击

看了上面这些问题,读者应该对实现区块链的难度有了一个基本了解。正是因为很难,所以在中本聪出现之前,密码朋克中的这么多IT精英,也是屡试屡败。但是,中本聪总结了前人的经验,并设计了一个非常巧妙的运行机制,成功解决了这些问题,使得比特币系统在无中心节点运维管理的情况下,稳定运行。中本聪到底设计了一个什么样的机制?地球村的小明又该怎样用它来解决二黑的“双花”呢?要搞懂这些问题,首先必须了解一些密码学的基础知识。第3章 大道至简:有趣的哈希算法

地球村的小明为了了解怎么解决“双花”问题,准备学习一些密码学知识。这天小明待在家里学习。突然,传来了敲门声,如黄鹂般轻快悦耳的声音在门外响起:“小明哥,在家吗?”

这声音仿佛打开了小明身上一个神秘的开关,他无神的眼睛马上闪烁出热烈的光芒,快步走过去打开门:“翠花来了,快进来,请坐,请坐!”“小明哥,我来请教你一件事,区块链,你应该懂吧?”“这个当然懂!”小明挺了挺胸,坐直了身体,好让自己显得更加睿智。“不愧是名牌大学的高才生!”翠花瞪大杏仁般美丽的眼睛,崇拜地看着小明,“区块链技术这么热门,我也想学学这方面的知识,最近找到了中本聪的论文,可是一翻开就晕了。那么多奇怪的名词——哈希算法、哈希指针,真是看不下去。你能不能给我讲讲呢?”“哈希算法,其实就和我们写文章摘要一样,就是把一大段复杂的信息缩减成简单数据的方法。”小明依稀还记得以前老师说的话。“那哈希算法到底是怎么算的呢?能不能给我详细讲讲?”翠花穷追不舍地问。“肯定没问题!不过今天我有点忙,这样吧,下个周末我给你好好说一说。”为了表示胸有成竹,小明又使劲地点了几下头。“就这么定了。”“那好,不打扰你了,下周不见不散!”翠花满怀希望地走了。

没想到翠花也在学习密码学知识,这下小明更有动力了,他快速冲向书房,翻出了一本厚厚的密码学书。看来这几天要恶补一下哈希算法的具体细节了。他心里盘算着:这几天哪儿也不去,就在家里学习吧。3.1 哈希算法的基本原理

小明要读懂中本聪的论文,知道什么是区块链,首先需要掌握一些密码学的基础知识,因为整个比特币系统建立在数据加密的基础上,显然也只有这样,才能维持一个数字资产体系的安全。计算机密码学是以各类算法为基础的。所谓算法,是指为解决某个问题而设计的按一定规则执行的一系列指令。在计算机加密过程中,只有通过各类加密算法,才能把一段明文信息转换为加密信息。

对于区块链,包括其应用——比特币,哈希算法都是最常用的加密算法之一。“哈希”这个词听起来很奇怪,其实它源自英语,是“hash”这个单词的音译。哈希算法还有很多其他翻译名称,比如“散列算法”“杂凑算法”等。此前,在计算机类的文献中,“hash”常译作“散列”,但在区块链中,由于“哈希指针”“哈希树”“哈希表”等名词(见图3.1)已经约定俗成地成为固定称呼,因此本书中统一把“hash”译作“哈希”,以保持全书技术名词的一致性。图3.1│常见的哈希名词示例

哈希算法是一种用于加密的数学运算,密码学界在哈希算法的基础上研发出了多种系列算法,例如,美国国家安全局设计的SHA系列算法。哈希算法也和我们的生活密切相关,当你去银行开一个账户时,你的取款密码实际上就是通过哈希算法进行了加密,你使用银行的U盾来存取款时,它里面的数据也是通过哈希算法处理过的,以保证数据的安全。既然哈希算法如此高明,大部分人可能会认为它非常枯燥复杂且难以理解。请不要担心,下面就用通俗的语言描述它的基本原理,即使你只知道简单的数学知识,也可以看懂。

哈希算法从本质上来说,是对一段信息的转换。打个比方,小明的单位开了个无比重要的大会,单位领导慷慨激昂地进行了3个小时的主题发言,洋洋洒洒好几万字。会后为了进行宣传,头脑灵光的小明把领导讲话的内容进行了归纳总结和加工,缩减成200个字的“豆腐块”,发表在报纸上。那么可以近似认为,小明对领导的讲话进行了一次哈希计算(即通过哈希算法进行计算),把洋洋洒洒几万字转换成了“豆腐块”。当然,实际上的哈希计算比这更复杂一点,因为它不是把信息转换成文字,而是转换成一段数字,最终这段数字和领导发言之间建立一一对应的关系。所以,可以认为,哈希计算实际上就是对信息进行映射的一种方法,它通过专门的数学方法,对原信息进行加密计算,把原信息变成一段简洁的加密数据,这样原信息和加密数据之间就形成了对应关系。原信息称为明文,加密数据称为密文。

为了加深直观的认识,下面设计一种简单的哈希算法。假设小明要给翠花写一封情书,并且想用哈希算法对它进行加密。情书开头的几个字是“翠花你好,在这个阳光灿烂的日子”。小明设计了一个名叫QS的哈希算法对这句话进行加密,具体步骤如下。(1)首先取每个字的笔画数,比如“翠”字为14画,“花”字为7画,其他字的笔画依次为7、6、6、7、3、6、6、7、9、8、4、3。对于逗号,我们规定它的取值为0。(2)把所有的数字相加,得到93。

通过这个简单的哈希算法,小明把情书的第一句话加密成了数字93,93就称为哈希值,也就是QS(情书第一句话)=93。如果小明所有的情书都可以这样处理,倒是可以为他节省不少苦思冥想的时间。但实际上这是行不通的,因为即使小明把93这个数字发给翠花,翠花也不知道他是什么意思。即使翠花知道这个哈希算法的细节,她也无法把哈希值“93”还原成小明情书的第一句话。因为在进行哈希计算的过程中,已经丢失了很多信息。但是,反过来说,如果翠花知道这个哈希算法,并知道“翠花你好,在这个阳光灿烂的日子”这句话,她同样可以计算得出93。也就是说,可以验证小明这句话代表的数字是93,如图3.2所示。通过哈希算法,就可以编制一个密码表,把小明的每句话和对应的密文数字放在表中,就可以根据数字来查出小明的话。图3.2│哈希算法的计算过程示例

说到这里,大家可能会发现一个问题,如果小明情书的其他句子加密后也是数字93,那怎么知道93到底代表哪句话?确实,这个哈希算法QS过于简单,导致有很大可能使得小明其他的话在加密后也是93。也就是说,不同的明文,加密后得到的密文一样。这个问题称为“哈希碰撞”,如图3.3所示。要设计一个合格的哈希算法,必须要使得这个算法产生哈希碰撞的可能性非常小,小到在实际应用中几乎不可能出现,这样明文和密文才能一一对应。比特币系统所使用的哈希算法称为SHA256算法,它是一个优秀的哈希算法,产生哈希碰撞的可能性极小,可以近似认为不会产生碰撞。当然,它的加密计算过程也是非常复杂的,是由美国国家安全局的数学专家设计的,比小明设计的QS算法要复杂很多,即使用计算机执行SHA256算法,也需要很长时间。实际上,在比特币系统中,当矿工用计算机进行比特币挖矿时,就是使用SHA256算法反复进行成千上万次的计算。图3.3│哈希算法的计算和哈希碰撞3.2 美国国家安全局设计的密码武器——SHA256算法

在计算机技术中,存在很多种类的哈希算法,比如美国国家安全局提出的SHA系列算法、报文摘要算法、Ethash算法、RIPEMD160算法等,又比如我国提出的SM3算法等,如图3.4所示。比特币系统中使用了SHA256算法,它的全称是安全哈希算法(Secure Hash Algorithm),它是SHA系列算法中的一个,其他的还有SHA1、SHA224、SHA384和SHA512等。图3.4│各类哈希算法示意图

SHA256算法有哪些优点呢?可以总结如下。(1)从密文很难反推出明文。使用了SHA256算法后,即使你知道算法的步骤,也看到了最终的加密计算结果,仍然很难知道原来的内容是什么。虽然不能完全否定反推的可能,但是至少根据目前人类所掌握的计算资源和算法,是不能反推明文的。(2)SHA256算法抵抗“哈希碰撞”的能力很强,也就是说,想要找到两组不同的明文信息对应同样的密文,从计算理论上来说是非常困难的。在SHA256算法中,明文信息只要发生一点细微的变动,哪怕只是改变了一个字或一个标点,都会使最终的密文(哈希值)产生非常大的变化。因此,一段明文总是和它的哈希值一一对应,就像每个人都有不同的指纹,人和指纹一一对应。因此,形象地说,一段信息的哈希值就相当于这段信息的“指纹”。(3)不论输入的明文信息有多长,最后生成的密文长度总是固定的,且是一个256位的二进制数值。为了使用方便,通常会表示成64位的十六进制数值,例如一个SHA256哈希数值可以是:6D768EEF6ECAD3C29A5A629280E686CF0C3F5D5A86 AFF3CA12020C923ADC6C65。由于有这个优点,有时它会被用来压缩信息以节省存储空间。

因为SHA256算法有这些优点,它在信息科学中得到了非常广泛的应用。下面介绍它在加密信息、检验信息的一致性及压缩数据等多方面的应用。(1)利用SHA256算法加密。因为SHA256算法是不可逆的,不能从密文反推出明文,所以它经常被用来加密重要信息,例如银行账户的密码。假设小明要开设一个银行账户,他在开户时设置了对应的密码。这个密码会存放在银行的数据库里,当他下一次存取款时,用来和他输入的密码进行比对,以确定身份。但是,如果密码以明文形式存放在数据库里,会带来极大的危险。假如二黑是银行的内部工作人员,他利用职权非法进入了数据库,知道了小明的密码,就可以取走小明的钱了。因此,为保安全,账户密码总是以密文形式存放的。小明设置的账户密码会通过SHA256算法进行加密,变成密文后存放在数据库里。下次他在银行窗口办理业务输入密码时,密码会先通过SHA256算法进行计算,再和数据库里的密文比对,如果一致,说明他的密码是正确的。经过这种加密处理,即使二黑进入了银行的密码数据库,仍然不知道小明的密码,如图3.5所示。图3.5│哈希算法用于加密存储(2)检验信息的一致性。假设小明要在网上发情书给他的女朋友翠花,在网络传输中,有时可能因为数据传输故障导致发送的信息不完整,或者更糟糕的是,被小明的情敌二黑中途截获并恶意篡改,原本写的是“我爱你”,翠花收到的可能是“我恨你”,小明的幸福人生从此变得岌岌可危。所幸小明是天才,他很快想出一个好办法:在发送信息时,先使用SHA256算法对原始信息进行一次计算,得到这段信息的哈希值,然后把原始信息和对应的哈希值一起发送给翠花。翠花收到信息后,也使用SHA256算法对原始信息进行一次计算得到哈希值,然后和小明发送的哈希值进行比对,如果不一致,说明原始信息出现了问题,如图3.6所示。从此,小明的妈妈再也不担心他找不到女朋友了。图3.6│哈希算法用于通信校验的过程(3)压缩数据。翠花长得很漂亮,她很喜欢拍照,几年的时间就拍了几万张照片,小明的计算机已经存不下了,他必须把这些资料放到其他计算机中。但是,他很想在自己的计算机中保存一份完整的档案,以便查找。于是,他使用SHA256算法对每一张照片进行计算,得到它们的哈希值,这些哈希值的数据量远远小于对应照片的数据量。小明把照片的存放位置和照片的哈希值一一对应,编制成了一张表。这样,小明能在自己的计算机里存下这张表,并随时可以根据照片的哈希值在其他计算机上找到这张照片,如图3.7所示。即使年深日久,存储在其他计算机上的照片发生存储错误,或者被人恶意修改了,他也能通过哈希值及时发现。图3.7│哈希算法用于数据的压缩与存储

SHA256算法是一个强大的加密算法,它在各方面保障了小明的幸福生活。但是二黑也不是吃素的,他很快就发现了一个漏洞。小明在网上给翠花发送情书的时候,二黑截获了情书和对应的哈希值。这次他不但篡改了情书,也使用SHA256算法对篡改后的情书进行计算,从而得到对应的哈希值。现在二黑把这份伪造的情书和对应的哈希值发送给翠花,翠花即使进行校验,也没法发现问题。天才小明这下也傻眼了。那这个问题要怎么解决呢?第4章 火眼金睛:加密数字签名和非对称

由于二黑总是篡改小明写的情书,这让小明有些不知所措。这天,小明妈妈看到小明闷闷不乐地坐着,“你今天怎么了?难不成是吃了什么不消化的东西?”小明妈妈走过来,伸手在他的额头上摸了摸,“还好没发烧。”“什么消不消化啊,莫名其妙。”小明推开妈妈的手,“别理我,烦着呢。”“哦?你烦什么啊?”小明妈妈上下打量着他问道。“是这样的,我本来想给翠花写信讨论学习问题,没想到二黑假冒我的名义,乱改我写的信!”“哦,原来是这样啊!”小明妈妈露出一副恍然大悟的模样,意味深长地看着小明,“讨论学习当然是很重要的,可不能让二黑给破坏了。别着急,我有办法。”“真的吗?这回你可得帮帮我。”小明一听说有办法,马上从椅子上蹦了起来。“你只要给自己的信加上数字签名就行了。”小明妈妈神秘地笑着,“有了数字签名,就相当于有了识别假冒者的火眼金睛,这次保准二黑要傻眼。”“那你赶紧告诉我怎么搞数字签名吧!”小明拉着妈妈向书房走去……4.1 身份认证的利器——数字签名

为了解决小明发情书的难题,小明妈妈想出了数字签名的办法。在密码学中,数字签名主要用于对某段文字或信息进行认证,确保它是由某人发出的。为了实现数字签名,密码学家设计了一种特殊的加密方法,叫作非对称加密。

在电子信息世界中,数字签名常用于身份认证。如果某人需要进行数字签名,他就要用到非对称加密算法的一对密钥,一个密钥是私人密钥k1,这个密钥由他秘密保存,这是唯一可以代表他身份的东西;另一个密钥是公共密钥k2,这个密钥由他向全网络发布,每个人都知道这是他的公共密钥。如果他要对某段信息进行数字签名,首先要对这段信息进行哈希计算,得到数据D,然后用k1对数据D加密,这就是数字签名。图4.1所示的就是增加数字签名的信息发送过程。图4.1│信息发送过程中的数字签名

如果其他人要验证他的签名,则需要用他的公钥来解密这段信息,如果能够正常解密,则可以确认这段信息确实是他发出来的。为什么数字签名可以达到身份认证的效果呢?下面将通过解释非对称加密的含义以及数字签名与验证的过程,帮助读者进一步了解身份认证。4.2 一把锁配两把钥匙——奇特的非对称加密

要进行数字签名,小明首先要学习一种新的加密方法,其为非对称加密。在通常的加密方法中,密钥只有一个,这个密钥既用来加密信息,也用来解密信息,这叫作对称加密。就好比一把锁有一把钥匙,既可以用这把钥匙把锁锁住,也可以用这把钥匙把锁打开。例如小明有一个密钥6666,他用这个密钥加密自己的情书,他的情书就和密钥6666混在一起进行了某种数学计算,变成一堆谁也看不懂的乱码。翠花收到乱码情书后,也用密钥6666进行解密,于是情书又变成了小明写出来的原文,如图4.2所示。对称加密虽然方便,但是存在以下两个缺点。(1)小明需要在网上把密钥传输给翠花,二黑很有可能在网上截获这个密钥,这样二黑还是可以解密小明的情书并进行篡改。(2)假如小明是个花心男,除了翠花外,还有金花、银花、茉莉花等红颜知己。那么他需要为每一个红颜知己准备一个密钥,要安全地在网上传输以及保存这么多密钥,也是一件麻烦的事情。图4.2│对称加密对信息进行加解密的过程

因此,密码学家们想出了更好的加密方法,也就是非对称加密。比特币系统所使用的加密算法,就是一种称为椭圆曲线加密算法(Elliptic Curve Cryptography,ECC)的非对称加密算法。这种非对称加密算法的特点在于,它不遵守一把钥匙开一把锁的“套路”,它有两把钥匙,即两个密钥,一个称为公钥,另一个称为私钥。公钥与私钥是一对,公钥可以向所有人公开,即使二黑知道了也没关系,私钥则必须由本人机密保管。公钥和私钥都是一串数字,且这一对公钥和私钥有如下特点。(1)用私钥可以生成公钥,但从公钥无法推算出私钥。(2)如果用公钥对数据进行加密,那么只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。

通过这种办法,就可以很方便地管理密钥了。因为小明只需要保存自己的私钥,并且把公钥向所有人公开,这样任何人要向他发送信息时都可以用公钥加密,并且只有小明才可以用私钥解密这些信息。4.3 数字签名与验证的过程

有了非对称加密算法,小明就可以对自己的情书进行数字签名后再发送给翠花,从而保证两点:翠花收到的情书确实是自己写的;情书在传输过程中没有被二黑篡改。小明写好情书后,先对情书进行哈希计算得到一个哈希值D,然后用自己的私钥加密情书,得到一个数字签名。小明需要把情书和数字签名一起发送给翠花。翠花收到情书后,要进行数字签名验证:用小明的公钥解密数字签名,得到哈希值D1,同时对情书本身做一次哈希计算,得到哈希值D2。如果D2和D1比较后相等,则说明情书确实是小明写的,因为只有用小明的私钥加密的信息,才能用小明的公钥正常解密,而小明的私钥只有他自己知道。同时也说明情书未被篡改,因为假如篡改了,对应的哈希值也会改变,那么D2就不会等于D1,如图4.3所示。图4.3│数字签名与验证签名的过程

那么怎么保证保密性,即二黑即使截获情书也不知道里面是什么内容呢?很简单,因为翠花也有自己的公钥和私钥。小明在发送情书的时候,不发送情书明文,而是用翠花的公钥加密后再发送,这样翠花收到情书后,可以先用自己的私钥解密情书,再进行数字签名的验证。4.4 基于数字签名的加密通信

通过利用椭圆曲线加密算法进行加密和数字签名,并用哈希算法SHA256来辅助验证情书的完整性,小明和翠花终于可以在网上欢乐地写情书,且不用担心被伪造、篡改和偷看,也不用担心在网上传播的密钥被截获。看来区块链技术首先给他们带来了幸福的生活,他们的通信过程如图4.4所示(假设小明的私钥是k1,公钥是k2;翠花的私钥是c1,公钥是c2)。(1)小明写好情书(用字母a代表这封情书),然后用SHA256算法求出这封情书的哈希值,写作SHA(a)。(2)小明用自己的私钥k1对哈希值加密,得到的结果就是一个数字签名,写作k1(SHA(a))。(3)小明把情书a用翠花的公钥c2加密,得到c2(a),然后把加密后的情书c2(a)和数字签名k1(SHA(a))一起发送给翠花。(4)翠花收到加密情书c2(a)后,先用自己的私钥c1对它解密,得到了情书原文。(5)为了保证情书确实是小明写的且未被篡改,翠花还需要验证情书的数字签名。翠花用小明的公钥k2解密数字签名k1(SHA(a)),得到SHA(a)。(6)翠花用SHA256算法求出a的哈希值D,用这个值与SHA(a)比较,如果是一致的,则说明情书与小明当初发出的是一样的,传输过程中未出现任何错误。图4.4│小明和翠花的加密通信全过程示意图

通过上面6个步骤,小明和翠花可以安全通信,即使是在一个公开的网络上,二黑可以随意观察他们的通信过程,但很难伪造和篡改他们的情书。在比特币系统中,也正是用了这种方法来保障区块数据不易被篡改和伪造。例如,在区块链中,当小明向翠花发送一个“虚拟货币”时,他会用自己的私钥对翠花的公钥进行数字签名,当其他人用小明的公钥对这个数字签名解密时,就会得到翠花的公钥。这就证明了以下两点。(1)用小明的公钥能正常验证(解密)这个数字签名,说明这个数字签名确实是小明发出的。(2)这个数字签名被解密后,得到的是翠花的公钥,这就证明小明发出的“虚拟货币”的接收者确实是翠花。

当然,区块链的巧妙之处并不仅仅在于利用了哈希算法和数字签名,它设计了一套严密的数据链结构,并设计了一个在无中心管控的团队中达成共识的算法,从而在不可信的环境中构造出一个非常巧妙的、可信任的区块链系统。第5章 环环相扣:比特币之链

小明通过学习数字签名和非对称加密,对区块链技术有了更深入的了解,并且也对翠花进行了详细介绍。“哎,小明哥。这下我也算是入门了。但这比特币到底是什么东西啊?”翠花倚傍着小明,娇嗔地说,“这看不见摸不着的,我真是想不出来它到底是什么。你这次一定要给我讲清楚。”“这个当然没问题。”小明清了清嗓子,“比特币其实就是建立在密码学基础上的一种‘虚拟货币’……”“嗨,翠花,这事儿我也清楚。”二黑不怀好意地把脸凑了过来,“不就是‘虚拟货币’嘛,就和咱们玩的游戏币是一样的。”“比特币这么高技术的东西岂能是游戏币能比的?”小明不耐烦地推开二黑。“嗯,话是这么说,但比特币和游戏币到底有什么区别呢?”翠花还是一头雾水。“我们玩的游戏中的游戏币是中心化的东西,是游戏开发商自己定义的,想发多少发多少。可比特币就不同了。”小明耐心地解释,“比特币是去中心化的,它的总数从一开始就固定了,谁也不能改变。并且,比特币是通过数字签名技术来验证所有者的,所以它本质上是一种数字签名链。”“原来是这样啊。”翠花瞪大眼睛,“虽然没听懂,但是听起来好像很厉害的样子。”“嗨,其实他也不懂,别听他忽悠。”二黑又靠了上来。

小明急了:“别捣乱,中本聪在论文里已经把比特币定义得清清楚楚了,我能不懂?”小明用肩膀撞开二黑,“翠花,到我家去,我们一起慢慢看论文。”5.1 比特币是数字签名链

中本聪的论文原名是Bitcoin: A Peer-to-Peer Electronic Cash System,翻译成中文就是《比特币:一种点对点的电子现金系统》,所谓的点对点,就是个人对个人的意思。言外之意,它不需要一个中心机构来管理,也不需要一个中介结构来撮合,可以放心地在个人与个人之间进行使用。这篇论文的英文原文和中文翻译都可以在网上找到,但网上的中文翻译在某些关键的问题上可能会出现错误,会给阅读者带来理解上的困难。

为此,下面着重阐释比特币的定义。我国对比特币的资产属性进行了定义,提出“从性质上看,比特币应当是一种特定的虚拟商品”。而从具体的计算机技术上,中本聪在论文中是这样定义比特币的:可把比特币定义为这样一条数字签名的链条——每一个拥有者在发送这个币给接收者时,要对前一次交易的哈希值和接收者的公钥进行数字签名,然后把这个数字签名放在币的尾部。因此,可以这么理解:从实际应用上来说,比特币是“虚拟货币”;但从技术本质上来说,比特币是一条数字签名链。就好比说一块钻石,从日常应用上来说它是一件珠宝,但从技术本质上来说它是高压高温条件下形成的碳元素晶体。

中本聪用一幅图说明了比特币的数字签名链,如图5.1所示。图5.1│比特币的数字签名链

从图5.1可以看出,比特币被定义得非常复杂,作为一种虚拟资产,它被定义为一条加上了数字签名的交易记录链条,记录了比特币从不同的交易者转手的过程。这种定义和人们平时在网络世界中了解到的虚拟商品的定义是不一致的。例如,在一个游戏中,虚拟商品通常只需要简单地定义为一条数据库记录即可。假如小明在玩的某个游戏,游戏中有一种虚拟商品叫作“红晶石”,小明在游戏中获得了300个红晶石,游戏系统会在数据库中增加一条记录“小明:300红晶石”。如果小明把这300个红晶石送给了翠花,那么游戏系统要做的就是从小明的记录里删除300个红晶石,在翠花的记录里增加300个红晶石。于是,小明的记录变成“小明:0红晶石”,翠花的记录变成“翠花:300红晶石”。

同样是虚拟商品,游戏里的交易记录为什么定义得这么简单呢?因为游戏系统是由某个公司运营的,这个公司的游戏服务器是大家都信任的中心节点,数据都存储在服务器内部,只有该公司才能修改记录。所以,游戏系统可以很简单地用单独的记录条目来记录每个人的虚拟商品,记录和记录之间没有直接的联系。例如小明只需要一个记录条目,翠花也只需要一个记录条目,当他们拥有的红晶石个数发生变化时,只需要相应修改他们记录条目下的红晶石个数就可以了。但是比特币系统是没有中心节点进行管控的,大家都可以看到交易记录,都可以修改数据,如果只是简单地使用游戏系统的记录方法,那就乱套了。比如,二黑就可以随意删掉翠花记录下的300个红晶石,并给自己的记录增加300个。5.2 比特币数字签名链的运行过程

比特币基于数字签名的交易记录链由于运行在不可信任的环境中,必须要通过多种技术手段来防止有人恶意篡改和伪造。具体是怎样实现的呢?图5.1展示了这个过程,但中本聪并没有对这个图做太多解释,因为他的论文是写给“数字货币”专家看的,专家一看图就懂了。为了让各位读者都能看明白,接下来对图5.1进行详细解释。为了更形象化,下面把图5.1对应到一个生活中的例子,假设交易0是小明的妈妈给小明发送了一个比特币,而交易1是小明把这个比特币发送给了翠花,如图5.2所示。

为了清楚地阐明这个数字签名的交易记录链是怎样运作的,这里以交易1这条记录为例子进行说明。交易1这条记录,记载了小明发送比特币给翠花的过程。小明是这样写这条记录的。图5.2│生活中的实例(1)小明把翠花的公钥放在交易1的记录里,表示他发送比特币的接收者是翠花。(2)小明使用SHA256算法对上一个交易——交易0记录的所有数据进行计算,求出交易0记录的哈希值,也放在交易1的记录里。这个步骤证明他自己这个比特币来源于交易0。因为他的比特币是小明妈妈在交易0中发送给他的。(3)小明使用自己的私钥对翠花的公钥和哈希值进行数字签名。这是表明自己确认这次交易,此后不可后悔和抵赖。

通过这3个步骤,小明清楚地记录了这次交易过程,而其他人也能很好地进行验证。比如二黑要验证这次交易的有效性,他要做以下事情。(1)查看这次交易记录里的哈希值,根据这个哈希值找到上一个交易记录——交易0,在交易0中含有小明的公钥,说明小明的比特币是从交易0中获得的,这也证明了小明确实拥有该比特币。(2)从交易0中找到小明的公钥,对交易1中小明的签名进行验证(解密),如果能正常解密,说明这个交易记录确实是小明写的,小明不可抵赖。解密的结果里包含翠花的公钥和哈希值,与交易1明文书写的翠花的公钥和哈希值进行比对,如果一致,说明这次交易一切正常,交易记录没有被篡改。

综上所述,比特币交易记录就这样一环扣一环地连接起来,每一次交易都需要用上一次交易的哈希值来验证,都需要用自己的签名来确认。这保证了交易不可抵赖,不易篡改,不易伪造。

如果小明事后想反悔,否认自己发送比特币给翠花。其他人一查交易记录,里面有小明的数字签名,那么小明就无法抵赖。

如果二黑想篡改这次交易,把这次交易的接收者翠花的公钥改成自己的公钥,使这个比特币变成自己的。那么其他人把小明的数字签名解密后,得到真正的接收者公钥,和二黑篡改后的记录进行比对,会发现错误,因此二黑无法篡改。

二黑打算一不做二不休,干脆伪造整个交易。因此,他篡改了本次交易接收者的公钥,然后又篡改了签名,把签名变成自己的。但是其他人仍然可以发现问题,因为前一个交易中的公钥是小明的,无法用来验证本次交易中二黑的签名。所以,二黑必须还要伪造前一个交易,把前一个交易中的公钥改成自己的。而要伪造前一个交易,他又必须伪造前前一个交易,这样一直向前,二黑必须要伪造整个交易链,直至第一个发生的交易。比特币交易链上的第一个发生的交易称为币基交易(Coinbase交易,由挖矿形成),二黑是无法伪造币基交易的(见后面的介绍),所以二黑也无法伪造任何一次交易(见图5.3)。图5.3│二黑无法伪造交易5.3 数字签名链的类比:比特币纸

如上所述,中本聪设计了一个巧妙的交易记录方式,每次交易都需要上一次验证,这样一环扣一环,导致整个交易链很难被篡改和伪造。在前面的图5.1中中本聪描述了比特币的数字签名链,该图看起来还是有点复杂,人们要弄懂得多看几遍。因此,为便于理解,下面用生活中的例子进行说明。可以想象一个比特币就是一张纸,这张纸上有一张表格,表格用于记录这个比特币每次换手的过程。每次这个比特币的拥有者想做交换时,都必须在这张纸的表格中写下本次换手情况,然后按上自己的手印。记录的情况包括三方面内容:这个比特币要给谁,这个比特币从哪里来,当前拥有者留下的手印。

假如小明的妈妈通过挖矿得到一个比特币,小明妈妈把这个比特币给了小明,小明又把这个比特币给了翠花,那么这张“比特币纸”上就记录了这样一张表,如表5.1所示。表5.1 比特币纸

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载