Skip to content

Commit

Permalink
fix: Use the account specified in app.toml to sign BLS transactions (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
vitsalis authored Apr 14, 2023
1 parent a0cead9 commit 3388e0f
Show file tree
Hide file tree
Showing 17 changed files with 315 additions and 258 deletions.
4 changes: 2 additions & 2 deletions app/test_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -226,13 +226,13 @@ func Setup(t *testing.T, isCheckTx bool) *BabylonApp {

// SetupPrivSigner sets up a PrivSigner for testing
func SetupPrivSigner() (*PrivSigner, error) {
nodeCfg := tmconfig.DefaultConfig()
kr, err := client.NewKeyringFromBackend(client.Context{}, keyring.BackendMemory)
if err != nil {
return nil, err
}
nodeCfg := tmconfig.DefaultConfig()
encodingCfg := appparams.GetEncodingConfig()
privSigner, _ := InitPrivSigner(client.Context{}, ".", kr, encodingCfg)
privSigner, _ := InitPrivSigner(client.Context{}, ".", kr, "", encodingCfg)
privSigner.WrappedPV.Clean(nodeCfg.PrivValidatorKeyFile(), nodeCfg.PrivValidatorStateFile())
return privSigner, nil
}
Expand Down
19 changes: 15 additions & 4 deletions app/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import (
tmos "github.com/cometbft/cometbft/libs/os"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/config"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/x/auth/types"

appparams "github.com/babylonchain/babylon/app/params"
Expand Down Expand Up @@ -44,7 +43,7 @@ type PrivSigner struct {
ClientCtx client.Context
}

func InitPrivSigner(clientCtx client.Context, nodeDir string, kr keyring.Keyring, encodingCfg appparams.EncodingConfig) (*PrivSigner, error) {
func InitPrivSigner(clientCtx client.Context, nodeDir string, kr keyring.Keyring, feePayer string, encodingCfg appparams.EncodingConfig) (*PrivSigner, error) {
// setup private validator
nodeCfg := tmconfig.DefaultConfig()
pvKeyFile := filepath.Join(nodeDir, nodeCfg.PrivValidatorKeyFile())
Expand All @@ -65,12 +64,24 @@ func InitPrivSigner(clientCtx client.Context, nodeDir string, kr keyring.Keyring
WithLegacyAmino(encodingCfg.Amino).
WithTxConfig(encodingCfg.TxConfig).
WithAccountRetriever(types.AccountRetriever{}).
WithFromAddress(sdk.AccAddress(wrappedPV.GetAddress())).
WithFeeGranterAddress(sdk.AccAddress(wrappedPV.GetAddress())).
WithSkipConfirmation(true).
WithKeyring(kr).
WithNodeURI(nodeCfg.RPC.ListenAddress)

if feePayer != "" {
feePayerRecord, err := kr.Key(feePayer)
if err != nil {
return nil, err
}
feePayerAddress, err := feePayerRecord.GetAddress()
if err != nil {
return nil, err
}
clientCtx = clientCtx.
WithFromAddress(feePayerAddress).
WithFromName(feePayer)
}

return &PrivSigner{
WrappedPV: wrappedPV,
ClientCtx: clientCtx,
Expand Down
2 changes: 0 additions & 2 deletions client/tx/tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ func SendMsgsToTendermint(clientCtx client.Context, msgs []sdk.Msg) (*sdk.TxResp
WithAccountRetriever(clientCtx.AccountRetriever).
WithKeybase(clientCtx.Keyring).
WithChainID(clientCtx.ChainID).
WithFeeGranter(clientCtx.FeeGranter).
WithFeePayer(clientCtx.FeePayer).
WithGasPrices(gasPrice).
WithGasAdjustment(gasAdjustment)
Expand Down Expand Up @@ -113,7 +112,6 @@ func prepareFactory(clientCtx client.Context, txf sdktx.Factory) (sdktx.Factory,
if initNum == 0 {
txf = txf.WithAccountNumber(num)
}

if initSeq == 0 {
txf = txf.WithSequence(seq)
}
Expand Down
2 changes: 1 addition & 1 deletion cmd/babylond/cmd/custom_babylon_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
)

const (
defaultKeyName = "default"
defaultKeyName = ""
defaultGasPrice = "0.01ubbn"
defaultGasAdjustment = 1.5
)
Expand Down
11 changes: 5 additions & 6 deletions cmd/babylond/cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -279,16 +279,12 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a
panic(err)
}

// parse the key name that will be used for signing BLS-sig txs from app.toml
keyName := bbntypes.ParseKeyNameFromConfig(appOpts)

clientCtx, err := config.ReadFromClientConfig(
client.Context{}.
WithHomeDir(homeDir).
WithViper("").
WithKeyringDir(homeDir).
WithInput(os.Stdin).
WithFromName(keyName).
// Warning: It is important that ReadFromClientConfig receives context
// with already initialized codec. It creates keyring inside, and from cosmos
// 0.46.0 keyring requires codec. Without codec, operations performed by
Expand All @@ -298,7 +294,10 @@ func (a appCreator) newApp(logger log.Logger, db dbm.DB, traceStore io.Writer, a
if err != nil {
panic(err)
}
privSigner, err := app.InitPrivSigner(clientCtx, homeDir, clientCtx.Keyring, a.encCfg)
// parse the key name that will be used for signing BLS-sig txs from app.toml
keyName := bbntypes.ParseKeyNameFromConfig(appOpts)

privSigner, err := app.InitPrivSigner(clientCtx, homeDir, clientCtx.Keyring, keyName, a.encCfg)
if err != nil {
panic(err)
}
Expand Down Expand Up @@ -376,7 +375,7 @@ func (a appCreator) appExport(
panic(err)
}

privSigner, err := app.InitPrivSigner(clientCtx, homePath, kr, a.encCfg)
privSigner, err := app.InitPrivSigner(clientCtx, homePath, kr, "", a.encCfg)
if err != nil {
panic(err)
}
Expand Down
8 changes: 7 additions & 1 deletion proto/babylon/checkpointing/v1/tx.proto
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import "gogoproto/gogo.proto";
import "babylon/checkpointing/v1/checkpoint.proto";
import "babylon/checkpointing/v1/bls_key.proto";
import "cosmos/staking/v1beta1/tx.proto";
import "cosmos_proto/cosmos.proto";

option go_package = "github.com/babylonchain/babylon/x/checkpointing/types";

Expand All @@ -24,7 +25,12 @@ message MsgAddBlsSig {
option (gogoproto.equal) = false;
option (gogoproto.goproto_getters) = false;

BlsSig bls_sig = 1;
// signer corresponds to the submitter of the transaction
// This might be a different entity compared to the one that created the BLS signature
// (i.e. the validator owner of the BLS key which is specified by the `bls_sig.signer_address`)
string signer = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];

BlsSig bls_sig = 2;
}

// MsgAddBlsSigResponse defines the MsgAddBlsSig response type.
Expand Down
2 changes: 1 addition & 1 deletion x/checkpointing/client/cli/tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ func CmdTxAddBlsSig() *cobra.Command {
return err
}

msg := types.NewMsgAddBlsSig(epoch_num, lch, blsSig, addr)
msg := types.NewMsgAddBlsSig(clientCtx.GetFromAddress(), epoch_num, lch, blsSig, addr)

return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
},
Expand Down
2 changes: 1 addition & 1 deletion x/checkpointing/keeper/bls_signer.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func (k Keeper) SendBlsSig(ctx sdk.Context, epochNum uint64, lch types.LastCommi
}

// create MsgAddBlsSig message
msg := types.NewMsgAddBlsSig(epochNum, lch, blsSig, addr)
msg := types.NewMsgAddBlsSig(k.clientCtx.GetFromAddress(), epochNum, lch, blsSig, addr)

// keep sending the message to Tendermint until success or timeout
// TODO should read the parameters from config file
Expand Down
10 changes: 5 additions & 5 deletions x/checkpointing/keeper/msg_server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ func FuzzAddBlsSig_NoError(f *testing.F) {
blsSig := bls12381.Sign(blsPrivKey, signBytes)

// create MsgAddBlsSig message
msg := types.NewMsgAddBlsSig(endingEpoch, lch, blsSig, addr)
msg := types.NewMsgAddBlsSig(sdk.AccAddress(addr), endingEpoch, lch, blsSig, addr)
_, err = msgServer.AddBlsSig(ctx, msg)
require.NoError(t, err)
afterCkpt, err := ck.GetRawCheckpoint(ctx, endingEpoch)
Expand Down Expand Up @@ -285,7 +285,7 @@ func FuzzAddBlsSig_NotInValSet(f *testing.F) {
valAddr := datagen.GenRandomValidatorAddress()
signBytes := types.GetSignBytes(endingEpoch, lch)
blsSig := bls12381.Sign(blsPrivKey, signBytes)
msg := types.NewMsgAddBlsSig(endingEpoch, lch, blsSig, valAddr)
msg := types.NewMsgAddBlsSig(sdk.AccAddress(valAddr), endingEpoch, lch, blsSig, valAddr)

_, err = msgServer.AddBlsSig(ctx, msg)
require.Error(t, err, types.ErrCkptDoesNotExist)
Expand Down Expand Up @@ -318,7 +318,7 @@ func FuzzAddBlsSig_CkptNotExist(f *testing.F) {
addr := helper.ValBlsPrivKeys[i].Address
signBytes := types.GetSignBytes(epoch.EpochNumber-1, lch)
blsSig := bls12381.Sign(blsPrivKey, signBytes)
msg := types.NewMsgAddBlsSig(epoch.EpochNumber-1, lch, blsSig, addr)
msg := types.NewMsgAddBlsSig(sdk.AccAddress(addr), epoch.EpochNumber-1, lch, blsSig, addr)

// add the BLS signature
_, err := msgServer.AddBlsSig(ctx, msg)
Expand Down Expand Up @@ -361,7 +361,7 @@ func FuzzAddBlsSig_WrongLastCommitHash(f *testing.F) {
addr := helper.ValBlsPrivKeys[i].Address
signBytes := types.GetSignBytes(endingEpoch, lch)
blsSig := bls12381.Sign(blsPrivKey, signBytes)
msg := types.NewMsgAddBlsSig(endingEpoch, lch, blsSig, addr)
msg := types.NewMsgAddBlsSig(sdk.AccAddress(addr), endingEpoch, lch, blsSig, addr)

// add the BLS signature
_, err = msgServer.AddBlsSig(ctx, msg)
Expand Down Expand Up @@ -401,7 +401,7 @@ func FuzzAddBlsSig_InvalidSignature(f *testing.F) {
lch := ctx.BlockHeader().LastCommitHash
addr := helper.ValBlsPrivKeys[i].Address
blsSig := datagen.GenRandomBlsMultiSig()
msg := types.NewMsgAddBlsSig(endingEpoch, lch, blsSig, addr)
msg := types.NewMsgAddBlsSig(sdk.AccAddress(addr), endingEpoch, lch, blsSig, addr)

// add the BLS signature message
_, err = msgServer.AddBlsSig(ctx, msg)
Expand Down
45 changes: 22 additions & 23 deletions x/checkpointing/types/genesis.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 14 additions & 9 deletions x/checkpointing/types/msgs.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,16 @@ var (
_ sdk.Msg = (*MsgAddBlsSig)(nil)
)

func NewMsgAddBlsSig(epochNum uint64, lch LastCommitHash, sig bls12381.Signature, addr sdk.ValAddress) *MsgAddBlsSig {
return &MsgAddBlsSig{BlsSig: &BlsSig{
EpochNum: epochNum,
LastCommitHash: &lch,
BlsSig: &sig,
SignerAddress: addr.String(),
}}
func NewMsgAddBlsSig(signer sdk.AccAddress, epochNum uint64, lch LastCommitHash, sig bls12381.Signature, addr sdk.ValAddress) *MsgAddBlsSig {
return &MsgAddBlsSig{
Signer: signer.String(),
BlsSig: &BlsSig{
EpochNum: epochNum,
LastCommitHash: &lch,
BlsSig: &sig,
SignerAddress: addr.String(),
},
}
}

func NewMsgWrappedCreateValidator(msgCreateVal *stakingtypes.MsgCreateValidator, blsPK *bls12381.PublicKey, pop *ProofOfPossession) (*MsgWrappedCreateValidator, error) {
Expand Down Expand Up @@ -56,12 +59,14 @@ func (m *MsgAddBlsSig) ValidateBasic() error {
}

func (m *MsgAddBlsSig) GetSigners() []sdk.AccAddress {
signer, err := sdk.ValAddressFromBech32(m.BlsSig.SignerAddress)
signer, err := sdk.AccAddressFromBech32(m.Signer)
if err != nil {
// Panic, since the GetSigners method is called after ValidateBasic
// which performs the same check.
panic(err)
}

return []sdk.AccAddress{sdk.AccAddress(signer)}
return []sdk.AccAddress{signer}
}

func (m *MsgWrappedCreateValidator) VerifyPoP(valPubkey cryptotypes.PubKey) bool {
Expand Down
Loading

0 comments on commit 3388e0f

Please sign in to comment.