From 83c7f204cd8e89d93d5c26b3c80f4392a9b278ea Mon Sep 17 00:00:00 2001 From: Wilmer Paulino Date: Thu, 6 Dec 2018 21:14:34 -0800 Subject: [PATCH] chainntnfs: modify GetTestTxidAndScript to generate new P2PKH scripts In this commit, we modify GetTestTxidAndScript to generate new P2PKH scripts. This is needed to properly test confirmations and spends of unique scripts on-chain within the set of interface-level test cases. --- chainntnfs/bitcoindnotify/bitcoind_test.go | 2 +- chainntnfs/test_utils.go | 68 +++++++++++++--------- 2 files changed, 42 insertions(+), 28 deletions(-) diff --git a/chainntnfs/bitcoindnotify/bitcoind_test.go b/chainntnfs/bitcoindnotify/bitcoind_test.go index c74bf6a2..a9e4fee4 100644 --- a/chainntnfs/bitcoindnotify/bitcoind_test.go +++ b/chainntnfs/bitcoindnotify/bitcoind_test.go @@ -197,7 +197,7 @@ func TestHistoricalConfDetailsTxIndex(t *testing.T) { // historical confirmation details using the set of fallback methods when the // backend node's txindex is disabled. func TestHistoricalConfDetailsNoTxIndex(t *testing.T) { - miner, tearDown := chainntnfs.NewMiner(t, nil, true, 400) + miner, tearDown := chainntnfs.NewMiner(t, nil, true, 25) defer tearDown() bitcoindConn, cleanUp := chainntnfs.NewBitcoindBackend( diff --git a/chainntnfs/test_utils.go b/chainntnfs/test_utils.go index bc3dae05..b1e482d3 100644 --- a/chainntnfs/test_utils.go +++ b/chainntnfs/test_utils.go @@ -35,35 +35,44 @@ var ( var ( NetParams = &chaincfg.RegressionNetParams - - testPrivKey = []byte{ - 0x81, 0xb6, 0x37, 0xd8, 0xfc, 0xd2, 0xc6, 0xda, - 0x63, 0x59, 0xe6, 0x96, 0x31, 0x13, 0xa1, 0x17, - 0xd, 0xe7, 0x95, 0xe4, 0xb7, 0x25, 0xb8, 0x4d, - 0x1e, 0xb, 0x4c, 0xfd, 0x9e, 0xc5, 0x8c, 0xe9, - } - privKey, pubKey = btcec.PrivKeyFromBytes(btcec.S256(), testPrivKey) - addrPk, _ = btcutil.NewAddressPubKey( - pubKey.SerializeCompressed(), NetParams, - ) - testAddr = addrPk.AddressPubKeyHash() ) -// GetTestTxidAndScript generate a new test transaction and returns its txid and -// the script of the output being generated. -func GetTestTxidAndScript(h *rpctest.Harness) (*chainhash.Hash, []byte, error) { - script, err := txscript.PayToAddrScript(testAddr) +// randPubKeyHashScript generates a P2PKH script that pays to the public key of +// a randomly-generated private key. +func randPubKeyHashScript() ([]byte, *btcec.PrivateKey, error) { + privKey, err := btcec.NewPrivateKey(btcec.S256()) if err != nil { return nil, nil, err } - output := &wire.TxOut{Value: 2e8, PkScript: script} + pubKeyHash := btcutil.Hash160(privKey.PubKey().SerializeCompressed()) + addrScript, err := btcutil.NewAddressPubKeyHash(pubKeyHash, NetParams) + if err != nil { + return nil, nil, err + } + + pkScript, err := txscript.PayToAddrScript(addrScript) + if err != nil { + return nil, nil, err + } + + return pkScript, privKey, nil +} + +// GetTestTxidAndScript generate a new test transaction and returns its txid and +// the script of the output being generated. +func GetTestTxidAndScript(h *rpctest.Harness) (*chainhash.Hash, []byte, error) { + pkScript, _, err := randPubKeyHashScript() + if err != nil { + return nil, nil, fmt.Errorf("unable to generate pkScript: %v", err) + } + output := &wire.TxOut{Value: 2e8, PkScript: pkScript} txid, err := h.SendOutputs([]*wire.TxOut{output}, 10) if err != nil { return nil, nil, err } - return txid, script, nil + return txid, pkScript, nil } // WaitForMempoolTx waits for the txid to be seen in the miner's mempool. @@ -107,16 +116,18 @@ func WaitForMempoolTx(miner *rpctest.Harness, txid *chainhash.Hash) error { // CreateSpendableOutput creates and returns an output that can be spent later // on. -func CreateSpendableOutput(t *testing.T, miner *rpctest.Harness) (*wire.OutPoint, []byte) { +func CreateSpendableOutput(t *testing.T, + miner *rpctest.Harness) (*wire.OutPoint, *wire.TxOut, *btcec.PrivateKey) { + t.Helper() // Create a transaction that only has one output, the one destined for // the recipient. - script, err := txscript.PayToAddrScript(testAddr) + pkScript, privKey, err := randPubKeyHashScript() if err != nil { - t.Fatalf("unable to create p2pkh script: %v", err) + t.Fatalf("unable to generate pkScript: %v", err) } - output := &wire.TxOut{Value: 2e8, PkScript: script} + output := &wire.TxOut{Value: 2e8, PkScript: pkScript} txid, err := miner.SendOutputsWithoutChange([]*wire.TxOut{output}, 10) if err != nil { t.Fatalf("unable to create tx: %v", err) @@ -130,19 +141,22 @@ func CreateSpendableOutput(t *testing.T, miner *rpctest.Harness) (*wire.OutPoint t.Fatalf("unable to generate single block: %v", err) } - return wire.NewOutPoint(txid, 0), script + return wire.NewOutPoint(txid, 0), output, privKey } // CreateSpendTx creates a transaction spending the specified output. -func CreateSpendTx(t *testing.T, outpoint *wire.OutPoint, pkScript []byte) *wire.MsgTx { +func CreateSpendTx(t *testing.T, prevOutPoint *wire.OutPoint, + prevOutput *wire.TxOut, privKey *btcec.PrivateKey) *wire.MsgTx { + t.Helper() spendingTx := wire.NewMsgTx(1) - spendingTx.AddTxIn(&wire.TxIn{PreviousOutPoint: *outpoint}) - spendingTx.AddTxOut(&wire.TxOut{Value: 1e8, PkScript: pkScript}) + spendingTx.AddTxIn(&wire.TxIn{PreviousOutPoint: *prevOutPoint}) + spendingTx.AddTxOut(&wire.TxOut{Value: 1e8, PkScript: prevOutput.PkScript}) sigScript, err := txscript.SignatureScript( - spendingTx, 0, pkScript, txscript.SigHashAll, privKey, true, + spendingTx, 0, prevOutput.PkScript, txscript.SigHashAll, + privKey, true, ) if err != nil { t.Fatalf("unable to sign tx: %v", err)