WIP: next hard fork #5
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