Please note, this is a STATIC archive of website bitcoinsv.io from October 2020, cach3.com does not collect or store any user information, there is no "phishing" involved.
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