183 lines
6.3 KiB
Markdown
183 lines
6.3 KiB
Markdown
# Testing a Branch
|
|
|
|
To test a branch called `zindexdb` with a fresh clone
|
|
|
|
```
|
|
git clone https://git.hush.is/hush/hush3 hush3-testing
|
|
cd hush3-testing
|
|
git checkout zindexdb
|
|
# you need 2GB RAM free per -jN
|
|
./build.sh -j2; make; make; make # this deals with build-system race condition bugs
|
|
|
|
# we want to test a fresh sync, so backup current data
|
|
TIME=`perl -e "print time"`
|
|
mv ~/.komodo/{HUSH3,HUSH3-backup-$TIME}
|
|
mkdir ~/.komodo/HUSH3
|
|
|
|
# Use your previous config as a base
|
|
cp ~/.komodo/{HUSH3-backup-$TIME,HUSH3}/HUSH3.conf
|
|
# Add zindex to your node
|
|
echo "zindex=1" >> ~/.komodo/HUSH3/HUSH3.conf
|
|
|
|
|
|
# This is optional but will likely speed up sync time greatly
|
|
cp ~/.komodo/{HUSH3-backup,HUSH3}/peers.dat
|
|
|
|
# This log file is helpful for debugging more and will contain a history of the
|
|
# size of the anonset at every block height
|
|
./src/hushd &> hushd.log &
|
|
# to look at the log
|
|
tail -f hushd.log
|
|
```
|
|
|
|
To get a CSV file of the value of the anonset size for every block height:
|
|
```
|
|
grep 'setting zstats' hushd.log | cut -d= -f2
|
|
```
|
|
|
|
This only needs to be calculated once, if we can verify it's correct. These are historical values that do not change. These values should match on all nodes:
|
|
|
|
```
|
|
46913,2547,2253,294
|
|
46914,2549,2254,295
|
|
46915,2549,2254,295
|
|
46916,2553,2257,296
|
|
46917,2553,2257,296
|
|
```
|
|
|
|
We should also check a recent block height to verify it's working correctly. The big "test" for this `zindexdb` branch is:
|
|
|
|
* If you stop a node, and restart, are the stats from `getchaintxtstats` correct, i.e. the anonset stats? For instance, `shielded_pool_size` should be close to 500000, if it's close to or exactly 0, something is wrong.
|
|
* Is there a new file called `zindex.dat` in `~/.komodo/HUSH3/` ?
|
|
* Is `zindex.dat` 149 bytes ?
|
|
|
|
# Coding
|
|
|
|
Various coding styles have been used during the history of the codebase,
|
|
and the result is not very consistent. However, we're now trying to converge to
|
|
a single style, so please use it in new code. Old code will be converted
|
|
gradually.
|
|
- Basic rules specified in src/.clang-format. Use a recent clang-format-3.5 to format automatically.
|
|
- Braces on new lines for namespaces, classes, functions, methods.
|
|
- Braces on the same line for everything else.
|
|
- 4 space indentation (no tabs) for every block except namespaces.
|
|
- No indentation for public/protected/private or for namespaces.
|
|
- No extra spaces inside parenthesis; don't do ( this )
|
|
- No space after function names; one space after if, for and while.
|
|
|
|
Block style example:
|
|
```c++
|
|
namespace foo
|
|
{
|
|
class Class
|
|
{
|
|
bool Function(char* psz, int n)
|
|
{
|
|
// Comment summarising what this section of code does
|
|
for (int i = 0; i < n; i++) {
|
|
// When something fails, return early
|
|
if (!Something())
|
|
return false;
|
|
...
|
|
}
|
|
|
|
// Success return is usually at the end
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
Development tips and tricks
|
|
---------------------------
|
|
|
|
**compiling for debugging**
|
|
|
|
Run configure with the --enable-debug option, then make. Or run configure with
|
|
CXXFLAGS="-g -ggdb -O0" or whatever debug flags you need.
|
|
|
|
**debug.log**
|
|
|
|
If the code is behaving strangely, take a look in the debug.log file in the data directory;
|
|
error and debugging messages are written there.
|
|
|
|
The -debug=... command-line option controls debugging; running with just -debug or -debug=1 will turn
|
|
on all categories (and give you a very large debug.log file).
|
|
|
|
**testnet and regtest modes**
|
|
|
|
Run with the -testnet option to run with "play zcash" on the test network, if you
|
|
are testing multi-machine code that needs to operate across the internet.
|
|
|
|
If you are testing something that can run on one machine, run with the -regtest option.
|
|
In regression test mode, blocks can be created on-demand; see qa/rpc-tests/ for tests
|
|
that run in -regtest mode.
|
|
|
|
**DEBUG_LOCKORDER**
|
|
|
|
Hush is a multithreaded application, and deadlocks or other multithreading bugs
|
|
can be very difficult to track down. Compiling with -DDEBUG_LOCKORDER (configure
|
|
CXXFLAGS="-DDEBUG_LOCKORDER -g") inserts run-time checks to keep track of which locks
|
|
are held, and adds warnings to the debug.log file if inconsistencies are detected.
|
|
|
|
Locking/mutex usage notes
|
|
-------------------------
|
|
|
|
The code is multi-threaded, and uses mutexes and the
|
|
LOCK/TRY_LOCK macros to protect data structures.
|
|
|
|
Deadlocks due to inconsistent lock ordering (thread 1 locks cs_main
|
|
and then cs_wallet, while thread 2 locks them in the opposite order:
|
|
result, deadlock as each waits for the other to release its lock) are
|
|
a problem. Compile with -DDEBUG_LOCKORDER to get lock order
|
|
inconsistencies reported in the debug.log file.
|
|
|
|
Re-architecting the core code so there are better-defined interfaces
|
|
between the various components is a goal, with any necessary locking
|
|
done by the components (e.g. see the self-contained CKeyStore class
|
|
and its cs_KeyStore lock for example).
|
|
|
|
Threads
|
|
-------
|
|
|
|
- ThreadScriptCheck : Verifies block scripts.
|
|
|
|
- ThreadImport : Loads blocks from blk*.dat files or bootstrap.dat.
|
|
|
|
- StartNode : Starts other threads.
|
|
|
|
- ThreadDNSAddressSeed : Loads addresses of peers from the DNS.
|
|
|
|
- ThreadMapPort : Universal plug-and-play startup/shutdown
|
|
|
|
- ThreadSocketHandler : Sends/Receives data from peers on port 8233.
|
|
|
|
- ThreadOpenAddedConnections : Opens network connections to added nodes.
|
|
|
|
- ThreadOpenConnections : Initiates new connections to peers.
|
|
|
|
- ThreadMessageHandler : Higher-level message handling (sending and receiving).
|
|
|
|
- DumpAddresses : Dumps IP addresses of nodes to peers.dat.
|
|
|
|
- ThreadFlushWalletDB : Close the wallet.dat file if it hasn't been used in 500ms.
|
|
|
|
- ThreadRPCServer : Remote procedure call handler, listens on port 8232 for connections and services them.
|
|
|
|
- HushMiner : Generates zcash (if wallet is enabled).
|
|
|
|
- Shutdown : Does an orderly shutdown of everything.
|
|
|
|
Pull Request Terminology
|
|
------------------------
|
|
|
|
Concept ACK - Agree with the idea and overall direction, but have neither reviewed nor tested the code changes.
|
|
|
|
utACK (untested ACK) - Reviewed and agree with the code changes but haven't actually tested them.
|
|
|
|
Tested ACK - Reviewed the code changes and have verified the functionality or bug fix.
|
|
|
|
ACK - A loose ACK can be confusing. It's best to avoid them unless it's a documentation/comment only change in which case there is nothing to test/verify; therefore the tested/untested distinction is not there.
|
|
|
|
NACK - Disagree with the code changes/concept. Should be accompanied by an explanation.
|