Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

txscript: Split signing code to sign subpackage. #2642

Merged
merged 1 commit into from
May 7, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion blockchain/chaingen/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"github.com/decred/dcrd/chaincfg/v3"
"github.com/decred/dcrd/dcrutil/v4"
"github.com/decred/dcrd/txscript/v4"
"github.com/decred/dcrd/txscript/v4/sign"
"github.com/decred/dcrd/txscript/v4/stdaddr"
"github.com/decred/dcrd/wire"
)
Expand Down Expand Up @@ -620,7 +621,7 @@ func (g *Generator) CreateTreasuryTSpend(privKey []byte, payouts []AddressAmount
})

// Calculate TSpend signature without SigHashType.
sigscript, err := txscript.TSpendSignatureScript(msgTx, privKey)
sigscript, err := sign.TSpendSignatureScript(msgTx, privKey)
if err != nil {
panic(err)
}
Expand Down
3 changes: 2 additions & 1 deletion blockchain/common_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import (
"github.com/decred/dcrd/dcrutil/v4"
"github.com/decred/dcrd/lru"
"github.com/decred/dcrd/txscript/v4"
"github.com/decred/dcrd/txscript/v4/sign"
"github.com/decred/dcrd/wire"
)

Expand Down Expand Up @@ -345,7 +346,7 @@ func newFakeCreateTSpend(privKey []byte, payouts []dcrutil.Amount, fee dcrutil.A
})

// Calculate TSpend signature without SigHashType.
sigscript, err := txscript.TSpendSignatureScript(msgTx, privKey)
sigscript, err := sign.TSpendSignatureScript(msgTx, privKey)
if err != nil {
panic(err)
}
Expand Down
11 changes: 5 additions & 6 deletions blockchain/fullblocktests/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"github.com/decred/dcrd/dcrec/secp256k1/v4"
"github.com/decred/dcrd/dcrutil/v4"
"github.com/decred/dcrd/txscript/v4"
"github.com/decred/dcrd/txscript/v4/sign"
"github.com/decred/dcrd/txscript/v4/stdaddr"
"github.com/decred/dcrd/wire"
)
Expand Down Expand Up @@ -1561,9 +1562,8 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) {
// associated p2sh output in bshso0.
spend := chaingen.MakeSpendableOut(bshso0, uint32(i+2), 2)
tx := g.CreateSpendTx(&spend, lowFee)
sig, err := txscript.RawTxInSignature(tx, 0,
redeemScript, txscript.SigHashAll, privKeyBytes,
dcrec.STEcdsaSecp256k1)
sig, err := sign.RawTxInSignature(tx, 0, redeemScript,
txscript.SigHashAll, privKeyBytes, dcrec.STEcdsaSecp256k1)
if err != nil {
panic(err)
}
Expand Down Expand Up @@ -1597,9 +1597,8 @@ func Generate(includeLargeReorg bool) (tests [][]TestInstance, err error) {
// associated p2sh output in bshso0.
spend := chaingen.MakeSpendableOut(bshso0, uint32(i+2), 2)
tx := g.CreateSpendTx(&spend, lowFee)
sig, err := txscript.RawTxInSignature(tx, 0,
redeemScript, txscript.SigHashAll, privKeyBytes,
dcrec.STEcdsaSecp256k1)
sig, err := sign.RawTxInSignature(tx, 0, redeemScript,
txscript.SigHashAll, privKeyBytes, dcrec.STEcdsaSecp256k1)
if err != nil {
panic(err)
}
Expand Down
13 changes: 7 additions & 6 deletions blockchain/treasury_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (
"github.com/decred/dcrd/gcs/v3/blockcf2"
"github.com/decred/dcrd/lru"
"github.com/decred/dcrd/txscript/v4"
"github.com/decred/dcrd/txscript/v4/sign"
"github.com/decred/dcrd/txscript/v4/stdaddr"
"github.com/decred/dcrd/wire"
)
Expand Down Expand Up @@ -2044,18 +2045,18 @@ func TestSpendableTreasuryTxs(t *testing.T) {
})

// Generate the valid signature for the first input, which is a P2PKH.
sig, err := txscript.SignatureScript(tx, 0, tspend.TxOut[1].PkScript,
txscript.SigHashAll, spendPrivKey.Serialize(),
dcrec.STEcdsaSecp256k1, true)
sig, err := sign.SignatureScript(tx, 0, tspend.TxOut[1].PkScript,
txscript.SigHashAll, spendPrivKey.Serialize(), dcrec.STEcdsaSecp256k1,
true)
if err != nil {
t.Fatalf("unable to generate sig: %v", err)
}
tx.TxIn[0].SignatureScript = sig

// Generate the valid signature for the third input, which is a P2PKH.
sig, err = txscript.SignatureScript(tx, 2, tadd1.TxOut[1].PkScript,
txscript.SigHashAll, addPrivKey.Serialize(),
dcrec.STEcdsaSecp256k1, true)
sig, err = sign.SignatureScript(tx, 2, tadd1.TxOut[1].PkScript,
txscript.SigHashAll, addPrivKey.Serialize(), dcrec.STEcdsaSecp256k1,
true)
if err != nil {
t.Fatalf("unable to generate sig: %v", err)
}
Expand Down
40 changes: 19 additions & 21 deletions internal/mempool/mempool_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
"github.com/decred/dcrd/dcrutil/v4"
"github.com/decred/dcrd/internal/mining"
"github.com/decred/dcrd/txscript/v4"
"github.com/decred/dcrd/txscript/v4/sign"
"github.com/decred/dcrd/txscript/v4/stdaddr"
"github.com/decred/dcrd/wire"
)
Expand Down Expand Up @@ -464,9 +465,8 @@ func (p *poolHarness) CreateSignedTx(inputs []spendableOutput, numOutputs uint32

// Sign the new transaction.
for i := range tx.TxIn {
sigScript, err := txscript.SignatureScript(tx,
i, p.payScript, txscript.SigHashAll, p.signKey,
dcrec.STEcdsaSecp256k1, true)
sigScript, err := sign.SignatureScript(tx, i, p.payScript,
txscript.SigHashAll, p.signKey, dcrec.STEcdsaSecp256k1, true)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -501,9 +501,8 @@ func (p *poolHarness) CreateTxChain(firstOutput spendableOutput, numTxns uint32)
})

// Sign the new transaction.
sigScript, err := txscript.SignatureScript(tx, 0,
p.payScript, txscript.SigHashAll, p.signKey,
dcrec.STEcdsaSecp256k1, true)
sigScript, err := sign.SignatureScript(tx, 0, p.payScript,
txscript.SigHashAll, p.signKey, dcrec.STEcdsaSecp256k1, true)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -559,9 +558,9 @@ func (p *poolHarness) CreateTicketPurchase(sourceTx *dcrutil.Tx, cost int64) (*d
tx.AddTxOut(newTxOut(change, changeScriptVer, changeScript))

// Sign the ticket purchase.
sigScript, err := txscript.SignatureScript(tx, 0,
sourceTx.MsgTx().TxOut[0].PkScript, txscript.SigHashAll,
p.signKey, dcrec.STEcdsaSecp256k1, true)
sigScript, err := sign.SignatureScript(tx, 0,
sourceTx.MsgTx().TxOut[0].PkScript, txscript.SigHashAll, p.signKey,
dcrec.STEcdsaSecp256k1, true)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -655,9 +654,9 @@ func (p *poolHarness) CreateVote(ticket *dcrutil.Tx, mungers ...func(*wire.MsgTx
// Sign the input.
inputToSign := 1
redeemTicketScript := ticket.MsgTx().TxOut[0].PkScript
signedScript, err := txscript.SignTxOutput(p.chainParams, vote, inputToSign,
redeemTicketScript, txscript.SigHashAll, p,
p, vote.TxIn[inputToSign].SignatureScript, noTreasury)
signedScript, err := sign.SignTxOutput(p.chainParams, vote, inputToSign,
redeemTicketScript, txscript.SigHashAll, p, p,
vote.TxIn[inputToSign].SignatureScript, noTreasury)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -704,7 +703,7 @@ func (p *poolHarness) CreateRevocation(ticket *dcrutil.Tx) (*dcrutil.Tx, error)
// Sign the input.
inputToSign := 0
redeemTicketScript := ticket.MsgTx().TxOut[0].PkScript
signedScript, err := txscript.SignTxOutput(p.chainParams, revocation,
signedScript, err := sign.SignTxOutput(p.chainParams, revocation,
inputToSign, redeemTicketScript, txscript.SigHashAll, p, p,
revocation.TxIn[inputToSign].SignatureScript, noTreasury)
if err != nil {
Expand Down Expand Up @@ -2321,7 +2320,7 @@ func createTSpend(t *testing.T, expiry uint32, tspendAmount, tspendFee int64, pi
})

// Calculate TSpend signature without SigHashType.
sigscript, err := txscript.TSpendSignatureScript(msgTx, piKey)
sigscript, err := sign.TSpendSignatureScript(msgTx, piKey)
if err != nil {
t.Fatalf("unable to sign tspend: %v", err)
}
Expand Down Expand Up @@ -2467,7 +2466,7 @@ func TestHandlesTSpends(t *testing.T) {
// should fail.
tx := tspends[1].MsgTx()
tx.Expiry += 1
tx.TxIn[0].SignatureScript, err = txscript.TSpendSignatureScript(tx, piKey)
tx.TxIn[0].SignatureScript, err = sign.TSpendSignatureScript(tx, piKey)
if err != nil {
t.Fatal(err)
}
Expand All @@ -2477,7 +2476,7 @@ func TestHandlesTSpends(t *testing.T) {
// fail.
tx = tspends[1].MsgTx()
tx.Expiry = uint32(tvi)
tx.TxIn[0].SignatureScript, err = txscript.TSpendSignatureScript(tx, piKey)
tx.TxIn[0].SignatureScript, err = sign.TSpendSignatureScript(tx, piKey)
if err != nil {
t.Fatal(err)
}
Expand All @@ -2491,7 +2490,7 @@ func TestHandlesTSpends(t *testing.T) {
// in the next block).
tx = tspends[1].MsgTx()
tx.Expiry = expiry + uint32(tvi*mul*2)
tx.TxIn[0].SignatureScript, err = txscript.TSpendSignatureScript(tx, piKey)
tx.TxIn[0].SignatureScript, err = sign.TSpendSignatureScript(tx, piKey)
if err != nil {
t.Fatal(err)
}
Expand All @@ -2511,7 +2510,7 @@ func TestHandlesTSpends(t *testing.T) {
t.Fatal(err)
}
tx = tspends[3].MsgTx()
tx.TxIn[0].SignatureScript, err = txscript.TSpendSignatureScript(tx, nonPiKey)
tx.TxIn[0].SignatureScript, err = sign.TSpendSignatureScript(tx, nonPiKey)
if err != nil {
t.Fatal(err)
}
Expand Down Expand Up @@ -2579,9 +2578,8 @@ func createTAdd(t *testing.T, spend *spendableOutput, payScript, signKey []byte,
}

var err error
tx.TxIn[0].SignatureScript, err = txscript.SignatureScript(tx,
0, payScript, txscript.SigHashAll, signKey,
dcrec.STEcdsaSecp256k1, true)
tx.TxIn[0].SignatureScript, err = sign.SignatureScript(tx, 0, payScript,
txscript.SigHashAll, signKey, dcrec.STEcdsaSecp256k1, true)
if err != nil {
t.Fatalf("Unable to sign tadd: %v", err)
}
Expand Down
19 changes: 9 additions & 10 deletions internal/mining/mining_harness_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"github.com/decred/dcrd/dcrec/secp256k1/v4"
"github.com/decred/dcrd/dcrutil/v4"
"github.com/decred/dcrd/txscript/v4"
"github.com/decred/dcrd/txscript/v4/sign"
"github.com/decred/dcrd/txscript/v4/stdaddr"
"github.com/decred/dcrd/wire"
)
Expand Down Expand Up @@ -1003,9 +1004,8 @@ func (m *miningHarness) CreateTxChain(firstOutput spendableOutput, numTxns uint3
m.payScript))

// Sign the new transaction.
sigScript, err := txscript.SignatureScript(tx, 0,
m.payScript, txscript.SigHashAll, m.signKey,
dcrec.STEcdsaSecp256k1, true)
sigScript, err := sign.SignatureScript(tx, 0, m.payScript,
txscript.SigHashAll, m.signKey, dcrec.STEcdsaSecp256k1, true)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -1076,9 +1076,8 @@ func (m *miningHarness) CreateSignedTx(inputs []spendableOutput, numOutputs uint

// Sign the new transaction.
for i := range tx.TxIn {
sigScript, err := txscript.SignatureScript(tx,
i, m.payScript, txscript.SigHashAll, m.signKey,
dcrec.STEcdsaSecp256k1, true)
sigScript, err := sign.SignatureScript(tx, i, m.payScript,
txscript.SigHashAll, m.signKey, dcrec.STEcdsaSecp256k1, true)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -1128,9 +1127,9 @@ func (m *miningHarness) CreateTicketPurchase(sourceTx *dcrutil.Tx, cost int64) (
tx.AddTxOut(newTxOut(change, changeScriptVer, changeScript))

// Sign the ticket purchase.
sigScript, err := txscript.SignatureScript(tx, 0,
sourceTx.MsgTx().TxOut[0].PkScript, txscript.SigHashAll,
m.signKey, dcrec.STEcdsaSecp256k1, true)
sigScript, err := sign.SignatureScript(tx, 0,
sourceTx.MsgTx().TxOut[0].PkScript, txscript.SigHashAll, m.signKey,
dcrec.STEcdsaSecp256k1, true)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -1215,7 +1214,7 @@ func (m *miningHarness) CreateVote(ticket *dcrutil.Tx, mungers ...func(*wire.Msg
// Sign the input.
inputToSign := 1
redeemTicketScript := ticket.MsgTx().TxOut[0].PkScript
signedScript, err := txscript.SignTxOutput(params, vote, inputToSign,
signedScript, err := sign.SignTxOutput(params, vote, inputToSign,
redeemTicketScript, txscript.SigHashAll, m, m,
vote.TxIn[inputToSign].SignatureScript, m.chain.isTreasuryAgendaActive)
if err != nil {
Expand Down
18 changes: 8 additions & 10 deletions internal/rpcserver/treasury_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"github.com/decred/dcrd/rpcclient/v7"
"github.com/decred/dcrd/rpctest"
"github.com/decred/dcrd/txscript/v4"
"github.com/decred/dcrd/txscript/v4/sign"
"github.com/decred/dcrd/txscript/v4/stdaddr"
"github.com/decred/dcrd/wire"
)
Expand Down Expand Up @@ -92,7 +93,7 @@ func createTSpend(privKey []byte, payouts []tspendPayout, fee dcrutil.Amount, ex
})

// Calculate TSpend signature without SigHashType.
sigscript, err := txscript.TSpendSignatureScript(msgTx, privKey)
sigscript, err := sign.TSpendSignatureScript(msgTx, privKey)
if err != nil {
panic(err)
}
Expand Down Expand Up @@ -120,9 +121,8 @@ func createTAdd(t testing.TB, privKey []byte, prevOut *wire.OutPoint, pkScript [
}
tx.Version = wire.TxVersionTreasury

sig, err := txscript.SignatureScript(tx, 0, pkScript,
txscript.SigHashAll, privKey,
dcrec.STEcdsaSecp256k1, true)
sig, err := sign.SignatureScript(tx, 0, pkScript, txscript.SigHashAll,
privKey, dcrec.STEcdsaSecp256k1, true)
if err != nil {
t.Fatalf("unable to generate sig: %v", err)
}
Expand Down Expand Up @@ -473,17 +473,15 @@ func TestTreasury(t *testing.T) {
})

// Generate signatures for the P2PKH inputs.
sig, err := txscript.SignatureScript(tx, 0, tspendYes.TxOut[1].PkScript,
txscript.SigHashAll, privKey.Serialize(),
dcrec.STEcdsaSecp256k1, true)
sig, err := sign.SignatureScript(tx, 0, tspendYes.TxOut[1].PkScript,
txscript.SigHashAll, privKey.Serialize(), dcrec.STEcdsaSecp256k1, true)
if err != nil {
t.Fatalf("unable to generate sig: %v", err)
}
tx.TxIn[0].SignatureScript = sig

sig, err = txscript.SignatureScript(tx, 2, tadd1.TxOut[1].PkScript,
txscript.SigHashAll, privKey.Serialize(),
dcrec.STEcdsaSecp256k1, true)
sig, err = sign.SignatureScript(tx, 2, tadd1.TxOut[1].PkScript,
txscript.SigHashAll, privKey.Serialize(), dcrec.STEcdsaSecp256k1, true)
if err != nil {
t.Fatalf("unable to generate sig: %v", err)
}
Expand Down
3 changes: 2 additions & 1 deletion rpctest/memwallet.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"github.com/decred/dcrd/hdkeychain/v3"
"github.com/decred/dcrd/rpcclient/v7"
"github.com/decred/dcrd/txscript/v4"
"github.com/decred/dcrd/txscript/v4/sign"
"github.com/decred/dcrd/txscript/v4/stdaddr"
"github.com/decred/dcrd/wire"
)
Expand Down Expand Up @@ -529,7 +530,7 @@ func (m *memWallet) CreateTransaction(outputs []*wire.TxOut, feeRate dcrutil.Amo
return nil, err
}

sigScript, err := txscript.SignatureScript(tx, i, utxo.pkScript,
sigScript, err := sign.SignatureScript(tx, i, utxo.pkScript,
txscript.SigHashAll, privKey, dcrec.STEcdsaSecp256k1, true)
if err != nil {
return nil, err
Expand Down
5 changes: 3 additions & 2 deletions rpctest/votingwallet.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
dcrdtypes "github.com/decred/dcrd/rpc/jsonrpc/types/v3"
"github.com/decred/dcrd/rpcclient/v7"
"github.com/decred/dcrd/txscript/v4"
"github.com/decred/dcrd/txscript/v4/sign"
"github.com/decred/dcrd/txscript/v4/stdaddr"
"github.com/decred/dcrd/wire"
)
Expand Down Expand Up @@ -456,7 +457,7 @@ func (w *VotingWallet) handleBlockConnectedNtfn(ntfn *blockConnectedNtfn) {
prevScript = w.voteRetScript
}

sig, err := txscript.SignatureScript(t, 0, prevScript, txscript.SigHashAll,
sig, err := sign.SignatureScript(t, 0, prevScript, txscript.SigHashAll,
w.privateKey, dcrec.STEcdsaSecp256k1, true)
if err != nil {
w.logError(fmt.Errorf("failed to sign ticket tx: %v", err))
Expand Down Expand Up @@ -565,7 +566,7 @@ func (w *VotingWallet) handleWinningTicketsNtfn(ntfn *winningTicketsNtfn) {
vote.Version = wire.TxVersionTreasury
}

sig, err := txscript.SignatureScript(vote, 1, w.p2sstx, txscript.SigHashAll,
sig, err := sign.SignatureScript(vote, 1, w.p2sstx, txscript.SigHashAll,
w.privateKey, dcrec.STEcdsaSecp256k1, true)
if err != nil {
w.logError(fmt.Errorf("failed to sign ticket tx: %v", err))
Expand Down
3 changes: 0 additions & 3 deletions txscript/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,6 @@ the standard go tooling for working with modules to incorporate it.
* [Extracting Details from Standard Scripts](https://pkg.go.dev/github.com/decred/dcrd/txscript/v4#example-ExtractPkScriptAddrs)
Demonstrates extracting information from a standard public key script.

* [Manually Signing a Transaction Output](https://pkg.go.dev/github.com/decred/dcrd/txscript/v4#example-SignTxOutput)
Demonstrates manually creating and signing a redeem transaction.

* [Counting Opcodes in Scripts](https://pkg.go.dev/github.com/decred/dcrd/txscript/v4#example-ScriptTokenizer)
Demonstrates creating a script tokenizer instance and using it to count the
number of opcodes a script contains.
Expand Down
12 changes: 12 additions & 0 deletions txscript/bench_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,18 @@ import (
"github.com/decred/dcrd/wire"
)

const (
// noTreasury signifies the treasury agenda should be treated as though
// it is inactive. It is used to increase the readability of the
// tests.
noTreasury = false

// withTreasury signifies the treasury agenda should be treated as
// though it is active. It is used to increase the readability of
// the tests.
withTreasury = true
)

var (
// manyInputsBenchTx is a transaction that contains a lot of inputs which is
// useful for benchmarking signature hash calculation.
Expand Down
Loading