You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Merge #13666: Always create signatures with Low R values
e306be7 Use 72 byte dummy signatures when watching only inputs may be used (Andrew Chow)
48b1473 Use 71 byte signature for DUMMY_SIGNATURE_CREATOR (Andrew Chow)
18dfea0 Always create 70 byte signatures with low R values (Andrew Chow)
Pull request description:
When creating signatures for transactions, always make one which has a 32 byte or smaller R and 32 byte or smaller S value. This results in signatures that are always less than 71 bytes (32 byte R + 32 byte S + 6 bytes DER + 1 byte sighash) with low R values. In most cases, the signature will be 71 bytes.
Because R is not mutable in the same way that S is, a low R value can only be found by trying different nonces. RFC 6979 for deterministic nonce generation has the option to specify additional entropy, so we simply use that and add a uin32_t counter which we increment in order to try different nonces. Nonces are sill deterministically generated as the nonce used will the be the first one where the counter results in a nonce that results in a low R value. Because different nonces need to be tried, time to produce a signature does increase. On average, it takes twice as long to make a signature as two signatures need to be created, on average, to find one with a low R.
Having a fixed size signature makes size calculations easier and also saves half a byte of transaction size, on average.
DUMMY_SIGNATURE_CREATOR has been modified to produce 71 byte dummy signatures instead of 72 byte signatures.
Tree-SHA512: 3cd791505126ce92da7c631856a97ba0b59e87d9c132feff6e0eef1dc47768e81fbb38bfbe970371bedf9714b7f61a13a5fe9f30f962c81734092a4d19a4ef33
/** Whether we know how to spend this output, ignoring the lack of keys */
508
508
boolfSolvable;
509
509
510
+
/** Whether to use the maximum sized, 72 byte signature when calculating the size of the input spend. This should only be set when watch-only outputs are allowed */
511
+
bool use_max_sig;
512
+
510
513
/**
511
514
* Whether this output is considered safe to spend. Unconfirmed transactions
512
515
* from outside keys and unconfirmed replacement transactions are considered
513
516
* unsafe and will not be used to fund new spending transactions.
514
517
*/
515
518
boolfSafe;
516
519
517
-
COutput(const CWalletTx *txIn, int iIn, int nDepthIn, boolfSpendableIn, boolfSolvableIn, boolfSafeIn)
520
+
COutput(const CWalletTx *txIn, int iIn, int nDepthIn, boolfSpendableIn, boolfSolvableIn, boolfSafeIn, bool use_max_sig_in = false)
0 commit comments