Search code examples
bitcoindogecoin-api

Trying to understand nbits value from stratum protocol


I'm looking at the stratum protocol and I'm having a problem with the nbits value of the mining.notify method. I have trouble calculating it, I assume it's the currency difficulty.

I pull a notify from a dogecoin pool and it returned 1b3cc366 and at the time the difficulty was 1078.52975077.

I'm assuming here that 1b3cc366 should give me 1078.52975077 when converted. But I can't seem to do the conversion right.

I've looked here, here and also tried the .NET function BitConverter.Int64BitsToDouble.

Can someone help me understand what the nbits value signify?


Solution

  • You are right, nbits is current network difficulty.

    Difficulty encoding is throughly described here.

    Hexadecimal representation like 0x1b3cc366 consists of two parts:

    • 0x1b -- number of bytes in a target
    • 0x3cc366 -- target prefix

    This means that valid hash should be less than 0x3cc366000000000000000000000000000000000000000000000000 (it is exactly 0x1b = 27 bytes long).

    Floating point representation of difficulty shows how much current target is harder than the one used in the genesis block.

    Satoshi decided to use 0x1d00ffff as a difficulty for the genesis block, so the target was 0x00ffff0000000000000000000000000000000000000000000000000000.

    And 1078.52975077 is how much current target is greater than the initial one:

    $ echo 'ibase=16;FFFF0000000000000000000000000000000000000000000000000000 / 3CC366000000000000000000000000000000000000000000000000' | bc -l
    1078.52975077482646448605