# Proof of work

A proof-of-work is a solution for difficult (costly) mathematical task. This solution must be trivial to check whether data satisfies claimed requirements.

Novacoin uses the hashcash method to provide proofs of the work. The difficulty of this work is adjusted so as to limit the rate at which new blocks can be generated by the network to required target spacing rate (from 10 to 30 minutes). Due to the very low probability of successful proof generation, this makes it unpredictable which worker computer in the network will be able to generate the next solution.

#### How long will it take me to generate a proof-of-work?

No-one can say exactly. But there is an estimation of how long it might take.

Imagine that you have a hardware with 1 MH/s hashing speed. Let's estimate how much time the generation of proof-of-work will take from you in average, with a current Novacoin proof-of-work difficulty.

Difficulty 1.0 is represented by

``````0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
``````

value of target. So, to get a successful proof of work we need to perform `0xFFFFFFFFFFFFFFFF / 0x00000000FFFFFFFF` or ~ `4294967297` attempts.

At difficulty 360 we need ~ `360 * 4294967297` = `1546188226920` attempts. If you have 1 MH/s or 1000000 hashes per second then you will be able to scan such amount of hashes within `1546188226920 / 1000000` = `1546188` seconds or `1546188 / 86400` = `17,89` days.

Probability of successful block generation during one day could be calculated from available hashrate using formula:

``````P = nHashesPerSecond * 86400 / (4294967297 * difficulty)
``````

#### How does it work?

Each block header represented by structure of 6 fields, a some of this fields could be varied pretty freely.

Field Type sizeof Requirements
nVersion unsigned int 4 Shouldn't be modified manually.
hashPrevBlock unsigned char[] 32 Shouldn't be modified manually.
hashMerkleRoot unsigned char[] 32 It's a merkle tree hash. Could be modified through modification, addition or removal of transactions.
nTime unsigned int 4 Can be updated manually to any value from [max tx timestamp, time() + 3600] interval.
nBits unsigned int 4 Shouldn't be updated manually
nNonce unsigned int 4 Attempts counter for proof-of-work. You need to update this field for every new hashing attempt.

The hashing result of a valid proof-of-work value must be lower than current target. Miner tries to find this suitable solution by scanning all possible nNonce values (from 0 to UINT_MAX). In case of overflow the new coinbase transaction will be created. This allows miner to replace a value of new merkle tree hash with a new one and start nNonce scanning from zero again. Adjustment of timestamp is also possible.

``````nBlockReward = 100 / (diffuculty / 0,000244) ^ (1/6)