Purpose
Proof-of-work (PoW) in Dscuss is used for resistance against flooding. PoW is
just a uint64
number, which is sent along with users' public key. Hash of
user's public key plus PoW must has a determined number of leading zero bits
(see below). It should be hard to find such a PoW. Hence the selected hashing
function is scrypt. Peers are forced to do this work before
participating in discussion, otherwise their messages will be dropped.
Math
Average time to find a PoW is
Tavg = C * 2 ^ n
Where C is a constant, which depends on peer's CPU performance and n is the number of leading zeros in the resulting hash.
The time to find PoW (T) is actually a random variable, which has a geometric distribution. Tavg is the expected value of this variable. The real distribution of time to find an 8-bit (as an example) PoW is shown on the histogram below. The histogram is drawn for 10,000 values.
The number of required leading zero bits is set to 16
for the
proof-of-concept version. In this case, Tavg is about 20 minutes on Intel(R)
Core(TM) i7-4790k CPU @ 4.0GHz
or 2 hours on Intel(R) Core(TM) 2 Duo P8600 @
2.40GHz
.
Benchmarking
How to benchmark proof-of-work on your system:
- Disable
debug
in dscuss.go. - Run
utils/benchmark_pow.sh [bit_num] [count]
where,
bit_num
is the number of leading zero bits in PoW (can be 8 or 16);
count
specifies how many times to run the test.
for example:
utils/benchmark_pow.sh 16 50
This test takes about 12 hours on Intel Core i7-4790k.
When the benchmark is over, you will see the results: the Tavg and the histogram:
The benchmark is over.
The average time to find proof is: 22.2161
The histogram is ready: pow_histogram.png.
In benchmark.log
you will find details about each test run.