区块链开发实战:实用案例分析(txt+pdf+epub+mobi电子书下载)


发布时间:2020-08-09 02:32:27

点击下载

作者:(摩洛哥)贝拉·巴德(Bellaj Badr),(英)理查德·霍洛克(Richard Horrocks),(美)吴讯(Xun(Brian)Wu)

出版社:机械工业出版社

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

区块链开发实战:实用案例分析

区块链开发实战:实用案例分析试读:

区块链技术丛书区块链开发实战:实用案例分析Blockchain By Example【摩洛哥】贝拉·巴德(Bellaj Badr),【英】理查德·霍洛克(Richard Horrocks),【美】吴讯(Xun(Brian)Wu) 著董宁,朱轩彤,王冰,岳蕾 译ISBN:978-7-111-63998-5本书纸版由机械工业出版社于2019年出版,电子版由华章分社(北京华章图文信息有限公司,北京奥维博世图书发行有限公司)在中华人民共和国境内(不包括香港、澳门特别行政区及台湾地区)制作与发行。版权所有,侵权必究客服热线:+ 86-10-68995265客服信箱:service@bbbvip.com官方网址:www.hzmedia.com.cn新浪微博 @华章数媒微信公众号 华章电子书(微信号:hzebook)Foreword推荐序

从贝拉·巴德(Bellaj Badr)第一次告诉我,他打算写一本关于区块链的书起,我就非常支持他的决定。作为一名经验丰富的开发人员,我甚至提出了一些需要加强理解的主题。一年后,读完这本书,我的期望被超越了,我高兴极了。因此,我很高兴能受邀写推荐序。

人们普遍认为,区块链是一种颠覆性的技术,已经震撼了IT领域。因此,它越来越引起许多开发人员的兴趣。然而根据我的经验,对于初学者来说,很难找到一个有用的指南——用最简单的术语解释区块链,并用具体的案例教你如何使用主流区块链解决方案构建项目。

本书旨在改变这种情况,并从开发人员的角度介绍区块链技术。这是一项具有巨大潜在价值的事业,贝拉和他的合著者在这方面进行了充分发挥。

事实上,本书将帮助你一步一步地用不同的概念和技术——比特币(Bitcoin)、以太坊(Ethereum)、Quorum和超级账本(Hyperledger)——从头开始建立现实的项目。在其他主题中,你将学到开发人员如何创建代币、在业务中实现隐私保护解决方案等。

本书不仅适合初学者。它也可向经验丰富的程序员很好地介绍区块链技术,甚至提高成熟开发人员的开发速度。如果你在初学本书时对区块链有些了解,阅读本书会有所裨益,但是如果你不了解区块链,坚持下去,也能在前进的过程中了解区块链的基本理念。

贝拉是一名出色的教育家。他希望我们掌握实际技能,而不是仅仅理解浮在表面的概念!他知道,如果我们做好了学习的准备,我们就必须练习,必须完成功课。在各章节中,他将不断挑战你,让你为所展示的项目提出新的功能。在尝试执行他的建议时,我们都得到了很好的反馈。

我喜欢这本书,觉得它很有价值。我想你也会深有同感。享受阅读时光吧!Sam HauerNSApps联合创始人译者序The Translator's Words“每个硬币都有正反两面。”技术和业务就是商业驱动力的两面,交错发展且互相促进。互联网就是最好的例子,技术的发展让全球能够联通成一个大的网络,而基于网络的商业模式创新同时又在推动科技不断迭代。经常听到这样的说法,如果说千禧年的头十年是消费互联网走向巅峰的十年,那么已经开始的下半场属于更多行业、大中小企业参与的产业互联网。我一直工作于企业服务的科技实践一线,深深感受到各个行业为了迎接产业互联网的到来,正在轰轰烈烈地展开一场数字化、端到端、业务创新的战役。同时,像云计算、大数据、区块链、物联网、5G等技术也不再是空中楼阁,而是实实在在地在企业业务中落地应用。

其中,区块链作为最为火热的代表技术之一,近几年的发展尤为明显。但是,由于技术普及书籍和渠道有限,所以社会大众对区块链技术的认知和应用潜力的评估不尽一致。之前我也陆续翻译和自己写作出版了几本专项技术书籍,前不久从出版社和写作伙伴了解到了这本更为全面、可系统地帮助开发人员上手的《Blockchain By Example》并组织翻译。

本书花了很多篇幅在开始章节介绍比特币和以太坊,这诚然和作者自身背景有很大关系。在区块链技术发展早期,很多国外的拥趸者是从比特币开始认识了一个以技术代替中介的“信任机器”,而且他们大多有技术或程序员背景,这也就是所谓的“区块链1.0”阶段。直到2014年,华尔街的很多一线金融机构才开始关注如何参考比特币的技术并将其应用在金融业务中,到今天全球各个产业都有区块链应用的场景和范例,应该说在这个称为“区块链2.0”阶段的形成过程中,区块链技术已经在与行业应用结合方面有了非常大的突破和改变,同比特币的范畴大相径庭,它更看重如何把业务逻辑和链上的可信数据更好地结合。应该说在国内,更多的人是在这个阶段开始了解区块链的,行业龙头、中小企业、科研院所、行业组织、政府监管部门都纷纷投入其中,以至于这两年区块链成了关注度颇高且极具话题性的新兴技术。

在区块链1.0向2.0发展的过程中,也同时出现了以比特币及代币为基础衍生出的“通证经济”的币圈,以及以区块链技术去结合各行业应用而落地的“链圈”,当然这种分类也并不绝对,以这种划分来区分科技从业者或技术爱好者本身也有失偏颇。但是,有少部分人打着“区块链”或金融创新的旗号,在金融领域利用不法手段牟利,再加之社会本身对这项新兴技术还没有准确的认知,因此都为区块链行业的发展蒙上了一层阴影。2017年9月4日,中国人民银行、中央网信办、工业和信息化部、工商总局、银监会、证监会、保监会以七部委名义在官网联合发布了“关于防范代币发行融资风险的公告”,旨在拨乱反正,引导科技发展“避虚向实”,向赋能实体经济方面稳健发展。

客观说,我多年一直在从事科技应用工作,按上面的分类应该属于比较早期的铁杆“链圈”。但为什么要翻译既包含比特币、以太坊等数字货币或公有链技术,又包含像超级账本这样“链圈”使用颇多的联盟链技术的一本引进书籍呢?在我看来主要有以下几点原因:

1. 技术没有好或不好之分,作为一本入门区块链技术的手册型图书,本书可以帮助技术开发人员很快上手各种不同类型的区块链技术,并全面了解各种区块链技术栈。之前我已经出版了介绍超级账本、以太坊的技术书籍,这次算是把比特币也补上了。

2. 从发展的眼光去看技术发展,要想用好技术的价值,甚至评估技术在行业中的应用前景,就必须了解它的前世今生。

3. 现在市面上不乏介绍区块链的图书,应该说是良莠不齐,很多所谓的“专家”对区块链技术本身还缺乏准确的理解,也未从事过具体技术实践,却凭借自己的理解对区块链的发展加以评判,有误导社会认知之嫌。近年来我一直从事科技孵化、将技术和行业场景结合的一线工作,觉得本书在整体架构、技术普及等方面比较有价值,自己也愿意在科技普及之路上做点贡献。“开卷有益”,祝大家有所收获,身体健康。

感谢杨春程、李素罗参与本书审校工作。董宁2019年9月前言Preface

区块链是一项可能对全球经济的许多方面产生重大影响的突破性技术。通过将范式从当前占主导地位的中心化架构转移到去中心化架构,这项创新性技术将为那些传统上依赖中介和信任的产业带来翻天覆地的变革。

在过去的几年中,区块链呈指数增长,已经发展成多种形式。目前包含许多不同的技术和工具,其中一些是成熟的,另一些是相对较新的。所有这些都使得理解和掌握关键的思想和概念成为一项艰巨的任务。

这就是本书诞生时的图景。由于区块链大热,因此有许多相关书籍,但是我们认为,其中很多书都只关注区块链的理论性或者推测性,换句话说,就是只介绍区块链未来可能有哪些应用,却没有具体介绍如何落地。这正是本书的与众不同之处:它非常注重实际。从最开始,本书就通过一系列深入并且能够快速上手的案例,详细讲解了区块链今天能做什么,以及到底怎么做。

本书分为几大部分。开始部分对区块链概念进行介绍和高度概括,然后基于以太坊、比特币和超级账本区块链展示不同的使用案例和实际操作。本书的读者对象

本书的目标读者是区块链新手,本书的目标是为他们提供开发基于区块链的项目的简便方法。本书较详尽地介绍了不同区块链解决方案的技术细节,并一步一步地指导读者实施典型的区块链项目。在学习完本书之后,读者能够自行创建和维护基于区块链的可靠、可扩展的分布式系统。本书内容

第1章是概览章节,介绍区块链技术的基本理念。

第2章首先通过创建一个客户友好型支付系统来介绍比特币的细节,之后关注在比特币区块链上的智能合约的使用细节。

第3章在前面章节介绍的比特币概览知识的基础上,在比特币代码库上创建一个新的货币。

第4章介绍创建去中心化应用的以太坊的基本特征、理念和工具。该章介绍后面章节将大量使用的Solidity智能合约语言。

第5章在第4章的基础上,利用Solidity语言更高级的性能和Truffle开发环境,创建一个更复杂的去中心化应用。

第6章继续在前两章以太坊内容的基础上推进,该章关注智能合约如何用oracle和第三方API与外界互动。

第7章介绍私有企业级区块链及相关应用案例,之后详细介绍如何用以太坊的企业分叉Quorum实现私有网络。

第8章在前面以太坊章节的基础上介绍如何将去中心化的文件存储集成到去中心化应用中去。

第9章介绍本书设计的第三个区块链网络:超级账本。该章介绍超级账本的主要理念和基本特征,以及它与比特币和以太坊的区别,并介绍一个超级账本的实际应用,即供应链溯源。

第10章在前面章节的基础上介绍如何用区块链实现两个银行和两个交易伙伴之间的信用证业务。充分利用本书

本书假设你会使用命令行界面,但不要求你拥有任何正式的shell脚本技能。还假设你拥有与编程语言无关的基础知识,在某些情况下熟悉一种特定的语言是有益的,尽管这不是必要条件。

由于本书涵盖了多种语言和技术,读者不太可能熟悉所有这些语言和技术。因此,我们当然希望你有学习的意愿。下载示例代码及彩色图像

本书的示例代码及所有截图和样图,可以从http://www.packtpub.com通过个人账号下载,也可以访问华章图书官网http://www.hzbook.com,通过注册并登录个人账号下载。

下载文件后,请确保使用最新版本的解压软件进行解压缩:● Windows: WinRAR/7-Zip● Mac: Zipeg/iZip/UnRarX● Linux: 7-Zip/PeaZip

本书的代码包还托管在GitHub上,网址为https://github.com/PacktPublishing/Blockchain-By-Example。如果代码有更新,它将在现有的GitHub存储库上进行更新。

我们还在https://github.com/PacktPublishing/上提供了丰富的书籍和视频目录中的其他代码包。查一下吧!

我们还提供了一个pdf文件,其中包含本书中使用的屏幕截图和彩色图表。下载地址为:https://www.packtpub.com/sites/default/files/downloads/9781788475686_ColorImages.pdf。本书排版约定

本书使用了许多排版约定。

代码文本(CodeInText):表示文本、数据库表名、文件夹名称、文件名、文件扩展名、路径名、用户输入和Twitter句柄中的代码。下面是一个示例:“你可以在任何级别上使用console.log()在控制台中打印接收到的值。”

代码块如下:

任何命令行输入或输出如下所示:sudo add-apt-repository ppa:bitcoin/bitcoinsudo add-apt-repository ppa:bitcoin/bitcoinsudo apt-get updatesudo apt-get update

粗体:表示一个新的术语,一个重要的单词,或你在屏幕上看到的单词。下面是一个示例:“……其基本单位称为区块。”这个图标表示警告或重要说明。这个图标表示提示和技巧。About the Reviewers审校者简介

Karthikeyan Sukumaran在过去三年中一直参与区块链的研究和开发,并在移动和网络平台方面拥有十多年的行业经验。他担任自己创立的区块链初创公司的首席执行官,为各种咨询、汽车、供应链、物流和金融公司构建了多个区块链项目。他也是印度区块链社区的知名演讲者。目前,他是印度存托和清算公司(DTCC)的副董事(DLT实验室区块链研发)。

Aafaf Ouaddah是资深安全工程师,目前正在攻读涉及区块链的博士学位。她在分布式系统方面有广泛的经验。目前,她是研究分布式系统、区块链、物联网和雾计算中的安全和隐私的首席研究员。她在各种会议和研讨会上发表过10多篇研究论文,并在IEEE、Springer和Elsevier的著名国际期刊上发表过论文。第1章 初识区块链

区块链是什么?随着围绕着它的大肆炒作,你一定听说过或遇到过这个问题——这甚至可能是你阅读本书的原因。在本章中,让我们从开发人员的角度来发现炒作背后的原因。

正如你可能知道的那样,区块链是一种新兴技术,它具有颠覆许多不同领域的巨大潜力。这种潜力主要基于它为人们提供可信赖的渠道,以通过互联网传输价值或实际资产(通证化)的能力。

区块链有能力将我们从信息互联网推动到价值互联网,这可能会打破我们现有的金融体系。

区块链在很多方面都是一场革命,类似于互联网诞生时的情况,当然它不是一时的趋势。之所以如此,是因为它为以前的金融问题提供了一个解决方案。在历史上,我们第一次能够在不依赖权威的环境(如互联网)中建立信任。因此,有些人将区块链称为信任机器。

区块链的潜在影响是巨大的,它远远超出了防止金融组织完全中心化的范畴。事实上,它的去中介能力为几乎每一个与技术(甚至包括互联网技术)相关的领域进行变革打开了大门,即推动我们走向端到端的世界。

通过这个简短的介绍,我试图让大家了解区块链这一主题的重要性,并确认你选择学习该项技术是及时的。正如这本书的名字所暗示的那样,我们将在整本书中遵循的方法是构建具体的区块链项目,而不是列出抽象概念。

尽管本章技术性较低,但主要目标是为你提供必要的背景,以便了解本书内容架构。

在本章中,我们将讨论以下主题:● 什么是加密货币。● 什么是区块链。● 如何发送和接收比特币。● 如何使用JavaScript将数据存储到一个比特币区块链。● 区块链类型。

本章内容不涵盖:● 加密原理。● 加密货币交易。

在本章中,第一部分主要介绍基本概念,第二部分实用性更强,主要通过著名的“世界你好”(Hello World)示例来演示如何与区块链交互。1.1 区块链和加密货币的兴起

许多人很难理解区块链背后的逻辑和概念,以及为什么会需要它。这主要是因为我们不清楚它能解决什么问题或能带来什么好处。

因此,我认为有必要从本书一开始就澄清,区块链都解决哪些问题。我们将从加密货币的概念和历史开始。1.1.1 从虚拟货币到加密货币

区块链并非突然出现。它是过去几十年金融科技和虚拟货币发展的产物。

20世纪末,随着互联网的广泛使用,数字货币作为电子现金系统的延伸出现。许多项目都是为了创造新的数字货币而开发的:电子现金、电子黄金、网络货币和自由储备银行等。

尽管在20世纪90年代取得了巨大的成功,但这些项目在21世纪之初已经不复存在,有的破产了,有的被政府部门叫停。一种能够在一夜之间消失的货币是一场真正的金融噩梦,但由于这类数字货币系统具有中心化特性,这种情况是不可避免的。

以前总是需要一个中央机构的参与,以打击欺诈和管理系统内的信任。

由于这个致命的弱点,与之相反的去中心化被作为一个解决方案提出。然而,在没有任何中央机构授权的情况下,很难在这种环境中建立信任。这种对比使得创造一种可靠的数字货币成为棘手的难题。

值得庆幸的是,密码学的进展和一些聪明的解决方案的出现,如工作量证明机制(proof of work)(例如哈希现金项目,见http://hashcash.org)带来了打破僵局的希望。1.1.2 比特币的出现

2008年,中本聪迎接挑战,推出了一种名为“比特币”的数字货币。这种新的货币有效地利用加密技术来管理所有权,并保障系统的安全,因此命名为加密货币。

中本聪通过引入他最初所称的由区块所组成的链(a chain of blocks)解决了上述问题。在其出版的白皮书(见https://bitcoin.org/bitcoin.pdf)中,介绍了他对一种新的点对点电子现金系统——比特币的设想,并详细描述了它的基础机制——区块链(blockchain)。

比特币是第一个可靠的和分布式的电子现金系统,完全实现点对点,具备如下功能:● 加密以确保所有权和身份。● 工作量证明共识机制验证交易和保护网络以防止出现重复交易。● 一个透明的和共享的账本(区块链)。● 使用假名。

比特币系统假设网络中的多数人(> 51%)是诚实的,根据协议定义的规则(共识规则)自动运行以验证每一笔既定的交易。通过区块链共享,每个参与者可以检查交易日志和发送方的偿付能力,然后投票决定是否进行交易。

投票权取决于玩家为维护比特币网络而投入使用的总体哈希算力(最初,一台机器算作一票)。

要使用加密货币,用户需要安装一个特定的客户端来创建一个钱包,生成相应的密钥对(私钥/公钥),以及区块链和网络。公钥由客户端(软件)用于生成有效地址,发送到既定地址的资金由计算地址的私钥控制。通过这种方式,我们依靠安全的原则来管理所有权。

下面的关系图是如何在点对点网络中处理交易并添加到区块链中:

在比特币网络中,用户间不认识对方,区块链被认为了解先前的共识结果,因此是所参考的唯一可信来源。具有共识协议的区块链允许网络在没有单点故障的情况下来管理交易。1.1.3 什么是区块链

人们经常将区块链与比特币混为一谈,区块链是比特币的底层技术。具体来说,区块链是一个只能添加的、按时间顺序(时间戳)增长的数据库,它利用基本的加密措施来保护被存储的交易不被篡改(换句话说,数据不能被删除或更改)。

这个数据库,或者叫作账本,收集和记录经过网络验证的转账交易,其基本单位被称为区块(block)。一旦通过网络共识机制的验证,这些区块就会被添加到现有的加密的哈希链接块序列链中,以确保数据的完整性,因此名为区块链(blockchain)。

如果相互链接的区块中的一个比特发生了变化,哈希链接就会崩溃,该链就会被中断,并且它将被网络拒绝。

下图显示了网络成员是如何复制和处理区块链的,以确保每个人都对交易日志的认识保持一致。验证新块时,所有节点同步相同的副本。

上图还展示了区块链实现了一种特殊的数据结构,它由存储交易和智能合约的相互链接的区块组成。让我们更详细地研究这些关键要素。区块

如果我们考虑区块链是一个账本或一本书,一个区块可以比作一个页面或一个表,它们记录了已经确认的交易。区块链中存储的每个区块都是独一无二的,通过哈希标识进行区分,区块包括标题和正文。

标题包括创建时的相关信息(时间戳、默克尔根、随机数、难度目标和版本),以及对前一个块的引用,正文是交易的集合。

当成功验证(挖掘)区块时,它将正式成为区块链的一部分。新的比特币就在新的区块中创建(一种新的交易),并支付给验证者(或矿工)。交易

交易是区块链系统最基本的构建单位。它们表示两个地址之间在区块链网络中的价值(加密货币)转移。

更确切地说,它们由区块链协议(例如比特币或以太坊)定义的小数据结构表示,这些协议确定了其属性(元数据、输入、输出等)和模型。

在广播交易之前,发送资金的用户使用他们的私钥(由他们的钱包管理)签名,并指定目的地址。数字签名和公钥用于使网络用户能够验证交易,并检查发件人是否有权使用特定地址持有的比特币。智能合约

智能合约是区块链中最令人兴奋的概念之一,代表存储在区块链本身上的自执行脚本。智能合约将区块链概念带入下一阶段,使其能够将业务逻辑转换为内在的合约条款,这些条款将在不依赖经纪人、律师或其他中间人的情况下自动执行。

智能合约的最早形式是使用基础的锁定和解锁脚本在比特币中定义的,但这个概念随着其他区块链的出现而不断演变。

智能合约是区块链中更强大、更具颠覆性的力量之一,正在获得越来越多的商业关注,如Gartner公司报告《区块链的智能合约尚未为商业世界做好准备》(参见https://www.gartner.com/smarterwithgartner/why-blockchains-smart-contracts-arent-ready-for-the-business-world/)所述。Gartner公司估计,到2022年,超过25%的全球组织将使用智能合约。

由于它们的重要性,我们将在本书的后面向你介绍领先区块链平台(比特币、以太坊和起级账本)上的智能合约应用。

现在已经完成了对这些概念的描述,让我们练习一下,以深入了解以上内容。1.2 与区块链交互

区块链作为一种技术已经迅速发展,由于区块链项目的大量涌现而产生的新技术已经出现。因此,人们试图更密切地理解当今的区块链机制,从而发现了比特币。

因此,在本章中,我们将以比特币为主要例子。这一选择是因为比特币是最早的区块链实现,几乎所有其他项目都借鉴它的设计和机制。

在下面的部分中,我们将连接到比特币网络,并将经典的“世界你好”消息存储到区块链中。比特币交易可用于在区块链中存储少量数据——允许开发人员在比特币的基础上构建分布式系统,如彩色币、Counterparty、Tierion等。

你将会对存储在区块链中的消息数量感到惊讶。1.2.1 入门

为了将消息存储到区块链中,我们将设置两个比特币客户端(一个接收方和一个发送方)。然后我们将构建一笔交易,并将这笔交易与我们的消息一起发送。

从技术上讲,在区块链中存储数据的最著名的做法之一是创建零值OP_RETURN输出。正如在比特币协议的定义中,OP_RETURN脚本操作码使我们能够存储多达80字节。你可以在代码库中查看script/standard.h(参见https://github.com/bitcoin/bitcoin/ blob/0.15/src/script/standard.h):static const unsigned int MAX_OP_RETURN_RELAY = 83;

正如standard.h标题文件中提到的,这三个额外的字节用于必要的操作码,其余的字节用于额外的消息。更重要的是,可以调整OP_RETURN输出,以避免区块链膨胀。

如果你感到迷茫,不要担心,我们将在下一章深入研究输出和脚本等概念。

我们将使用两种不同的方法来实现我们的目标:● 通过使用RPC命令和比特币客户端创建带有OP_RETURN输出的

原始交易。● 通过编写Node.js程序来使用在线REST API创建和发送原始交

易。第一次运行比特币客户端

比特币客户端是一个允许我们执行比特币操作(发送交易、接收付款等)的终端用户软件。当你运行它时,你将成为比特币网络的一部分。

我们选择两种常见客户端:Bitcoin Core和Electrum。在我们的示例中,发送者将使用Electrum,接收者将使用Bitcoin Core(最受欢迎的比特币客户端)。

出于演示的目的,我将在一台使用Ubuntu 16.04的机器上安装它们。

你可以使用以下命令安装Bitcoin Core(15.04版本):更多指令可参见https://bitcoin.org/en/full-node#other-linux-distributions。

Electrum是一个轻量级的钱包,这意味着它不需要你下载整个区块链,使用如下代码。下载并安装Electrum的最新版本:

两个客户端都安装后,我们需要将其与网络同步。同步区块链

我们在前面了解到,区块链是一个由网络上的所有计算机复制的交易数据库。我们需要同步大量数据(>200 GB)才能发送或接收比特币。然而,有两个解决方案:● 对全节点客户端(例如Bitcoin Core)启用prune参数。● 使用瘦(SPV)客户端(例如Electrum)从Electrum服务器上获

取区块链信息,而不是一个本地副本。

我们将研究这两个解决方案。尽管如此,还是推荐使用比特币全节点客户端,因为你总是可以从区块链的功能中受益。

运行Bitcoin Core

根据操作系统的不同,你需要在以下路径下的默认数据目录中创建配置文件bitcoin.conf:● Windows: %APPDATA%\Bitcoin\● Mac: $HOME/Library/Application Support/Bitcoin/● Linux: $HOME/.bitcoin/

在Linux中,使用mkdir ~/.bitcoin创建一个.bitcoin目录。然后使用nano ~/.bitcoin/bitcoin.conf创建bitcoin.conf文件。

在bitcoin.conf中添加以下内容,定义你的客户端配置(每个#符号后是对参数的解释):

复制完成后,按,然后按,之后按保存文件。

现在,我们的第一个客户端已经准备好在测试网上运行了,这是一个用于测试目的的比特币网络,它遵循与主网络相同的规则。这是一个使用没有价值的比特币的公共网络。你可以使用此网络发送免费的交易并测试应用程序。在写作本书时,一个完整的区块链超过200 GB。因此,我们通过在bitcoin.conf中设置prune=参数来激活prune模式。n表示你愿意分配给区块链的空间量,最小为550 MB。请注意,数据目录将超过几GB(在我的例子中是2GB),因为它承载着额外的索引和日志文件以及UTXO数据库。prune大小只定义将下载的区块数。

现在运行Bitcoin Core。打开一个新的命令行接口(CLI)窗口,然后运行以下命令:bitcoin-qt

Bitcoin Core将开始运行标准的、与测试网连接的GUI接口。

第一次运行时,它会要求你设置数据目录,我们将其设置为默认值。它会自动为你创建一个钱包,开始与测试网同步,下载区块链:

或者,你可以使用以下命令在CLI模式下运行比特币守护进程(daemon):bitcoind

你可以选择继续使用哪种模式(bitcoind或bitcoin-qt),可用的RPC命令是相同的。我将使用btcoin-qt。

在Bitcoin Core启动时,它会在默认数据目录中创建许多子目录和文件,如下面的屏幕截图所示:

主要子目录包括:● blocks:存储实际比特币区块。● chainstate:为可用的未使用的交易输出(Unspent Transaction

Output, UTXO)保存一个DB级别数据库,换句话说,是存储每

个人有多少钱的数据库。● wallet:包含加密的wallet.dat文件,该文件存储私钥。

即使网络同步还没有结束,你可以打开blocks/子目录查看以原始格式存储的区块链区块。每个blk00*.dat文件都是几个未同步区块的集合。

稍后我们将读取其中一个文件的内容。关于.bitcoin目录内容的更多细节可以在官方文档中找到,参见https://en.bitcoin.it/wiki/Data_directory。

当服务器(bitcoind或bitcoin-qt)运行时,打开另一个终端。然后我们通过执行bitcoin-cli getnewaddress读取更新地址为钱包生成一个新地址,如下面的屏幕截图所示:

bitcoin-cli基本上是一个工具,使我们能够通过命令行向bitcoind或bitcoin-qt发出RPC命令(bitcoin-qt用户也可以通过在帮助菜单使用调试控制台访问比特币RPC接口)。

现在我们已经完成了Bitcoin Core,让我们把它与区块链同步,继续来配置Electrum。

运行Electrum

下载并安装Electrum之后,通过运行electrum -- testnet打开Electrum的测试网模式。当第一次运行Electrum时,它将显示新的钱包创建向导。遵循以下步骤:

1. 在第一个对话框中选择自动连接(Auto Connect)并单击继续(Next)。

2. 选择标准钱包(Standard Wallet)并单击继续(Next)。

3. 继续为出现的每个对话框选择继续(Next),直到要求保存种子单词为止。复制它们,然后再次确认已经正确地保存,如下所示:

4. 在最后一步中,它将要求你输入密码,你可以将密码留空。

5. 一旦完成,Electrum将生成一个拥有大量新地址的新钱包。退出Electrum GUI,让我们继续CLI模式。当按照守护进程运行Electrum 时,在其中执行JSON/RPC命令如下:electrum --testnet daemonelectrum --testnet daemon load_wallet

6. 在一个新的终端窗口中,运行electrum --testnet listaddresses:

太好了,现在我们有了开始与公共比特币网络进行交易的必要环境。也就是说,让我们通过构建比特币原始交易、签名并将其广播到网络,来了解比特币交易是如何在区块链中创建、交换和存储的。1.2.2 方法1——使用Bitcoin Core创建原始交易

为了达到更好的效果,我们将集中讨论在Bitcoin Core中创建和发送原始交易所需的指令,而不需要冗长的解释。

如果你不能理解现在读到的所有内容,不要担心。第2章将解释在本节中引入的新概念(输入、输出、脚本等)。为我们的地址注资

首先,为了进行第一次交易,我们需要用一些比特币为之前创建的地址提供资金。幸运的是,在测试网中,可以使用一个名为比特币龙头(bitcoin faucet)的免费资金来源,它为测试应用程序提供没有价值的比特币。

本例中,浏览龙头网站http://bitcoinfaucet.uo1.net/或任何其他比特币龙头网站,提供Electrum生成的第一个地址和Bitcoin Core创建的地址,如下图所示:未使用的交易输出

现在我们已经从龙头发送了比特币,检查一下Bitcoin Core是否可以看到交易。要做到这一点,需要列出两个客户端的可用的未使用的交易输出(UTXO),使用listunspent RPC命令。

在运行Bitcoin Core时,在终端窗口中运行以下命令:bitcoin-cli listunspent

我们将得到如下结果:[{ }]

最初,listunspent返回一个空的结果,因为Bitcoin Core尚未完成与区块链同步,这需要一段时间(几小时)。因此,在本指南的其余部分中,我们将使用Electrum而不是Bitcoin Core,这样能避免我们等待数小时才能看到收到的比特币。

然而,我们会不时回头用Bitcoin Core,因为它有一个强大的命令行来处理原始交易。

现在在Electrum运行相同的命令,如下所示:electrum --testnet listunspent

我们将得到可用条目的列表,如下图所示:

上一个命令的输出显示,我们从龙头接收到一个可用的交易,该交易由其哈希值(prevout_hash字段)唯一标识,价值为1.1个比特币。

更准确地说,我们有一个来自前一个交易的可用的未使用的交易输出,它可以用作我们想创建的交易的输入,如下所示:

在比特币中,交易花费来自先前交易的输出,并产生可在未来由交易花费的新输出。事实上,用户只是通过使用未使用的交易输出来转移资金。

前面的图显示,我们从龙头接收到的交易(交易C)把早先创建的交易的输出(输出1)作为了输入。同一个交易创建两个输出:一个为我们(输出1),另一个返回更改(输出0),原因是交易输出必须完全使用。

可能与你的预期不同,在比特币中,交易不会更新全局用户余额(账户/余额模型)。相反,它们在一个或多个输入和输出之间移动比特币(UTXO模型)。作为收到的未使用交易所转移的价值之和,总余额由比特币客户端计算。创建交易

在这个级别上,是时候创建一个交易了,此交易花费接收到的交易。从listunspent输出中,我们有必要的内容(prevout_hash和prevout_n)来创造原始交易。让我们来看看。

首先,你需要使用在线转换器(如https://codebeautify.org/string-hex-converter)将“世界你好”(hello world)消息转换为十六进制。十六进制编码形式为68656c6c6f20776f726c64。

然后,我们必须使用createrawtransaction命令,它使用给定的输入创建一个交易,并创建新的输出。我们必须将具有以下参数的对象作为参数传递(来自前面的输出):● 可用输出之一的txid。● 被选中的输出的vout索引(在Electrum中是prevout_n)。● 消息的十六进制形式。●( 此前创建的)目标地址。● 发送的聪(比特币的最小货币单位)总数。

这里我们发送一个比特币,虽然你可以把它设置为0:

你将得到以下序列化的长十六进制编码字符串,表示原始交易:为了方便使用前面的CLI命令(并避免操作长十六进制字符串),你可以将createrawtransaction输出分配给一个终端变量,稍后将其用作其他命令的实参。例如,我们可以使用RAW=$ (bitcoin-cli createrawtransaction...)。生成的新字符串将存储在RAW变量中,并可以使用$RAW进行访问。

交易结构

乍一看,前面生成的十六进制字符串似乎模棱两可且毫无意义。下表将逐字节分析并深入研究我们的交易:

如你所见,我们的交易有一个输入(从龙头接收到的唯一未使用的交易),其交易id为0791...252,还有两个输出:● 带有OP_RETURN脚本的OP_RETURN输出。● 将一个比特币发送到指定地址的输出。

可以通过使用deserialize(反序列化)命令解码回原始交易,这样交易结构就是可视化的了。如果你运行electrum -- testnet deserialize ,它将输出我们所创建的交易中有意义的JSON表示:

要得到相同的结果,你可以使用bitcoin-cli decoderawtransaction解码原始交易,或者使用https://live.blockcypher.com/btc-testnet/decodetx/之类的在线解码器。签署交易

此时,交易已经创建,但尚未传输到网络。要发送交易,我们需要使用bitcoin-cli signrawtransaction命令进行签名。使用我们的私钥(与接收地址相关)签署交易,以向网络证明我们对输出的所有权,即我们有权使用所持有的比特币。

第一步是提取与用于从龙头接收比特币的第一个地址相关联的私钥:electrum --testnet listaddresses | electrum --testnet getprivatekeys -

注意命令行末尾有一个短横线。它将被返回的值替换。结果是,你将得到一个私钥列表。复制第一个没有p2pkh前缀的,如下所示:请注意,不要在现实生活中分享你的私钥。记住,拥有私钥的人可以使用收到的比特币。

接下来,我们需要从愿意花费的输出中获取scriptPubKey。为此,我们必须先使用electrum gettransaction --testnet "0791521362528725683caedf998006cf68b1cd817be1694ef0daca265d9b4252"从区块链检索交易。

其次,我们使用生成的原始表单来获得scriptPubKey,如下所示:

与以前不同的是,这里我们正在加载和反序列化从龙头接收到的交易。我们将获得在该交易中创建的输出,如下所示:

框中的内容是未使用交易输出的scriptPubKey。

输出中可以看到scriptPubKey,它表示为使用输出而设置的条件。新所有者可以使用与接收输出的地址相关联的私钥进行签名,以满足scriptPubKey的条件。

网络检查数字签名是否有效,如果有效,则使其成为新交易的输入。加密部分(scriptSig和scriptPubKey)特别复杂,我们将在下一章讨论。

从输出中复制scriptPubKey,并将其通过其他选项传递给signrawtransaction命令,如下所示:

第二个实参是我们正在使用的前一个交易输出的JSON数组,第三个实参是与接收输出的地址相关的私钥。结果将类似于下面的输出:

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载