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

multi: btcsuite and go-ethereum updates #1542

Merged
merged 5 commits into from May 25, 2022
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion client/asset/bch/bch.go
Expand Up @@ -14,7 +14,7 @@ import (
"decred.org/dcrdex/dex"
dexbch "decred.org/dcrdex/dex/networks/bch"
dexbtc "decred.org/dcrdex/dex/networks/btc"
"github.com/btcsuite/btcd/btcec"
"github.com/btcsuite/btcd/btcec/v2"
"github.com/btcsuite/btcd/chaincfg"
"github.com/btcsuite/btcd/txscript"
"github.com/btcsuite/btcd/wire"
Expand Down
33 changes: 14 additions & 19 deletions client/asset/btc/btc.go
Expand Up @@ -24,13 +24,14 @@ import (
"decred.org/dcrdex/dex/calc"
"decred.org/dcrdex/dex/config"
dexbtc "decred.org/dcrdex/dex/networks/btc"
"github.com/btcsuite/btcd/btcec"
"github.com/btcsuite/btcd/btcec/v2"
"github.com/btcsuite/btcd/btcec/v2/ecdsa"
"github.com/btcsuite/btcd/btcjson"
"github.com/btcsuite/btcd/btcutil"
"github.com/btcsuite/btcd/chaincfg"
"github.com/btcsuite/btcd/chaincfg/chainhash"
"github.com/btcsuite/btcd/txscript"
"github.com/btcsuite/btcd/wire"
"github.com/btcsuite/btcutil"
"github.com/btcsuite/btcwallet/wallet"
"github.com/decred/dcrd/dcrjson/v4" // for dcrjson.RPCError returns from rpcclient
"github.com/decred/dcrd/rpcclient/v7"
Expand Down Expand Up @@ -2827,7 +2828,10 @@ func (btc *baseWallet) Redeem(form *asset.RedeemForm) ([]dex.Bytes, asset.Coin,
msgTx.AddTxOut(txOut)

if btc.segwit {
sigHashes := txscript.NewTxSigHashes(msgTx)
// NewTxSigHashes uses the PrevOutFetcher only for detecting a taproot
// output, so we can provide a dummy that always returns a wire.TxOut
// with a nil pkScript that so IsPayToTaproot returns false.
sigHashes := txscript.NewTxSigHashes(msgTx, new(txscript.CannedPrevOutputFetcher))
for i, r := range form.Redemptions {
contract := contracts[i]
redeemSig, redeemPubKey, err := btc.createWitnessSig(msgTx, i, contract, addresses[i], values[i], sigHashes)
Expand Down Expand Up @@ -2914,10 +2918,7 @@ func (btc *baseWallet) SignMessage(coin asset.Coin, msg dex.Bytes) (pubkeys, sig
}
pk := privKey.PubKey()
hash := chainhash.HashB(msg) // legacy servers will not accept this signature!
sig, err := privKey.Sign(hash)
if err != nil {
return nil, nil, err
}
sig := ecdsa.Sign(privKey, hash)
pubkeys = append(pubkeys, pk.SerializeCompressed())
sigs = append(sigs, sig.Serialize()) // DER format serialization
return
Expand Down Expand Up @@ -3362,8 +3363,8 @@ func (btc *baseWallet) refundTx(txHash *chainhash.Hash, vout uint32, contract de

if btc.segwit {
// Add the marker and flag weight too.
witnessVBtyes := uint64((dexbtc.RefundSigScriptSize + 2 + 3) / 4)
size += witnessVBtyes + dexbtc.P2WPKHOutputSize
witnessVBytes := uint64((dexbtc.RefundSigScriptSize + 2 + 3) / 4)
size += witnessVBytes + dexbtc.P2WPKHOutputSize
} else {
size += dexbtc.RefundSigScriptSize + dexbtc.P2PKHOutputSize
}
Expand All @@ -3390,7 +3391,10 @@ func (btc *baseWallet) refundTx(txHash *chainhash.Hash, vout uint32, contract de
msgTx.AddTxOut(txOut)

if btc.segwit {
sigHashes := txscript.NewTxSigHashes(msgTx)
// NewTxSigHashes uses the PrevOutFetcher only for detecting a taproot
// output, so we can provide a dummy that always returns a wire.TxOut
// with a nil pkScript that so IsPayToTaproot returns false.
sigHashes := txscript.NewTxSigHashes(msgTx, new(txscript.CannedPrevOutputFetcher))
refundSig, refundPubKey, err := btc.createWitnessSig(msgTx, 0, contract, sender, val, sigHashes)
if err != nil {
return nil, fmt.Errorf("createWitnessSig: %w", err)
Expand Down Expand Up @@ -4190,15 +4194,6 @@ type blockHeader struct {
PreviousBlockHash string `json:"previousblockhash"`
}

// verboseBlockTxs is a partial btcjson.GetBlockVerboseResult with
// key "rawtx" -> "tx".
type verboseBlockTxs struct {
Hash string `json:"hash"`
Height uint64 `json:"height"`
NextHash string `json:"nextblockhash"`
Tx []btcjson.TxRawResult `json:"tx"`
}

// externalAddress will return a new address for public use.
func (btc *baseWallet) externalAddress() (btcutil.Address, error) {
if btc.segwit {
Expand Down
21 changes: 10 additions & 11 deletions client/asset/btc/btc_test.go
Expand Up @@ -22,13 +22,14 @@ import (
"decred.org/dcrdex/dex/calc"
"decred.org/dcrdex/dex/encode"
dexbtc "decred.org/dcrdex/dex/networks/btc"
"github.com/btcsuite/btcd/btcec"
"github.com/btcsuite/btcd/btcec/v2"
"github.com/btcsuite/btcd/btcec/v2/ecdsa"
"github.com/btcsuite/btcd/btcjson"
"github.com/btcsuite/btcd/btcutil"
"github.com/btcsuite/btcd/chaincfg"
"github.com/btcsuite/btcd/chaincfg/chainhash"
"github.com/btcsuite/btcd/txscript"
"github.com/btcsuite/btcd/wire"
"github.com/btcsuite/btcutil"
)

var (
Expand Down Expand Up @@ -1645,7 +1646,7 @@ func testSwap(t *testing.T, segwit bool, walletType string) {
node.changeAddr = addrStr

privBytes, _ := hex.DecodeString("b07209eec1a8fb6cfe5cb6ace36567406971a75c330db7101fb21bc679bc5330")
privKey, _ := btcec.PrivKeyFromBytes(btcec.S256(), privBytes)
privKey, _ := btcec.PrivKeyFromBytes(privBytes)
wif, err := btcutil.NewWIF(privKey, &chaincfg.MainNetParams, true)
if err != nil {
t.Fatalf("error encoding wif: %v", err)
Expand Down Expand Up @@ -1782,7 +1783,7 @@ func testRedeem(t *testing.T, segwit bool, walletType string) {
}

privBytes, _ := hex.DecodeString("b07209eec1a8fb6cfe5cb6ace36567406971a75c330db7101fb21bc679bc5330")
privKey, _ := btcec.PrivKeyFromBytes(btcec.S256(), privBytes)
privKey, _ := btcec.PrivKeyFromBytes(privBytes)
wif, err := btcutil.NewWIF(privKey, &chaincfg.MainNetParams, true)
if err != nil {
t.Fatalf("error encoding wif: %v", err)
Expand Down Expand Up @@ -1891,7 +1892,7 @@ func testSignMessage(t *testing.T, segwit bool, walletType string) {

vout := uint32(5)
privBytes, _ := hex.DecodeString("b07209eec1a8fb6cfe5cb6ace36567406971a75c330db7101fb21bc679bc5330")
privKey, pubKey := btcec.PrivKeyFromBytes(btcec.S256(), privBytes)
privKey, pubKey := btcec.PrivKeyFromBytes(privBytes)
wif, err := btcutil.NewWIF(privKey, &chaincfg.MainNetParams, true)
if err != nil {
t.Fatalf("error encoding wif: %v", err)
Expand All @@ -1900,10 +1901,7 @@ func testSignMessage(t *testing.T, segwit bool, walletType string) {
msg := randBytes(36)
msgHash := chainhash.HashB(msg)
pk := pubKey.SerializeCompressed()
signature, err := privKey.Sign(msgHash)
if err != nil {
t.Fatalf("signature error: %v", err)
}
signature := ecdsa.Sign(privKey, msgHash)
sig := signature.Serialize()

pt := newOutPoint(tTxHash, vout)
Expand All @@ -1928,7 +1926,8 @@ func testSignMessage(t *testing.T, segwit bool, walletType string) {
if sentMsg.String() != checkMsg.String() {
t.Fatalf("received wrong message. expected '%s', got '%s'", checkMsg.String(), sentMsg.String())
}
sig, _ := wif.PrivKey.Sign(sentMsg)
msgHash := chainhash.HashB(sentMsg)
sig := ecdsa.Sign(wif.PrivKey, msgHash)
r, _ := json.Marshal(base64.StdEncoding.EncodeToString(sig.Serialize()))
return r, nil
}
Expand Down Expand Up @@ -2209,7 +2208,7 @@ func testRefund(t *testing.T, segwit bool, walletType string) {
const feeSuggestion = 100

privBytes, _ := hex.DecodeString("b07209eec1a8fb6cfe5cb6ace36567406971a75c330db7101fb21bc679bc5330")
privKey, _ := btcec.PrivKeyFromBytes(btcec.S256(), privBytes)
privKey, _ := btcec.PrivKeyFromBytes(privBytes)
wif, err := btcutil.NewWIF(privKey, &chaincfg.MainNetParams, true)
if err != nil {
t.Fatalf("error encoding wif: %v", err)
Expand Down
4 changes: 2 additions & 2 deletions client/asset/btc/rpcclient.go
Expand Up @@ -15,12 +15,12 @@ import (
"decred.org/dcrdex/client/asset"
"decred.org/dcrdex/dex"
dexbtc "decred.org/dcrdex/dex/networks/btc"
"github.com/btcsuite/btcd/btcec"
"github.com/btcsuite/btcd/btcec/v2"
"github.com/btcsuite/btcd/btcjson"
"github.com/btcsuite/btcd/btcutil"
"github.com/btcsuite/btcd/chaincfg"
"github.com/btcsuite/btcd/chaincfg/chainhash"
"github.com/btcsuite/btcd/wire"
"github.com/btcsuite/btcutil"
)

const (
Expand Down
14 changes: 8 additions & 6 deletions client/asset/btc/spv.go
Expand Up @@ -35,16 +35,16 @@ import (
"decred.org/dcrdex/client/asset"
"decred.org/dcrdex/dex"
dexbtc "decred.org/dcrdex/dex/networks/btc"
"github.com/btcsuite/btcd/btcec"
"github.com/btcsuite/btcd/btcec/v2"
"github.com/btcsuite/btcd/btcjson"
"github.com/btcsuite/btcd/btcutil"
"github.com/btcsuite/btcd/btcutil/gcs"
"github.com/btcsuite/btcd/btcutil/psbt"
"github.com/btcsuite/btcd/chaincfg"
"github.com/btcsuite/btcd/chaincfg/chainhash"
"github.com/btcsuite/btcd/txscript"
"github.com/btcsuite/btcd/wire"
"github.com/btcsuite/btclog"
"github.com/btcsuite/btcutil"
"github.com/btcsuite/btcutil/gcs"
"github.com/btcsuite/btcutil/psbt"
"github.com/btcsuite/btcwallet/chain"
"github.com/btcsuite/btcwallet/waddrmgr"
"github.com/btcsuite/btcwallet/wallet"
Expand Down Expand Up @@ -100,7 +100,8 @@ type btcWallet interface {
Unlock(passphrase []byte, lock <-chan time.Time) error
Lock()
Locked() bool
SendOutputs(outputs []*wire.TxOut, keyScope *waddrmgr.KeyScope, account uint32, minconf int32, satPerKb btcutil.Amount, label string) (*wire.MsgTx, error)
SendOutputs(outputs []*wire.TxOut, keyScope *waddrmgr.KeyScope, account uint32, minconf int32,
satPerKb btcutil.Amount, coinSelectionStrategy wallet.CoinSelectionStrategy, label string) (*wire.MsgTx, error)
HaveAddress(a btcutil.Address) (bool, error)
Stop()
WaitForShutdown()
Expand Down Expand Up @@ -820,7 +821,8 @@ func (w *spvWallet) sendToAddress(address string, value, feeRate uint64, subtrac
wireOP := wire.NewTxOut(int64(value), pkScript)
// converting sats/vB -> sats/kvB
feeRateAmt := btcutil.Amount(feeRate * 1e3)
tx, err := w.wallet.SendOutputs([]*wire.TxOut{wireOP}, nil, w.acctNum, 0, feeRateAmt, "")
tx, err := w.wallet.SendOutputs([]*wire.TxOut{wireOP}, nil, w.acctNum, 0,
feeRateAmt, wallet.CoinSelectionLargest, "")
if err != nil {
return nil, err
}
Expand Down
14 changes: 8 additions & 6 deletions client/asset/btc/spv_test.go
Expand Up @@ -15,17 +15,17 @@ import (
"decred.org/dcrdex/dex"
"decred.org/dcrdex/dex/encode"
dexbtc "decred.org/dcrdex/dex/networks/btc"
"github.com/btcsuite/btcd/btcec"
"github.com/btcsuite/btcd/btcec/v2"
"github.com/btcsuite/btcd/btcjson"
"github.com/btcsuite/btcd/btcutil"
"github.com/btcsuite/btcd/btcutil/gcs"
"github.com/btcsuite/btcd/btcutil/gcs/builder"
"github.com/btcsuite/btcd/btcutil/psbt"
"github.com/btcsuite/btcd/chaincfg"
"github.com/btcsuite/btcd/chaincfg/chainhash"
"github.com/btcsuite/btcd/peer"
"github.com/btcsuite/btcd/txscript"
"github.com/btcsuite/btcd/wire"
"github.com/btcsuite/btcutil"
"github.com/btcsuite/btcutil/gcs"
"github.com/btcsuite/btcutil/gcs/builder"
"github.com/btcsuite/btcutil/psbt"
"github.com/btcsuite/btcwallet/chain"
"github.com/btcsuite/btcwallet/waddrmgr"
"github.com/btcsuite/btcwallet/wallet"
Expand Down Expand Up @@ -168,7 +168,9 @@ func (c *tBtcWallet) Locked() bool {
return false
}

func (c *tBtcWallet) SendOutputs(outputs []*wire.TxOut, keyScope *waddrmgr.KeyScope, account uint32, minconf int32, satPerKb btcutil.Amount, label string) (*wire.MsgTx, error) {
func (c *tBtcWallet) SendOutputs(outputs []*wire.TxOut, keyScope *waddrmgr.KeyScope,
account uint32, minconf int32, satPerKb btcutil.Amount,
coinSelectionStrategy wallet.CoinSelectionStrategy, label string) (*wire.MsgTx, error) {
if c.sendToAddressErr != nil {
return nil, c.sendToAddressErr
}
Expand Down
4 changes: 2 additions & 2 deletions client/asset/btc/wallet.go
Expand Up @@ -5,11 +5,11 @@ import (
"sync"
"time"

"github.com/btcsuite/btcd/btcec"
"github.com/btcsuite/btcd/btcec/v2"
"github.com/btcsuite/btcd/btcjson"
"github.com/btcsuite/btcd/btcutil"
"github.com/btcsuite/btcd/chaincfg/chainhash"
"github.com/btcsuite/btcd/wire"
"github.com/btcsuite/btcutil"
)

type Wallet interface {
Expand Down
6 changes: 5 additions & 1 deletion client/db/test/dbtest.go
Expand Up @@ -22,7 +22,11 @@ func init() {
// Generate a public key on the secp256k1 curve.
func randomPubKey() *secp256k1.PublicKey {
//return secp256k1.NewPublicKey(secp256k1.S256().ScalarBaseMult(randBytes(32)))
return secp256k1.PrivKeyFromBytes(randBytes(32)).PubKey()
priv, err := secp256k1.GeneratePrivateKey()
if err != nil {
panic(err.Error())
}
return priv.PubKey()
}

func randString(maxLen int) string {
Expand Down
2 changes: 1 addition & 1 deletion dex/networks/bch/cashaddr.go
Expand Up @@ -6,8 +6,8 @@ package bch
import (
"fmt"

"github.com/btcsuite/btcd/btcutil"
"github.com/btcsuite/btcd/chaincfg"
"github.com/btcsuite/btcutil"
bchchaincfg "github.com/gcash/bchd/chaincfg"
"github.com/gcash/bchutil"
)
Expand Down
10 changes: 7 additions & 3 deletions dex/networks/bch/cashaddr_test.go
Expand Up @@ -7,9 +7,9 @@ import (
"testing"

"decred.org/dcrdex/dex/encode"
"github.com/btcsuite/btcd/btcec"
"github.com/btcsuite/btcd/btcec/v2"
"github.com/btcsuite/btcd/btcutil"
"github.com/btcsuite/btcd/chaincfg"
"github.com/btcsuite/btcutil"
"github.com/gcash/bchutil"
)

Expand Down Expand Up @@ -92,7 +92,11 @@ func TestCashAddr(t *testing.T) {
// wrong.
checkHash(net, lowPubKey)
for i := 0; i < 100; i++ {
_, pubKey := btcec.PrivKeyFromBytes(btcec.S256(), encode.RandomBytes(33))
priv, err := btcec.NewPrivateKey()
if err != nil {
panic(err.Error())
}
pubKey := priv.PubKey()
checkHash(net, pubKey.SerializeUncompressed())
checkHash(net, pubKey.SerializeCompressed())
}
Expand Down
2 changes: 1 addition & 1 deletion dex/networks/btc/clone.go
Expand Up @@ -4,9 +4,9 @@
package btc

import (
"github.com/btcsuite/btcd/btcutil"
"github.com/btcsuite/btcd/chaincfg"
"github.com/btcsuite/btcd/wire"
"github.com/btcsuite/btcutil"
)

// AddressDecoder decodes a string address to a btcutil.Address.
Expand Down
2 changes: 1 addition & 1 deletion dex/networks/btc/config.go
Expand Up @@ -10,7 +10,7 @@ import (
"strconv"

"decred.org/dcrdex/dex"
"github.com/btcsuite/btcutil"
"github.com/btcsuite/btcd/btcutil"
)

// NetPorts are a set of port to use with the different networks.
Expand Down
7 changes: 3 additions & 4 deletions dex/networks/btc/script.go
Expand Up @@ -11,11 +11,10 @@ import (
"fmt"

"decred.org/dcrdex/dex"
"github.com/btcsuite/btcd/blockchain"
"github.com/btcsuite/btcd/btcutil"
"github.com/btcsuite/btcd/chaincfg"
"github.com/btcsuite/btcd/txscript"
"github.com/btcsuite/btcd/wire"
"github.com/btcsuite/btcutil"
)

const (
Expand Down Expand Up @@ -235,7 +234,7 @@ const (
InitTxSizeSegwit = InitTxSizeBaseSegwit + RedeemP2WPKHInputSize +
(SegwitMarkerAndFlagWeight+RedeemP2WPKHInputWitnessWeight+(witnessWeight-1))/witnessWeight

witnessWeight = blockchain.WitnessScaleFactor
witnessWeight = 4 // github.com/btcsuite/btcd/blockchain.WitnessScaleFactor
)

// BTCScriptType holds details about a pubkey script and possibly it's redeem
Expand Down Expand Up @@ -441,7 +440,7 @@ func ExtractScriptAddrs(script []byte, chainParams *chaincfg.Params) (*BtcScript
// For P2SH and non-P2SH multi-sig, pull the addresses from the pubkey script.
class, addrs, numRequired, err := txscript.ExtractPkScriptAddrs(script, chainParams)
nonStandard := class == txscript.NonStandardTy
if err != nil {
if err != nil { // txscript.ExtractPkScriptAddrs always returns a nil error now, so this should not happen
return nil, nonStandard, fmt.Errorf("ExtractScriptAddrs: %w", err)
}
if nonStandard {
Expand Down