blockchain – How does fixing a block work in relation to the primary letter/quantity after the 0’s?


The comparability used is numeric

These are numbers not strings of characters. You may see this by wanting on the code within the 2009 primary.cpp of the Bitcoin reference implementation:

        uint256 hashTarget = CBigNum().SetCompact(pblock->nBits).getuint256();
        uint256 hash;


           if (hash <= hashTarget)
                pblock->nNonce = tmp.block.nNonce;
                assert(hash == pblock->GetHash());

                    //// debug print
                    printf("proof-of-work discovered  n  hash: %s  ntarget: %sn", hash.GetHex().c_str(), hashTarget.GetHex().c_str());

Observe that if (hash <= hashTarget) is a numeric comparability. Each hash and hashTarget are sort uint256 – an unsigned integer.

Numbers expressed in hexadecimal are nonetheless numbers

There’s a alternative of visible representations however the alternative made doesn’t change the underlying nature of the quantity or the best way during which numbers are in contrast arithmetically or at a machine degree in a pc.

Your instance, 00005fad, is a quantity expressed in hexadecimal (base 16), the identical quantity might be written in regular decimal (base 10) as 24493. Anybody unfamiliar with non-decimal representations akin to hexadecimal, octal and binary can verify this utilizing one thing just like the Home windows 10 calculator, within the menu select “Programmer Mode” then click on on “hex” and enter 5fad – it exhibits the identical worth in a number of completely different representations.

Main zeroes

The notion that Bitcoin cares concerning the variety of main zeroes in, say, a hexadecimal illustration, is a generally repeated mistake (do not ask me how I do know this).

In case you insist on writing numbers with main zeroes it’s nonetheless clearly true that 000015 (fifteen) with 4 main zeroes is smaller than 000150 (100 and fifty) with solely three main zeroes. It could nevertheless be a mistake to assume that smaller numbers at all times have extra main zeroes. Each you and Bitcoin know that 000017 (seventeen) is smaller than 000019 (nineteen) regardless that each have the identical variety of main zeroes.

It’s true that a is lower than b in precisely the identical manner that 7 is lower than 8 or that 2 is lower than 3. However it’s most likely a mistake to begin evaluating particular person digits in a specific visible illustration. The hash and hash targets are abnormal numbers (although giant) which can be in contrast in an abnormal manner.

So the place does this speak of main zeroes come from? It’s a part of a way of encoding the goal worth as an issue in a compact illustration. Bitcoin has some fairly arcane strategies of saving house in information which can be transmitted.



Lets have a look at some latest blocks (most up-to-date at prime, reverse chronological order)

Block Mined on Problem Hash bits
669315 2021-02-06 02:48 21434395961349 0000000000000000000bbefe7b336aab05ef49c9c6ccd70a895b3cc4669ac924
669314 2021-02-06 02:36 21434395961349 0000000000000000000ae88c36b136ef612f0a0622bdf614854a7810e3f781cf
669313 2021-02-06 02:34 21434395961349 0000000000000000000acd9e8fd6512d3832e98a8c87d049afbd805abd44d8c2
669312 2021-02-06 02:25 21434395961349 0000000000000000000beb9d24f999168c79fa58394868f9fcc5367c28f137dc
669311 2021-02-06 02:22 20823531150112 00000000000000000004f29390852281bae27d3662f648020bb47cced0d883b8
669310 2021-02-06 02:18 20823531150112 00000000000000000000cd7ef96b5f6687c8b49df40c2dec2128adc39827707e
669309 2021-02-06 01:54 20823531150112 00000000000000000009d6c5902b0b8598f2ebd0fe076581b039fe789b4daca6
669308 2021-02-06 01:37 20823531150112 0000000000000000000be631fd1026989a86cf9dae421e7eca0f80d77b6bba5e

Discover that the problem elevated after block 669311 however the variety of main zeroes within the hashes has not elevated (not in hexadecimal and never in binary).


If you wish to see actual particulars you might have a look at early variations of the Bitcoin reference implementation in C++. Nonetheless I’d recommend as a substitute wanting on the present BTCD implementation in go-lang as a result of that’s effectively commented and, for my part, a neater language to learn.


    // TargetTimespan is the specified period of time that ought to elapse
    // earlier than the block problem requirement is examined to find out how
    // it needs to be modified with a view to preserve the specified block
    // technology charge.
    TargetTimespan time.Length

    // TargetTimePerBlock is the specified period of time to generate every
    // block.
    TargetTimePerBlock time.Length


    // Calculate new goal problem as:
    //  currentDifficulty * (adjustedTimespan / targetTimespan)
    // The consequence makes use of integer division which implies it is going to be barely
    // rounded down.  Bitcoind additionally makes use of integer division to calculate this
    // consequence.
    oldTarget := CompactToBig(lastNode.bits)
    newTarget := new(massive.Int).Mul(oldTarget, massive.NewInt(adjustedTimespan))
    targetTimeSpan := int64(b.chainParams.TargetTimespan / time.Second)
    newTarget.Div(newTarget, massive.NewInt(targetTimeSpan))

Calculating the hash goal


Supply hyperlink

Leave a reply