txscript: Optimize ExtractPkScriptAddrs scripthash.
This begins the process of converting the ExtractPkScriptAddrs function to use the optimized extraction functions recently introduced as part of the typeOfScript conversion. In order to ease the review process, the detection of each script type will be converted in a separate commit such that the script is only parsed as a fallback for the cases that are not already converted to more efficient variants. In particular, this converts the detection for pay-to-script-hash scripts.
This commit is contained in:
parent
e4c9d283b5
commit
9dec01adf4
1 changed files with 25 additions and 12 deletions
|
@ -813,11 +813,36 @@ func PushedData(script []byte) ([][]byte, error) {
|
||||||
return data, nil
|
return data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// scriptHashToAddrs is a convenience function to attempt to convert the passed
|
||||||
|
// hash to a pay-to-script-hash address housed within an address slice. It is
|
||||||
|
// used to consolidate common code.
|
||||||
|
func scriptHashToAddrs(hash []byte, params *chaincfg.Params) []btcutil.Address {
|
||||||
|
// Skip the hash if it's invalid for some reason.
|
||||||
|
var addrs []btcutil.Address
|
||||||
|
addr, err := btcutil.NewAddressScriptHashFromHash(hash, params)
|
||||||
|
if err == nil {
|
||||||
|
addrs = append(addrs, addr)
|
||||||
|
}
|
||||||
|
return addrs
|
||||||
|
}
|
||||||
|
|
||||||
// ExtractPkScriptAddrs returns the type of script, addresses and required
|
// ExtractPkScriptAddrs returns the type of script, addresses and required
|
||||||
// signatures associated with the passed PkScript. Note that it only works for
|
// signatures associated with the passed PkScript. Note that it only works for
|
||||||
// 'standard' transaction script types. Any data such as public keys which are
|
// 'standard' transaction script types. Any data such as public keys which are
|
||||||
// invalid are omitted from the results.
|
// invalid are omitted from the results.
|
||||||
func ExtractPkScriptAddrs(pkScript []byte, chainParams *chaincfg.Params) (ScriptClass, []btcutil.Address, int, error) {
|
func ExtractPkScriptAddrs(pkScript []byte, chainParams *chaincfg.Params) (ScriptClass, []btcutil.Address, int, error) {
|
||||||
|
|
||||||
|
// Avoid parsing the script for the cases that already have the able to
|
||||||
|
// work with raw scripts.
|
||||||
|
|
||||||
|
// Check for pay-to-script-hash.
|
||||||
|
if hash := extractScriptHash(pkScript); hash != nil {
|
||||||
|
return ScriptHashTy, scriptHashToAddrs(hash, chainParams), 1, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fall back to slow path. Ultimately these are intended to be replaced by
|
||||||
|
// faster variants based on the unparsed raw scripts.
|
||||||
|
|
||||||
var addrs []btcutil.Address
|
var addrs []btcutil.Address
|
||||||
var requiredSigs int
|
var requiredSigs int
|
||||||
|
|
||||||
|
@ -867,18 +892,6 @@ func ExtractPkScriptAddrs(pkScript []byte, chainParams *chaincfg.Params) (Script
|
||||||
addrs = append(addrs, addr)
|
addrs = append(addrs, addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
case ScriptHashTy:
|
|
||||||
// A pay-to-script-hash script is of the form:
|
|
||||||
// OP_HASH160 <scripthash> OP_EQUAL
|
|
||||||
// Therefore the script hash is the 2nd item on the stack.
|
|
||||||
// Skip the script hash if it's invalid for some reason.
|
|
||||||
requiredSigs = 1
|
|
||||||
addr, err := btcutil.NewAddressScriptHashFromHash(pops[1].data,
|
|
||||||
chainParams)
|
|
||||||
if err == nil {
|
|
||||||
addrs = append(addrs, addr)
|
|
||||||
}
|
|
||||||
|
|
||||||
case WitnessV0ScriptHashTy:
|
case WitnessV0ScriptHashTy:
|
||||||
// A pay-to-witness-script-hash script is of the form:
|
// A pay-to-witness-script-hash script is of the form:
|
||||||
// OP_0 <32-byte hash>
|
// OP_0 <32-byte hash>
|
||||||
|
|
Loading…
Reference in a new issue