TBD Describe how exactly sending of new jobs before the next block is found works.
nTime
field can be rolled once per second with the following notes:- Mining proxy must not interpret greater than minimum
nTime
as invalid submission. - Device MAY roll
nTime
once per second. - Pool SHOULD accept
nTime
which is within the consensus limits. - Pool MUST accept
nTime
rolled once per second.
The protocol allows nTime
rolling in the hardware as long as the hardware can roll the nTime
field once per second.
Modern bitcoin ASIC miners do/will support nTime
rolling in hardware because it is the most efficient way to expand hashing space for one hashing core/chip.
The nTime
field is part of the second SHA256 block so it shares midstates with the nonce.
Rolling nTime
therefore can be implemented as efficiently as rolling nonce, with lowered communication with a mining chip over its communication channels.
The protocol needs to allow and support this.
- Legacy mode: update extranonce1, don’t send all the time (send common merkle-root)
- mining on a locally obtained prevhash (server SHOULD queue the work for some time if the miner has faster access to the network).
- Proxying with separated channels helps with merging messages into TCP stream, makes reconnecting more efficient (and done in proxy, not HW), allows to negotiate work for all devices at once.
- Evaluate reaching the design goals.
- Add promise protocol extension support. It is mainly for XMR and ZEC, but can be addressed in generic way already. Promise construction can be coin specific, but the general idea holds for all known use cases.
v2 ST - protocol v2 (this), standard channel
v2 EX - protocol v2, extended channel
v1 - original stratum v1 protocol
Typical scenario for end mining devices, header-only mining. The device:
- Sets up the connection without enabling extended channels.
- Opens a Standard channel or more (in the future).
- Receives standard jobs with Merkle root provided by the upstream node.
- Submits standard shares.
Translation from v2 clients to v2 upstream, without aggregating difficulty.
Transparent proxy (connection aggregation):
- Passes all
OpenChannel
messages from downstream connections to the upstream, with updatedrequest_id
for unique identification. - Associates
channel_id
given byOpenChannel.Success
with the initiating downstream connection. All further messages addressed to thechannel_id
from the upstream node are passed only to this connection, withchannel_id
staying stable.
Proxy:
- Translates all standard ...
V1
(todo difficulty aggregation with info about the devices)
Translation from v1 clients to v2 upstream.
The proxy:
- Accept Opens ...
...
The original stratum protocol uses json, which has very bad ratio between the payload size and the actual information transmitted. Designing a binary based protocol yields better data efficiency. Technically, we can use the saved bandwidth for more frequent submits to further reduce the variance in measured hash rate and/or to allow individual machines to submit its work directly instead of using work-splitting mining proxy.
- upstream stratum node: responsible for providing new mining jobs, information about new prevhash, etc.
- downstream stratum node: consumes mining jobs by physically performing proof-of-work computations or by passing jobs onto further downstream devices.
- channel ID: identifies an individual mining device or proxy after the channel has been opened. Upstream endpoints perform job submission
- public key: ...
- signature: signature encoded as...(?)
- BIP320: this proposal identifies general purpose bits within version field of bitcoin block header. Mining devices use these bits to extend their search space.
- Merkle root: the root hash of a Merkle tree which contains the coinbase transaction and the transaction set consisting of all the other transactions in the block.
- Write more about channel ID being identifier valid for a particular connection only. It works only in the namespace of it.
- Refresh sequence diagrams.
- Is it useful to have channel-based reconnect? Or is connection-based enough?
- Decide on how to control a single device and allow it to have open multiple channels.
- Describe precisely scenarios with
SetNewPrevHash
with regards to repeated block height - Decide on how to manage assignment of message ID's and the size of the message ID space. Shall we allow 2 level multiplexing? E.g. dedicate an ID to a class of vendor messages, while allowing the vendor to assign custom messages ID’s within the class?
- More information about telemetry data
+----------------------------------------------------------------------------------------------------------------------+
| Hashing Power Information |
+-------------------------+------------------+-------------------------------------------------------------------------+
| Field Name | Data Type | Description |
+-------------------------+------------------+-------------------------------------------------------------------------+
| aggregated_device_count | U32 | Number of aggregated devices on the channel. An end mining device must |
| | | send 1. A proxy can send 0 when there are no connections to it yet (in |
| | | aggregating mode) |
+-------------------------+------------------+-------------------------------------------------------------------------+