以下的指引是介绍在主流的Linux系统下安装Miner ID可使用的工具,前提假设是你使用着类似Bourne shell的shell,比如bash
。
在此了解Miner ID的BRFC(比特币注释请求)。
在此了解Miner ID参考实现的开源代码。
技术支持
欲获得技术支持、参与讨论技术标准和参考实现的,请加入以下telegram群组。
从源代码开始构建
要求
对于开发,你只需要在本地中安装Node.js(最低10.12.0版本)和节点全局软件包NPM。
节点
前往 Node.js官网下载安装包。另外,请确保git在你的PATH中可用,npm
可能会需要它(你可以在这里找到git)。
你可以使用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 IDkeystore
它用于存储Miner ID私钥network
(mainnet="livenet" | testnet="testnet" | regtest="regtest")rpcHost
rpcPort
rpcUser
rpcPassword
运行项目
运行API服务器:
$ npm start
运行CLI:
$ npm run cli
测试
$ npm test
你可以使用自己的更改配置来自行build image。
$ docker build . -t minerid_reference:1.1.1
你还可以从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)、testnet
或regtest
),以及要使用哪些比特币节点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
字段 | 功能 |
blockHeight | coinbase交易所在的区块高度 |
alias | Miner ID的别名 |
coinbase2 | coinbase (coinb2 ) 的第二部分,详见stratum protocol |
jobData | 挖矿行为的特定数据将通过扩展的方式添加到Miner ID coinbase文档中 |
miningCandidate | BitCoin RPC getminingcandidate 响应 |
getInfo | BitCoin RPC getinfo 响应 |
feeSpec | mAPI默认 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