Skip to content

Commit

Permalink
chore: add test of pop to verify btc sig bip322
Browse files Browse the repository at this point in the history
  • Loading branch information
RafilxTenfen committed Nov 3, 2024
1 parent 0f1b296 commit fddba59
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 2 deletions.
6 changes: 4 additions & 2 deletions x/btcstaking/types/pop.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ func NewPoPBTC(addr sdk.AccAddress, btcSK *btcec.PrivateKey) (*ProofOfPossession
// NewPoPWithECDSABTCSig generates a new proof of possession where Bitcoin signature is in ECDSA format
// a proof of possession contains two signatures:
// - pop.BtcSig = ecdsa_sign(sk_BTC, addr)
// addr -> bbn....
func NewPoPBTCWithECDSABTCSig(addr sdk.AccAddress, btcSK *btcec.PrivateKey) (*ProofOfPossessionBTC, error) {
pop := ProofOfPossessionBTC{
BtcSigType: BTCSigType_ECDSA,
Expand All @@ -62,6 +63,7 @@ func NewPoPBTCWithECDSABTCSig(addr sdk.AccAddress, btcSK *btcec.PrivateKey) (*Pr
if err != nil {
return nil, err
}
fmt.Printf("\nbtc sig pop ecdsa %s", btcSig)
pop.BtcSig = btcSig

return &pop, nil
Expand All @@ -77,7 +79,7 @@ func newPoPBTCWithBIP322Sig[A btcutil.Address](
BtcSigType: BTCSigType_BIP322,
}

bip322SigEncoded, err := newBIP322Sig(tmhash.Sum(addressToSign.Bytes()), btcSK, net, bip322SignFn)
bip322SigEncoded, err := NewBIP322Sig(tmhash.Sum(addressToSign.Bytes()), btcSK, net, bip322SignFn)
if err != nil {
return nil, err
}
Expand All @@ -86,7 +88,7 @@ func newPoPBTCWithBIP322Sig[A btcutil.Address](
return &pop, nil
}

func newBIP322Sig[A btcutil.Address](
func NewBIP322Sig[A btcutil.Address](
msgToSign []byte,
btcSK *btcec.PrivateKey,
net *chaincfg.Params,
Expand Down
60 changes: 60 additions & 0 deletions x/btcstaking/types/pop_test.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
package types_test

import (
"github.com/babylonlabs-io/babylon/crypto/ecdsa"
"github.com/cometbft/cometbft/crypto/tmhash"

"encoding/base64"
"encoding/hex"
"fmt"
"math/rand"
"testing"

"github.com/stretchr/testify/require"

"github.com/babylonlabs-io/babylon/crypto/bip322"
"github.com/btcsuite/btcd/btcec/v2"
"github.com/btcsuite/btcd/chaincfg"

sdk "github.com/cosmos/cosmos-sdk/types"
Expand Down Expand Up @@ -74,6 +81,59 @@ func FuzzPoP_ECDSA(f *testing.F) {
})
}

func TestPopFt(t *testing.T) {
privateKeyStr := "cUiuX4MkxHvLxpteByWDe4CAADpZMBzZFRzfiXvyf8sQFZLZH7fF"
privateKeyBytes, err := base64.StdEncoding.DecodeString(privateKeyStr)
require.NoError(t, err)

bbnAddrStr := "bbn1usyvyrep4qvkpe9pj9hku39sz6fsxkm0pd38wu"
bbnAddr, err := sdk.AccAddressFromBech32(bbnAddrStr)
require.NoError(t, err)

bbnAddrBz := bbnAddr.Bytes()
// require.Equal(t, "x", fmt.Sprintf("%s", bbnAddrBz))
bbnAddrBzHex := hex.EncodeToString(bbnAddrBz)
require.Equal(t, "e408c20f21a81960e4a1916f6e44b01693035b6f", bbnAddrBzHex)

bbnAddrSha256 := tmhash.Sum(bbnAddr.Bytes())
bbnAddrSha256Hex := hex.EncodeToString(bbnAddrSha256)
require.Equal(t, "765cf28f2bb99786473e892bf29588f9078625cee1a0f57edb4c0b08c868efa0", bbnAddrSha256Hex)

privKeyBtcCec, pubKeyBtcCec := btcec.PrivKeyFromBytes(privateKeyBytes)
signed, err := ecdsa.Sign(privKeyBtcCec, bbnAddrBzHex)
require.NoError(t, err)

signedHex := hex.EncodeToString(signed)
require.Equal(t, "207ba0d0a3f761d86573a96c08184232fbfa3ff830a04f38738069185f5518ab984870fc59e55b8861ab90881e260331977a98ee8e319e3871a4298056a9e60818", signedHex)

popEcdsaBtc, err := types.NewPoPBTCWithECDSABTCSig(bbnAddr, privKeyBtcCec)
require.NoError(t, err)

popEcdsaBtcHexOfMarshal, err := popEcdsaBtc.ToHexStr()
require.NoError(t, err)

require.Equal(t, "08021241207ba0d0a3f761d86573a96c08184232fbfa3ff830a04f38738069185f5518ab984870fc59e55b8861ab90881e260331977a98ee8e319e3871a4298056a9e60818", popEcdsaBtcHexOfMarshal)

bip322EncodedFromFront, err := base64.StdEncoding.DecodeString("AkcwRAIgVl1CWJAw3SIF7CLj1+iMnJ9mAFaVPNRgVyFPnqryQjgCIGlJEt/YwLUf81flhNcdlw3QpObk83CRgTqwHMENfGheASEDtLJdctLYE77nPGeUc9219HlWrpPkGj4WtgpxkLzLeK8=")
require.NoError(t, err)

pop, err := types.NewPoPBTCWithBIP322P2WPKHSig(bbnAddr, privKeyBtcCec, &chaincfg.SigNetParams)
require.NoError(t, err)
pop.BtcSig = bip322EncodedFromFront
err = pop.VerifyBIP322(bbnAddr, bbn.NewBIP340PubKeyFromBTCPK(pubKeyBtcCec), net)
require.NoError(t, err)

// schSig, err := schnorr.ParseSignature(bip322EncodedFromFront)
// require.NoError(t, err)
// require.Equal(t, "x", schSig)

bip322SignedAddrBz, err := types.NewBIP322Sig(bbnAddrSha256, privKeyBtcCec, &chaincfg.SigNetParams, bip322.SignWithP2WPKHAddress)
require.NoError(t, err)

bip322SignedAddrHex := hex.EncodeToString(bip322SignedAddrBz)
require.Equal(t, "0a2a746231713377787473743437786535636e387234766d71356c636672377874776a6c386461716b7a3861126c02483045022100cf3db1f6db234e0bb375d5ae38dd1180b7b298a12244eeadaa27a57540996ddb02206ff6a44f1ab495d799a76f4722916991718ec8c142bced33b2e28339fec5233f012103e64d9214bfdee7adabb3f4b701d2dcf8112419699ba50e8134533a8c8054f8d5", bip322SignedAddrHex)
}

func FuzzPoP_BIP322_P2WPKH(f *testing.F) {
datagen.AddRandomSeedsToFuzzer(f, 10)

Expand Down

0 comments on commit fddba59

Please sign in to comment.