Page MenuHomePhabricator

[avalanche] Add a new staking reward selection algorithm
ClosedPublic

Authored by Fabien on Sep 14 2023, 11:46.

Details

Summary

This algo computes a score locally for each proof that is independent of
the proof set, and picks a proof based on the score. The change to get
selected is proportianal to the staked amount.

This improves on the previous algorithm in a few ways:

  • It is inherently tolerant to a missing proof as long as the missing proof is not the winner. This removes the need for a list of winners entirely.
  • Each individual proof has no impact on the selection (except for itself) which makes this algorithm more robust against manipulation.

Due to the nature of this algo, it is impossible to predict the winner
in tests by manipulating the proofs or the blockhash like with the
previous algorithm.

The algorithm is currently not in use and will replace its predecessor
in a subsequent diff.

Test Plan
ninja check-avalanche

Run the Gitian build

Diff Detail

Repository
rABC Bitcoin ABC
Lint
Lint Not Applicable
Unit
Tests Not Applicable

Event Timeline

Fabien requested review of this revision.Sep 14 2023, 11:46
Fabien planned changes to this revision.Sep 14 2023, 11:48

Tail of the build log:

[338/481] Building CXX object src/CMakeFiles/server.dir/rpc/net.cpp.o
[339/481] Building CXX object src/CMakeFiles/server.dir/timedata.cpp.o
[340/481] Building CXX object src/CMakeFiles/server.dir/rpc/rawtransaction.cpp.o
[341/481] Building CXX object src/CMakeFiles/server.dir/rpc/blockchain.cpp.o
[342/481] Building CXX object src/CMakeFiles/server.dir/torcontrol.cpp.o
[343/481] Building CXX object src/CMakeFiles/server.dir/txdb.cpp.o
[344/481] Building CXX object src/CMakeFiles/server.dir/txmempool.cpp.o
[345/481] Building CXX object src/CMakeFiles/server.dir/versionbits.cpp.o
[346/481] Building CXX object src/CMakeFiles/server.dir/dummywallet.cpp.o
[347/481] Building C object src/secp256k1/CMakeFiles/recover-bench.dir/src/bench_recover.c.o
[348/481] Building CXX object src/CMakeFiles/server.dir/txorphanage.cpp.o
[349/481] Building CXX object src/CMakeFiles/server.dir/validationinterface.cpp.o
[350/481] Building C object src/secp256k1/CMakeFiles/secp256k1.dir/src/secp256k1.c.o
[351/481] Building C object src/secp256k1/CMakeFiles/ecmult-bench.dir/src/bench_ecmult.c.o
[352/481] Building C object src/secp256k1/CMakeFiles/verify-bench.dir/src/bench_verify.c.o
[353/481] Building C object src/secp256k1/CMakeFiles/sign-bench.dir/src/bench_sign.c.o
[354/481] Building CXX object src/CMakeFiles/bitcoind.dir/bitcoind.cpp.o
[355/481] Building C object src/secp256k1/CMakeFiles/internal-bench.dir/src/bench_internal.c.o
[356/481] Building CXX object src/test/CMakeFiles/testutil.dir/util/blockindex.cpp.o
[357/481] Building CXX object src/test/CMakeFiles/testutil.dir/util/logging.cpp.o
[358/481] Building CXX object src/CMakeFiles/server.dir/validation.cpp.o
[359/481] Building CXX object src/test/CMakeFiles/testutil.dir/util/str.cpp.o
[360/481] Building CXX object src/test/CMakeFiles/testutil.dir/util/blockfilter.cpp.o
[361/481] Linking C static library src/secp256k1/libsecp256k1.a
[362/481] Building CXX object src/test/CMakeFiles/testutil.dir/util/mining.cpp.o
[363/481] Building CXX object src/test/CMakeFiles/testutil.dir/util/net.cpp.o
[364/481] Building CXX object src/test/CMakeFiles/testutil.dir/util/transaction_utils.cpp.o
[365/481] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/db.cpp.o
[366/481] Building CXX object src/test/CMakeFiles/testutil.dir/util/setup_common.cpp.o
[367/481] Building CXX object src/test/CMakeFiles/testutil.dir/util/validation.cpp.o
[368/481] Building CXX object src/test/CMakeFiles/testutil.dir/util/wallet.cpp.o
[369/481] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/bitcoin.cpp.o
[370/481] Linking C executable src/secp256k1/recover-bench
[371/481] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/dns.cpp.o
[372/481] Linking C executable src/secp256k1/internal-bench
[373/481] Linking C executable src/secp256k1/verify-bench
[374/481] Linking C executable src/secp256k1/ecmult-bench
[375/481] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/options.cpp.o
[376/481] Linking C executable src/secp256k1/sign-bench
[377/481] Building CXX object src/seeder/CMakeFiles/bitcoin-seeder.dir/main.cpp.o
[378/481] Linking CXX static library src/libscript.a
[379/481] Linking CXX static library src/libbitcoinconsensus.a
[380/481] Linking CXX static library src/libcommon.a
[381/481] Linking CXX shared library src/libbitcoinconsensus.so.0.27.13
[382/481] Creating library symlink src/libbitcoinconsensus.so.0 src/libbitcoinconsensus.so
[383/481] Linking CXX executable src/bitcoin-cli
[384/481] Building CXX object src/CMakeFiles/server.dir/avalanche/peermanager.cpp.o
FAILED: src/CMakeFiles/server.dir/avalanche/peermanager.cpp.o 
/usr/bin/ccache /usr/bin/c++ -DBOOST_ALL_NO_LIB -DBUILD_BITCOIN_INTERNAL -DENABLE_AVX2 -DENABLE_SHANI -DENABLE_SSE41 -DHAVE_BUILD_INFO -DHAVE_CONFIG_H -DHAVE_CONSENSUS_LIB -DLEVELDB_ATOMIC_PRESENT -DLEVELDB_PLATFORM_POSIX -DOS_LINUX -I../../src/leveldb/helpers/memenv -I../../src/. -Isrc -I../../src/univalue/include -Isrc/crypto/.. -I../../src/secp256k1/include -I../../src/leveldb/include -isystem /usr/include/jemalloc -isystem /usr/include/miniupnpc -Werror -g -O2 -fPIC -fvisibility=hidden -fstack-reuse=none -fstack-protector-all -Wstack-protector -fcf-protection=full -fstack-clash-protection -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -Wall -Wextra -Wformat -Wvla -Wcast-align -Wunused-parameter -Wmissing-braces -Wredundant-decls -Wsign-compare -Wduplicated-branches -Wduplicated-cond -Wlogical-op -Wformat-security -Wredundant-move -Woverloaded-virtual -Wno-unused-parameter -Wno-implicit-fallthrough -Wno-psabi -pthread -std=gnu++17 -MD -MT src/CMakeFiles/server.dir/avalanche/peermanager.cpp.o -MF src/CMakeFiles/server.dir/avalanche/peermanager.cpp.o.d -o src/CMakeFiles/server.dir/avalanche/peermanager.cpp.o -c ../../src/avalanche/peermanager.cpp
../../src/avalanche/peermanager.cpp:23:10: fatal error: math: No such file or directory
   23 | #include <math>
      |          ^~~~~~
compilation terminated.
[385/481] Linking CXX executable src/bitcoin-tx
[386/481] Building CXX object src/CMakeFiles/server.dir/avalanche/proofpool.cpp.o
[387/481] Building CXX object src/CMakeFiles/server.dir/avalanche/processor.cpp.o
[388/481] Building CXX object src/CMakeFiles/server.dir/rpc/avalanche.cpp.o
[389/481] Building CXX object src/CMakeFiles/server.dir/net_processing.cpp.o
ninja: build stopped: cannot make progress due to previous errors.
Build build-without-wallet failed with exit code 1

Tail of the build log:

-- Installing: /results/artifacts/include/secp256k1_recovery.h
-- Installing: /results/artifacts/include/secp256k1_schnorr.h
[361/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/logging.cpp.o
[362/541] Linking CXX static library src/libscript.a
[363/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/blockindex.cpp.o
[364/541] Linking CXX static library src/libbitcoinconsensus.a
[365/541] Building CXX object src/CMakeFiles/server.dir/txorphanage.cpp.o
[366/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/str.cpp.o
[367/541] Linking CXX shared library src/libbitcoinconsensus.so.0.27.13
[368/541] Building C object src/secp256k1/CMakeFiles/ecmult-bench.dir/src/bench_ecmult.c.o
[369/541] Creating library symlink src/libbitcoinconsensus.so.0 src/libbitcoinconsensus.so
[370/541] Linking C executable src/secp256k1/ecmult-bench
[371/541] Linking CXX executable src/bitcoin-cli
[372/541] Building C object src/secp256k1/CMakeFiles/internal-bench.dir/src/bench_internal.c.o
[373/541] Linking C executable src/secp256k1/internal-bench
[374/541] Building CXX object src/CMakeFiles/server.dir/txmempool.cpp.o
[375/541] Building CXX object src/CMakeFiles/bitcoin-tx.dir/bitcoin-tx.cpp.o
[376/541] Building CXX object src/CMakeFiles/server.dir/torcontrol.cpp.o
[377/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/blockfilter.cpp.o
[378/541] Linking CXX executable src/bitcoin-tx
[379/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/context.cpp.o
[380/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/transaction_utils.cpp.o
[381/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/coinselection.cpp.o
[382/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/bdb.cpp.o
[383/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/coincontrol.cpp.o
[384/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/db.cpp.o
[385/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/mining.cpp.o
[386/541] Building CXX object src/CMakeFiles/server.dir/wallet/init.cpp.o
[387/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/validation.cpp.o
[388/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/crypter.cpp.o
[389/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/net.cpp.o
[390/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/wallet.cpp.o
[391/541] Building CXX object src/CMakeFiles/server.dir/validation.cpp.o
[392/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/setup_common.cpp.o
[393/541] Building CXX object src/wallet/CMakeFiles/wallet-tool.dir/wallettool.cpp.o
[394/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/sqlite.cpp.o
[395/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/fees.cpp.o
[396/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/transaction.cpp.o
[397/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/load.cpp.o
[398/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/signmessage.cpp.o
[399/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/encrypt.cpp.o
[400/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/receive.cpp.o
[401/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/util.cpp.o
[402/541] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/dns.cpp.o
[403/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/salvage.cpp.o
[404/541] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/options.cpp.o
[405/541] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/db.cpp.o
[406/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/walletutil.cpp.o
[407/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/backup.cpp.o
[408/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/interfaces.cpp.o
[409/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/spend.cpp.o
[410/541] Building CXX object src/seeder/CMakeFiles/bitcoin-seeder.dir/main.cpp.o
[411/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/scriptpubkeyman.cpp.o
[412/541] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/bitcoin.cpp.o
[413/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpcwallet.cpp.o
[414/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/walletdb.cpp.o
[415/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/wallet.cpp.o
[416/541] Linking CXX static library src/wallet/libwallet.a
ninja: build stopped: cannot make progress due to previous errors.
Build build-debug failed with exit code 1

Tail of the build log:

-- Installing: /results/artifacts/include/secp256k1.h
-- Installing: /results/artifacts/include/secp256k1_preallocated.h
-- Installing: /results/artifacts/include/secp256k1_recovery.h
-- Installing: /results/artifacts/include/secp256k1_schnorr.h
[363/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/blockindex.cpp.o
[364/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/logging.cpp.o
[365/541] Building C object src/secp256k1/CMakeFiles/ecmult-bench.dir/src/bench_ecmult.c.o
[366/541] Linking C executable src/secp256k1/ecmult-bench
[367/541] Building CXX object src/CMakeFiles/bitcoin-cli.dir/bitcoin-cli.cpp.o
[368/541] Linking CXX executable src/bitcoin-cli
[369/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/str.cpp.o
[370/541] Building C object src/secp256k1/CMakeFiles/internal-bench.dir/src/bench_internal.c.o
[371/541] Linking C executable src/secp256k1/internal-bench
[372/541] Building CXX object src/CMakeFiles/server.dir/txmempool.cpp.o
[373/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/blockfilter.cpp.o
[374/541] Building CXX object src/CMakeFiles/server.dir/wallet/init.cpp.o
[375/541] Building CXX object src/CMakeFiles/server.dir/rpc/rawtransaction.cpp.o
[376/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/transaction_utils.cpp.o
[377/541] Building CXX object src/CMakeFiles/server.dir/net_processing.cpp.o
[378/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/context.cpp.o
[379/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/coincontrol.cpp.o
[380/541] Building CXX object src/CMakeFiles/bitcoin-tx.dir/bitcoin-tx.cpp.o
[381/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/net.cpp.o
[382/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/validation.cpp.o
[383/541] Building CXX object src/CMakeFiles/server.dir/rpc/blockchain.cpp.o
[384/541] Linking CXX executable src/bitcoin-tx
[385/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/db.cpp.o
[386/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/mining.cpp.o
[387/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/crypter.cpp.o
[388/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/coinselection.cpp.o
[389/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/wallet.cpp.o
[390/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/bdb.cpp.o
[391/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/setup_common.cpp.o
[392/541] Building CXX object src/wallet/CMakeFiles/wallet-tool.dir/wallettool.cpp.o
[393/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/fees.cpp.o
[394/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/load.cpp.o
[395/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/receive.cpp.o
[396/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/transaction.cpp.o
[397/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/sqlite.cpp.o
[398/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/util.cpp.o
[399/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/encrypt.cpp.o
[400/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/signmessage.cpp.o
[401/541] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/dns.cpp.o
[402/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/salvage.cpp.o
[403/541] Building CXX object src/CMakeFiles/server.dir/validation.cpp.o
[404/541] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/options.cpp.o
[405/541] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/db.cpp.o
[406/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/walletutil.cpp.o
[407/541] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/bitcoin.cpp.o
[408/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/spend.cpp.o
[409/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/interfaces.cpp.o
[410/541] Building CXX object src/seeder/CMakeFiles/bitcoin-seeder.dir/main.cpp.o
[411/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/scriptpubkeyman.cpp.o
[412/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/backup.cpp.o
[413/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/walletdb.cpp.o
[414/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/wallet.cpp.o
[415/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpcwallet.cpp.o
[416/541] Linking CXX static library src/wallet/libwallet.a
ninja: build stopped: cannot make progress due to previous errors.
Build build-clang failed with exit code 1

Tail of the build log:

[359/541] Building CXX object src/CMakeFiles/server.dir/torcontrol.cpp.o
[360/541] Linking CXX static library src/libbitcoinconsensus.a
[361/541] Building C object src/secp256k1/CMakeFiles/ecmult-bench.dir/src/bench_ecmult.c.o
[362/541] Linking C executable src/secp256k1/ecmult-bench
[363/541] Linking CXX shared library src/libbitcoinconsensus.so.0.27.13
[364/541] Creating library symlink src/libbitcoinconsensus.so.0 src/libbitcoinconsensus.so
[365/541] Building CXX object src/CMakeFiles/server.dir/txmempool.cpp.o
[366/541] Building C object src/secp256k1/CMakeFiles/internal-bench.dir/src/bench_internal.c.o
[367/541] Linking C executable src/secp256k1/internal-bench
[368/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/blockindex.cpp.o
[369/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/logging.cpp.o
[370/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/str.cpp.o
[371/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/blockfilter.cpp.o
[372/541] Building CXX object src/CMakeFiles/bitcoin-cli.dir/bitcoin-cli.cpp.o
[373/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/transaction_utils.cpp.o
[374/541] Linking CXX executable src/bitcoin-cli
[375/541] Building CXX object src/CMakeFiles/bitcoin-tx.dir/bitcoin-tx.cpp.o
[376/541] Building CXX object src/CMakeFiles/server.dir/wallet/init.cpp.o
[377/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/net.cpp.o
[378/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/validation.cpp.o
[379/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/context.cpp.o
[380/541] Linking CXX executable src/bitcoin-tx
[381/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/mining.cpp.o
[382/541] Building CXX object src/CMakeFiles/server.dir/rpc/rawtransaction.cpp.o
[383/541] Building CXX object src/CMakeFiles/server.dir/net_processing.cpp.o
[384/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/coincontrol.cpp.o
[385/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/db.cpp.o
[386/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/wallet.cpp.o
[387/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/crypter.cpp.o
[388/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/coinselection.cpp.o
[389/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/bdb.cpp.o
[390/541] Building CXX object src/test/CMakeFiles/testutil.dir/util/setup_common.cpp.o
[391/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/fees.cpp.o
[392/541] Building CXX object src/CMakeFiles/server.dir/rpc/blockchain.cpp.o
[393/541] Building CXX object src/wallet/CMakeFiles/wallet-tool.dir/wallettool.cpp.o
[394/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/receive.cpp.o
[395/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/transaction.cpp.o
[396/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/load.cpp.o
[397/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/util.cpp.o
[398/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/signmessage.cpp.o
[399/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/sqlite.cpp.o
[400/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/encrypt.cpp.o
[401/541] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/dns.cpp.o
[402/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/walletutil.cpp.o
[403/541] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/db.cpp.o
[404/541] Building CXX object src/CMakeFiles/server.dir/validation.cpp.o
[405/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/salvage.cpp.o
[406/541] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/options.cpp.o
[407/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/interfaces.cpp.o
[408/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/spend.cpp.o
[409/541] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/bitcoin.cpp.o
[410/541] Building CXX object src/seeder/CMakeFiles/bitcoin-seeder.dir/main.cpp.o
[411/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/scriptpubkeyman.cpp.o
[412/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/walletdb.cpp.o
[413/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/backup.cpp.o
[414/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/wallet.cpp.o
[415/541] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpcwallet.cpp.o
[416/541] Linking CXX static library src/wallet/libwallet.a
ninja: build stopped: cannot make progress due to previous errors.
Build build-diff failed with exit code 1

Tail of the build log:

[358/539] Linking CXX static library src/libbitcoinconsensus.a
[359/539] Linking C executable src/secp256k1/sign-bench
[360/539] Linking CXX shared library src/libbitcoinconsensus.so.0.27.13
[361/539] Creating library symlink src/libbitcoinconsensus.so.0 src/libbitcoinconsensus.so
[362/539] Building C object src/secp256k1/CMakeFiles/ecmult-bench.dir/src/bench_ecmult.c.o
[363/539] Linking C executable src/secp256k1/ecmult-bench
[364/539] Building CXX object src/test/CMakeFiles/testutil.dir/util/blockindex.cpp.o
[365/539] Building CXX object src/CMakeFiles/server.dir/txmempool.cpp.o
[366/539] Building CXX object src/CMakeFiles/server.dir/rpc/rawtransaction.cpp.o
[367/539] Building CXX object src/CMakeFiles/server.dir/torcontrol.cpp.o
[368/539] Building C object src/secp256k1/CMakeFiles/internal-bench.dir/src/bench_internal.c.o
[369/539] Building CXX object src/test/CMakeFiles/testutil.dir/util/str.cpp.o
[370/539] Linking C executable src/secp256k1/internal-bench
[371/539] Building CXX object src/test/CMakeFiles/testutil.dir/util/logging.cpp.o
[372/539] Building CXX object src/CMakeFiles/bitcoin-cli.dir/bitcoin-cli.cpp.o
[373/539] Linking CXX executable src/bitcoin-cli
[374/539] Building CXX object src/CMakeFiles/server.dir/rpc/blockchain.cpp.o
[375/539] Building CXX object src/test/CMakeFiles/testutil.dir/util/blockfilter.cpp.o
[376/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/context.cpp.o
[377/539] Building CXX object src/test/CMakeFiles/testutil.dir/util/transaction_utils.cpp.o
[378/539] Building CXX object src/CMakeFiles/server.dir/wallet/init.cpp.o
[379/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/coincontrol.cpp.o
[380/539] Building CXX object src/CMakeFiles/bitcoin-tx.dir/bitcoin-tx.cpp.o
[381/539] Linking CXX executable src/bitcoin-tx
[382/539] Building CXX object src/test/CMakeFiles/testutil.dir/util/validation.cpp.o
[383/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/db.cpp.o
[384/539] Building CXX object src/test/CMakeFiles/testutil.dir/util/net.cpp.o
[385/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/coinselection.cpp.o
[386/539] Building CXX object src/test/CMakeFiles/testutil.dir/util/mining.cpp.o
[387/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/bdb.cpp.o
[388/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/crypter.cpp.o
[389/539] Building CXX object src/test/CMakeFiles/testutil.dir/util/wallet.cpp.o
[390/539] Building CXX object src/wallet/CMakeFiles/wallet-tool.dir/wallettool.cpp.o
[391/539] Building CXX object src/test/CMakeFiles/testutil.dir/util/setup_common.cpp.o
[392/539] Building CXX object src/CMakeFiles/server.dir/validation.cpp.o
[393/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/fees.cpp.o
[394/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/load.cpp.o
[395/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/receive.cpp.o
[396/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/util.cpp.o
[397/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/sqlite.cpp.o
[398/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/transaction.cpp.o
[399/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/signmessage.cpp.o
[400/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/encrypt.cpp.o
[401/539] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/dns.cpp.o
[402/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/salvage.cpp.o
[403/539] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/options.cpp.o
[404/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/walletutil.cpp.o
[405/539] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/db.cpp.o
[406/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/interfaces.cpp.o
[407/539] Building CXX object src/seeder/CMakeFiles/bitcoin-seeder.dir/main.cpp.o
[408/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/spend.cpp.o
[409/539] Building CXX object src/seeder/CMakeFiles/seeder-base.dir/bitcoin.cpp.o
[410/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/scriptpubkeyman.cpp.o
[411/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpc/backup.cpp.o
[412/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/walletdb.cpp.o
[413/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/rpcwallet.cpp.o
[414/539] Building CXX object src/wallet/CMakeFiles/wallet.dir/wallet.cpp.o
[415/539] Linking CXX static library src/wallet/libwallet.a
ninja: build stopped: cannot make progress due to previous errors.
Build build-clang-tidy failed with exit code 1

Use explicit include for unordered map in the peermanager test

Make the collisions to remain deterministic

Mengerian added inline comments.
src/avalanche/peermanager.cpp
905 ↗(On Diff #42199)

Maybe it's better to use proofRewardHash to select the winner, rather than proofid directly, otherwise it always biases to the same proofs, and creates an incentive for people to construct proofs with low proofid.

(this seems unlikely to matter in practice, but may as well avoid it anyway)

src/avalanche/peermanager.cpp
905 ↗(On Diff #42199)

we can do both as in theory the reward hash can also collide, with prob 1/2**256

Update the comment as well

bytesofman added inline comments.
src/avalanche/test/peermanager_tests.cpp
2301 ↗(On Diff #42203)

is this an implementation of a stats / probability function? where is the formula from?

src/avalanche/test/peermanager_tests.cpp
2301 ↗(On Diff #42203)

Each proof has 1/numProofs chance to be selected, so (numProofs - 1)/(numProofs) chance to NOT be selected.
Over the course of x iterations the chance of NOT being selected is then ((numProofs - 1)/(numProofs))^x.
The below formula is solving the equation ((numProofs - 1)/(numProofs))^x = 1/100000

Another suggestion is to rename proofRewardScore. It’s a bit confusing that the word “score” is used 2 places with totally different meaning.

Another suggestion is to rename proofRewardScore. It’s a bit confusing that the word “score” is used 2 places with totally different meaning.

Alternatively, could change peer.getScore() to peer.getWeight() or similar.

This comment was removed by Mengerian.
src/avalanche/peermanager.cpp
895–896 ↗(On Diff #42209)
// To make sure the selection is properly weighted according to the proof score,
// we normalize the proofRewardHash to a number between 0 and 1, then take 
// the logarithm and divide by the weight. Since it is scale-independent, we can 
// simplify by removing constants, and use base 2 logarithm.
// Inspired by: https://stackoverflow.com/a/30226926

Another suggestion is to rename proofRewardScore. It’s a bit confusing that the word “score” is used 2 places with totally different meaning.

Alternatively, could change peer.getScore() to peer.getWeight() or similar.

This is used as a score in other contexts, so this won't make much sense to change the name here, but I can rename proofRewardScore.

Improve on names and comments

PiRK added a subscriber: PiRK.

The code looks good and the algorithm is mostly understandable intuitively, except for the math stuff about the homogeneity of the distribution (discussed in private).

This revision is now accepted and ready to land.Sep 15 2023, 11:30

Looks good to me as far as the math and logic go.

src/avalanche/peermanager.cpp
898–899 ↗(On Diff #42221)

On second thought, this sentence seems unnecessary.

Make it work with the gitian build

@bit gitian-linux gitian-win gitian-osx

It is inherently tolerant to a missing proof as long as the missing proof is not the winner. This removes the need for a list of winners entirely.

What happens when a missing proof is a winner?

What happens when a missing proof is a winner?

If most of the stakers choose a particular winning Proof, and a miner is missing that proof, then he would produce a block sending the reward to another Proof. The avalanche stakers would then enforce a block policy rejecting that block, and all the avalanche-aware nodes would park that block.