mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-25 10:43:19 -03:00
Merge #16753: wallet: extract PubKey from P2PK script with Solver
798a589aff
wallet: extract PubKey from P2PK script with Solver (Sebastian Falbesoner) Pull request description: The function `ExtractPubKey()` checks if a given script matches the P2PK pattern (`<PubKey> OP_CHECKSIG`), extracts the PubKey and additionally checks if it is cryptographically valid (full validation with ECC library via `CPubKey::IsFullyValid()`). Currently this is done manually in the following order: 1. check if first script OP is data push with valid PubKey length (first part of pattern match), extract PubKey 2. create `CPubKey` object with extracted PubKey 3. fully validate public key 4. check if last script OP is `OP_CHECKSIG` (second part of pattern match) Using Solver, the pattern matching and PubKey extraction can be done via a single step, leading to the following simplified order with shorter code: 1. check if given script matches P2PK pattern with Solver (also contains valid PubKey length check), extracts Pubkey 2. create `CPubKey` object with extracted Pubkey 3. fully validate public key ACKs for top commit: instagibbs: utACK798a589aff
theStack: > utACK [798a589
](798a589aff
) sipa: ACK798a589aff
achow101: Code Review ACK798a589aff
Tree-SHA512: 350358a89afed8c2a7967c50e9714a2d4a909259b50e694ce68dde3e7d0fa0bf3238d33642e73f2bdb53860f6d3f7327ca3eb6426b74eaffacfbca0a384d68cd
This commit is contained in:
commit
a8ecd0dada
1 changed files with 3 additions and 12 deletions
|
@ -523,18 +523,9 @@ bool CWallet::LoadCScript(const CScript& redeemScript)
|
|||
|
||||
static bool ExtractPubKey(const CScript &dest, CPubKey& pubKeyOut)
|
||||
{
|
||||
//TODO: Use Solver to extract this?
|
||||
CScript::const_iterator pc = dest.begin();
|
||||
opcodetype opcode;
|
||||
std::vector<unsigned char> vch;
|
||||
if (!dest.GetOp(pc, opcode, vch) || !CPubKey::ValidSize(vch))
|
||||
return false;
|
||||
pubKeyOut = CPubKey(vch);
|
||||
if (!pubKeyOut.IsFullyValid())
|
||||
return false;
|
||||
if (!dest.GetOp(pc, opcode, vch) || opcode != OP_CHECKSIG || dest.GetOp(pc, opcode, vch))
|
||||
return false;
|
||||
return true;
|
||||
std::vector<std::vector<unsigned char>> solutions;
|
||||
return Solver(dest, solutions) == TX_PUBKEY &&
|
||||
(pubKeyOut = CPubKey(solutions[0])).IsFullyValid();
|
||||
}
|
||||
|
||||
bool CWallet::AddWatchOnlyInMem(const CScript &dest)
|
||||
|
|
Loading…
Add table
Reference in a new issue