7 ms·
> The PoW is suffice if the hash begins with a certain number of 0s This is a common explanation of PoW, but is actually incorrect. If you think about it, this
by nemo1618 6y ago
> The PoW is suffice if the hash begins with a certain number of 0s
This is a common explanation of PoW, but is actually incorrect. If you think about it, this would mean that the PoW difficulty could only increase (or decrease) by a factor of two. In reality, the block hash is simply interpreted as a (very large) number, and this number must be less than some other very large number (the "target"). So you do end up with a lot of leading zeros -- but these are just a side effect, not the thing being measured.
- sodascripts 6y agoTIL. I wonder why that myth is so commonly perpetuated.
- Jasper_ 6y agoIt used to work this way, but got changed to a less-than check for performance reasons. The Bitcoin whitepaper [0] even has the original approach: > The proof-of-work involves scanning for a value that when hashed, such as with SHA-256, the hash begins with a number of zero bits. [0] https://bitcoin.org/bitcoin.pdf https://bitcoin.org/bitcoin.pdf
- sodascripts 6y agoGotcha, thanks for the explanation.
- nemo1618 6y ago> but got changed to a less-than check for performance reasons. Performance as in "it takes less time to verify the PoW," or something else? Because the "leading zeros" and "less than target" approaches would both take a negligible amount of time.
- Jasper_ 6y agoThe story I was told from Bitcoin developers was that it was done for code performance reasons. However, since the less-than check goes back all the way to the code's "Initial commit" [0], I'm not sure if that's fully accurate -- it might have been based on correspondence from the original author. At the very least, the misconception comes from Bitcoin's own whitepaper. [0] https://github.com/bitcoin/bitcoin/blob/e071a3f6c06f41068ad17134189a4ac3073ef76b/main.cpp#L1179-L1181 https://github.com/bitcoin/bitcoin/blob/e071a3f6c06f41068ad1...
- nemo1618 6y agoWeird. That doesn't make any sense to me. btw, the whitepaper probably used "number of leading zeros" because that's what Hashcash does.
- monokh 6y agoThe article mentions the hash is required to begin with a certain number of 0s in hex digits (half byte) whereas the Bitcoin whitepaper refers to it as number of bits. I'm unsure about the comparison (== or >) but the whitepaper seems accurate with regards to the target.
- nullc 6y ago> It used to work this way, but got changed to a less-than check for performance reasons. I don't know who told you that, but they were weirdly confused. It not unlikely the case that sometime early in development (long before publication) that it was bits-based, not only is this how the standard hashcash code works-- but the Bitcoin code calls the relevant field that encods the difficulty "bits". But Bitcoin itself never worked that way, not from the first instant. Changing it would have been a consensus incompatible change, and Bitcoin is still more or less consensus compatible all the way back. (There are outright bugs that make the old software get stuck, but if you fix those, it follows along).
- saurik 6y agoI did not read the sentence you are responding to as implying it was changed after final network launch, only that it was changed.
- nullc 6y agoWell there is no evidence of that other than "bits" and that's how hashcash worked. Sounds like an invitation on the meaning of the word "changed". No bitcoin software was ever released that worked another way.
- joosters 6y agoI don't know who told you that, but they were weirdly confused. The bitcoin whitepaper told them that, in more than one place too, so it's not a simple typo, e.g. ...we implement the proof-of-work by incrementing a nonce in the block until a value is found that gives the block's hash the required zero bits.
- garmaine 6y agoBitcoin never worked that way. However the original hashcash proposal was specified as leading zeroes. I presume that’s what you are mixing up with.
- jbverschoor 6y agoThere’s a difference between mining bitcoins, and mining for network fees.
- trickstra 6y agoWhat difference would that be? Both the fees and the block reward go to the miner who first published a valid block with hash lower than the current difficulty. The only difference is where those bitcoins came from, but that has no impact on how easy it was to mine.
- exdsq 6y agoYeah as a miner you add the fee and the earned coins to the single coinbase transaction, so it’s a single mining action to get both.
- runeks 6y agoIt’s not a myth. It’s a useful simplification.
- tromp 6y agoIt's also accurate if you say that hash value H has -log_2 (H / 2^256) = 256 - log_2 H leading 0s and allow for fractional number of leading 0s. The nBits header field closely resembles a 32-bit floating point representation of this number (I say resembles because it's really a floating point representation of the threshold H value).
- monokh 6y ago(author here) Absolutely. Thanks for pointing this out. If difficulty adjusted in factors of two, the ability of the network to accurately maintain its 10 mins blocktime become impaired. I try to keep these concepts rather simplified to ease the reading and learning process. Perhaps there should be a note for these situations.
- sowbug 6y agoIn defense of the explanation, sometimes it's asking for an unnecessary mental leap of the reader to think of a bit array as a number, especially if the reader is not accustomed to thinking in base-2 or base-16 number systems.
- nullc 6y agoThe hash is just a number regardless-- surely no one has any problem understanding any other number in the protocol as a number! :)
- bouncycastle 6y agoEven this sentence is just a number.
- deleted 6y ago[deleted]
- yaktubi 6y agoReally it’s not because it’s a sequence of glyphs first and foremost. It can be mapped to a number though.
- bouncycastle 6y agoNope, no mapping necessary. 36 octets, so a single 288 bit number in base 2. (Big-endian, unsigned, I guess) Then convert to any base you want. (I should have probably used 32 octets so that it fits neatly in 256 bits)
- SilasX 6y agoThat doesn't seem like a simplification that misrepresents a relevant, core dynamic of Bitcoin. The exact details of how you ramp up difficulty are a pretty low-level technical issue.
- martinko 6y agoHow is network consensus achieved on the difficulty adjustment?
- johnpaulkiser 6y agoEach node independently comes to the new difficulty on their own in an entirely deterministic way. After 2 weeks there should be 2016 blocks mined, 1 block every 10 minutes. After each 2 week period every node recalculates the new difficulty based on the actual number of blocks mined in the last 2 weeks. If the actual number of blocks produced was 25% higher than the target of 2016, then simply increase the difficulty by 25%.
- martinko 6y agoThanks. Given that this relies on subjective timestamps, is this really entirely deterministic? I can imagine that one node counted 2014 blocks in the past two weeks, another 2015. What happens in such cases?
- tromp 6y agoDifficulty only changes at heights that are a multiple of 2016.
- deleted 6y ago[deleted]
- tromp 6y agoIt is computed using only information embedded in the block chain, specifically the timestamps of blocks 2016 * i and 2016 * (i+1).
- martinko 6y agoBut aren't blockchain timestamps unreliable? It was my understanding that difficulty was based on subjective node timestamps..
- WhoIsSatoshi 6y agoDo you have a source I can look at or do I have to go look at at or can you point to code by chance? I'm quite surprised I wasn't aware of this if this is actually how it is implemented, the leading zeroes seemed right (and the difficulty by factor of 2 also!) Thanks!
- nemo1618 6y agoSomeone else linked it below: https://github.com/bitcoin/bitcoin/blob/e071a3f6c06f41068ad17134189a4ac3073ef76b/main.cpp#L1179-L1181 https://github.com/bitcoin/bitcoin/blob/e071a3f6c06f41068ad1... Equivalent check in btcd, an alternative Bitcoin implementation: https://github.com/btcsuite/btcd/blob/991d32e72fe84d5fbf9c47cd604d793a0cd3a072/blockchain/validate.go#L329 https://github.com/btcsuite/btcd/blob/991d32e72fe84d5fbf9c47...