区块链开发指南(txt+pdf+epub+mobi电子书下载)

作者:申屠青春 主编

出版社:机械工业出版社

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

区块链开发指南

区块链开发指南试读:

前言

比特币于2009年诞生,在很长一段时间内,人们只知比特币,不知区块链。从2015年开始,区块链像狂风一样席卷全球,倍受金融界和科技界的关注;2015年年底,区块链技术逐渐得到国内金融界和科技界的了解和认同。

区块链行业的蓬勃发展源于区块链有可能给各行业带来巨大的变革。麦肯锡在2016年年初发布报告,指出区块链技术将在未来五年内颠覆众多行业,特别是银行业和保险业;埃森哲预测到2025年,区块链技术每年可帮助全球8大投资银行节省80亿美元至120亿美元的基础设施成本。

全球金融巨头如IBM、高盛、摩根大通、花旗银行、中国平安、瑞银、德勤、毕马威等纷纷布局区块链;区块链初创公司在全球范围内如雨后春笋般崛起,发展速度惊人。从2012年以来,全球区块链创业领域共发生207起融资/并购事件,融资额高达14亿美元。

截至2017年3月,区块链在金融业的落地应用包括跨境支付、清算结算、互助保险、电子票据、商业银行抵押品、贸易金融、数字资产登记、银行间贸易、银行间对账与审计、监管与简化流程、积分、征信、外汇交易市场、证券清算和交割等。

区块链技术还能解决供应链管理、物联网、医疗、军事、政务等领域的很多问题。例如,Warmart试图用区块链保障我国市场的猪肉供应链安全;医疗领域中,生成基于区块链的、不可更改的电子病历、检验报告等用于存证,方便解决医疗纠纷;军事防卫和信息安全化中,区块链技术可实现信息防御平台的现代化;政务中,区块链可以简化文件归档与政府公共档案管理,并且可用来发放政府社保、养老金等社会福利及居民身份存证等。

由此可见,区块链将带来一场巨大的变革。正如德勤的报告中所预言的一样:“区块链是一场改变信任的革命,将重塑金融行业。”而它作为一项伟大的技术,不仅仅对于金融行业有革新性,对于其他行业,也会有深远的影响。

而今实施“区块链+”战略所面临的最大难题是:极度缺乏从业人员。很多金融机构和企事业单位对区块链还停留在概念阶段,其开发人员不懂区块链;大部分对区块链技术感兴趣的人,或者想要从事区块链行业的技术人员,未能系统地了解区块链的原理和发展,缺乏区块链开发者应有的知识和技术储备。

为了让更多的开发人员转变成区块链开发者,让更多现有的区块链开发人员系统地理解区块链技术,在区块链领导媒体巴比特的提议和牵头下,成立了《区块链开发指南》编写小组,开始构思、编写本书。

编写小组成员有:银链科技CEO申屠青春、深圳大学教授张鹏、币信资深程序员宋波、朝夕网络CEO汪晓明、万达网络区块链研发中心总经理季宙栋、华安保险系统架构师左川民、巴比特区块链资深工程师易长军。

本书内容由申屠青春负责组织,共包含六个章节,具体分工如下:申屠青春编写第1章和第2章的大部分内容,易长军对本部分内容亦有贡献,币信的樊渊文贡献了1.4.2节、1.4.3节和1.4.4节,比特大陆的潘志彪贡献了2.5.2节、2.5.3节和2.5.4节;张鹏编写第3章;宋波编写第4章;汪晓明编写第5章;季宙栋编写第6章的实操部分,左川民编写第6章的原理部分。此外,银链科技的林素兰参与第1章和第2章部分内容的编辑,万达网络的丛宏雷、张梦航参与第6章实操部分内容的编写。

本书以比特币、以太坊、Fabric三种区块链的技术原理和实际操作为主要目标,全书具体内容如下。

第1章介绍比特币区块链,包括交易和交易链、区块和区块链、挖矿、矿池、脚本系统、合约应用案例等内容,向读者们介绍区块链基础知识。

第2章讲述区块链进阶技术,包括外带数据原理、Counterparty原理、挖矿算法解析、侧链技术,以及最新的IBLT、隔离见证、闪电网络等。

第3章的主要内容是区块链中使用的密码学基础,包括Hash函数、椭圆曲线密码体系、ECDSA签名、Schnorr数字签名和Bloom filter算法等,向开发者介绍密码学相关算法。

第4章是比特币区块链的编译、代码剖析、建立私链及API开发等实操内容。

第5章介绍以太坊的技术原理,包括以太坊简介、账户管理、交易原理、智能合约等,还涉及搭建私有链,智能合约开发、部署和调用等实操过程。

第6章介绍了IBM开源的区块链底层技术平台Fabric的原理和实操,对Fabric系统架构、节点、验证总账、交易背书的基本流程进行了详尽独到的分析,对Fabric的私有链建立和配置、链上代码的开发过程进行了详细的描述,为开发者使用Fabric提供技术指导。

最后,感谢编写小组各成员的配合和支持,使本书最终得以完本。感谢巴比特的李涛,时时督促此书的编写;感谢机械工业出版社华章公司的编辑杨绣国为本书顺利出版付出的努力。编写小组期待本书能够在区块链应用开发中给开发者以参考和启发。由于成书仓促,错误之处在所难免,恳请广大读者朋友批评指正。申屠青春2017年4月于深圳第1章区块链基础

区块链究竟是什么?狭义地说,区块链就是比特币的底层技术;不过,经过7年的发展,区块链已经不再“依附于”比特币,而是独立地发展成为了一种革命性的技术,比特币则是区块链最大、最成功的应用。

从技术层面来看,区块链是一个基于共识机制、去中心化的公开数据库。共识机制是指在分布式系统中保证数据一致性的算法;去中心化是指参与区块链的所有节点都是权力对等的,没有高低之分,同时也指所有人都可以平等自由地参与区块链网络,唯一的限制就是个人自己的选择;公开数据库则意味着所有人都可以看到过往的区块和交易,这也保证了无法造假和改写。基于以上特性,可以总结得出:区块链由许多对等的节点组成,通过共识算法保证区块数据和交易数据的一致性,从而形成一个统一的分布式账本。

从价值层面来看,区块链是一个价值互联网,用于传递价值。目前的互联网仅用来传递消息,但是还不能可靠地传递价值;而比特币区块链却可以在全球范围内自由地传递比特币,并且能够保证不被双花、不被冒用。从这个角度来说,区块链是记录价值、传递消息和价值本身转移的一个可信账本。

这里要提一下区块链在维基百科上的官方定义:一个区块链是一个基于比特币协议的不需要许可的分布式数据库,它维护了一个持续增长的不可篡改的数据记录列表,即使对于该数据库节点的运营者们也是如此。简而言之,区块链就是区块用某种方式组织起来的链条。在区块链中,信用或记录被放在各个区块中,然后用密码签名的方式“链接”到下一个区块。这些区块在系统的每一个节点上都有完整的副本,所有的信息都带有时间戳,是可追溯的。事实上,在区块链创建之初,我们在大多数情况下谈论的区块链都是比特币的底层实现方式。

基于区块链的系统和以往的其他系统存在很多不同之处,以区块链技术为核心的系统包括如下四大最主要的特点。

·Distributed(分布式的)

·区块链是全球化的,系统上的节点是运行在太平洋某个小岛的笔记本电脑上还是运行在中国某个小镇的服务器上,对系统本身来说都是一样的,除了网络连接速度有区别之外,其他没有任何区别。区块链没有中心节点,数据分布式地存储在各个节点上,即使绝大部分节点毁灭了,只要还有1个节点存在,就可以重新建立并还原区块链数据。

·Autonomous(自治的)

·区块链是一种去中心化的、自治的交易体系,这种自治性表现在两个方面:1)所有节点都是对等的,每个节点都可以自由加入和离开,并且这一行为对整个区块链系统的运行没有任何影响。所有的节点都是按照相同的规则来达成共识,且无需其他节点的参与。2)区块链系统本身一旦运行起来,就可自行产生区块并且同步数据,无需人工参与。

·Contractual(按照合约执行的)

·区块链是按照合约执行的,第一体现在各个节点的运行规则(指的是交易、区块链或协议)上,按照既定的规则执行,一旦出现违背规则的行为,就会被其他节点所抛弃;第二体现在智能合约上,智能合约是一种可程序化的合同条款、规则或规定,包含在每个交易中,交易验证时必须先运行智能合约,只有通过了验证的交易才能被接受。

·Trackable(可追溯的)

·区块链的数据是公开透明的,不能被篡改,而且相关交易之间有一定的关联性,因而很容易被追溯。比如比特币区块链,每一枚比特币都有其特定的来源,通过输入可以追溯到上一个交易,或者通过输出追溯到下一个交易。

·此外,区块链代码本身也是可追溯的,区块链系统是开源软件,其对于所有的人都是公开的,因此任何人都可以查看并修改这些代码,不过修改后的代码需要经过开源社区上其他程序员的审核。

本书主要讨论区块链技术,这不仅包括了比特币区块链技术,还包含了比特币区块链所没有的一些技术,本章接下来将对区块链的一些基本知识做一个详细的介绍,包括交易和交易链、区块、挖矿、矿池、脚本、智能合约等。1.1 交易和交易链

交易是签过名的数据结构,该数据结构会在区块链网络中广播,并被收集到区块中。它会引用以前的交易,从该交易中发送特定数量的比特币到一个或多个公钥中(即比特币地址),并且交易未被加密(比特币体系中没有加密任何数据)。多个交易可组成一个区块(block),这些区块同样也会在区块链网络中传播,一个区块会引用上一个区块,简而言之,区块链就是由区块(block)用某种方式组织起来的链条(chain)。区块链包括成千上万个区块,而一个区块内又包含一个或多个交易,上下关联的交易组成了一个交易链,一个交易链内部可能又包含了多个交易,下面的章节将会对这些知识点进行详细解释。1.1.1 比特币地址

比特币地址是一个由数字和字母组成的字符串,可以与任何想给你比特币的人分享。由公钥(一个同样由数字和字母组成的字符串)生成的比特币地址以数字“1”开头。下面是一个比特币地址的例子:1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy

在交易中,比特币地址通常是以收款方的形式出现。如果把比特币交易比作一张支票,那么比特币地址就是收款人,也就是我们要写入“收款人”一栏的内容。一张支票的收款人可能是某个银行账户,也可能是某个公司、机构,甚至是现金支票。支票不需要指定一个特定的账户,而是可以用一个普通的名字作为收款人,这使得它成为一种相当灵活的支付工具。与此类似,比特币地址的使用也使比特币交易变得很灵活。比特币地址可以代表一对公钥和私钥的所有者,也可以代表其他东西。

比特币地址是由公钥经过单向的Hash函数生成的。用户通常所见到的比特币地址是经过“Base58Check”编码的,这种编码使用了58个字符(一种Base58数字系统)和校验码,提高了可读性、避免了歧义,并有效地防止了在地址转录和输入中产生错误。Base58Check编码也被用于比特币的其他地方,例如私钥、加密的密钥和脚本Hash中,用来提高可读性和录入的正确性。图1-1描述了如何从公钥生成比特币地址。1.1.2 交易的本质

交易实质上就是包含一组输入列表和输出列表的数据结构,也可称之为转账记录,这其中就包括了交易金额、来源和收款人等信息,表1-1就是一个比特币交易的数据格式。表1-1 比特币交易数据格式图1-1 比特币地址生成流程

下面以一个具体的例子来说明一个区块链上的交易构成。假设有一个带有一个交易及一个输出的交易A,其中的输入列表和输出列表如下所示:Input:Previous tx: f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd04470b9a6Index: 0scriptSig: 304502206e21798a42fae0e854281abd38bacd1aeed3ee3738d9e1446618c4571d1090db022100e2ac980643b0b82c0e88ffdfec6b64e3e6ba35e7ba5fdd7d5d6cc8d25c6b241501Output:Value: 5000000000scriptPubKey: OP_DUP OP_HASH160 404371705fa9bd789a2fcd52d2c580b65d35549dOP_EQUALVERIFY OP_CHECKSIG

上文表示,交易A的输入0从交易f5d8ee39a430901c91a5917b9f2dc19d6d1a0e9cea205b009ca73dd04470b9a6的0号输出中导入了50个比特币,然后该输出发送50个比特币到一个比特币地址的公钥Hash值(404371705fa9bd789a2fcd52d2c580b65d35549d,该公钥Hash值是十六进制表示,而非正常的base58表示)。

如果接收者想花掉这笔钱,那么他首先得创建自己的交易B,再引用该交易A的0号输出作为交易B的输入。1.1.3 输入和输出

输入是对其他交易输出的引用,一个交易中通常列有多个输入。所有被引用的输出值相加,得出的总和值会在该交易A的输出中用到。Previous tx是以前交易的Hash值,Index是被引用交易的特定输出号,ScriptSig是一个脚本的前一半(脚本将在后文中详细讨论)。

脚本包含两个部分,一个签名和一个公钥,公钥属于交易输出的收款人,并且表明交易创建者允许收款人获得的输出金额;另一个部分是ECDSA签名,是通过对交易的Hash值进行ECDSA签名而得到的。签名和公钥一起,证明原地址的真正所有者创建了该支付交易。

输出中包含了发送比特币的指令,金额(Value)是以聪(Satoshi,1BTC=100000000聪)为单位的数值。ScriptPubKey是脚本的另一半(这点将在后文中详细讨论),可以有多个输出,它们共享了输入金额。一个交易中的每一个输出都只能被后来的交易当成输入引用一次。如果你不想丢币,那就需要把所有输入值的总和值发送到一个输出地址。如果输入是50BTC,但你仅想发送25BTC,那么比特币将创建2个25BTC的输出:一个发往目标地址,另一个则回到你的地址(称之为“找零”,详见1.1.5节)。在交易过程中,会产生一笔交易费,作为交易费支付的任何比特币都不能被赎回,生成这个区块的矿工将获得这笔交易费。

为了验证某个交易的输入已经被授权,可以收集被引用的输出中的所有金额。比特币体系使用了一个类似于Forth的脚本系统,其目的是验证从某地址发出的比特币是否真正属于该地址的拥有人,输入的scriptSig和被引用的输出scriptPubKey会按顺序运行。如果scriptPubKey返回真,则输入被授权,证明是地址拥有人发出了比特币。通过脚本系统,发送者可以创建非常复杂的发送条件,人们为了收到金额,首先必须满足这些条件。举个例子,可以创建一个能被任何人赎回而无需授权的输出,也可以创建一个需要10个不同签名的输入,或者无需公钥仅由密码赎回的输出。1.1.4 交易类型

根据目标地址的不同,可以把交易分为如下几种类型。(1)支付到公钥HashscriptPubKey: OP_DUP OP_HASH160 OP_EQUALVERIFY OP_CHECKSIGscriptSig:

一个比特币地址只是一个Hash值,因而发送者无法在scriptPubKey中提供完整的公钥,当要赎回比特币时,接收者需要同时提供签名scriptSig和公钥scriptPubKey,脚本系统会验证公钥的Hash值与scriptPubKey中的Hash值是否匹配,同时还会检查公钥和签名是否匹配。检查过程见4.2.5节。(2)支付到脚本Hash

该类交易非常有意义,未来应该会在某些场合频繁使用。该类交易的接受地址不是通常意义上的地址,而是一个多签地址,以3开头。比如,三对公钥对可以生成一个多签地址。需要在生成过程中指定n of 3中的n,n的范围是[1,3],若n=1,则仅需要一个私钥签名即可花费该地址的币,若n=3,则需要三把私钥依次签名才可以。

地址以3开头,可以实现多方管理资产,极大地提高安全性,也可以轻松实现基于比特币原生的三方交易担保支付。一个m-of-n的模式如下:m {pubkey}...{pubkey} n OP_CHECKMULTISIG

其中,m和n需要满足:1≤n≤20,m≤n。

m和n可以是1 of 1、1 of 2、2 of 3等组合,通常选择n=3。

·1 of 3,最大程度私钥冗余。防丢私钥损失,3把私钥中任意一把即可签名发币,即使丢失2把也可以保障不受损失。

·2 of 3,提高私钥冗余度的同时解决单点信任问题。3把私钥中的任意2把私钥可签名发币,对于三方不完全信任的情形,即中介交易,非常适用。

·3 of 3,最大程度解决资金信任问题,无私钥冗余。必须3把私钥全部签名才能发币,适用于多方共同管理的重要资产,但是任何一方遗失私钥均会造成严重损失。

多签地址的交易构造、签名、发送过程与普通交易类似。(3)挖矿交易

挖矿(coinbase)交易用于凭空产生比特币。挖矿交易只有一个输入,该输入有一个“coinbase”参数,没有scriptSig,“coinbase”中的数据可以是任意内容,它不会被使用。比特币把压缩的当前目标Hash值和任意精确度的“extraNonce”都存储在这儿,区块头中的Nonce每次一溢出,它们就会增长。extraNonce有助于扩大工作量证明函数的范围,矿工很容易修改Nonce(4字节)、时间戳和extraNonce(2~100字节)。

挖矿交易的输出金额在一段时间内是固定值,初始是50个比特币,每21万个区块后减半,目前已经经历了两次减半,因而是12.5个比特币。输出地址可以是任何地址,一般是矿工或矿池的比特币地址。

Nonce溢出是指在对一个块进行散列时,Nonce从0开始,每计算一次Hash都要增长一次,因而有可能会出现超过数值范围的情况,这时,extraNonce就要相应增长以存储Nonce。1.1.5 找零地址

在实际的区块链交易中,假设A拥有一个比特币地址,里面包含着还没有花费过的10个比特币。B也有一个比特币地址,里面一分钱也没有。当A想向B支付10个比特币时,A地址里的未花费输出变为零,而B的则会变为10 BTC。如果A想支付的金额与所拥有的相同,自然不会存在需要找零钱的问题。不过当手头的金额比要支付的大时,找零自然也是天经地义的事情。

假设A的地址上有35个比特币(如图1-2所示),当A想向B支付8个比特币时,如图1-2所示,只需要使用包含着20个比特币的那一笔未消费支出,并设置好要支持的金额即可,剩下的12个比特币则会返回给A,以便A在将来可以继续使用。图1-2 找零示意图

这样就有了一个找零机制,实际上,比特币在交易时会把消费时所用的地址(消费地址)的余额设置为零。当需要支付的金额小于可用余额时,在交易信息中必须告诉比特币网络零钱将要被发送至哪个地址,即“找零地址”。找零地址可能是也可能不是原先的发送地址。除此之外,发送地址所留下的剩余款项将由网络作为交易费支付给矿工。在上面的例子里,A可以选择将找回的零钱发送到一个新创建的找零地址上,或者将原先发送的地址设置为找零地址,并将零钱返回。虽然将发送地址作为找零地址对A而言是方便了管理,不过这也可能会造成A的隐私性降低,在一定程度上还可能会影响到B的匿名性。

根据设计,每一笔比特币交易将在一个称为“区块链”的全球性的公共总账上永久可见,这就意味着任何人随时都可以在上面进行跟踪查询。通过将某个比特币地址与其使用者关联起来,好事者都可以据此绘制关于这个人与他人之间的资金转移的关系图。但如果是将找回的零钱发送至一个新创建的地址,那么就可以让这种追踪变得更加困难。

要理解这一点,可以参考图1-3。假设从地址A发送比特币到地址B后,零钱返回地址为A,则区块链会揭示地址A向地址B支付了一笔钱。同样的道理,如果有两个或两个以上地址参与其中,任何涉及这个接收零钱的找零地址都会揭示A作为支付方的交易。假如某个控制着的任何接收地址或付款地址的人其身份是众所周知的,那么其他有过交易往来的各方的身份也有可能被推断出来。

现在想象一下,地址A发起付款到地址B,但此时将找零地址更改为新生成的地址C,如图1-4所示。如果没有进一步的信息,那么其他人所能知道的,只是有一个交易拆分了地址A的余额至地址B和C。而地址B或C的主人可能是也可能不是A。由于新地址C的加入,让整个交易的真相变得更加扑朔离迷:哪一个地址代表着被支付方,哪一个地址代表着找回的零钱呢?图1-3 两种找零方案图1-4 重新生成找零地址

当所有各方都将零钱发送至新创建的地址时,要想将个人身份与地址相关联,就必须收集更多的信息,并耗费更多的资源。1.2 区块和区块链

比特币网络中,数据会以文件的形式被永久记录,我们称这些文件为区块。一个区块是一些或所有最新比特币交易的记录集,且未被其他先前的区块记录。可以将区块想象为一个城市记录者其记录本上单独的一页纸(对房地产产权的变更记录),或者是股票交易所的总账本。在绝大多数情况下,新区块会被加入到记录的最后(在比特币中的名称为区块链),一旦写上,就再也不能改变或删除。每个区块记录了它被创建之前发生的所有事件。1.2.1 区块结构

一个区块的结构如表1-2所示。表1-2 区块结构示意图

每个区块都包括了一个被称为“魔法数”的常数0xD9B4BEF9、区块的大小、区块头、区块所包含的交易数量及部分或所有的近期新交易。在每个区块中,对整个区块链起决定作用的是区块头,如表1-3所示,接下来本章将会对每一个字段都做出比较详细的解释。表1-3 区块头描述

这里的hashPrevBlock就是区块之所以能够连成区块链的关键字段,该字段使得各个区块之间可以连接起来,形成一个巨大的“链条”。每个区块都必须要指向前一个区块,否则无法通过验证。这个区块链条会一直追溯到源头,也就是指向创世区块。很显然,创世区块的hashPrevBlock的值为零或为空。在区块头中,最关键的一个数据项是一个随机数Nonce,这串数字是一个答案,而这个答案对于每一个区块来说都是唯一的,它的特点具体如下。

·这个答案很难获得。

·有效答案有多个,不过我们只需要找到一个答案就可以了。

·其他节点对有效答案的验证很容易。

正是因为问题很难解答,没有固定的算法可以求出答案,所以唯一的做法就是不断尝试,找寻这个答案的做法就是“挖矿”,可以想象,会有很多人同时都在“挖矿”,他们之间是相互竞争的关系。

区块内包含许多交易,它们通过Merkle根节点间接被散列,以保证矿工能及时追踪一个正在打包的区块内交易的变化情况。一旦生成Merkle根节点,那么对包含一个交易的区块做散列所花的时间,与对包含1万个交易的区块做散列所花的时间是一样的。

目标Hash值的压缩格式是一个特殊的浮点编码类型,首字节是指数(仅使用了5个最低位),后3个字节是尾数,它能表示256位的数值。一个区块头的SHA-256(一种单向函数的算法,可形成长度为256位的串)值必定要小于或等于目标Hash值,该区块才能被网络所接受。目标Hash值越低,产生一个新区块的难度就越大。

Merkle树是Hash的二叉树。在比特币中会两次使用SHA-256算法来生成Merkle树,如果叶子个数为奇数,则要重复计算最后一个叶子的两次SHA-256值,以达到偶数叶子节点的要求。

计算过程:首先按照区块中交易的两次SHA-256进行散列,然后按照Hash值的大小进行排序,生成最底层。第二层的每个元素则是相连续的两个Hash值的两次SHA-256的Hash值。之后,会重复这个过程,直到某一层只有一个Hash值为止,这就是Merkle根。举例来说,想象有3个交易,a、b、c,那么Merkle根的生成过程如下所示:d1 = dhash(a)d2 = dhash(b)d3 = dhash(c)d4 = dhash(c) # 只有3个元素,是奇数,因而将最后一个元素重算一次d5 = dhash(d1 concat d2)d6 = dhash(d3 concat d4)d7 = dhash(d5 concat d6)

这里的d7就是以上三个交易的Merkle根。需要注意的是,Merkle树的Hash值是小头位序(即高位在后,是数字在计算机中的一种表示形式)。对于某些实现和计算来说,在散列计算前应该先按位反转,之后在散列计算后再反转一次。1.2.2 创世块

创世块(Genesis Block)是指区块链的第一个区块,现在的比特币客户端版本把创世区块号定为0,以前的版本把该区块号定为1。以下是创世块的一种表示形式,它出现在以前的比特币代码的注释中,第一个代码段定义了创建该块所需要的所有变量,第二个代码段是标准的区块类格式,还包含了第一个代码段中缩短版本的数据。GetHash()= 0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26fhashMerkleRoot = 0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33btxNew.vin[0].scriptSig = 48660479940x736B6E616220726F662074756F6C69616220646E6F63657320666F206B6E697262206E6F20726F6C6C65636E61684320393030322F6E614A2F33302073656D695420656854txNew.vout[0].nValue = 5000000000txNew.vout[0].scriptPubKey = 0x5F1DF16B2B704C8A578D0BBAF74D385CDE12C11EE50455F3C438EF4C3FBCF649B6DE611FEAE06279A60939E028A8D65C10B73071A6F16719274855FEB0FD8A6704 OP_CHECKSIGblock.nVersion = 1block.nTime = 1231006505block.nBits = 0x1d00ffffblock.nNonce = 2083236893CBlock(hash=000000000019d6, ver=1, hashPrevBlock=00000000000000, hashMerkleRoot=4a5e1e, nTime=1231006505, nBits=1d00ffff, nNonce=2083236893, vtx=1) CTransaction(hash=4a5e1e, ver=1, vin.size=1, vout.size=1, nLocKime=0)t CTxIn(COutPoint(000000, -1), coinbase 04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73) CTxOut(nValue=50.00000000, scriptPubKey=0x5F1DF16B2B704C8A578D0B) vMerkleTree: 4a5e1e

coinbase参数(看上面的十六进制)中包含了“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks.”这句话。

这句话翻译过来就是“2009年1月3日,首相第二次对处于崩溃边缘的银行进行紧急救助”,这句话正是泰晤士报当天的头版文章标题(如图1-5所示)。这应该是一个该区块在2009年1月3日或之后创建的一个证据,同时也是对银行系统采用部分准备金制度导致不稳定性的一个说明。图1-5 2009年1月3日的泰晤士报

创世块50BTC的收益被发送到如下地址:1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa,我们称该交易为创世交易。

创世块的收益花不掉,原因如下:比特币客户端把区块和交易分别存储在两个数据库中,当客户端发现区块数据库为空时,就会用代码直接生成一个创世块,但是没有把创世交易存储到客户端的交易数据库中,比特币网络一旦收到要花掉创世交易输出的交易时,因为在交易数据库中找不到创世交易,因而都会拒绝,也就是说花不掉这50个币了。出现这种情况很可能是中本聪为了纪念创世交易,故意而为的。

创世块的数据结构如下所示。

·01000000:指版本号。

·0000000000000000000000000000000000000000000000000000000000000000:为prev block。

·3BA3EDFD7A7B12B27AC72C3E67768F617FC81BC3888A51323A9FB8AA4B1E5E4A:为Merkle根。

·29AB5F49:时间戳。

·FFFF001D:目标Hash值。

·1DAC2B7C:随机数。

·01:交易个数。

·01000000:版本。

·01:输入个数。

·0000000000000000000000000000000000000000000000000000000000000000FFFFFFFF:前一个输出。

·4D:脚本长度。

·04FFFF001D0104455468652054696D65732030332F4A616E2F32303039204368616E63656C6C6F72206F6E206272696E6B206F66207365636F6E64206261696C6F757420666F722062616E6B73:scriptsig脚本。

·FFFFFFFF:序列号。

·01:输出个数。

·00F2052A01000000:50 BTC的收益。

·43:指脚本scriptPubKey的长度。

·4104678AFDB0FE5548271967F1A67130B7105CD6A828E03909A67962E0EA1F61DEB649F6BC3F4CEF38C4F35504E51EC112DE5C384DF7BA0B8D578A4C702B6BF11D5FAC:脚本scriptPubKey。

·00000000:锁定时间。

JSON版本的创世块如下所示:{ "hash":"000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", "ver":1, "prev_block":"0000000000000000000000000000000000000000000000000000000000000000", "mrkl_root":"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "time":1231006505, "bits":486604799, "nonce":2083236893, "n_tx":1, "size":285, "tx":[ { "hash":"

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

下载完整电子书

若在网站上没有找合适的书籍,可联系网站客服获取,各类电子版图书资料皆有。

客服微信:xzh432

登入/注册
卧槽~你还有脸回来
没有账号? 忘记密码?