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

implement solo machine client #6267

Merged
merged 101 commits into from
Aug 24, 2020
Merged
Show file tree
Hide file tree
Changes from 86 commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
cbc16d7
pause work until client refactor resolved
colin-axner Apr 27, 2020
e045498
continued scaffolding
colin-axner Apr 30, 2020
c993f95
add msgs and evidence
colin-axner May 1, 2020
6de06a4
add update and misbehaviour functionality
colin-axner May 5, 2020
c7e2b38
implement cli
colin-axner May 5, 2020
fedb7c8
various types compile issues
colin-axner May 5, 2020
066d6b0
add sig proof and various bug fixes
colin-axner May 5, 2020
57c7ad5
added rest routes
colin-axner May 8, 2020
f83c1d6
Merge branch 'master' of github.com:cosmos/cosmos-sdk into colin/5382…
colin-axner May 12, 2020
aa8703b
verification funcs now update sequence number
colin-axner May 12, 2020
c70d6ec
add sm suite and header test
colin-axner May 18, 2020
5c31eda
msgcreateclient and msgupdateclient tests
colin-axner May 18, 2020
dcb688b
add basic evidence test
colin-axner May 18, 2020
d6de635
Merge branch 'master' of github.com:cosmos/cosmos-sdk into colin/5382…
colin-axner May 18, 2020
3463dc1
evidence validate basic test
colin-axner May 18, 2020
fa52816
consensus state tests
colin-axner May 18, 2020
c163056
rm accidental file
colin-axner May 18, 2020
9e30000
add verify con state and channel state, pause work for counterparty c…
colin-axner May 19, 2020
480aa6c
client state tests added
colin-axner May 20, 2020
afbc501
update clienttype numbers
colin-axner May 20, 2020
11c5707
Merge branch 'master' of github.com:cosmos/cosmos-sdk into colin/5382…
colin-axner May 20, 2020
83805ca
update test added
colin-axner May 21, 2020
d459d57
add misbehaviour tests
colin-axner May 21, 2020
bc4b50a
update alias
colin-axner May 21, 2020
8b2e924
update cli tx
colin-axner May 21, 2020
43fb4a2
update import alias
colin-axner May 21, 2020
8032570
cleanup code
colin-axner May 21, 2020
7aef9d4
remove todo, tested by evidence tests
colin-axner May 21, 2020
9bebd1d
add info to err msg
colin-axner May 21, 2020
c7e521d
wrapf
colin-axner May 21, 2020
1bbd505
Update x/ibc/06-solomachine/client/cli/tx.go
colin-axner May 22, 2020
f1616b7
Update x/ibc/06-solomachine/client/cli/tx.go
colin-axner May 22, 2020
fbdb272
Update x/ibc/06-solomachine/client/cli/tx.go
colin-axner May 22, 2020
97728b8
Update x/ibc/06-solomachine/client/cli/tx.go
colin-axner May 22, 2020
89f5870
Update x/ibc/06-solomachine/update.go
colin-axner May 22, 2020
5d4e6c6
Update x/ibc/23-commitment/types/signature.go
colin-axner May 22, 2020
2b25840
Update x/ibc/06-solomachine/types/header.go
colin-axner May 22, 2020
992a28d
apply most of the review suggestions from @fedekunze
colin-axner May 22, 2020
74a7120
Merge branch 'master' of github.com:cosmos/cosmos-sdk into colin/5382…
fedekunze May 22, 2020
4696f74
remove alias.go
colin-axner Jun 3, 2020
cf601c3
Merge branch 'colin/5382-solo-machine-client' of github.com:cosmos/co…
colin-axner Jun 3, 2020
72b2cf1
Merge branch 'master' of github.com:cosmos/cosmos-sdk into colin/5382…
colin-axner Jun 3, 2020
4098179
update cli context with master changes
colin-axner Jun 3, 2020
d2426ed
merge selective downstream changes from colin/solomachine
colin-axner Jun 3, 2020
bb493c9
fix build issues
colin-axner Jun 3, 2020
7f6c19b
remove signature proof
colin-axner Jun 3, 2020
53c8875
Merge branch 'master' of github.com:cosmos/cosmos-sdk into colin/5382…
fedekunze Jun 10, 2020
eafa96c
merge master
colin-axner Jun 10, 2020
6de9582
Merge branch 'master' of github.com:cosmos/cosmos-sdk into colin/5382…
colin-axner Jun 11, 2020
c08c5bb
try to migrate to proto
colin-axner Jun 11, 2020
2f57522
rm go structs for consensus state and header
colin-axner Jun 16, 2020
d9c106d
Merge branch 'master' of github.com:cosmos/cosmos-sdk into colin/5382…
colin-axner Jun 16, 2020
4fc1df8
Merge branch 'master' of github.com:cosmos/cosmos-sdk into colin/5382…
colin-axner Jun 17, 2020
d709936
address @fedekunze review and continue proto migration
colin-axner Jun 17, 2020
03d63ae
fix proto issues
colin-axner Jun 18, 2020
317c1f1
Merge branch 'master' of github.com:cosmos/cosmos-sdk into colin/5382…
colin-axner Jun 18, 2020
572e5b9
fix compile bugs in types, proto panics on getpubkey currently
colin-axner Jun 18, 2020
d4151a1
add timestamp
colin-axner Jun 18, 2020
925026a
update pubkey to be type sdkcrypto.PublicKey
colin-axner Jun 18, 2020
05ca908
Merge branch 'master' into colin/5382-solo-machine-client
fedekunze Jun 18, 2020
3789072
Merge branch 'master' into colin/5382-solo-machine-client
fedekunze Jun 26, 2020
003d626
update timestamp handling
colin-axner Jul 3, 2020
5893db8
merge master
colin-axner Jul 3, 2020
f81dd48
Merge branch 'colin/5382-solo-machine-client' of github.com:cosmos/co…
colin-axner Jul 3, 2020
955b0b2
Merge branch 'master' into colin/5382-solo-machine-client
cwgoes Jul 7, 2020
31e6d56
merge master
colin-axner Aug 10, 2020
776ae65
Merge branch 'master' of github.com:cosmos/cosmos-sdk into colin/5382…
colin-axner Aug 12, 2020
8b9d4fa
begin removing amino, migrate to proto
colin-axner Aug 12, 2020
f71fdbb
Merge branch 'colin/5382-solo-machine-client' of github.com:cosmos/co…
colin-axner Aug 12, 2020
c4b7fc5
fix various build issues
colin-axner Aug 12, 2020
1d48573
Merge branch 'master' into colin/5382-solo-machine-client
cwgoes Aug 12, 2020
f733da7
fix most test in types
colin-axner Aug 12, 2020
4cb6b1a
Merge branch 'colin/5382-solo-machine-client' of github.com:cosmos/co…
colin-axner Aug 12, 2020
9e6ea20
change sanitize to produce, fix bug, types test passing
colin-axner Aug 12, 2020
1dfaaa6
begin updating cli
colin-axner Aug 13, 2020
fb34b42
move solomachine into light-clients/
colin-axner Aug 19, 2020
badfd61
merge master
colin-axner Aug 19, 2020
76c303a
fix merge issue
colin-axner Aug 19, 2020
e3f8888
update proto and fix cli
colin-axner Aug 19, 2020
a2474b3
more fixes and update proto again
colin-axner Aug 19, 2020
04e55eb
update pubkey to be any
colin-axner Aug 19, 2020
de84509
fix string func issue
colin-axner Aug 20, 2020
1f1f0f8
update tests to use testing pkg
colin-axner Aug 21, 2020
8a76254
Merge branch 'master' of github.com:cosmos/cosmos-sdk into colin/5382…
colin-axner Aug 21, 2020
7a0e730
update from tm crypto keys ref to sdk
colin-axner Aug 21, 2020
34d15cf
fix tests :tada:
colin-axner Aug 21, 2020
3e85eae
increase codecov
colin-axner Aug 21, 2020
2ac5fbe
address TODOs
colin-axner Aug 21, 2020
329d769
address most of @fedekunze comments
colin-axner Aug 21, 2020
159167b
add test case for misbehaviour frozen client
colin-axner Aug 21, 2020
e421c4f
Merge branch 'master' of github.com:cosmos/cosmos-sdk into colin/5382…
colin-axner Aug 21, 2020
f776e2f
fix lint
colin-axner Aug 21, 2020
c8dca75
fix proto lint?
colin-axner Aug 21, 2020
8395379
rename Signature to TimestampedSignature
colin-axner Aug 24, 2020
7dfc425
Merge branch 'master' of github.com:cosmos/cosmos-sdk into colin/5382…
colin-axner Aug 24, 2020
60a1034
remove chainID
colin-axner Aug 24, 2020
4f7d604
rename FrozenHeight to FrozenSequence
colin-axner Aug 24, 2020
e939091
apply verify consensus state changes requested by @AdityaSripal
colin-axner Aug 24, 2020
30f45c0
remove dup check
colin-axner Aug 24, 2020
ffd3086
fix typo in proto file comment
colin-axner Aug 24, 2020
871a6a7
Merge branch 'master' into colin/5382-solo-machine-client
colin-axner Aug 24, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 95 additions & 0 deletions proto/ibc/light-clients/solomachine/v1/solomachine.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
syntax = "proto3";
package ibc.lightclients.v1.solomachine;

option go_package = "github.com/cosmos/cosmos-sdk/x/ibc/light-clients/solomachine/types";

import "cosmos/base/crypto/v1beta1/crypto.proto";
import "gogoproto/gogo.proto";

// ClientState defines a solo machine client that tracks the current consensus
// state and if the client is frozen.
message ClientState {
option (gogoproto.goproto_getters) = false;
// client ID
string id = 1;
colin-axner marked this conversation as resolved.
Show resolved Hide resolved
// chainID for the connected solo machine
string chain_id = 2 [(gogoproto.moretags) = "yaml:\"chain_id\""];
// frozen height of the solo machine
uint64 frozen_height = 3 [(gogoproto.moretags) = "yaml:\"frozen_height\""];
ConsensusState consensus_state = 4
[(gogoproto.moretags) = "yaml:\"consensus_state\""];
}

// ConsensusState defines a solo machine consensus state
message ConsensusState {
option (gogoproto.goproto_getters) = false;
// current sequence of the consensus state
uint64 sequence = 1;
// public key of the solo machine
cosmos.base.crypto.v1beta1.PublicKey public_key = 2
[(gogoproto.moretags) = "yaml:\"public_key\""];
uint64 timestamp = 3;
}

// Header defines a solo machine consensus header
message Header {
option (gogoproto.goproto_getters) = false;
// sequence to update solo machine public key at
uint64 sequence = 1;
bytes signature = 2;
cosmos.base.crypto.v1beta1.PublicKey new_public_key = 3
[(gogoproto.moretags) = "yaml:\"new_public_key\""];
}

// Evidence defines evidence of misbehaviour for a solo machine which consists
// of a sequence and two signatures over different messages at that sequence.
message Evidence {
option (gogoproto.goproto_getters) = false;
option (gogoproto.goproto_stringer) = false;
string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""];
uint64 sequence = 2;
SignatureAndData signature_one = 3
[(gogoproto.moretags) = "yaml:\"signature_one\""];
SignatureAndData signature_two = 4
[(gogoproto.moretags) = "yaml:\"signature_two\""];
}

// SignatureAndData contains a signature and the data signed over to create that
// signature.
message SignatureAndData {
option (gogoproto.goproto_getters) = false;
bytes signature = 1;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

?

Suggested change
bytes signature = 1;
Signature signature = 1;

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so this wouldn't make sense because we don't need the timestamp for SignatureAndData it is only used for misbehaviour. The naming still needs some work..

bytes data = 2;
}

// Signature contains the signature and the timestamp of the signature.
message Signature {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

where is this used?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

proof needs to be passed in as a []byte but I need the actual signature and the timestamp so we have to marshal this struct and pass it in as proof

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was thinking of renaming to SignatureDoc? since it isn't strictly just the signature

option (gogoproto.goproto_getters) = false;
bytes signature = 1;
uint64 timestamp = 2;
}
// MsgCreateClient defines a message to create an IBC client
message MsgCreateClient {
option (gogoproto.goproto_getters) = false;
string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""];
string chain_id = 2 [(gogoproto.moretags) = "yaml:\"chain_id\""];
ConsensusState consensus_state = 3
[(gogoproto.moretags) = "yaml:\"consensus_state\""];
}

// MsgUpdateClient defines a message to update an IBC client
message MsgUpdateClient {
option (gogoproto.goproto_getters) = false;
string client_id = 1 [(gogoproto.moretags) = "yaml:\"client_id\""];
Header header = 2 [(gogoproto.nullable) = false];
}

// MsgSubmitClientMisbehaviour defines an sdk.Msg type that supports submitting
// arbitrary Evidence.
message MsgSubmitClientMisbehaviour {
option (gogoproto.goproto_getters) = false;
bytes submitter = 1
[(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress"];
Evidence evidence = 2 [(gogoproto.nullable) = false];
}

17 changes: 13 additions & 4 deletions x/ibc/02-client/exported/exported.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,13 @@ type Header interface {
GetHeight() uint64
}

// message types for the IBC client
const (
TypeMsgCreateClient string = "create_client"
TypeMsgUpdateClient string = "update_client"
TypeMsgSubmitClientMisbehaviour string = "submit_client_misbehaviour"
)

// MsgCreateClient defines the msg interface that the
// CreateClient Handler expects
type MsgCreateClient interface {
Expand All @@ -169,14 +176,16 @@ type ClientType byte

// available client types
const (
Tendermint ClientType = iota + 1 // 1
Localhost
SoloMachine ClientType = 6
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like this change 👍

Tendermint ClientType = 7
Localhost ClientType = 9
)

// string representation of the client types
const (
ClientTypeTendermint string = "tendermint"
ClientTypeLocalHost string = "localhost"
ClientTypeSoloMachine string = "solomachine"
ClientTypeTendermint string = "tendermint"
ClientTypeLocalHost string = "localhost"
)

func (ct ClientType) String() string {
Expand Down
2 changes: 1 addition & 1 deletion x/ibc/07-tendermint/client/cli/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (
"github.com/cosmos/cosmos-sdk/x/ibc/07-tendermint/types"
)

// NewTxCmd returns a root CLI command handler for all x/bank transaction commands.
// NewTxCmd returns a root CLI command handler for all x/ibc/07-tendermint transaction commands.
func NewTxCmd() *cobra.Command {
txCmd := &cobra.Command{
Use: types.SubModuleName,
Expand Down
13 changes: 3 additions & 10 deletions x/ibc/07-tendermint/types/msgs.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,6 @@ import (
host "github.com/cosmos/cosmos-sdk/x/ibc/24-host"
)

// Message types for the IBC client
const (
TypeMsgCreateClient string = "create_client"
TypeMsgUpdateClient string = "update_client"
TypeMsgSubmitClientMisbehaviour string = "submit_client_misbehaviour"
)

var (
_ clientexported.MsgCreateClient = (*MsgCreateClient)(nil)
_ clientexported.MsgUpdateClient = (*MsgUpdateClient)(nil)
Expand Down Expand Up @@ -74,7 +67,7 @@ func (msg MsgCreateClient) Route() string {

// Type implements sdk.Msg
func (msg MsgCreateClient) Type() string {
return TypeMsgCreateClient
return clientexported.TypeMsgCreateClient
}

// ValidateBasic implements sdk.Msg
Expand Down Expand Up @@ -184,7 +177,7 @@ func (msg MsgUpdateClient) Route() string {

// Type implements sdk.Msg
func (msg MsgUpdateClient) Type() string {
return TypeMsgUpdateClient
return clientexported.TypeMsgUpdateClient
}

// ValidateBasic implements sdk.Msg
Expand Down Expand Up @@ -238,7 +231,7 @@ func (msg MsgSubmitClientMisbehaviour) Route() string { return host.RouterKey }

// Type returns the MsgSubmitClientMisbehaviour's type.
func (msg MsgSubmitClientMisbehaviour) Type() string {
return TypeMsgSubmitClientMisbehaviour
return clientexported.TypeMsgSubmitClientMisbehaviour
}

// ValidateBasic performs basic (non-state-dependant) validation on a MsgSubmitClientMisbehaviour.
Expand Down
7 changes: 1 addition & 6 deletions x/ibc/09-localhost/types/msgs.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,6 @@ import (
host "github.com/cosmos/cosmos-sdk/x/ibc/24-host"
)

// Message types for the IBC client
const (
TypeMsgCreateClient string = "create_client"
)

var (
_ clientexported.MsgCreateClient = (*MsgCreateClient)(nil)
)
Expand All @@ -30,7 +25,7 @@ func (msg MsgCreateClient) Route() string {

// Type implements sdk.Msg
func (msg MsgCreateClient) Type() string {
return TypeMsgCreateClient
return clientexported.TypeMsgCreateClient
}

// ValidateBasic implements sdk.Msg
Expand Down
27 changes: 27 additions & 0 deletions x/ibc/light-clients/solomachine/client/cli/cli.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package cli

import (
"github.com/spf13/cobra"

"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/x/ibc/light-clients/solomachine/types"
)

// NewTxCmd returns a root CLI command handler for all solo machine transaction commands.
func NewTxCmd() *cobra.Command {
txCmd := &cobra.Command{
Use: types.SubModuleName,
Short: "Solo Machine transaction subcommands",
DisableFlagParsing: true,
SuggestionsMinimumDistance: 2,
RunE: client.ValidateCmd,
}

txCmd.AddCommand(
NewCreateClientCmd(),
NewUpdateClientCmd(),
NewSubmitMisbehaviourCmd(),
)

return txCmd
}
139 changes: 139 additions & 0 deletions x/ibc/light-clients/solomachine/client/cli/tx.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
package cli

import (
"fmt"
"io/ioutil"

"github.com/pkg/errors"

"github.com/spf13/cobra"

"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/tx"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/version"
"github.com/cosmos/cosmos-sdk/x/ibc/light-clients/solomachine/types"
)

// NewCreateClientCmd defines the command to create a new solo machine client.
func NewCreateClientCmd() *cobra.Command {
return &cobra.Command{
Use: "create [client-id] [path/to/consensus_state.json]",
Short: "create new solo machine client",
Long: "create a new solo machine client with the specified identifier and consensus state",
Example: fmt.Sprintf("%s tx ibc %s create [client-id] [path/to/consensus_state.json] --from node0 --home ../node0/<app>cli --chain-id $CID", version.AppName, types.SubModuleName),
Args: cobra.ExactArgs(2),
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx := client.GetClientContextFromCmd(cmd)
clientCtx, err := client.ReadTxCommandFlags(clientCtx, cmd.Flags())
if err != nil {
return err
}

clientID := args[0]

cdc := codec.NewProtoCodec(clientCtx.InterfaceRegistry)

var consensusState *types.ConsensusState
if err := cdc.UnmarshalJSON([]byte(args[1]), &consensusState); err != nil {
// check for file path if JSON input is not provided
contents, err := ioutil.ReadFile(args[1])
if err != nil {
return errors.New("neither JSON input nor path to .json file were provided")
}
if err := cdc.UnmarshalJSON(contents, &consensusState); err != nil {
return errors.Wrap(err, "error unmarshalling consensus state file")
}
}

msg := types.NewMsgCreateClient(clientID, consensusState)

if err := msg.ValidateBasic(); err != nil {
return err
}

return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
},
}
}

// NewUpdateClientCmd defines the command to update a solo machine client.
func NewUpdateClientCmd() *cobra.Command {
return &cobra.Command{
Use: "update [client-id] [path/to/header.json]",
Short: "update existing client with a header",
Long: "update existing client with a solo machine header",
Example: fmt.Sprintf("%s tx ibc %s update [client-id] [path/to/header.json] --from node0 --home ../node0/<app>cli --chain-id $CID", version.AppName, types.SubModuleName),
Args: cobra.ExactArgs(2),
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx := client.GetClientContextFromCmd(cmd)
clientCtx, err := client.ReadTxCommandFlags(clientCtx, cmd.Flags())
if err != nil {
return err
}

clientID := args[0]

cdc := codec.NewProtoCodec(clientCtx.InterfaceRegistry)

var header types.Header
if err := cdc.UnmarshalJSON([]byte(args[1]), &header); err != nil {
// check for file path if JSON input is not provided
contents, err := ioutil.ReadFile(args[1])
if err != nil {
return errors.New("neither JSON input nor path to .json file were provided")
}
if err := cdc.UnmarshalJSON(contents, &header); err != nil {
return errors.Wrap(err, "error unmarshalling header file")
}
}

msg := types.NewMsgUpdateClient(clientID, header)
if err := msg.ValidateBasic(); err != nil {
return err
}

return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
},
}
}

// NewSubmitMisbehaviourCmd defines the command to submit a misbehaviour to prevent
// future updates.
func NewSubmitMisbehaviourCmd() *cobra.Command {
return &cobra.Command{
Use: "misbehaviour [path/to/evidence.json]",
Short: "submit a client misbehaviour",
Long: "submit a client misbehaviour to prevent future updates",
Example: fmt.Sprintf("%s tx ibc %s misbehaviour [path/to/evidence.json] --from node0 --home ../node0/<app>cli --chain-id $CID", version.AppName, types.SubModuleName),
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx := client.GetClientContextFromCmd(cmd)
clientCtx, err := client.ReadTxCommandFlags(clientCtx, cmd.Flags())
if err != nil {
return err
}

cdc := codec.NewProtoCodec(clientCtx.InterfaceRegistry)

var ev types.Evidence
if err := cdc.UnmarshalJSON([]byte(args[0]), &ev); err != nil {
// check for file path if JSON input is not provided
contents, err := ioutil.ReadFile(args[0])
if err != nil {
return errors.New("neither JSON input nor path to .json file were provided")
}
if err := cdc.UnmarshalJSON(contents, &ev); err != nil {
return errors.Wrap(err, "error unmarshalling evidence file")
}
}

msg := types.NewMsgSubmitClientMisbehaviour(ev, clientCtx.GetFromAddress())
if err := msg.ValidateBasic(); err != nil {
return err
}

return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
},
}
}
7 changes: 7 additions & 0 deletions x/ibc/light-clients/solomachine/doc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/*
Package solomachine implements a concrete `ConsensusState`, `Header`,
`Misbehaviour` and `Equivocation` types for the Solo Machine light client.
This implementation is based off the ICS 06 specification:
https://github.com/cosmos/ics/tree/master/spec/ics-006-solo-machine-client
*/
package solomachine
Loading