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 principal.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("BitcoinMiner:n");
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 kind 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 stage in a pc.
Your instance, 00005fad, is a quantity expressed in hexadecimal (base 16), the identical quantity could be written in regular decimal (base 10) as 24493. Anybody unfamiliar with non-decimal representations resembling hexadecimal, octal and binary can examine 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 similar worth in a number of totally different representations.
Main zeroes
The notion that Bitcoin cares in regards to the variety of main zeroes in, say, a hexadecimal illustration, is a generally repeated mistake (do not ask me how I do know this).
When 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 will nonetheless be a mistake to suppose that smaller numbers all the time have extra main zeroes. Each you and Bitcoin know that 000017 (seventeen) is smaller than 000019 (nineteen) though each have the identical variety of main zeroes.
It’s true that a
is lower than b
in precisely the identical means that 7
is lower than 8
or that 2
is lower than 3
. However it’s most likely a mistake to start out evaluating particular person digits in a selected visible illustration. The hash and hash targets are bizarre numbers (although giant) which might be in contrast in an bizarre means.
So the place does this speak of main zeroes come from? It’s a part of a technique of encoding the goal worth as a problem in a compact illustration. Bitcoin has some fairly arcane strategies of saving area in knowledge which might be transmitted.
See
Examples
Lets have a look at some latest blocks (most up-to-date at high, 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).
Implementations
If you wish to see actual particulars you may have a look at early variations of the Bitcoin reference implementation in C++. Nonetheless I’d counsel as an alternative wanting on the present BTCD implementation in go-lang as a result of that’s properly commented and, in my view, a better language to learn.
e.g. https://github.com/btcsuite/btcd/blob/grasp/chaincfg/params.go
// TargetTimespan is the specified period of time that ought to elapse
// earlier than the block problem requirement is examined to find out how
// it must be modified as a way to preserve the specified block
// era charge.
TargetTimespan time.Length
// TargetTimePerBlock is the specified period of time to generate every
// block.
TargetTimePerBlock time.Length
and https://github.com/btcsuite/btcd/blob/grasp/blockchain/problem.go
// Calculate new goal problem as:
// currentDifficulty * (adjustedTimespan / targetTimespan)
// The outcome makes use of integer division which suggests it is going to be barely
// rounded down. Bitcoind additionally makes use of integer division to calculate this
// outcome.
oldTarget := CompactToBig(lastNode.bits)
newTarget := new(huge.Int).Mul(oldTarget, huge.NewInt(adjustedTimespan))
targetTimeSpan := int64(b.chainParams.TargetTimespan / time.Second)
newTarget.Div(newTarget, huge.NewInt(targetTimeSpan))
Calculating the hash goal
See