txscript: Use dcrutil/v2.

This udpates the txscript module to use v2 of the dcrutil module and v2
of the chaincfg module since dcrutil/v2 requires it.

While here, it also modifies the signing functions to accept the new
dcrutil.AddressParams instead of a pointer to a chaincfg.Params struct
in order to remove the tight coupling between txscript and chaincfg at
the API boundary.

It also updates the tests accordingly.
This commit is contained in:
Dave Collins 2019-06-18 23:51:20 -05:00
parent ae32a34020
commit 1e34495ddb
No known key found for this signature in database
GPG Key ID: B8904D9D9C93D1F2
9 changed files with 130 additions and 142 deletions

View File

@ -10,7 +10,6 @@ import (
"io/ioutil"
"testing"
"github.com/decred/dcrd/chaincfg"
"github.com/decred/dcrd/wire"
)
@ -562,7 +561,7 @@ func BenchmarkExtractPkScriptAddrsLarge(b *testing.B) {
}
const scriptVersion = 0
params := &chaincfg.MainNetParams
params := mainNetParams
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, _, _, err := ExtractPkScriptAddrs(scriptVersion, script, params)
@ -580,7 +579,7 @@ func BenchmarkExtractPkScriptAddrs(b *testing.B) {
"EQUAL")
const scriptVersion = 0
params := &chaincfg.MainNetParams
params := mainNetParams
b.ResetTimer()
for i := 0; i < b.N; i++ {
_, _, _, err := ExtractPkScriptAddrs(scriptVersion, script, params)

View File

@ -9,12 +9,12 @@ import (
"encoding/hex"
"fmt"
"github.com/decred/dcrd/chaincfg"
"github.com/decred/dcrd/chaincfg/chainec"
"github.com/decred/dcrd/chaincfg/chainhash"
"github.com/decred/dcrd/chaincfg/v2"
"github.com/decred/dcrd/chaincfg/v2/chainec"
"github.com/decred/dcrd/dcrec"
"github.com/decred/dcrd/dcrec/secp256k1"
"github.com/decred/dcrd/dcrutil"
"github.com/decred/dcrd/dcrutil/v2"
"github.com/decred/dcrd/txscript"
"github.com/decred/dcrd/wire"
)
@ -27,8 +27,9 @@ func ExamplePayToAddrScript() {
// which is useful to ensure the accuracy of the address and determine
// the address type. It is also required for the upcoming call to
// PayToAddrScript.
mainNetParams := chaincfg.MainNetParams()
addressStr := "DsSej1qR3Fyc8kV176DCh9n9cY9nqf9Quxk"
address, err := dcrutil.DecodeAddress(addressStr)
address, err := dcrutil.DecodeAddress(addressStr, mainNetParams)
if err != nil {
fmt.Println(err)
return
@ -67,8 +68,9 @@ func ExampleExtractPkScriptAddrs() {
}
// Extract and print details from the script.
mainNetParams := chaincfg.MainNetParams()
scriptClass, addresses, reqSigs, err := txscript.ExtractPkScriptAddrs(
scriptVersion, script, &chaincfg.MainNetParams)
scriptVersion, script, mainNetParams)
if err != nil {
fmt.Println(err)
return
@ -95,8 +97,9 @@ func ExampleSignTxOutput() {
}
privKey, pubKey := secp256k1.PrivKeyFromBytes(privKeyBytes)
pubKeyHash := dcrutil.Hash160(pubKey.SerializeCompressed())
addr, err := dcrutil.NewAddressPubKeyHash(pubKeyHash,
&chaincfg.MainNetParams, dcrec.STEcdsaSecp256k1)
mainNetParams := chaincfg.MainNetParams()
addr, err := dcrutil.NewAddressPubKeyHash(pubKeyHash, mainNetParams,
dcrec.STEcdsaSecp256k1)
if err != nil {
fmt.Println(err)
return
@ -155,10 +158,9 @@ func ExampleSignTxOutput() {
// Notice that the script database parameter is nil here since it isn't
// used. It must be specified when pay-to-script-hash transactions are
// being signed.
sigScript, err := txscript.SignTxOutput(&chaincfg.MainNetParams,
redeemTx, 0, originTx.TxOut[0].PkScript, txscript.SigHashAll,
txscript.KeyClosure(lookupKey), nil, nil,
dcrec.STEcdsaSecp256k1)
sigScript, err := txscript.SignTxOutput(mainNetParams, redeemTx, 0,
originTx.TxOut[0].PkScript, txscript.SigHashAll,
txscript.KeyClosure(lookupKey), nil, nil, dcrec.STEcdsaSecp256k1)
if err != nil {
fmt.Println(err)
return

View File

@ -3,12 +3,12 @@ module github.com/decred/dcrd/txscript
go 1.11
require (
github.com/decred/dcrd/chaincfg v1.5.1
github.com/decred/dcrd/chaincfg/chainhash v1.0.1
github.com/decred/dcrd/chaincfg/v2 v2.0.2
github.com/decred/dcrd/dcrec v1.0.0
github.com/decred/dcrd/dcrec/edwards v1.0.0
github.com/decred/dcrd/dcrec/secp256k1 v1.0.2
github.com/decred/dcrd/dcrutil v1.3.0
github.com/decred/dcrd/dcrutil/v2 v2.0.0
github.com/decred/dcrd/wire v1.2.0
github.com/decred/slog v1.0.0
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8

View File

@ -8,10 +8,10 @@ github.com/dchest/blake256 v1.0.0 h1:6gUgI5MHdz9g0TdrgKqXsoDX+Zjxmm1Sc6OsoGru50I
github.com/dchest/blake256 v1.0.0/go.mod h1:xXNWCE1jsAP8DAjP+rKw2MbeqLczjI3TRx2VK+9OEYY=
github.com/decred/base58 v1.0.0 h1:BVi1FQCThIjZ0ehG+I99NJ51o0xcc9A/fDKhmJxY6+w=
github.com/decred/base58 v1.0.0/go.mod h1:LLY1p5e3g91byL/UO1eiZaYd+uRoVRarybgcoymu9Ks=
github.com/decred/dcrd/chaincfg v1.5.1 h1:u1Xbq0VTnAXIHW5ECqrWe0VYSgf5vWHqpSiwoLBzxAQ=
github.com/decred/dcrd/chaincfg v1.5.1/go.mod h1:FukMzTjkwzjPU+hK7CqDMQe3NMbSZAYU5PAcsx1wlv0=
github.com/decred/dcrd/chaincfg/chainhash v1.0.1 h1:0vG7U9+dSjSCaHQKdoSKURK2pOb47+b+8FK5q4+Je7M=
github.com/decred/dcrd/chaincfg/chainhash v1.0.1/go.mod h1:OVfvaOsNLS/A1y4Eod0Ip/Lf8qga7VXCQjUQLbkY0Go=
github.com/decred/dcrd/chaincfg/v2 v2.0.2 h1:VeGY52lHuYT01tIGbvYj+OO0GaGxGaJmnh+4vGca1+U=
github.com/decred/dcrd/chaincfg/v2 v2.0.2/go.mod h1:hpKvhLCDAD/xDZ3V1Pqpv9fIKVYYi11DyxETguazyvg=
github.com/decred/dcrd/dcrec v1.0.0 h1:W+z6Es+Rai3MXYVoPAxYr5U1DGis0Co33scJ6uH2J6o=
github.com/decred/dcrd/dcrec v1.0.0/go.mod h1:HIaqbEJQ+PDzQcORxnqen5/V1FR3B4VpIfmePklt8Q8=
github.com/decred/dcrd/dcrec/edwards v1.0.0 h1:UDcPNzclKiJlWqV3x1Fl8xMCJrolo4PB4X9t8LwKDWU=
@ -20,8 +20,8 @@ github.com/decred/dcrd/dcrec/secp256k1 v1.0.1 h1:EFWVd1p0t0Y5tnsm/dJujgV0ORogRJ6
github.com/decred/dcrd/dcrec/secp256k1 v1.0.1/go.mod h1:lhu4eZFSfTJWUnR3CFRcpD+Vta0KUAqnhTsTksHXgy0=
github.com/decred/dcrd/dcrec/secp256k1 v1.0.2 h1:awk7sYJ4pGWmtkiGHFfctztJjHMKGLV8jctGQhAbKe0=
github.com/decred/dcrd/dcrec/secp256k1 v1.0.2/go.mod h1:CHTUIVfmDDd0KFVFpNX1pFVCBUegxW387nN0IGwNKR0=
github.com/decred/dcrd/dcrutil v1.3.0 h1:LtKIiDnq925yJT/4OpIKKiU9/WaxfD9LfhxrpLSi0Qs=
github.com/decred/dcrd/dcrutil v1.3.0/go.mod h1:7fUT70QAarhDwQK62g92uDbbYpjXlXngpy5RBiecufo=
github.com/decred/dcrd/dcrutil/v2 v2.0.0 h1:HTqn2tZ8eqBF4y3hJwjyKBmJt16y7/HjzpE82E/crhY=
github.com/decred/dcrd/dcrutil/v2 v2.0.0/go.mod h1:gUshVAXpd51DlcEhr51QfWL2HJGkMDM1U8chY+9VvQg=
github.com/decred/dcrd/wire v1.2.0 h1:HqJVB7vcklIguzFWgRXw/WYCQ9cD3bUC5TKj53i1Hng=
github.com/decred/dcrd/wire v1.2.0/go.mod h1:/JKOsLInOJu6InN+/zH5AyCq3YDIOW/EqcffvU8fJHM=
github.com/decred/slog v1.0.0 h1:Dl+W8O6/JH6n2xIFN2p3DNjCmjYwvrXsjlSJTQQ4MhE=

View File

@ -18,7 +18,7 @@ import (
"testing"
"github.com/decred/dcrd/chaincfg/chainhash"
"github.com/decred/dcrd/dcrutil"
"github.com/decred/dcrd/dcrutil/v2"
"github.com/decred/dcrd/wire"
)

View File

@ -9,10 +9,9 @@ import (
"errors"
"fmt"
"github.com/decred/dcrd/chaincfg"
"github.com/decred/dcrd/chaincfg/chainec"
"github.com/decred/dcrd/chaincfg/v2/chainec"
"github.com/decred/dcrd/dcrec"
"github.com/decred/dcrd/dcrutil"
"github.com/decred/dcrd/dcrutil/v2"
"github.com/decred/dcrd/wire"
)
@ -227,7 +226,7 @@ func handleStakeOutSign(tx *wire.MsgTx, idx int, subScript []byte,
// its input index, a database of keys, a database of scripts, and information
// about the type of signature and returns a signature, script class, the
// addresses involved, and the number of signatures required.
func sign(chainParams *chaincfg.Params, tx *wire.MsgTx, idx int,
func sign(chainParams dcrutil.AddressParams, tx *wire.MsgTx, idx int,
subScript []byte, hashType SigHashType, kdb KeyDB, sdb ScriptDB,
sigType dcrec.SignatureType) ([]byte,
ScriptClass, []dcrutil.Address, int, error) {
@ -446,7 +445,7 @@ sigLoop:
r := pSig.GetR()
s := pSig.GetS()
if chainec.Secp256k1.Verify(pubKey, hash, r, s) {
aStr := addr.EncodeAddress()
aStr := addr.Address()
if _, ok := addrToSig[aStr]; !ok {
addrToSig[aStr] = sig
}
@ -459,7 +458,7 @@ sigLoop:
doneSigs := 0
// This assumes that addresses are in the same order as in the script.
for _, addr := range addresses {
sig, ok := addrToSig[addr.EncodeAddress()]
sig, ok := addrToSig[addr.Address()]
if !ok {
continue
}
@ -489,7 +488,7 @@ sigLoop:
// NOTE: This function is only valid for version 0 scripts. Since the function
// does not accept a script version, the results are undefined for other script
// versions.
func mergeScripts(chainParams *chaincfg.Params, tx *wire.MsgTx, idx int,
func mergeScripts(chainParams dcrutil.AddressParams, tx *wire.MsgTx, idx int,
pkScript []byte, class ScriptClass, addresses []dcrutil.Address,
nRequired int, sigScript, prevScript []byte) []byte {
@ -593,7 +592,7 @@ func (sc ScriptClosure) GetScript(address dcrutil.Address) ([]byte, error) {
// NOTE: This function is only valid for version 0 scripts. Since the function
// does not accept a script version, the results are undefined for other script
// versions.
func SignTxOutput(chainParams *chaincfg.Params, tx *wire.MsgTx, idx int,
func SignTxOutput(chainParams dcrutil.AddressParams, tx *wire.MsgTx, idx int,
pkScript []byte, hashType SigHashType, kdb KeyDB, sdb ScriptDB,
previousScript []byte, sigType dcrec.SignatureType) ([]byte, error) {

View File

@ -12,17 +12,17 @@ import (
mrand "math/rand"
"testing"
"github.com/decred/dcrd/chaincfg"
"github.com/decred/dcrd/chaincfg/chainec"
"github.com/decred/dcrd/chaincfg/chainhash"
"github.com/decred/dcrd/chaincfg/v2"
"github.com/decred/dcrd/chaincfg/v2/chainec"
"github.com/decred/dcrd/dcrec"
"github.com/decred/dcrd/dcrutil"
"github.com/decred/dcrd/dcrutil/v2"
"github.com/decred/dcrd/wire"
)
// testingParams defines the chain params to use throughout these tests so it
// can more easily be changed if desired.
var testingParams = &chaincfg.RegNetParams
var testingParams = chaincfg.RegNetParams()
const testValueIn = 12345
@ -40,7 +40,7 @@ func mkGetKey(keys map[string]addressToKey) KeyDB {
}
return KeyClosure(func(addr dcrutil.Address) (chainec.PrivateKey,
bool, error) {
a2k, ok := keys[addr.EncodeAddress()]
a2k, ok := keys[addr.Address()]
if !ok {
return nil, false, errors.New("nope 2")
}
@ -74,7 +74,7 @@ func mkGetScript(scripts map[string][]byte) ScriptDB {
}
return ScriptClosure(func(addr dcrutil.Address) ([]byte,
error) {
script, ok := scripts[addr.EncodeAddress()]
script, ok := scripts[addr.Address()]
if !ok {
return nil, errors.New("nope 4")
}
@ -258,7 +258,7 @@ func TestSignTxOutput(t *testing.T) {
if err := signAndCheck(msg, tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, false},
address.Address(): {&key, false},
}), mkGetScript(nil), suite); err != nil {
t.Error(err)
break
@ -266,7 +266,7 @@ func TestSignTxOutput(t *testing.T) {
if err := signBadAndCheck(msg, tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, false},
address.Address(): {&key, false},
}), mkGetScript(nil), suite); err == nil {
t.Errorf("corrupted signature validated %s: %v",
msg, err)
@ -319,7 +319,7 @@ func TestSignTxOutput(t *testing.T) {
sigScript, err := SignTxOutput(
testingParams, tx, i, pkScript,
hashType, mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, false},
address.Address(): {&key, false},
}), mkGetScript(nil), nil, suite)
if err != nil {
t.Errorf("failed to sign output %s: %v", msg,
@ -332,7 +332,7 @@ func TestSignTxOutput(t *testing.T) {
sigScript, err = SignTxOutput(
testingParams, tx, i, pkScript,
hashType, mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, false},
address.Address(): {&key, false},
}), mkGetScript(nil), sigScript, suite)
if err != nil {
t.Errorf("failed to sign output %s a "+
@ -392,7 +392,7 @@ func TestSignTxOutput(t *testing.T) {
if err := signAndCheck(msg, tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(nil), suite); err != nil {
t.Error(err)
break
@ -400,7 +400,7 @@ func TestSignTxOutput(t *testing.T) {
if err := signBadAndCheck(msg, tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(nil), suite); err == nil {
t.Errorf("corrupted signature validated %s: %v",
msg, err)
@ -453,7 +453,7 @@ func TestSignTxOutput(t *testing.T) {
sigScript, err := SignTxOutput(testingParams,
tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(nil), nil, suite)
if err != nil {
t.Errorf("failed to sign output %s: %v", msg,
@ -466,7 +466,7 @@ func TestSignTxOutput(t *testing.T) {
sigScript, err = SignTxOutput(testingParams,
tx, i, pkScript,
hashType, mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(nil), sigScript, suite)
if err != nil {
t.Errorf("failed to sign output %s a "+
@ -514,7 +514,7 @@ func TestSignTxOutput(t *testing.T) {
if err := signAndCheck(msg, tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(nil),
dcrec.STEcdsaSecp256k1); err != nil {
t.Error(err)
@ -523,7 +523,7 @@ func TestSignTxOutput(t *testing.T) {
if err := signBadAndCheck(msg, tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(nil),
dcrec.STEcdsaSecp256k1); err == nil {
t.Errorf("corrupted signature validated %s: %v",
@ -563,7 +563,7 @@ func TestSignTxOutput(t *testing.T) {
if err := signAndCheck(msg, tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(nil),
dcrec.STEcdsaSecp256k1); err != nil {
t.Error(err)
@ -572,7 +572,7 @@ func TestSignTxOutput(t *testing.T) {
if err := signBadAndCheck(msg, tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(nil),
dcrec.STEcdsaSecp256k1); err == nil {
t.Errorf("corrupted signature validated %s: %v",
@ -612,7 +612,7 @@ func TestSignTxOutput(t *testing.T) {
if err := signAndCheck(msg, tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(nil),
dcrec.STEcdsaSecp256k1); err != nil {
t.Error(err)
@ -621,7 +621,7 @@ func TestSignTxOutput(t *testing.T) {
if err := signBadAndCheck(msg, tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(nil),
dcrec.STEcdsaSecp256k1); err == nil {
t.Errorf("corrupted signature validated %s: %v",
@ -661,7 +661,7 @@ func TestSignTxOutput(t *testing.T) {
if err := signAndCheck(msg, tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(nil),
dcrec.STEcdsaSecp256k1); err != nil {
t.Error(err)
@ -670,7 +670,7 @@ func TestSignTxOutput(t *testing.T) {
if err := signBadAndCheck(msg, tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(nil),
dcrec.STEcdsaSecp256k1); err == nil {
t.Errorf("corrupted signature validated %s: %v",
@ -711,7 +711,7 @@ func TestSignTxOutput(t *testing.T) {
if err := signAndCheck(msg, tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, false},
address.Address(): {&key, false},
}), mkGetScript(nil), suite); err != nil {
t.Error(err)
break
@ -719,7 +719,7 @@ func TestSignTxOutput(t *testing.T) {
if err := signBadAndCheck(msg, tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, false},
address.Address(): {&key, false},
}), mkGetScript(nil), suite); err == nil {
t.Errorf("corrupted signature validated %s: %v",
msg, err)
@ -945,7 +945,7 @@ func TestSignTxOutput(t *testing.T) {
sigScript, err := SignTxOutput(testingParams,
tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(nil), nil, suite)
if err != nil {
t.Errorf("failed to sign output %s: %v", msg,
@ -958,7 +958,7 @@ func TestSignTxOutput(t *testing.T) {
sigScript, err = SignTxOutput(testingParams,
tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(nil), sigScript, suite)
if err != nil {
t.Errorf("failed to sign output %s a "+
@ -1036,9 +1036,9 @@ func TestSignTxOutput(t *testing.T) {
if err := signAndCheck(msg, tx, i, scriptPkScript,
hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, false},
address.Address(): {&key, false},
}), mkGetScript(map[string][]byte{
scriptAddr.EncodeAddress(): pkScript,
scriptAddr.Address(): pkScript,
}), suite); err != nil {
t.Error(err)
break
@ -1046,7 +1046,7 @@ func TestSignTxOutput(t *testing.T) {
if err := signBadAndCheck(msg, tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, false},
address.Address(): {&key, false},
}), mkGetScript(nil), suite); err == nil {
t.Errorf("corrupted signature validated %s: %v",
msg, err)
@ -1115,9 +1115,9 @@ func TestSignTxOutput(t *testing.T) {
_, err = SignTxOutput(testingParams, tx, i,
scriptPkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, false},
address.Address(): {&key, false},
}), mkGetScript(map[string][]byte{
scriptAddr.EncodeAddress(): pkScript,
scriptAddr.Address(): pkScript,
}), nil, suite)
if err != nil {
t.Errorf("failed to sign output %s: %v", msg,
@ -1130,9 +1130,9 @@ func TestSignTxOutput(t *testing.T) {
sigScript, err := SignTxOutput(testingParams,
tx, i, scriptPkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, false},
address.Address(): {&key, false},
}), mkGetScript(map[string][]byte{
scriptAddr.EncodeAddress(): pkScript,
scriptAddr.Address(): pkScript,
}), nil, suite)
if err != nil {
t.Errorf("failed to sign output %s a "+
@ -1208,9 +1208,9 @@ func TestSignTxOutput(t *testing.T) {
if err := signAndCheck(msg, tx, i, scriptPkScript,
hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(map[string][]byte{
scriptAddr.EncodeAddress(): pkScript,
scriptAddr.Address(): pkScript,
}), suite); err != nil {
t.Error(err)
break
@ -1218,7 +1218,7 @@ func TestSignTxOutput(t *testing.T) {
if err := signBadAndCheck(msg, tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(nil), suite); err == nil {
t.Errorf("corrupted signature validated %s: %v",
msg, err)
@ -1286,9 +1286,9 @@ func TestSignTxOutput(t *testing.T) {
_, err = SignTxOutput(testingParams,
tx, i, scriptPkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(map[string][]byte{
scriptAddr.EncodeAddress(): pkScript,
scriptAddr.Address(): pkScript,
}), nil, suite)
if err != nil {
t.Errorf("failed to sign output %s: %v", msg,
@ -1301,9 +1301,9 @@ func TestSignTxOutput(t *testing.T) {
sigScript, err := SignTxOutput(testingParams,
tx, i, scriptPkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(map[string][]byte{
scriptAddr.EncodeAddress(): pkScript,
scriptAddr.Address(): pkScript,
}), nil, suite)
if err != nil {
t.Errorf("failed to sign output %s a "+
@ -1393,16 +1393,16 @@ func TestSignTxOutput(t *testing.T) {
if err := signAndCheck(msg, tx, i, scriptPkScript,
hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, false},
address.Address(): {&key, false},
}), mkGetScript(map[string][]byte{
scriptAddr.EncodeAddress(): pkScript,
scriptAddr.Address(): pkScript,
}), suite); err != nil {
t.Error(err)
}
if err := signBadAndCheck(msg, tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, false},
address.Address(): {&key, false},
}), mkGetScript(nil), suite); err == nil {
t.Errorf("corrupted signature validated %s: %v",
msg, err)
@ -1484,9 +1484,9 @@ func TestSignTxOutput(t *testing.T) {
_, err = SignTxOutput(testingParams,
tx, i, scriptPkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, false},
address.Address(): {&key, false},
}), mkGetScript(map[string][]byte{
scriptAddr.EncodeAddress(): pkScript,
scriptAddr.Address(): pkScript,
}), nil, suite)
if err != nil {
t.Errorf("failed to sign output %s: %v", msg,
@ -1499,9 +1499,9 @@ func TestSignTxOutput(t *testing.T) {
sigScript, err := SignTxOutput(testingParams,
tx, i, scriptPkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, false},
address.Address(): {&key, false},
}), mkGetScript(map[string][]byte{
scriptAddr.EncodeAddress(): pkScript,
scriptAddr.Address(): pkScript,
}), nil, suite)
if err != nil {
t.Errorf("failed to sign output %s a "+
@ -1590,9 +1590,9 @@ func TestSignTxOutput(t *testing.T) {
if err := signAndCheck(msg, tx, i, scriptPkScript,
hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(map[string][]byte{
scriptAddr.EncodeAddress(): pkScript,
scriptAddr.Address(): pkScript,
}), suite); err != nil {
t.Error(err)
break
@ -1600,7 +1600,7 @@ func TestSignTxOutput(t *testing.T) {
if err := signBadAndCheck(msg, tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, false},
address.Address(): {&key, false},
}), mkGetScript(nil), suite); err == nil {
t.Errorf("corrupted signature validated %s: %v",
msg, err)
@ -1681,9 +1681,9 @@ func TestSignTxOutput(t *testing.T) {
_, err = SignTxOutput(testingParams,
tx, i, scriptPkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(map[string][]byte{
scriptAddr.EncodeAddress(): pkScript,
scriptAddr.Address(): pkScript,
}), nil, suite)
if err != nil {
t.Errorf("failed to sign output %s: %v", msg,
@ -1696,9 +1696,9 @@ func TestSignTxOutput(t *testing.T) {
sigScript, err := SignTxOutput(testingParams,
tx, i, scriptPkScript, hashType,
mkGetKey(map[string]addressToKey{
address.EncodeAddress(): {&key, true},
address.Address(): {&key, true},
}), mkGetScript(map[string][]byte{
scriptAddr.EncodeAddress(): pkScript,
scriptAddr.Address(): pkScript,
}), nil, suite)
if err != nil {
t.Errorf("failed to sign output %s a "+
@ -1777,10 +1777,10 @@ func TestSignTxOutput(t *testing.T) {
if err := signAndCheck(msg, tx, i, scriptPkScript,
hashType,
mkGetKey(map[string]addressToKey{
address1.EncodeAddress(): {&key1, true},
address2.EncodeAddress(): {&key2, true},
address1.Address(): {&key1, true},
address2.Address(): {&key2, true},
}), mkGetScript(map[string][]byte{
scriptAddr.EncodeAddress(): pkScript,
scriptAddr.Address(): pkScript,
}), dcrec.STEcdsaSecp256k1); err != nil {
t.Error(err)
break
@ -1788,8 +1788,8 @@ func TestSignTxOutput(t *testing.T) {
if err := signBadAndCheck(msg, tx, i, pkScript, hashType,
mkGetKey(map[string]addressToKey{
address1.EncodeAddress(): {&key1, true},
address2.EncodeAddress(): {&key2, true},
address1.Address(): {&key1, true},
address2.Address(): {&key2, true},
}), mkGetScript(nil),
dcrec.STEcdsaSecp256k1); err == nil {
t.Errorf("corrupted signature validated %s: %v",
@ -1860,9 +1860,9 @@ func TestSignTxOutput(t *testing.T) {
sigScript, err := SignTxOutput(testingParams, tx, i,
scriptPkScript, hashType,
mkGetKey(map[string]addressToKey{
address1.EncodeAddress(): {&key1, true},
address1.Address(): {&key1, true},
}), mkGetScript(map[string][]byte{
scriptAddr.EncodeAddress(): pkScript,
scriptAddr.Address(): pkScript,
}), nil, dcrec.STEcdsaSecp256k1)
if err != nil {
t.Errorf("failed to sign output %s: %v", msg,
@ -1881,9 +1881,9 @@ func TestSignTxOutput(t *testing.T) {
sigScript, err = SignTxOutput(testingParams, tx, i,
scriptPkScript, hashType,
mkGetKey(map[string]addressToKey{
address2.EncodeAddress(): {&key2, true},
address2.Address(): {&key2, true},
}), mkGetScript(map[string][]byte{
scriptAddr.EncodeAddress(): pkScript,
scriptAddr.Address(): pkScript,
}), sigScript, dcrec.STEcdsaSecp256k1)
if err != nil {
t.Errorf("failed to sign output %s: %v", msg, err)
@ -1961,9 +1961,9 @@ func TestSignTxOutput(t *testing.T) {
sigScript, err := SignTxOutput(testingParams, tx, i,
scriptPkScript, hashType,
mkGetKey(map[string]addressToKey{
address1.EncodeAddress(): {&key1, true},
address1.Address(): {&key1, true},
}), mkGetScript(map[string][]byte{
scriptAddr.EncodeAddress(): pkScript,
scriptAddr.Address(): pkScript,
}), nil, dcrec.STEcdsaSecp256k1)
if err != nil {
t.Errorf("failed to sign output %s: %v", msg,
@ -1982,10 +1982,10 @@ func TestSignTxOutput(t *testing.T) {
sigScript, err = SignTxOutput(testingParams, tx, i,
scriptPkScript, hashType,
mkGetKey(map[string]addressToKey{
address1.EncodeAddress(): {&key1, true},
address2.EncodeAddress(): {&key2, true},
address1.Address(): {&key1, true},
address2.Address(): {&key2, true},
}), mkGetScript(map[string][]byte{
scriptAddr.EncodeAddress(): pkScript,
scriptAddr.Address(): pkScript,
}), sigScript, dcrec.STEcdsaSecp256k1)
if err != nil {
t.Errorf("failed to sign output %s: %v", msg, err)

View File

@ -9,11 +9,10 @@ import (
"encoding/binary"
"fmt"
"github.com/decred/dcrd/chaincfg"
"github.com/decred/dcrd/chaincfg/chainhash"
"github.com/decred/dcrd/dcrec"
"github.com/decred/dcrd/dcrec/secp256k1"
"github.com/decred/dcrd/dcrutil"
"github.com/decred/dcrd/dcrutil/v2"
)
const (
@ -816,7 +815,7 @@ func PayToSStx(addr dcrutil.Address) ([]byte, error) {
return nil, scriptError(ErrUnsupportedAddress,
nilAddrErrStr)
}
if addr.DSA(addr.Net()) != dcrec.STEcdsaSecp256k1 {
if addr.DSA() != dcrec.STEcdsaSecp256k1 {
str := "unable to generate payment script for " +
"unsupported digital signature algorithm"
return nil, scriptError(ErrUnsupportedAddress, str)
@ -859,7 +858,7 @@ func PayToSStxChange(addr dcrutil.Address) ([]byte, error) {
return nil, scriptError(ErrUnsupportedAddress,
nilAddrErrStr)
}
if addr.DSA(addr.Net()) != dcrec.STEcdsaSecp256k1 {
if addr.DSA() != dcrec.STEcdsaSecp256k1 {
str := "unable to generate payment script for " +
"unsupported digital signature algorithm"
return nil, scriptError(ErrUnsupportedAddress, str)
@ -902,7 +901,7 @@ func PayToSSGen(addr dcrutil.Address) ([]byte, error) {
return nil, scriptError(ErrUnsupportedAddress,
nilAddrErrStr)
}
if addr.DSA(addr.Net()) != dcrec.STEcdsaSecp256k1 {
if addr.DSA() != dcrec.STEcdsaSecp256k1 {
str := "unable to generate payment script for " +
"unsupported digital signature algorithm"
return nil, scriptError(ErrUnsupportedAddress, str)
@ -964,7 +963,7 @@ func PayToSSRtx(addr dcrutil.Address) ([]byte, error) {
return nil, scriptError(ErrUnsupportedAddress,
nilAddrErrStr)
}
if addr.DSA(addr.Net()) != dcrec.STEcdsaSecp256k1 {
if addr.DSA() != dcrec.STEcdsaSecp256k1 {
str := "unable to generate payment script for " +
"unsupported digital signature algorithm"
return nil, scriptError(ErrUnsupportedAddress, str)
@ -1025,7 +1024,7 @@ func GenerateSStxAddrPush(addr dcrutil.Address, amount dcrutil.Amount, limits ui
return nil, scriptError(ErrUnsupportedAddress,
nilAddrErrStr)
}
if addr.DSA(addr.Net()) != dcrec.STEcdsaSecp256k1 {
if addr.DSA() != dcrec.STEcdsaSecp256k1 {
str := "unable to generate payment script for " +
"unsupported digital signature algorithm"
return nil, scriptError(ErrUnsupportedAddress, str)
@ -1101,7 +1100,7 @@ func PayToAddrScript(addr dcrutil.Address) ([]byte, error) {
return nil, scriptError(ErrUnsupportedAddress,
nilAddrErrStr)
}
switch addr.DSA(addr.Net()) {
switch addr.DSA() {
case dcrec.STEcdsaSecp256k1:
return payToPubKeyHashScript(addr.ScriptAddress())
case dcrec.STEd25519:
@ -1193,7 +1192,7 @@ func PushedData(script []byte) ([][]byte, error) {
// pubKeyHashToAddrs is a convenience function to attempt to convert the
// passed hash to a pay-to-pubkey-hash address housed within an address
// slice. It is used to consolidate common code.
func pubKeyHashToAddrs(hash []byte, params *chaincfg.Params) []dcrutil.Address {
func pubKeyHashToAddrs(hash []byte, params dcrutil.AddressParams) []dcrutil.Address {
// Skip the pubkey hash if it's invalid for some reason.
var addrs []dcrutil.Address
addr, err := dcrutil.NewAddressPubKeyHash(hash, params,
@ -1207,7 +1206,7 @@ func pubKeyHashToAddrs(hash []byte, params *chaincfg.Params) []dcrutil.Address {
// 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) []dcrutil.Address {
func scriptHashToAddrs(hash []byte, params dcrutil.AddressParams) []dcrutil.Address {
// Skip the hash if it's invalid for some reason.
var addrs []dcrutil.Address
addr, err := dcrutil.NewAddressScriptHashFromHash(hash, params)
@ -1226,7 +1225,7 @@ func scriptHashToAddrs(hash []byte, params *chaincfg.Params) []dcrutil.Address {
// value will indicate a nonstandard script type for other script versions along
// with an invalid script version error.
func ExtractPkScriptAddrs(version uint16, pkScript []byte,
chainParams *chaincfg.Params) (ScriptClass, []dcrutil.Address, int, error) {
chainParams dcrutil.AddressParams) (ScriptClass, []dcrutil.Address, int, error) {
if version != 0 {
return NonStandardTy, nil, 0, fmt.Errorf("invalid script version")
}

View File

@ -11,13 +11,17 @@ import (
"reflect"
"testing"
"github.com/decred/dcrd/chaincfg"
"github.com/decred/dcrd/chaincfg/chainhash"
"github.com/decred/dcrd/chaincfg/v2"
"github.com/decred/dcrd/dcrec"
"github.com/decred/dcrd/dcrec/secp256k1"
"github.com/decred/dcrd/dcrutil"
"github.com/decred/dcrd/dcrutil/v2"
)
// mainNetParams is an instance of the main network parameters and is shared
// throughout the tests.
var mainNetParams = chaincfg.MainNetParams()
// mustParseShortForm parses the passed short form script and returns the
// resulting bytes. It panics if an error occurs. This is only used in the
// tests as a helper since the only way it can fail is if there is an error in
@ -41,8 +45,7 @@ func newAddressPubKey(serializedPubKey []byte) dcrutil.Address {
if err != nil {
panic("invalid public key in test source")
}
addr, err := dcrutil.NewAddressSecpPubKeyCompressed(pubkey,
&chaincfg.MainNetParams)
addr, err := dcrutil.NewAddressSecpPubKeyCompressed(pubkey, mainNetParams)
if err != nil {
panic("invalid public key in test source")
}
@ -55,7 +58,7 @@ func newAddressPubKey(serializedPubKey []byte) dcrutil.Address {
// as a helper since the only way it can fail is if there is an error in the
// test source code.
func newAddressPubKeyHash(pkHash []byte) dcrutil.Address {
addr, err := dcrutil.NewAddressPubKeyHash(pkHash, &chaincfg.MainNetParams,
addr, err := dcrutil.NewAddressPubKeyHash(pkHash, mainNetParams,
dcrec.STEcdsaSecp256k1)
if err != nil {
panic("invalid public key hash in test source")
@ -69,8 +72,7 @@ func newAddressPubKeyHash(pkHash []byte) dcrutil.Address {
// as a helper since the only way it can fail is if there is an error in the
// test source code.
func newAddressScriptHash(scriptHash []byte) dcrutil.Address {
addr, err := dcrutil.NewAddressScriptHashFromHash(scriptHash,
&chaincfg.MainNetParams)
addr, err := dcrutil.NewAddressScriptHashFromHash(scriptHash, mainNetParams)
if err != nil {
panic("invalid script hash in test source")
}
@ -326,7 +328,7 @@ func TestExtractPkScriptAddrs(t *testing.T) {
t.Logf("Running %d tests.", len(tests))
for i, test := range tests {
class, addrs, reqSigs, err := ExtractPkScriptAddrs(scriptVersion,
test.script, &chaincfg.MainNetParams)
test.script, mainNetParams)
if err != nil && !test.noparse {
t.Errorf("ExtractPkScriptAddrs #%d (%s): %v", i,
test.name, err)
@ -359,9 +361,9 @@ func TestExtractPkScriptAddrs(t *testing.T) {
// unsupported address types are handled properly.
type bogusAddress struct{}
// EncodeAddress simply returns an empty string. It exists to satisfy the
// Address simply returns an empty string. It exists to satisfy the
// dcrutil.Address interface.
func (b *bogusAddress) EncodeAddress() string {
func (b *bogusAddress) Address() string {
return ""
}
@ -377,28 +379,12 @@ func (b *bogusAddress) Hash160() *[20]byte {
return nil
}
// IsForNet lies blatantly to satisfy the dcrutil.Address interface.
func (b *bogusAddress) IsForNet(chainParams *chaincfg.Params) bool {
return true // why not?
}
// String simply returns an empty string. It exists to satisfy the
// dcrutil.Address interface.
func (b *bogusAddress) String() string {
return ""
}
// DSA returns -1.
func (b *bogusAddress) DSA(chainParams *chaincfg.Params) dcrec.SignatureType {
return -1
}
// Net returns the network for the bogus address. It exists to satisfy the
// dcrutil.Address interface.
func (b *bogusAddress) Net() *chaincfg.Params {
return &chaincfg.RegNetParams
}
// TestPayToAddrScript ensures the PayToAddrScript function generates the
// correct scripts for the various types of addresses.
func TestPayToAddrScript(t *testing.T) {
@ -406,8 +392,7 @@ func TestPayToAddrScript(t *testing.T) {
// 1MirQ9bwyQcGVJPwKUgapu5ouK2E2Ey4gX
p2pkhMain, err := dcrutil.NewAddressPubKeyHash(hexToBytes("e34cce70c86"+
"373273efcc54ce7d2a491bb4a0e84"), &chaincfg.MainNetParams,
dcrec.STEcdsaSecp256k1)
"373273efcc54ce7d2a491bb4a0e84"), mainNetParams, dcrec.STEcdsaSecp256k1)
if err != nil {
t.Fatalf("Unable to create public key hash address: %v", err)
}
@ -415,7 +400,7 @@ func TestPayToAddrScript(t *testing.T) {
// Taken from transaction:
// b0539a45de13b3e0403909b8bd1a555b8cbe45fd4e3f3fda76f3a5f52835c29d
p2shMain, _ := dcrutil.NewAddressScriptHashFromHash(hexToBytes("e8c30"+
"0c87986efa84c37c0519929019ef86eb5b4"), &chaincfg.MainNetParams)
"0c87986efa84c37c0519929019ef86eb5b4"), mainNetParams)
if err != nil {
t.Fatalf("Unable to create script hash address: %v", err)
}
@ -423,14 +408,14 @@ func TestPayToAddrScript(t *testing.T) {
// mainnet p2pk 13CG6SJ3yHUXo4Cr2RY4THLLJrNFuG3gUg
p2pkCompressedMain, err := dcrutil.NewAddressSecpPubKey(hexToBytes("02192d7"+
"4d0cb94344c9569c2e77901573d8d7903c3ebec3a957724895dca52c6b4"),
&chaincfg.MainNetParams)
mainNetParams)
if err != nil {
t.Fatalf("Unable to create pubkey address (compressed): %v",
err)
}
p2pkCompressed2Main, err := dcrutil.NewAddressSecpPubKey(hexToBytes("03b0b"+
"d634234abbb1ba1e986e884185c61cf43e001f9137f23c2c409273eb16e65"),
&chaincfg.MainNetParams)
mainNetParams)
if err != nil {
t.Fatalf("Unable to create pubkey address (compressed 2): %v",
err)
@ -524,14 +509,14 @@ func TestMultiSigScript(t *testing.T) {
// mainnet p2pk 13CG6SJ3yHUXo4Cr2RY4THLLJrNFuG3gUg
p2pkCompressedMain, err := dcrutil.NewAddressSecpPubKey(hexToBytes("02192d"+
"74d0cb94344c9569c2e77901573d8d7903c3ebec3a957724895dca52c6b4"),
&chaincfg.MainNetParams)
mainNetParams)
if err != nil {
t.Fatalf("Unable to create pubkey address (compressed): %v",
err)
}
p2pkCompressed2Main, err := dcrutil.NewAddressSecpPubKey(hexToBytes("03b0b"+
"d634234abbb1ba1e986e884185c61cf43e001f9137f23c2c409273eb16e65"),
&chaincfg.MainNetParams)
mainNetParams)
if err != nil {
t.Fatalf("Unable to create pubkey address (compressed 2): %v",
err)
@ -1040,14 +1025,17 @@ func TestGenerateProvablyPruneableOut(t *testing.T) {
// TestGenerateSStxAddrPush ensures an expected OP_RETURN push is generated.
func TestGenerateSStxAddrPush(t *testing.T) {
testNetParams := chaincfg.TestNet3Params()
var tests = []struct {
addrStr string
net dcrutil.AddressParams
amount dcrutil.Amount
limits uint16
expected []byte
}{
{
"Dcur2mcGjmENx4DhNqDctW5wJCVyT3Qeqkx",
mainNetParams,
1000,
10,
hexToBytes("6a1ef5916158e3e2c4551c1796708db8367207ed1" +
@ -1055,6 +1043,7 @@ func TestGenerateSStxAddrPush(t *testing.T) {
},
{
"TscB7V5RuR1oXpA364DFEsNDuAs8Rk6BHJE",
testNetParams,
543543,
256,
hexToBytes("6a1e7a5c4cca76f2e0b36db4763daacbd6cbb6ee6" +
@ -1062,7 +1051,7 @@ func TestGenerateSStxAddrPush(t *testing.T) {
},
}
for _, test := range tests {
addr, err := dcrutil.DecodeAddress(test.addrStr)
addr, err := dcrutil.DecodeAddress(test.addrStr, test.net)
if err != nil {
t.Errorf("DecodeAddress failed: %v", err)
continue