区块链全节点的JavaScript实现:Bcoin 入门 - pradyuman


在本文中,我们将介绍“如何使用 Bcoin 安装和运行比特币的完整节点”。
我们将创建一个钱包,发送一些硬币并在 regtest 模式下挖掘一些块。那么,让我们开始吧。
比特币区块链被设计为一个去中心化的 P2P 网络,没有人拥有或控制比特币,每个人都可以参与。全节点是完全验证交易和区块的程序。通过运行比特币全节点,您正在支持比特币网络变得更加去中心化并促进比特币的增长。
“Bcoin”是用 Javascript 构建的比特币协议的另一种实现。完整节点可用于完整的区块链验证,并了解所有已知的共识规则。与其他类似的竞争实现相比,它更易于使用、学习更快且文档更齐全。
Bcoin 出于安全目的,只通过 Git 安装,因为通过 npm 安装时存在安全问题。

$ mkdir Bcoin && cd Bcoin
$ git clone https://github.com/bcoin-org/bcoin
$ cd bcoin

使用 npm 全局构建和安装:

$ npm rebuild
$ npm install --global


在 Nodejs 项目中,通常使用npm install,它将获取依赖树中提到的所有依赖项。我们担心 npm 作为单一的中心故障点以及如何验证下载的源代码。因此,现在不需要npm install。

在本地运行测试:
从Bcoinrepo 目录中,运行

$ npm run test

现在,我们已准备好运行我们的bcoin完整节点
 
启动你的第一个 bcoin 节点
如果bcoin是全局安装,bcoin则应在您的 PATH 中。如果没有,bcoin引导脚本驻留在/path/to/bcoin/bin/bcoin. 我们将在regtest模式下运行完整节点。
$ bcoin --network=regtest

这将在本地测试模式下启动一个bcoin全节点,没有对等点和 0 难度挖掘。在bcoin整个节点将使用默认选项通过读取启动。在配置向导你可以看到其他设置可用。
现在在第二个终端中,使用该bcoin-cli工具获取节点信息。

$ bcoin-cli --network=regtest info
  
玩钱包
默认情况下,该Bcoin软件运行一个钱包,该钱包在第一次启动时被初始化。钱包被调用,primary并且有一个名为 的帐户default。
Bcoin钱包结构使用BIP44,钱包Bcoin使用BIP39种子短语。
获取钱包的种子短语:

$ bwallet-cli master --id=primary

此命令将返回JSON有关您的钱包主密钥的包含信息:

{
  "encrypted": false,
 
"key": {
   
"xprivkey": "tprv8ZgxMBicQKsPfNKy1Wf9EV1cTmz1Cmm6MVrvYdgcR6Hf8sEDUAzhnnoiVbw5jejp4EZWXynQEJhB62oSfANpHRAJqfiZarh1gVMowcJZ2Mn"
  },
 
"mnemonic": {
   
"bits": 128,
   
"language": "english",
   
"entropy": "e35833c318d677945ec21efff032bb64",
   
"phrase": "today screen valid coyote guess sketch kitchen duck zoo light put siege"
  }
}

获取您钱包的当前接收地址
$ bwallet-cli --id=primary --account=default address

它将返回JSON有关您当前接收地址的响应。

{
  "name": "default",
 
"account": 0,
 
"branch": 0,
 
"index": 3,
 
"witness": false,
 
"nested": false,
 
"publicKey": "03af169e5a186bbd7b380cb4553c72af243e18f243785b1597f192bbedd4a94fc3",
 
"script": null,
 
"program": null,
 
"type": "pubkeyhash",
 
"address": "n2eoT9D8txT5ZymDvCFPA8PHs2CmTV6oJT"
}

现在你有了一个接收地址,所以我们可以在当前(regtest)网络中挖掘一些虚拟块来为我们的钱包提供资金。
$ bcoin-cli rpc generatetoaddress 10 n2eoT9D8txT5ZymDvCFPA8PHs2CmTV6oJT
此命令将在 regtest 网络中挖掘 10 个区块,地址为您的 coinbase 地址。现在我们可以检查我们的钱包余额。
检查您的钱包余额:
$ bwallet-cli --id=primary balance --account=default
它将返回JSON包含您的帐户余额的响应:

{
  "account": 0,
 
"tx": 307,
 
"coin": 287,
 
"unconfirmed": 1122500000000,
 
"confirmed": 1122500000000
}

现在让我们创建第二个钱包,一个使用Segregated Witness. 这个钱包类型的简要说明是 在这里.
 
创建隔离见证钱包
你可以随意命名这个钱包(这里我们将它命名为 test1

$ bwallet-cli mkwallet test1 --witness=true

它将返回包含JSON您的新钱包详细信息的响应,

{
  "network": "regtest",
 
"wid": 11,
 
"id": "test1",
 
"watchOnly": false,
 
"accountDepth": 1,
 
"token": "489d43e398dad34e69653e5edb5cb39b6d55be3364753c07d084d4b3d0292af7",
 
"tokenDepth": 0,
 
"master": {
   
"encrypted": true,
   
"until": 1571763677,
   
"iv": "4e24f2a5908e20da0b8ba3e88dcda272",
   
"algorithm": "pbkdf2",
   
"n": 50000,
   
"r": 0,
   
"p": 0
  },
 
"balance": {
   
"tx": 0,
   
"coin": 0,
   
"unconfirmed": 0,
   
"confirmed": 0
  }
}

获取这个新钱包的地址:
$ bwallet-cli --id=test1 --account=default address

现在,我们有了新的钱包地址,让我们从第一个钱包向第二个钱包发送一些硬币。
 
汇款

$ bwallet-cli send --id=primary --value=1000 --address=<your segwit wallet address>

现在,检查我们的segwit wallet.
$ bwallet-cli --id=test1 balance

它显示了一个JSON响应,
{
  "account": -1,
 
"tx": 1,
 
"coin": 1,
 
"unconfirmed": 100000000000,
 
"confirmed": 0
}

因此,我们创建了两个钱包,并将一些 regtest 硬币从一个钱包发送到另一个钱包,我们还挖掘了一些 regtest 区块。