### 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.

## What about rewards?

Block reward can be calculated using formula

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

This means, that reward starts from 100 coins and cut in a half every 64x multiply of difficulty.