mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-02-15 09:58:51 +00:00
fe92c15f0c44d1405b9048306736bd0eae868506 script/sign: avoid duplicated signature verification after signing (Sebastian Falbesoner)
080089567ca766d4c1cde8ec0e5c7df48f566e07 bench: add benchmark for `SignTransaction` (Sebastian Falbesoner)
Pull request description:
This PR is a small performance improvement on the `SignTransaction` function, which is used mostly by the wallet (obviously) and the `signrawtransactionwithkey` RPC. The lower-level function `ProduceSignature` already calls `VerifyScript` internally as last step in order to check whether the signature data is complete:
daa56f7f66/src/script/sign.cpp (L568-L570)
If and only if that is the case, the `complete` field of the `SignatureData` is set to `true` accordingly and there is no need then to verify the script after again, as we already know that it would succeed.
This leads to a rough ~20% speed-up for `SignTransaction` for single-input ECDSA or Taproot transactions, according to the newly introduced `SignTransaction{ECDSA,Taproot}` benchmarks:
```
$ ./src/bench/bench_bitcoin --filter=SignTransaction.*
```
without commit 18185f4f578b8795fdaa75926630a691e9c8d0d4:
| ns/op | op/s | err% | total | benchmark
|--------------------:|--------------------:|--------:|----------:|:----------
| 185,597.79 | 5,388.00 | 1.6% | 0.22 | `SignTransactionECDSA`
| 141,323.95 | 7,075.94 | 2.1% | 0.17 | `SignTransactionSchnorr`
with commit 18185f4f578b8795fdaa75926630a691e9c8d0d4:
| ns/op | op/s | err% | total | benchmark
|--------------------:|--------------------:|--------:|----------:|:----------
| 149,757.86 | 6,677.45 | 1.4% | 0.18 | `SignTransactionECDSA`
| 108,284.40 | 9,234.94 | 2.0% | 0.13 | `SignTransactionSchnorr`
Note that there are already signing benchmarks in the secp256k1 library, but `SignTransaction` does much more than just the cryptographical parts, i.e.:
* calculate the unsigned tx's `PrecomputedTransactionData` if necessary
* apply Solver on the prevout scriptPubKey, fetch the relevant keys from the signing provider
* perform the actual signing operation (for ECDSA signatures, that could be more than once due to low-R grinding)
* verify if the signatures are correct by calling `VerifyScript` (more than once currently, which is fixed by this PR)
so it probably makes sense to also have benchmarks from that higher-level application perspective.
ACKs for top commit:
achow101:
ACK fe92c15f0c44d1405b9048306736bd0eae868506
furszy:
utACK fe92c15f0c44
glozow:
light review ACK fe92c15f0c44d1405b9048306736bd0eae868506
Tree-SHA512: b7225ff9e8a640ca5222dea5b2a463a0f9b9de704e4330b5b9a7bce2d63a1f4620575c474a8186f4708d7d9534eab55d000393d99db79c0cfc046b35f0a4a778
114 lines
3.2 KiB
Makefile
114 lines
3.2 KiB
Makefile
# Copyright (c) 2015-2016 The Bitcoin Core developers
|
|
# Distributed under the MIT software license, see the accompanying
|
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
bin_PROGRAMS += bench/bench_bitcoin
|
|
BENCH_SRCDIR = bench
|
|
BENCH_BINARY = bench/bench_bitcoin$(EXEEXT)
|
|
|
|
RAW_BENCH_FILES = \
|
|
bench/data/block413567.raw
|
|
GENERATED_BENCH_FILES = $(RAW_BENCH_FILES:.raw=.raw.h)
|
|
|
|
bench_bench_bitcoin_SOURCES = \
|
|
$(RAW_BENCH_FILES) \
|
|
bench/addrman.cpp \
|
|
bench/base58.cpp \
|
|
bench/bech32.cpp \
|
|
bench/bench.cpp \
|
|
bench/bench.h \
|
|
bench/bench_bitcoin.cpp \
|
|
bench/bip324_ecdh.cpp \
|
|
bench/block_assemble.cpp \
|
|
bench/ccoins_caching.cpp \
|
|
bench/chacha20.cpp \
|
|
bench/checkblock.cpp \
|
|
bench/checkblockindex.cpp \
|
|
bench/checkqueue.cpp \
|
|
bench/crypto_hash.cpp \
|
|
bench/data.cpp \
|
|
bench/data.h \
|
|
bench/descriptors.cpp \
|
|
bench/disconnected_transactions.cpp \
|
|
bench/duplicate_inputs.cpp \
|
|
bench/ellswift.cpp \
|
|
bench/examples.cpp \
|
|
bench/gcs_filter.cpp \
|
|
bench/hashpadding.cpp \
|
|
bench/index_blockfilter.cpp \
|
|
bench/load_external.cpp \
|
|
bench/lockedpool.cpp \
|
|
bench/logging.cpp \
|
|
bench/mempool_eviction.cpp \
|
|
bench/mempool_stress.cpp \
|
|
bench/merkle_root.cpp \
|
|
bench/nanobench.cpp \
|
|
bench/nanobench.h \
|
|
bench/parse_hex.cpp \
|
|
bench/peer_eviction.cpp \
|
|
bench/poly1305.cpp \
|
|
bench/pool.cpp \
|
|
bench/prevector.cpp \
|
|
bench/random.cpp \
|
|
bench/readblock.cpp \
|
|
bench/rollingbloom.cpp \
|
|
bench/rpc_blockchain.cpp \
|
|
bench/rpc_mempool.cpp \
|
|
bench/sign_transaction.cpp \
|
|
bench/streams_findbyte.cpp \
|
|
bench/strencodings.cpp \
|
|
bench/util_time.cpp \
|
|
bench/verify_script.cpp \
|
|
bench/xor.cpp
|
|
|
|
nodist_bench_bench_bitcoin_SOURCES = $(GENERATED_BENCH_FILES)
|
|
|
|
bench_bench_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS) $(EVENT_CFLAGS) $(EVENT_PTHREADS_CFLAGS) -I$(builddir)/bench/
|
|
bench_bench_bitcoin_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
|
|
bench_bench_bitcoin_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
|
|
bench_bench_bitcoin_LDADD = \
|
|
$(LIBTEST_UTIL) \
|
|
$(LIBBITCOIN_NODE) \
|
|
$(LIBBITCOIN_WALLET) \
|
|
$(LIBBITCOIN_COMMON) \
|
|
$(LIBBITCOIN_UTIL) \
|
|
$(LIBBITCOIN_CONSENSUS) \
|
|
$(LIBBITCOIN_CRYPTO) \
|
|
$(LIBLEVELDB) \
|
|
$(LIBMEMENV) \
|
|
$(LIBSECP256K1) \
|
|
$(LIBUNIVALUE) \
|
|
$(EVENT_PTHREADS_LIBS) \
|
|
$(EVENT_LIBS) \
|
|
$(MINIUPNPC_LIBS) \
|
|
$(NATPMP_LIBS)
|
|
|
|
if ENABLE_ZMQ
|
|
bench_bench_bitcoin_LDADD += $(LIBBITCOIN_ZMQ) $(ZMQ_LIBS)
|
|
endif
|
|
|
|
if ENABLE_WALLET
|
|
bench_bench_bitcoin_SOURCES += bench/coin_selection.cpp
|
|
bench_bench_bitcoin_SOURCES += bench/wallet_balance.cpp
|
|
bench_bench_bitcoin_SOURCES += bench/wallet_create.cpp
|
|
bench_bench_bitcoin_SOURCES += bench/wallet_loading.cpp
|
|
bench_bench_bitcoin_SOURCES += bench/wallet_create_tx.cpp
|
|
bench_bench_bitcoin_SOURCES += bench/wallet_ismine.cpp
|
|
|
|
bench_bench_bitcoin_LDADD += $(BDB_LIBS) $(SQLITE_LIBS)
|
|
endif
|
|
|
|
CLEAN_BITCOIN_BENCH = bench/*.gcda bench/*.gcno $(GENERATED_BENCH_FILES)
|
|
|
|
CLEANFILES += $(CLEAN_BITCOIN_BENCH)
|
|
|
|
bench/data.cpp: bench/data/block413567.raw.h
|
|
|
|
bitcoin_bench: $(BENCH_BINARY)
|
|
|
|
bench: $(BENCH_BINARY) FORCE
|
|
$(BENCH_BINARY)
|
|
|
|
bitcoin_bench_clean : FORCE
|
|
rm -f $(CLEAN_BITCOIN_BENCH) $(bench_bench_bitcoin_OBJECTS) $(BENCH_BINARY)
|