Bitcoin Unlimited 基于 Satoshi 代码库,因此可以替代您的矿池软件。只需将您的池配置为指向 Bitcoin Unlimited 守护程序,其方式与比特币核心守护程序完全相同。
但是 Bitcoin Unlimited 具有促进挖矿的特定功能。
访问区块候选和提交区块解决方案的有效协议
Bitcoin Unlimited 提供了 2 个额外的挖矿 RPC 函数,可以用来代替“getblocktemplate”和“submitblock”。这些 RPC 不会将整个区块传递给矿池。相反,候选区块头、提议的 coinbase 交易和 coinbase merkle 证明被通过。这与通过 Stratum 协议传递给散列硬件的数据大致相同,因此,如果您熟悉 Stratum,您就会熟悉这是如何实现的。
矿池使用getminingcandidate来接收前面描述的区块信息和跟踪标识符。然后它可能会修改或完全替换 coinbase 交易和许多区块头字段,以创建不同的哈希硬件候选者。然后它通过 Stratum 将这些候选者转发到散列硬件。找到解决方案后,矿池可以通过 submitminingsolution 将解决方案提交回bitcoind。
使用 RPC getminingcandidate 和 RPC submitminingsolution 的一些好处是:
提供了一个示例 CPU-miner 程序,展示了这些功能的概念验证使用。源代码位于 bitcoin-miner.cpp。要尝试一下,请运行
bitcoin-miner
当然,鉴于当前和可预见的挖矿困难,该程序不会在主网上找到任何区块。但是,它会在 testnet 或 regtest 上找到块。
这些接口的基于 python 的测试位于 qa/rpc-tests/miningtest.py。此示例可能对使用高级语言访问这些 RPC 的人更有用。
{
# candidate identifier for submitminingsolution (integer):
\"id\": 14,
# Hash of the previous block (hex string):
\"prevhash\": \"0000316517e048ab283a41df3c0ba125345a5c56ef3f76db901b0ede65e2f0e5\",
# Coinbase transaction (hex string encoded binary transaction)
\"coinbase\": \"...00ffffffff10028122000b2f454233322f414431322ffff...\"
# Block version (integer):
\"version\": 536870912,
# Difficulty (hex string):
\"nBits\": \"207fffff\",
# Block time (integer):
\"time\": 1528925409,
# Merkle branch for the block, proving that this coinbase is part of the block (list of hex strings):
\"merkleProof\": [
\"ff12771afd8b7c5f11b499897c27454a869a01c2863567e0fc92308f01fd2552\",
\"d7fa501d5bc94d9ae9fdab9984fd955c08fedbfe02637ac2384844eb52688f45\"
]
}
{
# ID from getminingcandidate RPC (integer):
\"id\": 14,
# Miner generated nonce (integer):
\"nonce\": 1804358173,
# Modified Coinbase transaction (hex string encoded binary transaction, optional):
\"coinbase\": \"...00ffffffff10028122000b2fc7237b322f414431322ffff...\",
# Block time (integer, optional):
\"time\": 1528925410,
# Block version (integer, optional):
\"version\": 536870912
}
与submitblock 完全相同。None 表示成功,错误字符串或 JSONRPCException 如果有问题。
BIP135 是 BIP9 的增强版,允许矿工通过在已解决区块的版本字段中设置某些位来投票选择功能。版本字段中位含义的定义发生变化,可在 config/forks.csv 中找到。您可以定义自己的比特,但是除非绝大多数矿工同意遵守这些比特定义,否则这样的定义没有价值。详细信息可在 doc/bip135-genvoting.md 中找到。
矿工可以通过“mining.vote”配置参数启用对某些功能的投票。提供以逗号分隔的功能名称列表。例如,如果 forks.csv 定义了三个特征“f0”、“f1”和“f2”,您可以通过以下配置设置为“f1”和“f2”投票:
mining.vote=f0,f1
可以通过“get”和“set”RPC 调用随时访问或更改此参数。
大于过大块大小的块将被忽略,直到在其上构建“接受深度”(参见下一节)块。这允许矿工阻止他们认为过大的块,但如果看起来大多数网络都接受这个大小,则最终接受它们。您可以在此处了解有关这些参数的更多信息,以及矿工对如何设置它们的意见。
要更改 Bitcoin Unlimited 将生成的最大块,请运行:
bitcoin-cli setexcessiveblock blockSize acceptDepth
例如,要设置接受深度为 10 个块的 1MB 块,请使用:
bitcoin-cli setexcessiveblock 1000000 10
要更改 bitcoin.conf 或命令行中的超大块大小字段,请将超大块大小配置变量设置为以字节为单位的值:
excessiveblocksize=
例如,要设置 3MB 块,请使用:
过多块大小=3000000
要更改 bitcoin.conf 或命令行中的接受深度字段,请将exterioracceptdepth 配置变量设置为一个值(以块为单位):
excessiveacceptdepth=
例如,要在接受过多的块之前等待 10 个块,请使用:
过度接受深度=10
要在运行的 bitcoind 中发现这些设置,请使用“getexcessiveblock”。例如:
$ bitcoin-cli getexcessiveblock
{
\"excessiveBlockSize\": 16000000,
\"excessiveAcceptDepth\": 4
}
要隐藏这是一个 Bitcoin Unlimited 节点,请在 bitcoin.conf 文件中或使用 ./bitcoin-cli 将“net.subversionOverride”设置为您选择的字符串:
bitcoin-cli set net.subversionOverride=\"Your Choice Here\"
显示当前字符串:
bitcoin-cli get net.subversionOverride
要在 bitcoin.conf 或命令行中更改此字段,请使用:
net.subversionOverride=
默认情况下,Bitcoin Unlimited 将开采的最大区块为 1MB(与 Bitcoin Core 兼容)。如果整个比特币网络愿意挖掘更大的块,你可能想要增加这个块大小,或者如果你觉得对网络的需求超过了容量,你可能想要减小这个大小。
要更改 Bitcoin Unlimited 将生成的最大块,请运行:
bitcoin-cli setminingmaxblock blocksize
例如,要设置 2MB 块,请使用:
bitcoin-cli setminingmaxblock 2000000
要在 bitcoin.conf 或命令行中更改此字段,请使用:
blockmaxsize=
例如,要设置 3MB 块,请使用:
块最大大小=3000000
您可以通过运行来发现最大块大小:
bitcoin-cli getminingmaxblock
矿工可以通过 CLI/RPC 或配置文件设置区块版本标志:
从 CLI/RPC,
bitcoin-cli setblockversion (version number or string)
例如:
以下都选择投票给 2MB 块:
bitcoin-cli setblockversion 0x30000000 bitcoin-cli setblockversion 805306368 bitcoin-cli setblockversion BIP109
以下不投票支持 2MB 块:
bitcoin-cli setblockversion 0x20000000 bitcoin-cli setblockversion 536870912 bitcoin-cli setblockversion BASE
您可以使用以下命令发现当前块版本:
bitcoin-cli getblockversion
来自bitcoin.conf:
块版本=805306368
请注意,您必须在 bitcoin.conf 文件中以十进制格式指定版本。这是 Linux 中的一个简单转换: python -c \”print \’%d\’ % 0x30000000\”
Bitcoin Unlimited 跟踪多个数据源,如果一个源未提供请求的数据,则可以快速从其他源请求块或交易。要更改重试率,请在您的 bitcoin.conf 中以微秒为单位进行设置:
事务重试间隔:
txretryinterval=2000000
块重试间隔:
blkretryinterval=2000000
更大的交易内存池允许您的节点成功接收加速块(它增加了您在加速块中引用交易的机会)并从更大的可用交易集中进行选择。要更改内存池大小,请在 bitcoin.conf 中进行配置:
maxmempool=
因此 4GB 内存池的配置如下:
最大内存池=4096
要更改出现在已挖掘区块的 coinbase 消息中的字符串,请运行:
bitcoin-cli setminercomment \"your mining comment\"
显示当前字符串:
bitcoin-cli getminercomment
当您重新启动 bitcoind 时,内存池开始为空。如果快速找到一个块,这可能会导致一个交易很少的块。可以使用不同的 Bitcoin Unlimited 节点的内存池“启动”一个新的 bitcoind 实例。为此,请转到具有完整内存池的节点上的 CLI,连接到您的新节点,然后将事务推送到该节点。
bitcoin-cli addnodeonetry bitcoin-cli pushtx
Bitcoin Unlimited 可用于验证从其他 Bitcoin Unlimited 版本或其他比特币客户端收到的块模板。这确保了 Bitcoin Unlimited 将在开采区块后接受该区块,从而允许矿工在其采矿网络中部署多个客户端。请注意,如果该块不是基于此客户端看到的链提示构建的,则此 API 将返回错误。因此,客户端与创建块模板的客户端完全同步非常重要。您可以通过“addnode”显式连接它们来做到这一点。
块验证 RPC 使用与“submitblock” RPC 相同的调用语法,如果块验证失败,则返回 JSONRPCException。有关详细的 Python 示例,请参阅“qa/rpc-tests/validateblocktemplate.py”。
bitcoin-cli validateblocktemplate