DATUM 入门
你的节点构建区块,你的 gateway 与矿池通信,你的矿机向你的 gateway 提交哈希。七个步骤,按顺序 — 每一步都以"怎么知道成功了"结尾。
哪个矿池?步骤相同;只有端口、密钥和付款规则不同。
不要跳步。 节点没准备好的 gateway 也会连上我们、停在零,从外面看完全正常。做完一步再开始下一步。
赶时间? 对 CAROUSEL 和 CHIRP,一条命令替你完成第 2 到第 5 步:找到你的节点、(如果你允许)安装编译工具、克隆并编译 gateway、写入配置、以服务方式启动并注册你的地址。步骤仍然值得读一遍:这就是脚本做的事,出问题时你会用到。
curl -fsSL https://b.pyblock.xyz:8443/gateway | sh -s -- carousel YOUR_BTC_ADDRESS
curl -fsSL https://b.pyblock.xyz:8443/gateway | sh -s -- chirp YOUR_BTC_ADDRESS
有用的变量:PYBLOCK_CLI="bitcoin-cli -datadir=/data" 若没有自动检测到节点 · PYBLOCK_STRATUM=23334 矿机要连的端口 · PYBLOCK_INSTALL_DEPS=1 允许安装编译依赖 · PYBLOCK_NO_SYSTEMD=1 用 nohup 而不是服务运行。
WAVICLES 还没有安装脚本:按步骤手动做,大约十分钟。
1运行一个 BLAKE2b 节点
DATUM 需要一个跟随 BLAKE2b 分叉的 Bitcoin Knots 节点(Knots ≥ 29.4),并已完全同步。普通的 Knots 或 Core 不行:它不认识 blake2b 规则,不会返回可用的工作。
- 完全同步。仍在追赶的节点不会返回模板。
- RPC 可达,从 gateway 运行的地方 — 同一台机器或你的局域网 — 用
rpcuser/rpcpassword 或 cookie 文件。 blockreservedweight=100000。没有它,模板可能不给付款输出留空间,区块就只付给矿池。- 你的节点,你的规则。哪些交易进入你的区块,由你节点的内存池策略决定,而不是由我们决定。我们自己的网关运行 Plumb(带额外数据过滤器的 Knots,由我们从已签名的标签自行编译);你的网关使用你所连接的那个节点。
bitcoin.conf 里与此相关的部分:
server=1
rpcuser=YOUR_RPC_USER
rpcpassword=YOUR_RPC_PASSWORD
rpcallowip=127.0.0.1
blockreservedweight=100000
怎么知道成功了: 这条命令返回模板而不是错误。如果显示
unknown rule blake2b,节点不在分叉上;如果是别的错误,先修好节点 — 没有它 gateway 永远跑不起来。
bitcoin-cli -rpcport=8342 getblocktemplate '{"rules":["segwit","blake2b"]}'
2下载并编译 gateway
gateway 是一个小 C 程序,位于你的节点和矿池之间:向节点要工作,交给你的矿机,并告诉我们是谁干的活,好让区块付钱给他们。没有二进制可下载 — 从源码编译,几分钟搞定。
编译依赖(选你的发行版):
Debian / Ubuntusudo apt-get update && sudo apt-get install -y git cmake build-essential libcurl4-openssl-dev libjansson-dev libmicrohttpd-dev libsodium-dev pkg-config
Fedora / RHELsudo dnf install -y git cmake gcc gcc-c++ libcurl-devel jansson-devel libmicrohttpd-devel libsodium-devel pkgconf
Archsudo pacman -S --needed git cmake base-devel curl jansson libmicrohttpd libsodium
克隆并编译。二进制在 build/datum_gateway:
git clone --depth 1 https://gitlab.com/astrolexis-group1/datum-carousel.git ~/pyblock-gateway/src
cd ~/pyblock-gateway/src
cmake -B build -DCMAKE_BUILD_TYPE=Release && cmake --build build -j$(nproc)
ls -l build/datum_gateway
git clone --depth 1 https://github.com/CONVOYMining/datum_gateway.git ~/pyblock-gateway/src
cd ~/pyblock-gateway/src
cmake -B build -DCMAKE_BUILD_TYPE=Release && cmake --build build -j$(nproc)
ls -l build/datum_gateway
怎么知道成功了: ./build/datum_gateway --help 打印用法。如果还提到 key_file,说明你的版本支持持久的 gateway 身份(很好 — 见第 3 步)。
3配置 — 指向我们的 Prime
一个 JSON 文件。下面的内容就是安装脚本写的;只有大写的部分由你填写。点击复制,保存为二进制旁边的 carousel.json,并 chmod 600 — 里面有你节点的 RPC 密码。一个 JSON 文件。下面的内容就是安装脚本写的;只有大写的部分由你填写。点击复制,保存为二进制旁边的 chirp.json,并 chmod 600 — 里面有你节点的 RPC 密码。一个 JSON 文件。下面的内容就是安装脚本写的;只有大写的部分由你填写。点击复制,保存为二进制旁边的 wavicles.json,并 chmod 600 — 里面有你节点的 RPC 密码。
{
"bitcoind": {
"rpcuser": "YOUR_RPC_USER",
"rpcpassword": "YOUR_RPC_PASSWORD",
"rpcurl": "127.0.0.1:8342",
"work_update_seconds": 40,
"notify_fallback": true
},
"stratum": {
"listen_port": 23334,
"max_clients_per_thread": 1024,
"max_threads": 4,
"max_clients": 4096,
"vardiff_min": 1024,
"vardiff_target_shares_min": 8,
"share_stale_seconds": 120,
"fingerprint_miners": true
},
"mining": {
"pool_address": "YOUR_BLAKE2B_ADDRESS",
"coinbase_tag_primary": "PyBLOCK-CAROUSEL",
"coinbase_tag_secondary": "YOUR_NAME",
"coinbase_unique_id": 4242,
"pow_algorithm": "blake2b"
},
"api": { "listen_addr": "127.0.0.1", "listen_port": 7152, "admin_password": "CHOOSE_A_PASSWORD" },
"logger": {
"log_to_console": true,
"log_to_file": true,
"log_file": "carousel.log",
"log_rotate_daily": true,
"log_level_file": 2
},
"datum": {
"pool_host": "b.pyblock.xyz",
"pool_port": 28916,
"pool_pubkey": "36f94e73ae4c9b9c479c544f035bc9e69565e9d882112031cb27032ecbac818e35a7976501d5cd0453f9fc3e9823127839225e89c45a2cc80902ba0a7e09577b",
"key_file": "gateway.key",
"pool_pass_workers": true,
"pool_pass_full_users": true,
"always_pay_self": true,
"pooled_mining_only": false,
"protocol_global_timeout": 60
}
}
{
"bitcoind": {
"rpcuser": "YOUR_RPC_USER",
"rpcpassword": "YOUR_RPC_PASSWORD",
"rpcurl": "127.0.0.1:8342",
"work_update_seconds": 40,
"notify_fallback": true
},
"stratum": {
"listen_port": 23334,
"max_clients_per_thread": 1024,
"max_threads": 4,
"max_clients": 4096,
"vardiff_min": 1024,
"vardiff_target_shares_min": 8,
"share_stale_seconds": 120,
"fingerprint_miners": true
},
"mining": {
"pool_address": "YOUR_BLAKE2B_ADDRESS",
"coinbase_tag_primary": "PyBLOCK-CHIRP",
"coinbase_tag_secondary": "YOUR_NAME",
"coinbase_unique_id": 4242,
"pow_algorithm": "blake2b"
},
"api": { "listen_addr": "127.0.0.1", "listen_port": 7152, "admin_password": "CHOOSE_A_PASSWORD" },
"logger": {
"log_to_console": true,
"log_to_file": true,
"log_file": "chirp.log",
"log_rotate_daily": true,
"log_level_file": 2
},
"datum": {
"pool_host": "b.pyblock.xyz",
"pool_port": 28917,
"pool_pubkey": "cf995bb5b975ef4b90932f0608c98a033679092e976982621243cd1226803c6417442870dff8372b11363d8f80665b1f298cc23132bf2dab23958a4bcc7d4f72",
"key_file": "gateway.key",
"pool_pass_workers": true,
"pool_pass_full_users": true,
"always_pay_self": true,
"pooled_mining_only": false,
"protocol_global_timeout": 60
}
}
{
"bitcoind": {
"rpcuser": "YOUR_RPC_USER",
"rpcpassword": "YOUR_RPC_PASSWORD",
"rpcurl": "127.0.0.1:8342",
"work_update_seconds": 40,
"notify_fallback": true
},
"stratum": {
"listen_port": 23334,
"max_clients_per_thread": 1024,
"max_threads": 4,
"max_clients": 4096,
"vardiff_min": 1,
"vardiff_target_shares_min": 8,
"share_stale_seconds": 120,
"fingerprint_miners": true
},
"mining": {
"pool_address": "YOUR_BLAKE2B_ADDRESS",
"coinbase_tag_primary": "PyBLOCK-WAVICLES-BLAKE2b",
"coinbase_tag_secondary": "YOUR_NAME",
"coinbase_unique_id": 4242,
"pow_algorithm": "blake2b"
},
"api": { "listen_addr": "127.0.0.1", "listen_port": 7152, "admin_password": "CHOOSE_A_PASSWORD" },
"logger": {
"log_to_console": true,
"log_to_file": true,
"log_file": "wavicles.log",
"log_rotate_daily": true,
"log_level_file": 2
},
"datum": {
"pool_host": "b.pyblock.xyz",
"pool_port": 28915,
"pool_pubkey": "b5e0b0326b964a92f3046c73a76b9e98173e0c3ea0e0ca771f4e6a3dd92e2935b2caad2a088fdd7bf0a48fc0c41776a9abb13c7d4c6964b53a9ceee4c775e036",
"key_file": "gateway.key",
"pool_pass_workers": true,
"pool_pass_full_users": true,
"always_pay_self": true,
"pooled_mining_only": true,
"protocol_global_timeout": 60
}
}
- bitcoind — 你节点的 RPC 用户名、密码和
host:port(BLAKE2b 节点通常监听 8342)。cookie 文件也可以:用户名和密码是 .cookie 的两半。
- stratum.listen_port — 你的矿机要连接的端口(这里是 23334)。vardiff_min 是 share 难度下限:GPU / CPU 用
1,只有 ASIC 的话用 1024 或更高 — DATUM 默认的 16384 是 SHA-256 的量级,BLAKE2b 显卡永远达不到。
- mining.pool_address — 你的 BLAKE2b 地址。必填:填了无效地址 gateway 会在一秒内退出。你的 node-runner 份额付到这里,矿池不可达期间你找到的区块也全部付到这里。
- coinbase_tag_secondary — 你的名字。会写进你的 gateway 发布的每个区块的 scriptsig,永久上链。
- datum — 我们的 Prime:
pool_host b.pyblock.xyz,pool_port 28916,以及上面 128 位 hex 的 pool_pubkey。pool_pass_full_users: true 把每台矿机记到它登录用的地址。key_file 让 gateway 重启后保持同一身份 — 矿池按这把密钥给 node-runner 记账;只有你的版本不支持时才删掉这行。datum — 我们的 Prime:pool_host b.pyblock.xyz,pool_port 28917,以及上面 128 位 hex 的 pool_pubkey。pool_pass_full_users: true 把每台矿机记到它登录用的地址。key_file 让 gateway 重启后保持同一身份 — 矿池按这把密钥给 node-runner 记账;只有你的版本不支持时才删掉这行。datum — 我们的 Prime:pool_host b.pyblock.xyz,pool_port 28915,以及上面 128 位 hex 的 pool_pubkey。pool_pass_full_users: true 把每台矿机记到它登录用的地址。key_file 让 gateway 重启后保持同一身份 — 矿池按这把密钥给 node-runner 记账;只有你的版本不支持时才删掉这行。
- pooled_mining_only — 矿池不可达时怎么办。
false:gateway 继续挖,找到的区块 100% 付给 pool_address。true:等待矿池。
怎么知道成功了: python3 -m json.tool carousel.json 能原样打印文件而不报错 — 少一个逗号是 gateway 拒绝启动最常见的原因。python3 -m json.tool chirp.json 能原样打印文件而不报错 — 少一个逗号是 gateway 拒绝启动最常见的原因。python3 -m json.tool wavicles.json 能原样打印文件而不报错 — 少一个逗号是 gateway 拒绝启动最常见的原因。
4运行
先在前台运行,看日志。几秒内应该打印矿池的 DATUM Pool MOTD — 这就是握手完成:你的 gateway 证明了它的密钥,Prime 接受了。
cd ~/pyblock-gateway && chmod 600 carousel.json
./src/build/datum_gateway -c carousel.json
cd ~/pyblock-gateway && chmod 600 chirp.json
./src/build/datum_gateway -c chirp.json
cd ~/pyblock-gateway && chmod 600 wavicles.json
./src/build/datum_gateway -c wavicles.json
然后做成服务,重启也能活。安装脚本写的就是这个 unit;改一下路径和用户:
/etc/systemd/system/pyblock-gateway-carousel.service[Unit]
Description=PyBLOCK carousel DATUM gateway (your node, your block)
After=network-online.target
[Service]
User=YOUR_USER
ExecStart=/home/YOUR_USER/pyblock-gateway/src/build/datum_gateway -c /home/YOUR_USER/pyblock-gateway/carousel.json
Restart=always
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
/etc/systemd/system/pyblock-gateway-chirp.service[Unit]
Description=PyBLOCK chirp DATUM gateway (your node, your block)
After=network-online.target
[Service]
User=YOUR_USER
ExecStart=/home/YOUR_USER/pyblock-gateway/src/build/datum_gateway -c /home/YOUR_USER/pyblock-gateway/chirp.json
Restart=always
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
/etc/systemd/system/pyblock-gateway-wavicles.service[Unit]
Description=PyBLOCK wavicles DATUM gateway (your node, your block)
After=network-online.target
[Service]
User=YOUR_USER
ExecStart=/home/YOUR_USER/pyblock-gateway/src/build/datum_gateway -c /home/YOUR_USER/pyblock-gateway/wavicles.json
Restart=always
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload && sudo systemctl enable --now pyblock-gateway-carousel
journalctl -u pyblock-gateway-carousel -f
sudo systemctl daemon-reload && sudo systemctl enable --now pyblock-gateway-chirp
journalctl -u pyblock-gateway-chirp -f
sudo systemctl daemon-reload && sudo systemctl enable --now pyblock-gateway-wavicles
journalctl -u pyblock-gateway-wavicles -f
日志:journalctl -u pyblock-gateway-carousel -f(或配置里的 log_file)。gateway 还在 http://127.0.0.1:7152/ 提供一个小面板 — Clients 标签列出所有向它提交哈希的矿机。日志:journalctl -u pyblock-gateway-chirp -f(或配置里的 log_file)。gateway 还在 http://127.0.0.1:7152/ 提供一个小面板 — Clients 标签列出所有向它提交哈希的矿机。日志:journalctl -u pyblock-gateway-wavicles -f(或配置里的 log_file)。gateway 还在 http://127.0.0.1:7152/ 提供一个小面板 — Clients 标签列出所有向它提交哈希的矿机。
5注册你的地址(CAROUSEL 和 CHIRP)
在这两个 Prime 上,node-runner 的份额记在 gateway 密钥上,所以矿池需要知道这把密钥付到哪个地址。安装脚本会替你做;手动的话是在运行 gateway 的机器上发两个请求(只接受来自 gateway 当前连接 IP 的注册 — 这就是别人无法冒领你密钥的原因)。
1 · 问矿池从你的 IP 看到的是哪把 gateway 密钥:
curl -sS 'https://b.pyblock.xyz:8443/api/noderunner_claim.php?mode=whoami&product=carousel'
curl -sS 'https://b.pyblock.xyz:8443/api/noderunner_claim.php?mode=whoami&product=chirp'
2 · 把它绑定到你的地址(用上一步返回的密钥):
curl -sS -X POST https://b.pyblock.xyz:8443/api/noderunner_claim.php \
-d product=carousel -d gateway=GATEWAY_KEY_FROM_WHOAMI -d address=YOUR_BLAKE2B_ADDRESS
curl -sS -X POST https://b.pyblock.xyz:8443/api/noderunner_claim.php \
-d product=chirp -d gateway=GATEWAY_KEY_FROM_WHOAMI -d address=YOUR_BLAKE2B_ADDRESS
怎么知道成功了: 返回 "ok": true。用同一地址重复执行无害;更改已注册的地址需要人工处理 — 在 Telegram 上找我们。
WAVICLES 不需要注册:你在工作窗口里的身份就是 pool_address。
6把矿机指向你的 gateway
每台矿机都连到你自己的 gateway 的 stratum 端口 — 任何 BLAKE2b 矿机都行:GPU、CPU 或 Sia 级 ASIC。gateway 的地址是你机器的地址(局域网或公网),不是我们的。
URL stratum+tcp://YOUR_GATEWAY_IP:23334
Username YOUR_BLAKE2B_ADDRESS.rig-01
Password x
- 用户名 = 一个 BLAKE2b 地址(
bc1q… 或 1…),点后面加 worker 名可以。设置 pool_pass_full_users: true 时,这就是每台矿机的收款地址。 - 密码:
x。会被忽略。 - gateway 不检查用户名。原样转发;我们拒绝任何不可付款的地址,该矿机的份额落到
pool_address。
永远不要把矿机指向矿池。 b.pyblock.xyz:28916 是你的 gateway 与我们通信的地方。矿机连到那里挖不了。b.pyblock.xyz:28917 是你的 gateway 与我们通信的地方。矿机连到那里挖不了。b.pyblock.xyz:28915 是你的 gateway 与我们通信的地方。矿机连到那里挖不了。
怎么知道成功了: gateway 的 Clients 标签列出了矿机,你在已连接 node runner 里的那一行几分钟内开始计 share。
7确认你拿到了钱
从这里开始是矿池的事。一切都在链上,在区块自身的 coinbase 里:不托管,无需提现。
- CAROUSEL:当你的 gateway 发布区块时,爆块者拿 99%,PyBLØCK 拿 1% — 用自己的节点没有单独的 node-runner 份额,全是你的。在那之前你什么都拿不到:solo 就是 solo。
- CHIRP:任何成员爆的每个区块都按资历(7 天任期 + 24 小时算力)付给所有合格成员 — 100% 归辛迪加,0% PyBLØCK。你的矿机在第一个 share 被接受时进入登记表。
- WAVICLES:每个区块按工作量付给整个工作窗口(8 × 全网难度)— 100% 进入窗口,0% PyBLØCK。最低累计 1,000 sats;不足的份额分给达到门槛的矿工,绝不归矿池。
怎么知道成功了: 你的地址出现在
它自己的页面上 — 算力、worker 和收到的每一个 coinbase 输出。
整个设置就是这些。 矿池从不持有一聪:爆块者直接在区块里付给你。备份好 gateway.key 和你的配置 — 它们是你 gateway 的身份。
还没有节点?今天照样可以开始
在你搭建节点的同时,先通过 PyBLØCK 的节点挖。同样的产品、同样的付款规则 — 只是区块由我们的节点和网关构建,而不是你的。所有端口和三个字段都在
开始页。
在 WAVICLES 和 CHIRP,那条路同样是 0% 手续费(CAROUSEL 保持原有分配)。自带节点仍然更好:区块由你构建,更多独立模板让链保持去中心化。