cosmos-sdk/x/ibc/testing/solomachine.go

112 lines
3.0 KiB
Go
Raw Normal View History

implement solo machine client (#6267) * pause work until client refactor resolved * continued scaffolding * add msgs and evidence * add update and misbehaviour functionality * implement cli * various types compile issues * add sig proof and various bug fixes * added rest routes * verification funcs now update sequence number * add sm suite and header test * msgcreateclient and msgupdateclient tests * add basic evidence test * evidence validate basic test * consensus state tests * rm accidental file * add verify con state and channel state, pause work for counterparty commitment type * client state tests added * update clienttype numbers * update test added * add misbehaviour tests * update alias * update cli tx * update import alias * cleanup code * remove todo, tested by evidence tests * add info to err msg * wrapf * Update x/ibc/06-solomachine/client/cli/tx.go Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com> * Update x/ibc/06-solomachine/client/cli/tx.go Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com> * Update x/ibc/06-solomachine/client/cli/tx.go Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com> * Update x/ibc/06-solomachine/client/cli/tx.go Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com> * Update x/ibc/06-solomachine/update.go Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com> * Update x/ibc/23-commitment/types/signature.go Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com> * Update x/ibc/06-solomachine/types/header.go Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com> * apply most of the review suggestions from @fedekunze * remove alias.go * update cli context with master changes * merge selective downstream changes from colin/solomachine * fix build issues * remove signature proof * try to migrate to proto * rm go structs for consensus state and header * address @fedekunze review and continue proto migration * fix proto issues * fix compile bugs in types, proto panics on getpubkey currently * add timestamp * update pubkey to be type sdkcrypto.PublicKey * update timestamp handling * begin removing amino, migrate to proto * fix various build issues * fix most test in types * change sanitize to produce, fix bug, types test passing * begin updating cli * move solomachine into light-clients/ * fix merge issue * update proto and fix cli * more fixes and update proto again * update pubkey to be any * fix string func issue * update tests to use testing pkg * update from tm crypto keys ref to sdk * fix tests :tada: * increase codecov * address TODOs * address most of @fedekunze comments * add test case for misbehaviour frozen client * fix lint * fix proto lint? * rename Signature to TimestampedSignature * remove chainID * rename FrozenHeight to FrozenSequence * apply verify consensus state changes requested by @AdityaSripal * remove dup check * fix typo in proto file comment Co-authored-by: Federico Kunze <31522760+fedekunze@users.noreply.github.com> Co-authored-by: Federico Kunze <federico.kunze94@gmail.com> Co-authored-by: Christopher Goes <cwgoes@pluranimity.org>
2020-08-24 03:06:48 -07:00
package testing
import (
"testing"
"github.com/stretchr/testify/require"
"github.com/tendermint/tendermint/crypto"
"github.com/tendermint/tendermint/crypto/ed25519"
"github.com/cosmos/cosmos-sdk/std"
sdk "github.com/cosmos/cosmos-sdk/types"
solomachinetypes "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/solomachine/types"
)
// Solomachine is a testing helper used to simulate a counterparty
// solo machine client.
type Solomachine struct {
t *testing.T
ClientID string
PrivateKey crypto.PrivKey
PublicKey crypto.PubKey
Sequence uint64
Time uint64
}
// NewSolomachine returns a new solomachine instance with a generated private/public
// key pair and a sequence starting at 1.
func NewSolomachine(t *testing.T, clientID string) *Solomachine {
privKey := ed25519.GenPrivKey()
return &Solomachine{
t: t,
ClientID: clientID,
PrivateKey: privKey,
PublicKey: privKey.PubKey(),
Sequence: 1,
Time: 10,
}
}
func (solo *Solomachine) ClientState() *solomachinetypes.ClientState {
return solomachinetypes.NewClientState(solo.ConsensusState())
}
func (solo *Solomachine) ConsensusState() *solomachinetypes.ConsensusState {
publicKey, err := std.DefaultPublicKeyCodec{}.Encode(solo.PublicKey)
require.NoError(solo.t, err)
return &solomachinetypes.ConsensusState{
Sequence: solo.Sequence,
PublicKey: publicKey,
Timestamp: solo.Time,
}
}
// CreateHeader generates a new private/public key pair and creates the
// necessary signature to construct a valid solo machine header.
func (solo *Solomachine) CreateHeader() solomachinetypes.Header {
// generate new private key and signature for header
newPrivKey := ed25519.GenPrivKey()
data := append(sdk.Uint64ToBigEndian(solo.Sequence), newPrivKey.PubKey().Bytes()...)
signature, err := solo.PrivateKey.Sign(data)
require.NoError(solo.t, err)
publicKey, err := std.DefaultPublicKeyCodec{}.Encode(newPrivKey.PubKey())
require.NoError(solo.t, err)
header := solomachinetypes.Header{
Sequence: solo.Sequence,
Signature: signature,
NewPublicKey: publicKey,
}
// assumes successful header update
solo.Sequence++
solo.PrivateKey = newPrivKey
solo.PublicKey = newPrivKey.PubKey()
return header
}
// CreateEvidence constructs testing evidence for the solo machine client
// by signing over two different data bytes at the same sequence.
func (solo *Solomachine) CreateEvidence() solomachinetypes.Evidence {
dataOne := []byte("DATA ONE")
dataTwo := []byte("DATA TWO")
sig, err := solo.PrivateKey.Sign(append(sdk.Uint64ToBigEndian(solo.Sequence), dataOne...))
require.NoError(solo.t, err)
signatureOne := solomachinetypes.SignatureAndData{
Signature: sig,
Data: dataOne,
}
sig, err = solo.PrivateKey.Sign(append(sdk.Uint64ToBigEndian(solo.Sequence), dataTwo...))
require.NoError(solo.t, err)
signatureTwo := solomachinetypes.SignatureAndData{
Signature: sig,
Data: dataTwo,
}
return solomachinetypes.Evidence{
ClientId: solo.ClientID,
Sequence: solo.Sequence,
SignatureOne: &signatureOne,
SignatureTwo: &signatureTwo,
}
}