比特币开发之-------测试链

1比特币的测试区块链

你可能会惊讶地发现,有多个比特币区块链。 2009年1月3日由Satoshi Nakamoto创建的“主要”比特币块链,本章研究的创世区块所在的网络,被称为主网。另外还有其他用于测试的比特币区块链:现存的有testnet,segnet和regtest。我们依次看看每一个。

2Testnet——比特币的试验场

Testnet是用于测试的区块链,网络和货币的总称。 testnet是一个功能齐全的在线P2P网络,包括钱包,测试比特币(testnet币),挖矿以及类似主网的所有其他功能。实际上它和主网只有两个区别:testnet币是毫无价值的,挖掘难度足够低,任何人都可以相对容易地使用testnet币)。

任何打算在比特币主干网上用于生产的软件开发都应该首先在testnet上用测试币进行测试。这样可以保护开发人员免受由于软件错误而导致的金钱损失,也可以保护网络免受由于软件错误导致的意外攻击。

然而,保持测试币的无价值和易挖掘并不容易。尽管有来自开发商的呼吁,但还是有人使用先进的设备(GPU和ASIC)在testnet上挖矿。这就增加了难度,使用CPU挖矿不可能,导致获取测试币非常困难,以致于人们开始赋予其一定价值,所以测试币并不是毫无价值。结果,时不时地testnet必须被报废并重新从创始区块启动,重新进行难度设置。

目前的testnet被称为testnet3,是testnet的第三次迭代,于2011年2月重启,重置了之前的testnet网络的难度。

请记住,testnet3是一个大区块链,在2017年初超过20 GB。完全同步需要一天左右的时间,并占用您的计算机资源。它不像主网,也不是“轻量级”。运行testnet节点的一个好方法就是将其运行为一个专用的虚拟机镜像(例如,VirtualBox,Docker,Cloud Server等)。

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

要连接bitcoind,可以使用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": [

  [...]

在testnet3上,你也可以运行使用其他语言和框架实现的全节点来实验和学习,例如btcd(用Go编写)和bcoin(用JavaScript编写)。

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

3 Segnet—隔离见证测试网络

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

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

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

4 Regtest--本地区块链

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,
  [...]

你可以看到,还没有任何区块。 让我们开始挖一些(500块),赚取奖励:

$ bitcoin-cli -regtest generate 500

[
  "7afed70259f22c2bf11e406cb12ed5c0657b6e16a6477a9f8b28e2046b5ba1ca",
  "1aca2f154a80a9863a9aac4c72047a6d3f385c4eec5441a4aafa6acaa1dada14",
  "4334ecf6fb022f30fbd764c3ee778fabbd53b4a4d1950eae8a91f1f5158ed2d1",
  "5f951d34065efeaf64e54e91d00b260294fcdfc7f05dbb5599aec84b957a7766",
  "43744b5e77c1dfece9d05ab5f0e6796ebe627303163547e69e27f55d0f2b9353",
   [...]
  "6c31585a48d4fc2b3fd25521f4515b18aefb59d0def82bd9c2185c4ecb754327"
]

挖掘所有这些块只需要几秒钟,这样就可以很容易地进行测试。 如果您检查您的钱包余额,您将看到您获得了前400个区块的奖励(Coinbase的奖励必须挖满100块之后才能花费):

$ bitcoin-cli -regtest getbalance

12462.50000000

5使用测试块链进行开发

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

您可以使用测试区块链来建立开发管道。 在开发它时,建议在本地测试代码。

一旦您准备好在公共网络上尝试,请切换到testnet,将您的代码暴露在更加动态的环境中,并提供更多样化的代码和应用程序。

最后,一旦您确信您的代码正常工作,请切换到主网以实现生产部署。

当您进行变更,改进,错误修复等操作时,再次启动这个开发管道,首先在regtest上部署每个变更,然后在testnet上进行测试,最后实现生产。

你可能感兴趣的:(比特币)