elements/src/script
Ava Chow 16b4f75d04
Merge bitcoin/bitcoin#28923: script/sign: avoid duplicated signature verification after signing (+introduce signing benchmarks)
fe92c15f0c script/sign: avoid duplicated signature verification after signing (Sebastian Falbesoner)
080089567c 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 fe92c15f0c
  furszy:
    utACK fe92c15f0c
  glozow:
    light review ACK fe92c15f0c

Tree-SHA512: b7225ff9e8a640ca5222dea5b2a463a0f9b9de704e4330b5b9a7bce2d63a1f4620575c474a8186f4708d7d9534eab55d000393d99db79c0cfc046b35f0a4a778
2024-07-16 16:19:07 -04:00
..
descriptor.cpp refactor: Mark some static global vars as const 2024-07-08 21:19:23 +02:00
descriptor.h descriptor: Be able to get the pubkeys involved in a descriptor 2024-02-20 11:20:58 -05:00
interpreter.cpp refactor: Rename CTransaction::nVersion to version 2024-06-07 13:55:23 -04:00
interpreter.h tidy: modernize-use-equals-default 2024-07-08 11:12:01 +02:00
keyorigin.h Implement operator< for KeyOriginInfo and CExtPubKey 2021-12-10 08:29:47 -05:00
miniscript.cpp miniscript: make operator_mst consteval 2024-05-03 11:38:14 -04:00
miniscript.h tidy: modernize-use-equals-default 2024-07-08 11:12:01 +02:00
parsing.cpp util: move spanparsing.h to script/parsing.h 2024-05-16 10:16:08 -05:00
parsing.h util: move spanparsing.h to script/parsing.h 2024-05-16 10:16:08 -05:00
script.cpp util: move HexStr and HexDigit from util to crypto 2024-05-16 17:16:08 +02:00
script.h tidy: modernize-use-equals-default 2024-07-08 11:12:01 +02:00
script_error.cpp Implement Tapscript script validation rules (BIP 342) 2020-10-12 17:18:24 -07:00
script_error.h scripted-diff: Bump copyright headers 2020-12-31 09:45:41 +01:00
sigcache.cpp kernel: De-globalize signature cache 2024-07-05 09:03:04 +02:00
sigcache.h kernel: De-globalize signature cache 2024-07-05 09:03:04 +02:00
sign.cpp script/sign: avoid duplicated signature verification after signing 2024-05-12 18:02:41 +02:00
sign.h tidy: modernize-use-equals-default 2024-07-08 11:12:01 +02:00
signingprovider.cpp ci: Bump TIDY_LLVM_V 2024-03-15 13:34:05 +00:00
signingprovider.h tidy: modernize-use-equals-default 2024-07-08 11:12:01 +02:00
solver.cpp refactor: Add missing includes 2023-08-17 15:55:01 +02:00
solver.h Rename script/standard.{cpp/h} to script/solver.{cpp/h} 2023-08-14 17:39:49 -04:00