From 61b35566d79d36a59f21c10c616ea2b1be1d2440 Mon Sep 17 00:00:00 2001 From: anhductn2001 Date: Mon, 17 Jul 2023 15:38:41 +0700 Subject: [PATCH 1/3] add wasm contract cmd --- cmd/centaurid/cmd/root.go | 2 +- cmd/centaurid/cmd/wasm_contract.go | 104 +++++++++++++++++++++++++++++ testnode.sh | 0 3 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 cmd/centaurid/cmd/wasm_contract.go mode change 100644 => 100755 testnode.sh diff --git a/cmd/centaurid/cmd/root.go b/cmd/centaurid/cmd/root.go index 50f53fb2c..af51ee0d5 100644 --- a/cmd/centaurid/cmd/root.go +++ b/cmd/centaurid/cmd/root.go @@ -176,9 +176,9 @@ func initRootCmd(rootCmd *cobra.Command, encodingConfig app.EncodingConfig) { genutilcli.GenTxCmd(app.ModuleBasics, encodingConfig.TxConfig, banktypes.GenesisBalancesIterator{}, app.DefaultNodeHome), genutilcli.ValidateGenesisCmd(app.ModuleBasics), AddGenesisAccountCmd(app.DefaultNodeHome), + AddWasmContractCmd(app.DefaultNodeHome), tmcli.NewCompletionCmd(rootCmd, true), addDebugCommands(debug.Cmd()), - debug.Cmd(), config.Cmd(), CovertPrefixAddr(), // this line is used by starport scaffolding # stargate/root/commands diff --git a/cmd/centaurid/cmd/wasm_contract.go b/cmd/centaurid/cmd/wasm_contract.go new file mode 100644 index 000000000..3a60f5be9 --- /dev/null +++ b/cmd/centaurid/cmd/wasm_contract.go @@ -0,0 +1,104 @@ +package cmd + +import ( + "crypto/sha256" + "encoding/json" + "fmt" + "io" + "log" + "os" + + "github.com/spf13/cobra" + + "github.com/CosmWasm/wasmd/x/wasm/ioutils" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/server" + "github.com/cosmos/cosmos-sdk/x/genutil" + genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" + wasm08types "github.com/cosmos/ibc-go/v7/modules/light-clients/08-wasm/types" +) + +// AddGenesisAccountCmd returns add-genesis-account cobra Command. +func AddWasmContractCmd(defaultNodeHome string) *cobra.Command { + cmd := &cobra.Command{ + Use: "add-wasm-contract [wasm file]", + Short: "Add a wasm contract to genesis.json", + Long: `Add a wasm contract to genesis.json. Wasm contract don't need be added via gov module.`, + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx := client.GetClientContextFromCmd(cmd) + depCdc := clientCtx.Codec + cdc := depCdc + + serverCtx := server.GetServerContextFromCmd(cmd) + config := serverCtx.Config + + config.SetRoot(clientCtx.HomeDir) + + wasm, err := os.ReadFile(args[0]) + if err != nil { + return err + } + if !ioutils.IsWasm(wasm) { + return fmt.Errorf("invalid input file. Use wasm binary or gzip") + } + + genFile := config.GenesisFile() + appState, genDoc, err := genutiltypes.GenesisStateFromGenFile(genFile) + if err != nil { + return fmt.Errorf("failed to unmarshal genesis state: %w", err) + } + f, err := os.Open(args[0]) + if err != nil { + log.Fatal(err) + } + defer f.Close() + h := sha256.New() + if _, err := io.Copy(h, f); err != nil { + log.Fatal(err) + } + contract := wasm08types.GenesisContract{ + CodeHash: h.Sum(nil), + ContractCode: wasm, + } + + wasmGenState := GetGenesisStateFromAppState(cdc, appState) + + wasmGenState.Contracts = append(wasmGenState.Contracts, contract) + + wasmGenStateBz, err := cdc.MarshalJSON(wasmGenState) + if err != nil { + return fmt.Errorf("failed to marshal 08-wasm genesis state: %w", err) + } + + appState["08-wasm"] = wasmGenStateBz + + appStateJSON, err := json.Marshal(appState) + if err != nil { + return fmt.Errorf("failed to marshal application genesis state: %w", err) + } + + genDoc.AppState = appStateJSON + return genutil.ExportGenesisFile(genDoc, genFile) + }, + } + + cmd.Flags().String(flags.FlagHome, defaultNodeHome, "The application home directory") + flags.AddQueryFlagsToCmd(cmd) + + return cmd +} + +// GetGenesisStateFromAppState return GenesisState given raw application +// genesis state. +func GetGenesisStateFromAppState(cdc codec.JSONCodec, appState map[string]json.RawMessage) *wasm08types.GenesisState { + var genesisState wasm08types.GenesisState + + if appState["08-wasm"] != nil { + cdc.MustUnmarshalJSON(appState["08-wasm"], &genesisState) + } + + return &genesisState +} diff --git a/testnode.sh b/testnode.sh old mode 100644 new mode 100755 From 60bc88ab1b55bc6d727d8d8f30773d0c2e7f6737 Mon Sep 17 00:00:00 2001 From: anhductn2001 Date: Mon, 17 Jul 2023 17:18:49 +0700 Subject: [PATCH 2/3] create checksumk --- cmd/centaurid/cmd/wasm_contract.go | 33 +++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/cmd/centaurid/cmd/wasm_contract.go b/cmd/centaurid/cmd/wasm_contract.go index 3a60f5be9..ad04484ff 100644 --- a/cmd/centaurid/cmd/wasm_contract.go +++ b/cmd/centaurid/cmd/wasm_contract.go @@ -1,16 +1,16 @@ package cmd import ( + "bytes" "crypto/sha256" "encoding/json" "fmt" - "io" - "log" "os" "github.com/spf13/cobra" "github.com/CosmWasm/wasmd/x/wasm/ioutils" + wasmtypes "github.com/CosmWasm/wasmvm/types" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/codec" @@ -20,6 +20,8 @@ import ( wasm08types "github.com/cosmos/ibc-go/v7/modules/light-clients/08-wasm/types" ) +type Checksum = wasmtypes.Checksum + // AddGenesisAccountCmd returns add-genesis-account cobra Command. func AddWasmContractCmd(defaultNodeHome string) *cobra.Command { cmd := &cobra.Command{ @@ -50,17 +52,12 @@ func AddWasmContractCmd(defaultNodeHome string) *cobra.Command { if err != nil { return fmt.Errorf("failed to unmarshal genesis state: %w", err) } - f, err := os.Open(args[0]) + codeHash, err := CreateChecksum(wasm) if err != nil { - log.Fatal(err) - } - defer f.Close() - h := sha256.New() - if _, err := io.Copy(h, f); err != nil { - log.Fatal(err) + return err } contract := wasm08types.GenesisContract{ - CodeHash: h.Sum(nil), + CodeHash: codeHash, ContractCode: wasm, } @@ -102,3 +99,19 @@ func GetGenesisStateFromAppState(cdc codec.JSONCodec, appState map[string]json.R return &genesisState } + +func CreateChecksum(wasm []byte) (Checksum, error) { + if len(wasm) == 0 { + return Checksum{}, fmt.Errorf("wasm bytes nil or empty") + } + if len(wasm) < 4 { + return Checksum{}, fmt.Errorf("wasm bytes shorter than 4 bytes") + } + // magic number for Wasm is "\0asm" + // See https://webassembly.github.io/spec/core/binary/modules.html#binary-module + if !bytes.Equal(wasm[:4], []byte("\x00\x61\x73\x6D")) { + return Checksum{}, fmt.Errorf("wasm bytes do not not start with Wasm magic number") + } + hash := sha256.Sum256(wasm) + return Checksum(hash[:]), nil +} From 499f5bc9be47ae084ddf6f6e72fdca8afd7b1d79 Mon Sep 17 00:00:00 2001 From: anhductn2001 Date: Tue, 18 Jul 2023 15:46:14 +0700 Subject: [PATCH 3/3] use ibc-go fork --- go.mod | 4 ++-- go.sum | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index b62f8a844..79c4ce266 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( cloud.google.com/go/iam v0.12.0 // indirect cloud.google.com/go/storage v1.29.0 // indirect cosmossdk.io/log v1.1.0 // indirect - github.com/CosmWasm/wasmvm v1.2.4 // indirect; indirect // safe because we're using permissioned cosmwasm + github.com/CosmWasm/wasmvm v1.2.4 // indirect // safe because we're using permissioned cosmwasm github.com/aws/aws-sdk-go v1.44.203 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/chzyer/readline v1.5.1 // indirect @@ -186,7 +186,7 @@ replace ( // lock wasmvm so we do not break the grandpa contract github.com/CosmWasm/wasmvm => github.com/CosmWasm/wasmvm v1.2.2 // ibc-go with wasm client - github.com/cosmos/ibc-go/v7 => github.com/notional-labs/ibc-go/v7 v7.0.0-wasm-client + github.com/cosmos/ibc-go/v7 => github.com/notional-labs/ibc-go/v7 v7.0.0-wasm-client.0.20230718080912-f959b595d4d1 github.com/strangelove-ventures/packet-forward-middleware/v7 => github.com/notional-labs/packet-forward-middleware/v7 v7.0.0-20230615054050-5523db83e69a diff --git a/go.sum b/go.sum index 2c21732b5..0dcf327a7 100644 --- a/go.sum +++ b/go.sum @@ -770,8 +770,8 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/notional-labs/alliance v1.0.1-0.20230523105704-66dba9499c01 h1:koCsoc1NGpU8TntXwM/s7Z/whsKNDVPiLim35HLBAzA= github.com/notional-labs/alliance v1.0.1-0.20230523105704-66dba9499c01/go.mod h1:GFQ8TsXDMTpu7kif0Dwddz6rxazy0ZJQHfN38ZmAodI= -github.com/notional-labs/ibc-go/v7 v7.0.0-wasm-client h1:oQxReLXp48oCIW1zYL+YYg7Nr3L5ginxzJjWXSk1zHM= -github.com/notional-labs/ibc-go/v7 v7.0.0-wasm-client/go.mod h1:ISHo/Qitjtvj2svGmttaZv03zVXmS+uqvUyF9kFqlI0= +github.com/notional-labs/ibc-go/v7 v7.0.0-wasm-client.0.20230718080912-f959b595d4d1 h1:H2qC0F+SZtske/V+HgRUmin6QWGTZE6+dyfvW0j6hXQ= +github.com/notional-labs/ibc-go/v7 v7.0.0-wasm-client.0.20230718080912-f959b595d4d1/go.mod h1:ISHo/Qitjtvj2svGmttaZv03zVXmS+uqvUyF9kFqlI0= github.com/notional-labs/packet-forward-middleware/v7 v7.0.0-20230615054050-5523db83e69a h1:MMb5U1UydbPHdQGmvLBy5/KgX9NUb8tY6H5aJvXXKjI= github.com/notional-labs/packet-forward-middleware/v7 v7.0.0-20230615054050-5523db83e69a/go.mod h1:9C/cvYi6C0YqCc7sh0Eyv+pRYCXnt1DkJ1AN9q555Hw= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=