nimbus-eth2/nfuzz
Jacek Sieka 61538fa581 speed up shuffling
Replace shuffling function with zrnt version - `get_shuffled_seq` in
particular puts more strain on the GC by allocating superfluous seq's
which turns out to have a significant impact on block processing (when
replaying blocks for example) - 4x improvement on non-epoch, 1.5x on
epoch blocks (replay is done without signature checking)

Medalla, first 10k slots - pre:

```
Loaded 68973 blocks, head slot 117077
All time are ms
Average,       StdDev,          Min,          Max,      Samples,
Test
Validation is turned off meaning that no BLS operations are performed
76855.848,        0.000,    76855.848,    76855.848,            1,
Initialize DB
1.073,        0.914,        0.071,       12.454,         7831,
Load block from database
31.382,        0.000,       31.382,       31.382,            1,
Load state from database
85.644,       30.350,        3.056,      466.136,         7519,
Apply block
506.569,       91.129,      130.654,      874.786,          312,
Apply epoch block
```

post:

```
Loaded 68973 blocks, head slot 117077
All time are ms
Average,       StdDev,          Min,          Max,      Samples,
Test
Validation is turned off meaning that no BLS operations are performed
72457.303,        0.000,    72457.303,    72457.303,            1,
Initialize DB
1.015,        0.858,        0.070,       11.231,         7831,
Load block from database
28.983,        0.000,       28.983,       28.983,            1,
Load state from database
21.725,       17.461,        2.659,      393.217,         7519,
Apply block
324.012,       33.954,       45.452,      440.532,          312,
Apply epoch block
```
2020-08-21 16:05:10 +03:00
..
README.md Allow defects and assertions to propagate in fuzzing harnesses. 2020-01-08 13:46:14 +02:00
libnfuzz.h [WIP] Fake bls at runtime (#735) 2020-03-05 13:52:10 +01:00
libnfuzz.nim speed up shuffling 2020-08-21 16:05:10 +03:00

README.md

Introduction

libnfuzz is a wrapper library that exports to C, a set of fuzzing test cases written in Nim and making use of nim-beacon-chain.

Building

To build the wrapper library (for more details follow first the instructions from nim-beacon-chain):

git clone https://github.com/status-im/nim-beacon-chain.git
cd nim-beacon-chain
make
# static library
make libnfuzz.a
# dynamic loaded library
make libnfuzz.so

Default, the library is build with the minimal config. To select a specific config you can instead run:

# build with mainnet config
make libnfuzz.a NIMFLAGS="-d:const_preset=mainnet"

For the library to be useful for fuzzing with libFuzzer (e.g. for integration with beacon-fuzz) we can pass additional Nim arguments, e.g.:

make libnfuzz.a NIMFLAGS="--cc:clang --passC:'-fsanitize=fuzzer-no-link' --passL='-fsanitize=fuzzer'"

To disable BLS verification on deserialization of SSZ objects add -d:ssz_testing to the NIMFLAGS.

Other useful options might include: --clang.path:<path>, --clang.exe:<exe>, --clang.linkerexe:<exe>, -d:const_preset=mainnet

It might also deem useful to lower the log level, e.g. by adding -d:chronicles_log_level=fatal.

Usage

There is a libnfuzz.h file provided for easy including in C or C++ projects.

It is most important that before any of the exported tests are called, the NimMain() call is done first. Additionally, all following library calls need to be done from the same thread as from where the original NimMain() call was done.