Skip to content

Commit

Permalink
Merge branch 'main' into gai/docs-commit-pub-rand
Browse files Browse the repository at this point in the history
  • Loading branch information
gitferry committed Nov 13, 2024
2 parents ac29934 + fc280b8 commit 311d92f
Show file tree
Hide file tree
Showing 8 changed files with 73 additions and 37 deletions.
9 changes: 8 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)

### Documentation

* [#117](https://github.com/babylonlabs-io/finality-provider/pull/117) Spec of commit public randomness
* [#117](https://github.com/babylonlabs-io/finality-provider/pull/117) Spec of
commit public randomness

### Bug Fixes

* [#124](https://github.com/babylonlabs-io/finality-provider/pull/124) Ignore
duplicated finality vote error

## v0.10.0

Expand All @@ -48,6 +54,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
* [#114](https://github.com/babylonlabs-io/finality-provider/pull/114) Bump Babylon version to v0.15.0
* [#102](https://github.com/babylonlabs-io/finality-provider/pull/102) Improve `eotsd keys add` command
* [#104](https://github.com/babylonlabs-io/finality-provider/pull/104) Print fpd binary version
* [#87](https://github.com/babylonlabs-io/finality-provider/pull/87) Rename ChainName to ChainType

## v0.9.1

Expand Down
25 changes: 21 additions & 4 deletions clientcontroller/babylon.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ import (
btclctypes "github.com/babylonlabs-io/babylon/x/btclightclient/types"
btcstakingtypes "github.com/babylonlabs-io/babylon/x/btcstaking/types"
finalitytypes "github.com/babylonlabs-io/babylon/x/finality/types"
fpcfg "github.com/babylonlabs-io/finality-provider/finality-provider/config"
"github.com/babylonlabs-io/finality-provider/types"
"github.com/btcsuite/btcd/btcec/v2"
"github.com/btcsuite/btcd/btcec/v2/schnorr"
"github.com/btcsuite/btcd/btcutil"
Expand All @@ -29,6 +27,9 @@ import (
"github.com/cosmos/relayer/v2/relayer/provider"
"go.uber.org/zap"
protobuf "google.golang.org/protobuf/proto"

fpcfg "github.com/babylonlabs-io/finality-provider/finality-provider/config"
"github.com/babylonlabs-io/finality-provider/types"
)

var _ ClientController = &BabylonController{}
Expand Down Expand Up @@ -207,11 +208,19 @@ func (bc *BabylonController) SubmitFinalitySig(
btcstakingtypes.ErrFpAlreadySlashed,
}

res, err := bc.reliablySendMsg(msg, emptyErrs, unrecoverableErrs)
expectedErrs := []*sdkErr.Error{
finalitytypes.ErrDuplicatedFinalitySig,
}

res, err := bc.reliablySendMsg(msg, expectedErrs, unrecoverableErrs)
if err != nil {
return nil, err
}

if res == nil {
return &types.TxResponse{}, nil
}

return &types.TxResponse{TxHash: res.TxHash, Events: res.Events}, nil
}

Expand Down Expand Up @@ -252,11 +261,19 @@ func (bc *BabylonController) SubmitBatchFinalitySigs(
btcstakingtypes.ErrFpAlreadySlashed,
}

res, err := bc.reliablySendMsgs(msgs, emptyErrs, unrecoverableErrs)
expectedErrs := []*sdkErr.Error{
finalitytypes.ErrDuplicatedFinalitySig,
}

res, err := bc.reliablySendMsgs(msgs, expectedErrs, unrecoverableErrs)
if err != nil {
return nil, err
}

if res == nil {
return &types.TxResponse{}, nil
}

return &types.TxResponse{TxHash: res.TxHash, Events: res.Events}, nil
}

Expand Down
8 changes: 4 additions & 4 deletions clientcontroller/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import (
)

const (
babylonConsumerChainName = "babylon"
babylonConsumerChainType = "babylon"
)

type ClientController interface {
Expand Down Expand Up @@ -82,14 +82,14 @@ type ClientController interface {
Close() error
}

func NewClientController(chainName string, bbnConfig *fpcfg.BBNConfig, netParams *chaincfg.Params, logger *zap.Logger) (ClientController, error) {
func NewClientController(chainType string, bbnConfig *fpcfg.BBNConfig, netParams *chaincfg.Params, logger *zap.Logger) (ClientController, error) {
var (
cc ClientController
err error
)

switch chainName {
case babylonConsumerChainName:
switch chainType {
case babylonConsumerChainType:
cc, err = NewBabylonController(bbnConfig, netParams, logger)
if err != nil {
return nil, fmt.Errorf("failed to create Babylon rpc client: %w", err)
Expand Down
8 changes: 4 additions & 4 deletions finality-provider/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import (
)

const (
defaultChainName = "babylon"
defaultChainType = "babylon"
defaultLogLevel = zapcore.InfoLevel
defaultLogDirname = "logs"
defaultLogFilename = "fpd.log"
Expand Down Expand Up @@ -55,8 +55,8 @@ var (
// Config is the main config for the fpd cli command
type Config struct {
LogLevel string `long:"loglevel" description:"Logging level for all subsystems" choice:"trace" choice:"debug" choice:"info" choice:"warn" choice:"error" choice:"fatal"`
// ChainName and ChainID (if any) of the chain config identify a consumer chain
ChainName string `long:"chainname" description:"the name of the consumer chain" choice:"babylon"`
// ChainType and ChainID (if any) of the chain config identify a consumer chain
ChainType string `long:"chaintype" description:"the type of the consumer chain" choice:"babylon"`
NumPubRand uint32 `long:"numPubRand" description:"The number of Schnorr public randomness for each commitment"`
NumPubRandMax uint32 `long:"numpubrandmax" description:"The upper bound of the number of Schnorr public randomness for each commitment"`
MinRandHeightGap uint32 `long:"minrandheightgap" description:"The minimum gap between the last committed rand height and the current Babylon block height"`
Expand Down Expand Up @@ -91,7 +91,7 @@ func DefaultConfigWithHome(homePath string) Config {
bbnCfg.KeyDirectory = homePath
pollerCfg := DefaultChainPollerConfig()
cfg := Config{
ChainName: defaultChainName,
ChainType: defaultChainType,
LogLevel: defaultLogLevel.String(),
DatabaseConfig: DefaultDBConfigWithHomePath(homePath),
BabylonConfig: &bbnCfg,
Expand Down
4 changes: 2 additions & 2 deletions finality-provider/service/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,9 @@ func NewFinalityProviderAppFromConfig(
db kvdb.Backend,
logger *zap.Logger,
) (*FinalityProviderApp, error) {
cc, err := clientcontroller.NewClientController(cfg.ChainName, cfg.BabylonConfig, &cfg.BTCNetParams, logger)
cc, err := clientcontroller.NewClientController(cfg.ChainType, cfg.BabylonConfig, &cfg.BTCNetParams, logger)
if err != nil {
return nil, fmt.Errorf("failed to create rpc client for the consumer chain %s: %v", cfg.ChainName, err)
return nil, fmt.Errorf("failed to create rpc client for the consumer chain %s: %v", cfg.ChainType, err)
}

// if the EOTSManagerAddress is empty, run a local EOTS manager;
Expand Down
20 changes: 14 additions & 6 deletions finality-provider/service/fp_instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,13 @@ import (
"github.com/avast/retry-go/v4"
bbntypes "github.com/babylonlabs-io/babylon/types"
ftypes "github.com/babylonlabs-io/babylon/x/finality/types"
fppath "github.com/babylonlabs-io/finality-provider/lib/math"
"github.com/btcsuite/btcd/btcec/v2"
"github.com/gogo/protobuf/jsonpb"
"go.uber.org/atomic"
"go.uber.org/zap"

fppath "github.com/babylonlabs-io/finality-provider/lib/math"

"github.com/babylonlabs-io/finality-provider/clientcontroller"
"github.com/babylonlabs-io/finality-provider/eotsmanager"
fpcfg "github.com/babylonlabs-io/finality-provider/finality-provider/config"
Expand Down Expand Up @@ -693,12 +694,15 @@ func (fp *FinalityProviderInstance) SubmitFinalitySignature(b *types.BlockInfo)
return nil, fmt.Errorf("failed to send finality signature to the consumer chain: %w", err)
}

// update DB
fp.MustUpdateStateAfterFinalitySigSubmission(b.Height)
// it is possible that the vote is duplicate so the metrics do need to update
if res.TxHash != "" {
// update DB
fp.MustUpdateStateAfterFinalitySigSubmission(b.Height)

// update metrics
fp.metrics.RecordFpVoteTime(fp.GetBtcPkHex())
fp.metrics.IncrementFpTotalVotedBlocks(fp.GetBtcPkHex())
// update metrics
fp.metrics.RecordFpVoteTime(fp.GetBtcPkHex())
fp.metrics.IncrementFpTotalVotedBlocks(fp.GetBtcPkHex())
}

return res, nil
}
Expand Down Expand Up @@ -785,6 +789,10 @@ func (fp *FinalityProviderInstance) TestSubmitFinalitySignatureAndExtractPrivKey
return nil, nil, fmt.Errorf("failed to send finality signature to the consumer chain: %w", err)
}

if res.TxHash == "" {
return res, nil, nil
}

// try to extract the private key
var privKey *btcec.PrivateKey
for _, ev := range res.Events {
Expand Down
31 changes: 17 additions & 14 deletions itest/e2e_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,19 @@
package e2etest

import (
"math/rand"
"testing"
"time"

sdkmath "cosmossdk.io/math"
"github.com/babylonlabs-io/babylon/testutil/datagen"
"github.com/babylonlabs-io/finality-provider/clientcontroller"
"github.com/babylonlabs-io/finality-provider/finality-provider/cmd/fpd/daemon"
"github.com/babylonlabs-io/finality-provider/types"
"github.com/btcsuite/btcd/btcec/v2"
"github.com/stretchr/testify/require"
"go.uber.org/zap"
"math/rand"
"testing"
"time"

"github.com/babylonlabs-io/finality-provider/clientcontroller"
"github.com/babylonlabs-io/finality-provider/finality-provider/cmd/fpd/daemon"
"github.com/babylonlabs-io/finality-provider/types"
)

var (
Expand Down Expand Up @@ -84,26 +86,27 @@ func TestDoubleSigning(t *testing.T) {

finalizedBlocks := tm.WaitForNFinalizedBlocks(t, 1)

// test duplicate vote which should be ignored
res, extractedKey, err := fpIns.TestSubmitFinalitySignatureAndExtractPrivKey(finalizedBlocks[0])
require.NoError(t, err)
require.Nil(t, extractedKey)
require.Empty(t, res)
t.Logf("duplicate vote for %d is sent", finalizedBlocks[0].Height)

// attack: manually submit a finality vote over a conflicting block
// to trigger the extraction of finality-provider's private key
r := rand.New(rand.NewSource(time.Now().UnixNano()))
b := &types.BlockInfo{
Height: finalizedBlocks[0].Height,
Hash: datagen.GenRandomByteArray(r, 32),
}
_, extractedKey, err := fpIns.TestSubmitFinalitySignatureAndExtractPrivKey(b)
_, extractedKey, err = fpIns.TestSubmitFinalitySignatureAndExtractPrivKey(b)
require.NoError(t, err)
require.NotNil(t, extractedKey)
localKey := tm.GetFpPrivKey(t, fpIns.GetBtcPkBIP340().MustMarshal())
require.True(t, localKey.Key.Equals(&extractedKey.Key) || localKey.Key.Negate().Equals(&extractedKey.Key))

t.Logf("the equivocation attack is successful")

tm.WaitForFpShutDown(t)

// try to start the finality providers and the slashed one should expect err
err = tm.Fpa.StartHandlingFinalityProvider(fpIns.GetBtcPkBIP340(), "")
require.Error(t, err)
}

// TestFastSync tests the fast sync process where the finality-provider is terminated and restarted with fast sync
Expand Down Expand Up @@ -161,7 +164,7 @@ func TestFinalityProviderEditCmd(t *testing.T) {

cfg := tm.Fpa.GetConfig()
cfg.BabylonConfig.Key = testFpName
cc, err := clientcontroller.NewClientController(cfg.ChainName, cfg.BabylonConfig, &cfg.BTCNetParams, zap.NewNop())
cc, err := clientcontroller.NewClientController(cfg.ChainType, cfg.BabylonConfig, &cfg.BTCNetParams, zap.NewNop())
require.NoError(t, err)
tm.Fpa.UpdateClientController(cc)

Expand Down
5 changes: 3 additions & 2 deletions itest/test_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,8 @@ func StartManagerWithFinalityProvider(t *testing.T) (*TestManager, *service.Fina
fpBbnKeyInfo, err := service.CreateChainKey(cfg.BabylonConfig.KeyDirectory, cfg.BabylonConfig.ChainID, cfg.BabylonConfig.Key, cfg.BabylonConfig.KeyringBackend, passphrase, hdPath, "")
require.NoError(t, err)

cc, err := clientcontroller.NewClientController(cfg.ChainName, cfg.BabylonConfig, &cfg.BTCNetParams, zap.NewNop())
cc, err := clientcontroller.NewClientController(cfg.ChainType, cfg.BabylonConfig, &cfg.BTCNetParams, zap.NewNop())

require.NoError(t, err)
app.UpdateClientController(cc)

Expand Down Expand Up @@ -253,7 +254,7 @@ func StartManagerWithFinalityProvider(t *testing.T) (*TestManager, *service.Fina

// goes back to old key in app
cfg.BabylonConfig.Key = oldKey
cc, err = clientcontroller.NewClientController(cfg.ChainName, cfg.BabylonConfig, &cfg.BTCNetParams, zap.NewNop())
cc, err = clientcontroller.NewClientController(cfg.ChainType, cfg.BabylonConfig, &cfg.BTCNetParams, zap.NewNop())
require.NoError(t, err)
app.UpdateClientController(cc)

Expand Down

0 comments on commit 311d92f

Please sign in to comment.