Skip to content

Instantly share code, notes, and snippets.

@YihaoPeng
Last active July 26, 2023 14:07
Show Gist options
  • Star 23 You must be signed in to star a gist
  • Fork 9 You must be signed in to fork a gist
  • Save YihaoPeng/254d9daf3a5a80131507f32be6ed92df to your computer and use it in GitHub Desktop.
Save YihaoPeng/254d9daf3a5a80131507f32be6ed92df to your computer and use it in GitHub Desktop.
Stratum挖矿协议

Stratum挖矿协议: 该协议是由SlushPool制定的,请参阅其官方文档:https://slushpool.com/help/manual/stratum-protocol

以下所有报文均使用\n做为行结束符。


矿机订阅:

{"id": 1, "method": "mining.subscribe", "params": []}

服务器回应:

{"id": 1, "result": [ [ ["mining.set_difficulty", "b4b6693b72a50c7116db18d6497cac52"], ["mining.notify", "ae6812eb4cd7735a302a8a9dd95cf71f"]], "08000002", 4], "error": null}

如果没有收到该回应,则可能原因有:

  1. 连接的不是Stratum服务器。
  2. Stratum服务器工作状态异常。
  3. 请求报文的行结束符不为\n,在粘贴多行文本到终端时可能发生这种现象,此时请单行粘贴并手动按回车。

订阅成功后,矿机进行矿工名认证

{"params": ["把它替换为你真实的矿工名", "password"], "id": 2, "method": "mining.authorize"}

服务器回应:

{"error": null, "id": 2, "result": true}

若回应不为true,则 result 字段包含错误信息。 若没有收到任何回应,可能的原因有:

  1. Stratum Server状态异常。
  2. 行结束符问题。
  3. 订阅和认证相隔太久,服务器放弃认证矿机。

认证成功后,Stratum Server会主动推送挖矿难度和挖矿任务等信息,如下:

(难度)

{"id": null, "method": "mining.set_difficulty", "params": [16384]}

(任务)

{"params": ["0", "4d16b6f85af6e2198f44ae2a6de67f78487ae5611b77c6c0440b921e00000000", "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff20020862062f503253482f04b8864e5008", "072f736c7573682f000000000100f2052a010000001976a914d23fcdf86f7e756a64a7a9688ef9903327048ed988ac00000000", [], "00000002", "1c2ac4af", "504e86b9", false], "id": null, "method": "mining.notify"}

如果没有收到难度推送,则说明Stratum Server工作不正常。 如果没有收到任务推送,则说明Stratum Server可能此时没有可推送给你的任务。对于BTCPool,可能是它没有从Kafka中读取到可用的任务,这可能是因为jobmaker没有产生对应的任务,或者kafka状态异常。当然,也有可能是Stratum Server状态异常。


当矿机挖到一个符合矿池设定难度的share之后,它会进行share提交:

{"params": ["slush.miner1", "0", "00000001", "504e86ed", "b2957c02"], "id": 4, "method": "mining.submit"}

服务器回应:

{"error": null, "id": 4, "result": true}

若result不为true,则会包含拒绝该share的理由。


请注意,不是每个submit都会挖到区块。对于一个正常的矿池来说,矿机提交的大部分submit都是挖不到区块的,但是偶尔个别的submit达到了全网难度要求,因此能够挖到区块。

当矿机挖到区块时,矿机的提交动作和平常不会有什么不同。但是,矿机和矿池均可对share难度和job中的bits/target进行比较来发现它挖到了一个符合全网难度的share。

对于联合挖矿也是如此,检查share难度是否满足job中联合挖矿币种的难度。若正在联合挖多个币种,只需检查是否满足最低难度。

需要注意的是,联合挖矿的币种可能比正在挖掘的比特币难度高,或者难度低。

若比特币难度高,则挖到比特币区块则必然挖到联合挖矿币种区块,而反过来则不一定。

若联合挖矿币种难度高(比如BCH联合挖掘域名币),则在挖到比特币时不一定能挖到联合挖矿币种,但反过来则是一定能挖到。  

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment