名称: stratum-v2 描述: 当用户询问“什么是 Stratum v2”、“挖矿协议 v2”、“二进制挖矿协议”、“加密挖矿”、“作业声明协议”,或需要为 BSV 挖矿基础设施理解 Stratum v2 时,应使用此技能。
Stratum v2 挖矿协议
Stratum v2 是由 Braiins(Slush Pool)开发的下一代挖矿协议,旨在解决 Stratum v1 的局限性。它引入了二进制帧、端到端加密和去中心化作业声明。
何时使用
- 规划挖矿基础设施升级
- 评估从 v1 迁移到 v2
- 理解现代挖矿安全性
- 实施下一代矿池软件
- 构建去中心化挖矿解决方案
与 v1 的关键改进
| 特性 | Stratum v1 | Stratum v2 |
|---|---|---|
| 格式 | JSON-RPC 文本 | 二进制帧 |
| 带宽 | ~100% 基准 | ~30% 减少 |
| 加密 | 无(明文) | Noise Protocol(AEAD) |
| 认证 | 基于密码 | 基于密码学 |
| 作业选择 | 矿池控制 | 矿工可声明 |
| 效率 | 较高延迟 | 较低延迟 |
协议架构
Stratum v2 包含三个子协议:
1. 挖矿协议
矿池与矿工之间的核心工作分配。
2. 作业声明协议
允许矿工构建自己的区块模板。
3. 模板分发协议
从比特币节点分发区块模板到矿池/矿工。
二进制帧
消息结构
+------------------+------------------+------------------+
| 扩展类型 | 消息类型 | 消息长度 |
| (2 字节) | (1 字节) | (3 字节) |
+------------------+------------------+------------------+
| 负载数据 |
| (可变长度) |
+--------------------------------------------------------+
数据类型
| 类型 | 描述 | 大小 |
|---|---|---|
| U8 | 无符号 8 位 | 1 字节 |
| U16 | 无符号 16 位 LE | 2 字节 |
| U24 | 无符号 24 位 LE | 3 字节 |
| U32 | 无符号 32 位 LE | 4 字节 |
| U256 | 256 位哈希 | 32 字节 |
| STR0_255 | 长度前缀字符串 | 1 + n 字节 |
| B0_32 | 长度前缀字节 | 1 + n 字节 |
| B0_64K | 长度前缀字节 | 2 + n 字节 |
| SEQ0_64K | 项目序列 | 2 + 项目数 |
通道类型
标准通道
- 基本挖矿操作
- 固定扩展随机数大小
- 矿池分配难度
扩展通道
- 支持更大扩展随机数
- 自定义币基前缀
- 仅头部挖矿模式
组通道
- 聚合多个矿工
- 代理/农场配置
- 高效多路复用
加密(Noise Protocol)
Stratum v2 使用 Noise Protocol Framework:
- 握手: Noise_NX_secp256k1_ChaChaPoly_SHA256
- 密码: ChaCha20-Poly1305(AEAD)
- 曲线: secp256k1
- 哈希: SHA-256
连接流程
1. 客户端发起 Noise 握手
2. 服务器提供证书(由权威机构签名)
3. 加密通道建立
4. 所有后续消息加密
安全益处
- 中间人攻击防护
- 算力劫持预防
- 矿池冒充预防
- 矿工操作隐私
挖矿协议消息
设置消息
SetupConnection
{
protocol: U32,
min_version: U16,
max_version: U16,
flags: U32,
endpoint_host: STR0_255,
endpoint_port: U16,
vendor: STR0_255,
hardware_version: STR0_255,
firmware: STR0_255,
device_id: STR0_255
}
SetupConnection.Success
{
used_version: U16,
flags: U32
}
通道消息
OpenStandardMiningChannel
{
request_id: U32,
user_identity: STR0_255,
nominal_hash_rate: F32,
max_target: U256
}
OpenStandardMiningChannel.Success
{
request_id: U32,
channel_id: U32,
target: U256,
extranonce_prefix: B0_32,
group_channel_id: U32
}
作业消息
NewMiningJob
{
channel_id: U32,
job_id: U32,
future_job: BOOL,
version: U32,
version_rolling_allowed: BOOL
}
SetNewPrevHash
{
channel_id: U32,
job_id: U32,
prev_hash: U256,
min_ntime: U32,
nbits: U32
}
份额提交
SubmitSharesStandard
{
channel_id: U32,
sequence_number: U32,
job_id: U32,
nonce: U32,
ntime: U32,
version: U32
}
SubmitShares.Success
{
channel_id: U32,
last_sequence_number: U32,
new_submits_accepted_count: U32,
new_shares_sum: U64
}
作业声明协议
允许矿工选择交易构建区块:
流程
- 矿工连接到模板分发节点
- 矿工接收包含交易的区块模板
- 矿工向矿池声明自定义作业
- 矿池验证并接受声明
- 矿工处理自构建区块
消息
DeclareMiningJob
{
request_id: U32,
mining_job_token: B0_255,
version: U32,
coinbase_prefix: B0_64K,
coinbase_suffix: B0_64K,
tx_short_hash_nonce: U64,
tx_short_hash_list: SEQ0_64K[U64],
tx_hash_list_hash: U256,
excess_data: B0_64K
}
益处
- 去中心化交易选择
- 减少矿池审查风险
- 提高比特币去中心化
- 矿工控制区块内容
模板分发协议
从比特币节点分发模板到矿池/矿工:
NewTemplate
{
template_id: U64,
future_template: BOOL,
version: U32,
coinbase_tx_version: U32,
coinbase_prefix: B0_64K,
coinbase_tx_input_sequence: U32,
coinbase_tx_value_remaining: U64,
coinbase_tx_outputs_count: U32,
coinbase_tx_outputs: B0_64K,
coinbase_tx_locktime: U32,
merkle_path: SEQ0_255[U256]
}
比较:v1 与 v2 会话
Stratum v1 会话
客户端: {"method":"mining.subscribe","params":["Agent/1.0"],"id":1}
服务器: {"result":[[["mining.set_difficulty","1"],["mining.notify","1"]],"08000000",4],"id":1}
客户端: {"method":"mining.authorize","params":["user.worker",""],"id":2}
服务器: {"result":true,"id":2}
服务器: {"method":"mining.set_difficulty","params":[1024]}
服务器: {"method":"mining.notify","params":["job1","prev...","cb1","cb2",[],"ver","bits","time",true]}
客户端: {"method":"mining.submit","params":["user.worker","job1","00000000","time","nonce"],"id":3}
服务器: {"result":true,"id":3}
Stratum v2 会话
1. Noise 握手(加密通道建立)
2. SetupConnection → SetupConnection.Success
3. OpenStandardMiningChannel → OpenStandardMiningChannel.Success
4. SetTarget(难度)
5. NewMiningJob + SetNewPrevHash(作业分配)
6. SubmitSharesStandard → SubmitShares.Success
迁移考虑
何时迁移
- 安全性优先(需要 MITM 防护)
- 带宽成本显著
- 去中心化目标
- 现代基础设施刷新
何时留在 v1
- 旧硬件兼容性
- 现有稳定基础设施
- 简单矿池操作
- 无安全担忧
混合方法
许多矿池同时运行:
- v1 在端口 3333(旧版兼容)
- v2 在端口 3334(现代矿工) 翻译代理可以将 v1 矿工桥接到 v2 矿池。
BSV 考虑
当前状态
- BSV 矿池主要使用 Stratum v1
- GorillaPool 使用优化 v1 实现
- v2 采用取决于 ASIC 固件支持
BSV 特定特性
- 大区块模板(交易选择重要)
- getminingcandidate RPC(BSV 特定)
- submitminingsolution RPC(BSV 特定)
- 更高交易吞吐量
实施路径
- 从 Stratum v1 开始(成熟、兼容)
- 当 ASIC 生态系统准备好时添加 v2 支持
- 过渡期保持两者
参考实现
Stratum 参考实现(SRI):
- GitHub: stratum-mining/stratum
- 基于 Rust 的实现
- 生产就绪组件
组件:
roles/pool- 矿池角色roles/mining-proxy- 代理/翻译器roles/jd-client- 作业声明客户端roles/jd-server- 作业声明服务器
资源
实施状态
| 组件 | 可用性 |
|---|---|
| 协议规范 | 完整 |
| 参考实现 | 生产 |
| 矿池支持 | 增长中 |
| ASIC 固件 | 有限 |
| BSV 支持 | 未来 |
快速参考
Stratum v2 端口(典型):
- 3334 - 挖矿协议(加密)
- 8442 - 模板分发
- 8443 - 作业声明
关键 Crate(Rust):
[dependencies]
binary_sv2 = "1.0"
codec_sv2 = "1.0"
framing_sv2 = "1.0"
noise_sv2 = "1.0"