10bet《精通比特币第二版》中文版第九章区块链

来源:http://www.chinese-glasses.com 作者:Web前端 人气:58 发布时间:2020-03-31
摘要:在区块链中,由于区块链分支导致的重新计算,可能会修改最新的块。最近的六块地在表土里只有几英寸深。但是,在超过6个块之后,块在区块链中的位置越深,更改它的可能性就越小

在区块链中,由于区块链分支导致的重新计算,可能会修改最新的块。最近的六块地在表土里只有几英寸深。但是,在超过6个块之后,块在区块链中的位置越深,更改它的可能性就越小。100个街区之后,区块链足够稳定,可以支付Coinbase交易(包括新挖的比特币交易)。经过数千个街区(一个月)后的区块链将成为一个确定的历史,永远不会改变。

区块链中的每个区块都包含了产生于该区块的所有交易,且以Merkle树表示。Merkle树是一种哈希二叉树,它是一种用作快速归纳和校验大规模数据完整性的数据结构。这种二叉树包含加密哈希 值。术语“树”在计算机学科中常被用来描述一种具有分支的数据结构,但是树常常被倒置显示,“根”在图的上部同时“叶 子”在图的下部,你会在后续章节中看到相应的例子。在比特币网络中,Merkle树被用来归纳一个区块中的所有交易,同时生成整个交易集合的数字指纹,且提供了一种校验 区块是否存在某交易的高效途径。生成一棵完整的Merkle树需要递归地对哈希节点对进行哈希,并将新生成的哈希节点 插入到Merkle树中,直到只剩一个哈希节点,该节点就是Merkle树的根。在比特币的Merkle树中两次使用到了SHA256 算法,因此其加密哈希算法也被称为double-SHA256。当N个数据元素经过加密后插入Merkle树时,你至多计算2*log2 次就能检查出任意某数据元素是否在该树中,这使得该数据结构非常高效。Merkle树是自底向上构建的。在如下的例子中,我们从A、B、C、D四个构成Merkle树树叶的交易开始,如图9-2。

每个块头生成一个SHA256加密散列来生成散列值。使用这个散列值,可以标识区块链中相应的块。同时,每个块可以通过其块头的“父块哈希值”字段引用前一个块(父块)。

Nonce、难度目标和时间戳会用于挖矿过程,更多细节将在挖矿章节讨论。

区块链通常被视为一个垂直堆栈,第一个块是堆栈底部的第一个块,然后将每个块放在前一个块的顶部。使用堆栈将块依次堆叠的概念可视化之后,我们可以使用一些术语,如“高度”来表示块与第一个块之间的距离;和“top”或“top”表示新添加的块。

精力有限,后期修订以github为主,建议大家移步github链接阅读更新版本,感谢理解:https://github.com/tianmingyun/MasterBitcoin2CN

区块链的数据结构是由包含事务信息的块按远近顺序排列的。块按远近顺序在这个链中链接,每个块都指向前面的块。

区块是一种被包含在公开账簿里的聚合了交易信息的容器数据结构。它由一个包含元数据的区块头和紧跟其 后的构成区块主体的一长串交易列表组成。区块头是80字节,而平均每个交易至少是250字节,而且平均每个区块至少包含超过500个交易。因此,一个包含所有交易的完整区块比区块头的1000倍还要大。表7-1描述了一个区块结构。

你可以把区块链想象成地质构造中的一个地质层,或者是冰川核心的一个样本。沉积前表层可能随季节变化,甚至被风吹走。但在更深的地方,地质结构变得更加稳定。在几百英尺深的地方,你会看到保存了数百万年但仍然具有历史意义的岩层。

9.9.1.1使用testnet

像几乎所有其他比特币软件一样,Bitcoin Core完全支持在testnet网络运行而不是只能主网上运行,还允许您进行挖矿并运行一个testnet全节点。

如果要在testnet上启动Bitcoin Core,而不是在主网启动,您可以使用testnet开关:$ bitcoind -testnet在日志中,您应该会看到,bitcoind正在默认bitcoind目录的testnet3子目录中构建一个新的区块链:bitcoind: Using data directory /home/username/.bitcoin/testnet3可以使用bitcoin-cli命令行工具,但是要记得切换到testnet模式:$ bitcoin-cli -testnet getinfo{"version": 130200,"protocolversion": 70015,"walletversion": 130000,"balance": 0.00000000,"blocks": 416,"timeoffset": 0,"connections": 3,"proxy": "","difficulty": 1,"testnet": true,"keypoololdest": 1484801486,"keypoolsize": 100,"paytxfee": 0.00000000,"relayfee": 0.00001000,"errors": ""}您还可以使用getblockchaininfo命令确认testnet3区块链的详细信息和同步进度:$ bitcoin-cli -testnet getblockchaininfo{"chain": "test","blocks": 1088,"headers": 139999,"bestblockhash": "0000000063d29909d475a1c4ba26da64b368e56cce5d925097bf3a2084370128","difficulty": 1,"mediantime": 1337966158,"verificationprogress": 0.001644065914099759,"chainwork": "0000000000000000000000000000000000000000000000000000044104410441","pruned": false,"softforks": [

[...]您还可以使用其他全节点实现(如Goto写的btcd)和bcoin(用JavaScript编写)来运行在testnet3上,以其他编程语言和框架进行实验和学习。

在2017年初,testnet3支持主网的所有功能,也包括在主网络上尚未激活的Segregated Witness(见[segwit]隔离见证章节))。 因此,testnet3也可用于测试隔离见证功能。

2016年,启动了一个特殊用途的测试网络,以帮助开发和测试隔离见证(也称为segwit;见[segwit])。 该测试区块链称为segnet,可以通过运行Bitcoin Core的特殊版本来连接。

由于将segwit添加到testnet3中,因此后来不再需要使用segnet来测试segwit功能。

在将来,我们可能会看到其他专门用于测试单个功能或主要架构更改的测试网络区块链。

Regtest代表“回归测试”,是一种比特币核心功能,允许您创建本地区块链以进行测试。 与testnet3(它是一个公共和共享的测试区块链)不同,regtest区块链旨在作为本地测试的封闭系统运行。 您从头开始启动regtest块链,创建一个本地的创世区块。 您可以将其他节点添加到网络中,或者使用单个节点运行它来测试Bitcoin Core软件。

要在regtest模式下启动Bitcoin Core,您可以使用regtest标志:$ bitcoind -regtest就像使用testnet一样,Bitcoin Core将在bitcoind默认目录的regtest子目录下初始化一个新的区块链:bitcoind: Using data directory /home/username/.bitcoin/regtest要使用命令行工具,还需要指定regtest标志。 我们来试试getblockchaininfo命令来检查regtest块链:$ bitcoin-cli -regtest getblockchaininfo{"chain": "regtest","blocks": 0,"headers": 0,"bestblockhash": "0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206","difficulty": 4.656542373906925e-10,"mediantime": 1296688602,"verificationprogress": 1,"chainwork": "0000000000000000000000000000000000000000000000000000000000000002","pruned": false,[...]你可以看到,还没有任何区块。 让我们开始挖一些,赚取奖励:$ bitcoin-cli -regtest generate 500["7afed70259f22c2bf11e406cb12ed5c0657b6e16a6477a9f8b28e2046b5ba1ca","1aca2f154a80a9863a9aac4c72047a6d3f385c4eec5441a4aafa6acaa1dada14","4334ecf6fb022f30fbd764c3ee778fabbd53b4a4d1950eae8a91f1f5158ed2d1","5f951d34065efeaf64e54e91d00b260294fcdfc7f05dbb5599aec84b957a7766","43744b5e77c1dfece9d05ab5f0e6796ebe627303163547e69e27f55d0f2b9353",[...]"6c31585a48d4fc2b3fd25521f4515b18aefb59d0def82bd9c2185c4ecb754327"]挖掘所有这些块只需要几秒钟,这样就可以很容易地进行测试。 如果您检查您的钱包余额,您将看到您获得了前400个区块的奖励(Coinbase的奖励必须挖满100块之后才能花费):$ bitcoin-cli -regtest getbalance12462.50000000

Bitcoin的各种区块链(regtest,segnet,testnet3,以及主网)为比特币开发提供了一系列测试环境。 无论您是开发比特币核心还是另一个全节点共识客户端, 诸如钱包,交易所,电子商务网站等应用程序,甚至开发新颖的智能合同和复杂的脚本等等,请使用测试区块链网进行开发。

您可以使用测试区块链来建立开发管道。 在开发它时,建议在本地测试代码。 一旦您准备好在公共网络上尝试,请切换到testnet,将您的代码暴露在更加动态的环境中,并提供更多样化的代码和应用程序。 最后,一旦您确信您的代码正常工作,请切换到主网以实现生产部署。 当您进行更改,改进,错误修复等时,再次启动这个开发管道,首先在regtest上部署每个更改,然后在testnet上进行生产测试。

参考内容:1、本文部分内容摘自《精通比特币》第一版中译本,特此说明并致谢。

我正在发起“和我一起研读《精通比特币第二版》”活动。我声明,这不是讲课,是讨论,是研读学习,所以需要你的加入,更需要你的参与。我把这种学习方式作为一次认知学习法[注]的实践。我希望大家可以和我一起通过将认知学习法与《精通比特币第二版》的研读结合起来,尝试总结出一套可行的区块链知识技能快速入门的方法。尝试,反思,总结,生成以及组合进行的实践、检验并逐步迭代升级,这是我们的经历也是我们的结果。这个结果也将成为我们大家一起合作编写的一本书《认知学习比特币》的雏形(所有有价值的讨论都将成为这本书的素材)。我更希望大家通过本次认知学习方法论的实践以及迭代升级,将这种经过实践的学习方法迁移到更多领域的学习中。所以希望我们携手走入第二季,第三季......

欢迎扫描二维码加入。

10bet 1欲知详情请扫描二维码

由于块头包含“父块哈希值”字段,所以当前块的哈希值也会受到字段的影响。如果父块的标识改变了,子块的标识也会改变。

区块头由三组区块元数据组成。首先是一组引用父区块哈希值的数据,这组元数据用于将该区块与区块链中前一区块相连接。第二组元数据,即难度、时间戳和nonce,与挖矿竞争相关,详见挖矿章节。第三组元数据是merkle树根(一种用 来有效地总结区块中所有交易的数据结构)。表7-2描述了区块头的数据结构。

一旦一个块有许多代,这个瀑布效应将确保这个块不会被改变,除非强制重新计算该块中所有后续的块。正是这种重新计算需要大量的计算,所以长区块链的存在可以使区块链的历史无法改变,这也是比特币安全的一个关键特征。

10bet 2图9-1 区块通过引用父区块的区块头哈希值的方式,以链条的形式进行相连

时间: 2019-10-21阅读: 88标签: 区块链

特别预告:专栏早鸟价:99元,11月5日后升级为199元,11月14日零时前报名加入的朋友均赠送《精通比特币第二版》中文版纸质打印本一本。

当父块中有任何更改时,父块的哈希值也会更改。这将迫使子块的“父块哈希值”字段发生更改,从而导致子块的哈希值发生更改。子块的哈希值的改变将迫使大块的“父块哈希值”字段发生变化,从而改变大块的哈希值等等。

比特币的完整节点保存了区块链从创世区块起的一个本地副本。随着新的区块的产生,该区块链的本地副本会不断地更 新用于扩展这个链条。当一个节点从网络接收传入的区块时,它会验证这些区块,然后链接到现有的区块链上。为建立一个连接,一个节点将检查传入的区块头并寻找该区块的“父区块哈希值”。让我们假设,例如,一个节点在区块链的本地副本中有277,314个区块。该节点知道最后一个区块为第277,314个区 块,这个区块的区块头哈希值为: 00000000000000027e7ba6fe7bad39faf3b5a83daed765f05f7d1b71a1632249。 然后该比特币节点从网络上接收到一个新的区块,该区块描述如下:{"size":43560,"version":2, "previousblockhash":"00000000000000027e7ba6fe7bad39faf3b5a83daed765f05f7d1b71a1632249", "merkleroot":"5e049f4030e0ab2debb92378f53c0a6e09548aea083f3ab25e1d94ea1155e29d","time":1388185038,"difficulty":1180923195.25802612,"nonce":4215469401,"tx":["257e7497fb8bc68421eb2c7b699dbab234831600e7352f0d9e6522c7cf3f6c77",[...many more transactions omitted...] "05cfd38f6ae6aa83674cc99e4d75a1458c165b7ab84725eda41d018a09176634"]}对于这一新的区块,节点会在“父区块哈希值”字段里找出包含它的父区块的哈希值。这是节点已知的哈希值,也就是第 277314块区块的哈希值。故这个区块是这个链条里的最后一个区块的子区块,因此现有的区块链得以扩展。节点将新 的区块添加至链条的尾端,使区块链变长到一个新的高度277,315。图9-1显示了通过“父区块哈希值”字段进行连接三个区块的链。

区块链分叉只是暂时的,并且只在多个不同的块几乎同时被不同的矿工发现时才会发生。最后,只有一个子块成为区块链的一部分,解决了“区块链fork”的问题。虽然一个块可能有多个子块,但是每个块只有一个父块,因为一个块只有一个“父块散列值”字段可以指向它惟一的父块。

创世区块包含一个隐藏的信息。在其Coinbase交易的输入中包含这样一句话“The Times 03/Jan/2009 Chancellor on brink of second bailout forbanks.”这句话是泰晤士报当天的头版文章标题,引用这句话,既是对该区块产生时间的说明,也可视为半开玩笑地提醒人们一个独立的货币制度的重要性,同时告诉人们随着比特币的发展,一场前所未有的世 界性货币革命将要发生。该消息是由比特币的创立者中本聪嵌入创世区块中。

也就是说,每个块头包含其父块散列值。这样,通过将每个块链接到相应父块的散列序列,就创建了一个返回到第一个块(创建块)的链。

10bet 3表7-2 区块头结构

本文由10bet发布于Web前端,转载请注明出处:10bet《精通比特币第二版》中文版第九章区块链

关键词:

最火资讯