Miner ID

以下的指引是介绍在主流的Linux系统下安装Miner ID可使用的工具,前提假设是你使用着类似Bourne shell的shell,比如bash

在此了解Miner ID的BRFC(比特币注释请求)。

在此了解Miner ID参考实现的开源代码

技术支持

欲获得技术支持、参与讨论技术标准和参考实现的,请加入以下telegram群组

从源代码开始构建

要求

对于开发,你只需要在本地中安装Node.js(最低10.12.0版本)和节点全局软件包NPM。

节点

  • 在Windows下安装节点

前往 Node.js官网下载安装包。另外,请确保git在你的PATH中可用,npm可能会需要它(你可以在这里找到git)。

  • 在Ubuntu上安装节点

你可以使用apt install轻松安装nodejs和npm,只需运行以下命令:

```console
$ sudo apt install nodejs
$ sudo apt install npm
```
  • 其它操作系统

你可以在Node.js官网NPM官网找到更多关于安装的信息。

安装

$ git clone https://github.com/bitcoin-sv/minerid-reference.git
$ cd minerid-reference
$ npm install

配置

打开config.json 并根据你的设置编辑它:

  • 更改port
  • 更改minerIdDataPath ,它用于存储用户的Miner ID
  • 更改keystore 它用于存储Miner ID私钥
  • 更改network (mainnet="livenet" | testnet="testnet" | regtest="regtest")
  • 更改Bitcoin RPC参数:
  • rpcHost
  • rpcPort
  • rpcUser
  • rpcPassword

运行项目

运行API服务器:

$ npm start

运行CLI:

$ npm run cli

测试

$ npm test

Docker

Build Image

你可以使用自己的更改配置来自行build image。

$ docker build . -t minerid_reference:1.1.1

Pull Image

你还可以从Miner ID的公共Docker Hub库中提取image。

$ docker pull bitcoinsv/minerid:1.1.1

使用Docker Compose运行

docker-compose 文件示例:

version: "3.8"
services:
  minerid:
    image: bitcoinsv/minerid:1.1.1
    ports:
      - 9002:9002
    restart: always
    environment:
      NODE_CONFIG: '{
        "bitcoin": {
        "rpcHost":"host.docker.internal"
        },
        "network": "regtest"
        }'
    volumes:
      - minerid:/root/.keystore
      - minerid:/root/.minerid-client
volumes:
  minerid:
    external: false

由于Miner ID本质上是围绕一个私钥(Miner ID)构建的服务,因此我们使用数据卷来运行容器,以避免容器由于某种原因失灵及私钥丢失的情况。在环境变量中,我们通过将其传递给NODE_CONFIG来指定要使用哪个网络(livenet(或mainnet)、testnetregtest),以及要使用哪些比特币节点RPC参数和凭证。

初始设置

一旦docker容器开始运行,你就需要生成一个Miner ID私钥,并且设置Validity Check Transaction output (VCTx),来设置和配置你的Miner ID。你可以使用docker exec

$ docker exec -it <CONTAINER> bash
[email protected]:/app#

接下来运行cli命令,来对上面进行设置和配置:

[email protected]:/app# npm run cli -- generateminerid --name testMiner
[email protected]:/app#  npm run cli -- generatevctx --name testMiner

如果你正在livenet(主网)上运行,请按照指示为你的VCT供应资金。

使用Miner ID API

一旦你已经设置好并开始运行Miner ID服务,你将需要从矿池软件调用Miner ID的公开API,从而将Miner ID包含在coinbase交易中。如果要对mAPI响应进行签名,你还需要从mAPI调用Miner ID。Miner ID API的定义如下,也可以点击这里查看:

实施

REST API有四个端点:

1、GET /opreturn/:alias/:blockHeight([0-9]+)

Alias:Miner ID的别名
blockHeight:Miner ID文档创建时的区块高度

block height which Miner ID document is created for/at

返回高度为 blockHeight、别名为alias的Miner ID输出(锁定)脚本,为十六进制字符串

示例

2、POST /coinbase2

正文:

{ 
  "blockHeight": number,
  "alias": string,
  "coinbase2": string,
  "jobData": {
    "miningCandidate": {},
    "getInfo": {},
    "feeSpec": {}
  }
}

返回包含Miner ID输出的新版coinbase2

字段功能
blockHeightcoinbase交易所在的区块高度
aliasMiner ID的别名
coinbase2coinbase (coinb2) 的第二部分,详见stratum protocol
jobData挖矿行为的特定数据将通过扩展的方式添加到Miner ID coinbase文档中
miningCandidateBitCoin RPC getminingcandidate响应
getInfoBitCoin RPC getinfo 响应
feeSpecmAPI默认 fees

请注意:coinbase交易在stratum协议中被分成如下:

示例

{ 
    "blockHeight": 100, 
    "alias": "testMiner", 
    "coinbase2": "ffffffff011a0a5325000000001976a9145deb9155942e7d38febc15de8870222fd24d080e88ac00000000", 
    "jobData": {
        "miningCandidate": {
          "id": "e706b0e6-793b-448f-a1ae-8ef54459eb72",
          "prevhash": "70f5701644897c92b60e98dbbfe72e1cfd7a2728c6fa3a29c4b4f6e986b0ccaa",
          "coinbaseValue": 5000000974,
          "version": 536870912,
          "nBits": "207fffff",
          "time": 1590152467,
          "height": 106,
          "num_tx": 4,
          "sizeWithoutCoinbase": 1052,
          "merkleProof": [
            "9bd12ce6508574b3163aadb14eab7bd862306da85b221eb284fb41d6012db98f",
            "56f04cc78ac493defced65dd58f4437c67bcc697b59778b0cd96c3c64c1b0bbf"
          ]
        },
        "getInfo": {
          "version": 101000300,
          "protocolversion": 70015,
          "walletversion": 160300,
          "balance": 199.99997068,
          "blocks": 104,
          "timeoffset": 0,
          "connections": 4,
          "proxy": "",
          "difficulty": 4.656542373906925e-10,
          "testnet": false,
          "stn": false,
          "keypoololdest": 1575386196,
          "keypoolsize": 1999,
          "paytxfee": 0.00000000,
          "relayfee": 0.00000250,
          "errors": "",
          "maxblocksize": 9223372036854775807,
          "maxminedblocksize": 128000000,
          "maxstackmemoryusagepolicy": 100000000,
          "maxstackmemoryusageconsensus": 9223372036854775807
        },
        "feeSpec": {
          "fees": [
            {
              "feeType": "standard",
              "miningFee": {
                "satoshis": 1,
                "bytes": 1
              },
              "relayFee": {
                "satoshis": 1,
                "bytes": 10
              }
            },
            {
              "feeType": "data",
              "miningFee": {
                "satoshis": 2,
                "bytes": 1000
              },
              "relayFee": {
                "satoshis": 1,
                "bytes": 10000
              }
            }
          ]
        }
    }
}

3、GET /opreturn/:alias/rotate

alias: Miner ID别名

rotates the Miner ID key for an alias Miner ID

根据Miner ID转换出Miner ID的别名alias

示例

$ curl localhost:9002/opreturn/testMiner/rotate
OK

4、GET /minerid/:alias

alias: Miner ID别名

返回Miner iD别名alias的十六进制压缩公钥(33字节)字符串

示例

$ curl localhost:9002/minerid/testMiner
02644f5000535bbc135f9c8613f86f10c66a4a773eda5e913eff64eb328bc6326a

5. GET /minerid/:alias/sign/:hash

alias: Miner ID别名
hash: SHA256哈希(32字节十六进制字符串) 被用于 ECDSA签名算法

使用Miner ID别名alias返回哈希签名(71至73字节十六进制字符串)

示例

$ curl localhost:9002/minerid/testMiner/sign/02644f5000535bbc135f9c8613f86f10c66a4a773eda5e913eff64eb328bc632
3045022100e0f86a5b1748ae48b0d10ea305202769d754071272cba0fbb82f74f8e8da8b530220494351742f3ba9e51b155df15b13f27c927d21956822aedcbb7d179c66d4d4c0