@agoric/cosmos 0.35.0-u21.0 → 0.35.0-u22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -187
- package/Makefile +2 -2
- package/ante/ante.go +2 -2
- package/ante/inbound.go +1 -2
- package/ante/inbound_test.go +3 -1
- package/ante/vm_admission.go +1 -2
- package/app/app.go +255 -174
- package/app/encoding.go +6 -3
- package/app/export.go +50 -21
- package/app/genesis.go +7 -5
- package/app/params/encoding.go +1 -1
- package/app/params/proto.go +6 -4
- package/app/sim_test.go +11 -13
- package/app/txconfig/tx_config.go +169 -0
- package/app/upgrade.go +52 -97
- package/app/upgrade_test.go +1 -1
- package/cmd/agd/agvm.go +1 -1
- package/cmd/agd/main.go +1 -1
- package/cmd/libdaemon/main.go +2 -2
- package/daemon/cmd/root.go +99 -30
- package/daemon/cmd/root_test.go +12 -27
- package/daemon/main.go +2 -9
- package/git-revision.txt +1 -1
- package/go.mod +129 -109
- package/go.sum +228 -469
- package/package.json +2 -2
- package/proto/agoric/swingset/msgs.proto +46 -9
- package/proto/agoric/swingset/swingset.proto +7 -2
- package/proto/agoric/vbank/vbank.proto +1 -1
- package/proto/agoric/vibc/msgs.proto +4 -0
- package/tests/e2e/vbank/vbank_test.go +172 -0
- package/tests/integrations/types/aminojson_test.go +214 -0
- package/tests/integrations/vbank/vbank_test.go +348 -0
- package/third_party/proto/amino/amino.proto +6 -1
- package/third_party/proto/cosmos/base/v1beta1/coin.proto +18 -5
- package/third_party/proto/cosmos/upgrade/v1beta1/upgrade.proto +4 -8
- package/third_party/proto/ibc/core/channel/v1/channel.proto +42 -17
- package/third_party/proto/ibc/core/client/v1/client.proto +48 -40
- package/types/address_hooks.go +2 -2
- package/types/address_hooks_test.go +3 -3
- package/types/ibc_packet.go +3 -3
- package/types/ibc_packet_test.go +3 -3
- package/types/kv_entry_helpers.go +3 -3
- package/types/kv_entry_helpers_test.go +2 -2
- package/types/legacy_address_encoder.go +58 -0
- package/vm/proto_json_test.go +1 -1
- package/vm/server.go +2 -1
- package/x/swingset/abci.go +2 -2
- package/x/swingset/client/cli/tx.go +16 -14
- package/x/swingset/config.go +1 -1
- package/x/swingset/genesis.go +2 -1
- package/x/swingset/handler.go +2 -1
- package/x/swingset/keeper/extension_snapshotter.go +14 -5
- package/x/swingset/keeper/extension_snapshotter_test.go +1 -1
- package/x/swingset/keeper/keeper.go +21 -17
- package/x/swingset/keeper/keeper_test.go +10 -7
- package/x/swingset/keeper/msg_server.go +26 -5
- package/x/swingset/keeper/swing_store_exports_handler.go +1 -1
- package/x/swingset/keeper/swing_store_exports_handler_test.go +1 -1
- package/x/swingset/module.go +20 -22
- package/x/swingset/types/codec.go +10 -5
- package/x/swingset/types/default-params.go +13 -12
- package/x/swingset/types/expected_keepers.go +5 -4
- package/x/swingset/types/msgs.go +50 -36
- package/x/swingset/types/msgs.pb.go +60 -51
- package/x/swingset/types/params_test.go +21 -20
- package/x/swingset/types/swingset.pb.go +67 -61
- package/x/vbank/genesis.go +12 -8
- package/x/vbank/handler.go +2 -1
- package/x/vbank/keeper/grpc_query.go +4 -1
- package/x/vbank/keeper/keeper.go +108 -23
- package/x/vbank/keeper/querier.go +4 -1
- package/x/vbank/keeper/rewards.go +6 -2
- package/x/vbank/module.go +47 -75
- package/x/vbank/types/expected_keepers.go +15 -10
- package/x/vbank/types/key.go +3 -0
- package/x/vbank/types/params.go +4 -3
- package/x/vbank/types/vbank.pb.go +41 -40
- package/x/vbank/vbank.go +25 -10
- package/x/vbank/vbank_test.go +213 -154
- package/x/vibc/handler.go +2 -1
- package/x/vibc/keeper/keeper.go +10 -10
- package/x/vibc/keeper/migrations.go +1 -1
- package/x/vibc/keeper/triggers.go +1 -1
- package/x/vibc/module.go +5 -22
- package/x/vibc/types/codec.go +2 -1
- package/x/vibc/types/expected_keepers.go +7 -5
- package/x/vibc/types/ibc_module.go +5 -5
- package/x/vibc/types/msgs.go +30 -7
- package/x/vibc/types/msgs.pb.go +29 -25
- package/x/vibc/types/receiver.go +2 -2
- package/x/vlocalchain/handler.go +2 -1
- package/x/vlocalchain/keeper/keeper.go +17 -5
- package/x/vlocalchain/keeper/keeper_test.go +3 -2
- package/x/vlocalchain/types/expected_keepers.go +7 -4
- package/x/vlocalchain/vlocalchain_test.go +38 -26
- package/x/vstorage/genesis.go +10 -10
- package/x/vstorage/handler.go +2 -1
- package/x/vstorage/keeper/keeper.go +68 -46
- package/x/vstorage/keeper/keeper_test.go +35 -19
- package/x/vstorage/module.go +27 -13
- package/x/vstorage/testing/queue.go +5 -3
- package/x/vstorage/vstorage.go +2 -1
- package/x/vstorage/vstorage_test.go +21 -17
- package/x/vtransfer/genesis.go +1 -3
- package/x/vtransfer/handler.go +3 -2
- package/x/vtransfer/ibc_middleware.go +5 -5
- package/x/vtransfer/ibc_middleware_test.go +43 -29
- package/x/vtransfer/keeper/keeper.go +35 -33
- package/x/vtransfer/module.go +8 -11
- package/x/vtransfer/types/expected_keepers.go +3 -3
- package/x/vtransfer/utils_test.go +26 -11
- package/daemon/cmd/testnet.go +0 -539
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
package vtransfer_test
|
|
2
2
|
|
|
3
3
|
import (
|
|
4
|
+
"encoding/hex"
|
|
4
5
|
"fmt"
|
|
5
6
|
"strconv"
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
clienttypes "github.com/cosmos/ibc-go/
|
|
9
|
-
channeltypes "github.com/cosmos/ibc-go/
|
|
10
|
-
host "github.com/cosmos/ibc-go/
|
|
11
|
-
ibctesting "github.com/cosmos/ibc-go/
|
|
8
|
+
abci "github.com/cometbft/cometbft/abci/types"
|
|
9
|
+
clienttypes "github.com/cosmos/ibc-go/v8/modules/core/02-client/types"
|
|
10
|
+
channeltypes "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types"
|
|
11
|
+
host "github.com/cosmos/ibc-go/v8/modules/core/24-host"
|
|
12
|
+
ibctesting "github.com/cosmos/ibc-go/v8/testing"
|
|
12
13
|
)
|
|
13
14
|
|
|
14
15
|
// acknowledgePacketWithResult sends a MsgAcknowledgement to the channel associated with the endpoint.
|
|
15
16
|
// [AGORIC] Would be nice to create a new ibctesting.AcknowledgePacketWithResult
|
|
16
|
-
func acknowledgePacketWithResult(endpoint *ibctesting.Endpoint, packet channeltypes.Packet, ack []byte) (*
|
|
17
|
+
func acknowledgePacketWithResult(endpoint *ibctesting.Endpoint, packet channeltypes.Packet, ack []byte) (*abci.ExecTxResult, error) {
|
|
17
18
|
// get proof of acknowledgement on counterparty
|
|
18
19
|
packetKey := host.PacketAcknowledgementKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence())
|
|
19
20
|
proof, proofHeight := endpoint.Counterparty.QueryProof(packetKey)
|
|
@@ -26,17 +27,24 @@ func acknowledgePacketWithResult(endpoint *ibctesting.Endpoint, packet channelty
|
|
|
26
27
|
// ParseAckFromEvents parses events emitted from a MsgRecvPacket and returns the
|
|
27
28
|
// acknowledgement.
|
|
28
29
|
// [AGORIC] Signature taken from ibctesting.ParseAckFromEvents
|
|
29
|
-
func ParseAckFromEvents(events
|
|
30
|
+
func ParseAckFromEvents(events []abci.Event) ([]byte, error) {
|
|
30
31
|
return ParseAckFromFilteredEvents(events, channeltypes.EventTypeWriteAck)
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
// ParseAckFromFilteredEvents parses events emitted matching filteredType and returns the acknowledgement.
|
|
34
35
|
// [AGORIC] Would be nice to improve the implementation and upstream it
|
|
35
|
-
func ParseAckFromFilteredEvents(events
|
|
36
|
+
func ParseAckFromFilteredEvents(events []abci.Event, filteredType string) ([]byte, error) {
|
|
36
37
|
for _, ev := range events {
|
|
37
38
|
if ev.Type == filteredType {
|
|
38
39
|
for _, attr := range ev.Attributes {
|
|
39
|
-
|
|
40
|
+
switch attr.Key {
|
|
41
|
+
case channeltypes.AttributeKeyAckHex:
|
|
42
|
+
hexAck, err := hex.DecodeString(attr.Value)
|
|
43
|
+
if err != nil {
|
|
44
|
+
return nil, fmt.Errorf("failed to parse hex ack: %w", err)
|
|
45
|
+
}
|
|
46
|
+
return hexAck, nil
|
|
47
|
+
case channeltypes.AttributeKeyAck: //nolint:staticcheck // DEPRECATED
|
|
40
48
|
return []byte(attr.Value), nil
|
|
41
49
|
}
|
|
42
50
|
}
|
|
@@ -48,18 +56,25 @@ func ParseAckFromFilteredEvents(events sdk.Events, filteredType string) ([]byte,
|
|
|
48
56
|
// ParsePacketFromEvents parses the send_packet type events emitted by the IBC
|
|
49
57
|
// module and returns the packet.
|
|
50
58
|
// [AGORIC] Signature taken from ibctesting.ParsePacketFromEvents
|
|
51
|
-
func ParsePacketFromEvents(events
|
|
59
|
+
func ParsePacketFromEvents(events []abci.Event) (channeltypes.Packet, error) {
|
|
52
60
|
return ParsePacketFromFilteredEvents(events, channeltypes.EventTypeSendPacket)
|
|
53
61
|
}
|
|
54
62
|
|
|
55
63
|
// ParsePacketFromFilteredEvents parses events emitted matching filteredType and returns the packet.
|
|
56
64
|
// [AGORIC] Would be nice to improve the implementation and upstream it
|
|
57
|
-
func ParsePacketFromFilteredEvents(events
|
|
65
|
+
func ParsePacketFromFilteredEvents(events []abci.Event, filteredType string) (channeltypes.Packet, error) {
|
|
58
66
|
for _, ev := range events {
|
|
59
67
|
if ev.Type == filteredType {
|
|
60
68
|
packet := channeltypes.Packet{}
|
|
61
69
|
for _, attr := range ev.Attributes {
|
|
62
70
|
switch attr.Key {
|
|
71
|
+
case channeltypes.AttributeKeyDataHex:
|
|
72
|
+
hexData, err := hex.DecodeString(attr.Value)
|
|
73
|
+
if err != nil {
|
|
74
|
+
return channeltypes.Packet{}, fmt.Errorf("failed to parse hex data: %w", err)
|
|
75
|
+
}
|
|
76
|
+
packet.Data = hexData
|
|
77
|
+
|
|
63
78
|
case channeltypes.AttributeKeyData: //nolint:staticcheck // DEPRECATED
|
|
64
79
|
packet.Data = []byte(attr.Value)
|
|
65
80
|
|
package/daemon/cmd/testnet.go
DELETED
|
@@ -1,539 +0,0 @@
|
|
|
1
|
-
package cmd
|
|
2
|
-
|
|
3
|
-
// DONTCOVER
|
|
4
|
-
|
|
5
|
-
import (
|
|
6
|
-
"bufio"
|
|
7
|
-
"encoding/json"
|
|
8
|
-
"fmt"
|
|
9
|
-
"net"
|
|
10
|
-
"os"
|
|
11
|
-
"path/filepath"
|
|
12
|
-
|
|
13
|
-
tmconfig "github.com/cometbft/cometbft/config"
|
|
14
|
-
tmrand "github.com/cometbft/cometbft/libs/rand"
|
|
15
|
-
"github.com/cometbft/cometbft/types"
|
|
16
|
-
tmtime "github.com/cometbft/cometbft/types/time"
|
|
17
|
-
"github.com/spf13/cobra"
|
|
18
|
-
"github.com/spf13/pflag"
|
|
19
|
-
|
|
20
|
-
"cosmossdk.io/math"
|
|
21
|
-
|
|
22
|
-
"cosmossdk.io/simapp"
|
|
23
|
-
"github.com/cosmos/cosmos-sdk/client"
|
|
24
|
-
"github.com/cosmos/cosmos-sdk/client/flags"
|
|
25
|
-
"github.com/cosmos/cosmos-sdk/client/tx"
|
|
26
|
-
"github.com/cosmos/cosmos-sdk/crypto/hd"
|
|
27
|
-
"github.com/cosmos/cosmos-sdk/crypto/keyring"
|
|
28
|
-
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
|
|
29
|
-
"github.com/cosmos/cosmos-sdk/server"
|
|
30
|
-
srvconfig "github.com/cosmos/cosmos-sdk/server/config"
|
|
31
|
-
"github.com/cosmos/cosmos-sdk/testutil"
|
|
32
|
-
"github.com/cosmos/cosmos-sdk/testutil/network"
|
|
33
|
-
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
34
|
-
"github.com/cosmos/cosmos-sdk/types/module"
|
|
35
|
-
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
|
36
|
-
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
|
|
37
|
-
"github.com/cosmos/cosmos-sdk/x/genutil"
|
|
38
|
-
genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types"
|
|
39
|
-
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
var (
|
|
43
|
-
flagNodeDirPrefix = "node-dir-prefix"
|
|
44
|
-
flagNumValidators = "validator-count"
|
|
45
|
-
flagOutputDir = "output-dir"
|
|
46
|
-
flagNodeDaemonHome = "node-daemon-home"
|
|
47
|
-
flagStartingIPAddress = "starting-ip-address"
|
|
48
|
-
flagEnableLogging = "enable-logging"
|
|
49
|
-
flagGRPCAddress = "grpc.address"
|
|
50
|
-
flagRPCAddress = "rpc.address"
|
|
51
|
-
flagAPIAddress = "api.address"
|
|
52
|
-
flagPrintMnemonic = "print-mnemonic"
|
|
53
|
-
|
|
54
|
-
shortFlagNumValidators = "c"
|
|
55
|
-
flagDeprecatedNumValidators = "v"
|
|
56
|
-
)
|
|
57
|
-
|
|
58
|
-
type initArgs struct {
|
|
59
|
-
algo string
|
|
60
|
-
chainID string
|
|
61
|
-
keyringBackend string
|
|
62
|
-
minGasPrices string
|
|
63
|
-
nodeDaemonHome string
|
|
64
|
-
nodeDirPrefix string
|
|
65
|
-
numValidators int
|
|
66
|
-
outputDir string
|
|
67
|
-
startingIPAddress string
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
type startArgs struct {
|
|
71
|
-
algo string
|
|
72
|
-
apiAddress string
|
|
73
|
-
chainID string
|
|
74
|
-
enableLogging bool
|
|
75
|
-
grpcAddress string
|
|
76
|
-
minGasPrices string
|
|
77
|
-
numValidators int
|
|
78
|
-
outputDir string
|
|
79
|
-
printMnemonic bool
|
|
80
|
-
rpcAddress string
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
func addTestnetFlagsToCmd(cmd *cobra.Command) {
|
|
84
|
-
cmd.Flags().IntP(flagNumValidators, shortFlagNumValidators, 4, "Number of validators to initialize the testnet with")
|
|
85
|
-
cmd.Flags().Int(flagDeprecatedNumValidators, 4, "Number of validators to initialize the testnet with")
|
|
86
|
-
cmd.Flags().MarkDeprecated(flagDeprecatedNumValidators, fmt.Sprintf("use -%s or --%s", shortFlagNumValidators, flagNumValidators))
|
|
87
|
-
cmd.Flags().StringP(flagOutputDir, "o", "./.testnets", "Directory to store initialization data for the testnet")
|
|
88
|
-
cmd.Flags().String(flags.FlagChainID, "", "genesis file chain-id, if left blank will be randomly created")
|
|
89
|
-
cmd.Flags().String(server.FlagMinGasPrices, fmt.Sprintf("0.000006%s", sdk.DefaultBondDenom), "Minimum gas prices to accept for transactions; All fees in a tx must meet this minimum (e.g. 0.01photino,0.001stake)")
|
|
90
|
-
cmd.Flags().String(flags.FlagKeyType, string(hd.Secp256k1Type), "Key signing algorithm to generate keys for")
|
|
91
|
-
|
|
92
|
-
// support old flags name for backwards compatibility
|
|
93
|
-
cmd.Flags().SetNormalizeFunc(func(f *pflag.FlagSet, name string) pflag.NormalizedName {
|
|
94
|
-
if name == "algo" {
|
|
95
|
-
name = flags.FlagKeyType
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
return pflag.NormalizedName(name)
|
|
99
|
-
})
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// NewTestnetCmd creates a root testnet command with subcommands to run an in-process testnet or initialize
|
|
103
|
-
// validator configuration files for running a multi-validator testnet in a separate process
|
|
104
|
-
func NewTestnetCmd(mbm module.BasicManager, genBalIterator banktypes.GenesisBalancesIterator, appName string) *cobra.Command {
|
|
105
|
-
testnetCmd := &cobra.Command{
|
|
106
|
-
Use: "testnet",
|
|
107
|
-
Short: "subcommands for starting or configuring local testnets",
|
|
108
|
-
DisableFlagParsing: true,
|
|
109
|
-
SuggestionsMinimumDistance: 2,
|
|
110
|
-
RunE: client.ValidateCmd,
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
testnetCmd.AddCommand(testnetStartCmd(appName))
|
|
114
|
-
testnetCmd.AddCommand(testnetInitFilesCmd(mbm, genBalIterator, appName))
|
|
115
|
-
|
|
116
|
-
return testnetCmd
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// testnetInitFilesCmd returns a cmd to initialize all files for tendermint testnet and application
|
|
120
|
-
func testnetInitFilesCmd(mbm module.BasicManager, genBalIterator banktypes.GenesisBalancesIterator, appName string) *cobra.Command {
|
|
121
|
-
cmd := &cobra.Command{
|
|
122
|
-
Use: "init-files",
|
|
123
|
-
Short: "Initialize config directories & files for a multi-validator testnet running locally via separate processes (e.g. Docker Compose or similar)",
|
|
124
|
-
Long: fmt.Sprintf(`init-files will setup a number of directories (specified by "-%[2]s") and populate each with
|
|
125
|
-
necessary files (private validator, genesis, config, etc.) for running validator nodes.
|
|
126
|
-
|
|
127
|
-
Booting up a network with these validator folders is intended to be used with Docker Compose,
|
|
128
|
-
or a similar setup where each node has a manually configurable IP address.
|
|
129
|
-
|
|
130
|
-
Note, strict routability for addresses is turned off in the config file.
|
|
131
|
-
|
|
132
|
-
Example:
|
|
133
|
-
%[1]s testnet init-files -%[2]s 4 --output-dir ./.testnets --starting-ip-address 192.168.10.2
|
|
134
|
-
`, appName, shortFlagNumValidators),
|
|
135
|
-
RunE: func(cmd *cobra.Command, _ []string) error {
|
|
136
|
-
clientCtx, err := client.GetClientQueryContext(cmd)
|
|
137
|
-
if err != nil {
|
|
138
|
-
return err
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
serverCtx := server.GetServerContextFromCmd(cmd)
|
|
142
|
-
config := serverCtx.Config
|
|
143
|
-
|
|
144
|
-
args := initArgs{}
|
|
145
|
-
args.outputDir, _ = cmd.Flags().GetString(flagOutputDir)
|
|
146
|
-
args.keyringBackend, _ = cmd.Flags().GetString(flags.FlagKeyringBackend)
|
|
147
|
-
args.chainID, _ = cmd.Flags().GetString(flags.FlagChainID)
|
|
148
|
-
args.minGasPrices, _ = cmd.Flags().GetString(server.FlagMinGasPrices)
|
|
149
|
-
args.nodeDirPrefix, _ = cmd.Flags().GetString(flagNodeDirPrefix)
|
|
150
|
-
args.nodeDaemonHome, _ = cmd.Flags().GetString(flagNodeDaemonHome)
|
|
151
|
-
args.startingIPAddress, _ = cmd.Flags().GetString(flagStartingIPAddress)
|
|
152
|
-
args.numValidators, _ = cmd.Flags().GetInt(flagNumValidators)
|
|
153
|
-
args.algo, _ = cmd.Flags().GetString(flags.FlagKeyType)
|
|
154
|
-
|
|
155
|
-
return initTestnetFiles(clientCtx, cmd, config, mbm, genBalIterator, args)
|
|
156
|
-
},
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
addTestnetFlagsToCmd(cmd)
|
|
160
|
-
cmd.Flags().String(flagNodeDirPrefix, "node", "Prefix the directory name for each node with (node results in node0, node1, ...)")
|
|
161
|
-
cmd.Flags().String(flagNodeDaemonHome, appName, "Home directory of the node's daemon configuration")
|
|
162
|
-
cmd.Flags().String(flagStartingIPAddress, "192.168.0.1", "Starting IP address (192.168.0.1 results in persistent peers list ID0@192.168.0.1:46656, ID1@192.168.0.2:46656, ...)")
|
|
163
|
-
cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|test)")
|
|
164
|
-
|
|
165
|
-
return cmd
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// testnetStartCmd returns a cmd to start multi validator in-process testnet
|
|
169
|
-
func testnetStartCmd(appName string) *cobra.Command {
|
|
170
|
-
cmd := &cobra.Command{
|
|
171
|
-
Use: "start",
|
|
172
|
-
Short: "Launch an in-process multi-validator testnet",
|
|
173
|
-
Long: fmt.Sprintf(`testnet will launch an in-process multi-validator testnet,
|
|
174
|
-
and generate a number of directories (specified by "-%[2]s"), populated with necessary validator configuration files
|
|
175
|
-
(private validator, genesis, config, etc.).
|
|
176
|
-
|
|
177
|
-
Example:
|
|
178
|
-
%[1]s testnet start -%[2]s 4 --output-dir ./.testnets
|
|
179
|
-
`, appName, shortFlagNumValidators),
|
|
180
|
-
RunE: func(cmd *cobra.Command, _ []string) error {
|
|
181
|
-
args := startArgs{}
|
|
182
|
-
args.outputDir, _ = cmd.Flags().GetString(flagOutputDir)
|
|
183
|
-
args.chainID, _ = cmd.Flags().GetString(flags.FlagChainID)
|
|
184
|
-
args.minGasPrices, _ = cmd.Flags().GetString(server.FlagMinGasPrices)
|
|
185
|
-
args.numValidators, _ = cmd.Flags().GetInt(flagNumValidators)
|
|
186
|
-
args.algo, _ = cmd.Flags().GetString(flags.FlagKeyType)
|
|
187
|
-
args.enableLogging, _ = cmd.Flags().GetBool(flagEnableLogging)
|
|
188
|
-
args.rpcAddress, _ = cmd.Flags().GetString(flagRPCAddress)
|
|
189
|
-
args.apiAddress, _ = cmd.Flags().GetString(flagAPIAddress)
|
|
190
|
-
args.grpcAddress, _ = cmd.Flags().GetString(flagGRPCAddress)
|
|
191
|
-
args.printMnemonic, _ = cmd.Flags().GetBool(flagPrintMnemonic)
|
|
192
|
-
|
|
193
|
-
return startTestnet(cmd, args)
|
|
194
|
-
},
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
addTestnetFlagsToCmd(cmd)
|
|
198
|
-
cmd.Flags().Bool(flagEnableLogging, false, "Enable INFO logging of tendermint validator nodes")
|
|
199
|
-
cmd.Flags().String(flagRPCAddress, "tcp://0.0.0.0:26657", "the RPC address to listen on")
|
|
200
|
-
cmd.Flags().String(flagAPIAddress, "tcp://0.0.0.0:1317", "the address to listen on for REST API")
|
|
201
|
-
cmd.Flags().String(flagGRPCAddress, "0.0.0.0:9090", "the gRPC server address to listen on")
|
|
202
|
-
cmd.Flags().Bool(flagPrintMnemonic, true, "print mnemonic of first validator to stdout for manual testing")
|
|
203
|
-
return cmd
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
const nodeDirPerm = 0o755
|
|
207
|
-
|
|
208
|
-
// initTestnetFiles initializes testnet files for a testnet to be run in a separate process
|
|
209
|
-
func initTestnetFiles(
|
|
210
|
-
clientCtx client.Context,
|
|
211
|
-
cmd *cobra.Command,
|
|
212
|
-
nodeConfig *tmconfig.Config,
|
|
213
|
-
mbm module.BasicManager,
|
|
214
|
-
genBalIterator banktypes.GenesisBalancesIterator,
|
|
215
|
-
args initArgs,
|
|
216
|
-
) error {
|
|
217
|
-
if args.chainID == "" {
|
|
218
|
-
args.chainID = "chain-" + tmrand.Str(6)
|
|
219
|
-
}
|
|
220
|
-
nodeIDs := make([]string, args.numValidators)
|
|
221
|
-
valPubKeys := make([]cryptotypes.PubKey, args.numValidators)
|
|
222
|
-
|
|
223
|
-
simappConfig := srvconfig.DefaultConfig()
|
|
224
|
-
simappConfig.MinGasPrices = args.minGasPrices
|
|
225
|
-
simappConfig.API.Enable = true
|
|
226
|
-
simappConfig.Telemetry.Enabled = true
|
|
227
|
-
simappConfig.Telemetry.PrometheusRetentionTime = 60
|
|
228
|
-
simappConfig.Telemetry.EnableHostnameLabel = false
|
|
229
|
-
simappConfig.Telemetry.GlobalLabels = [][]string{{"chain_id", args.chainID}}
|
|
230
|
-
|
|
231
|
-
var (
|
|
232
|
-
genAccounts []authtypes.GenesisAccount
|
|
233
|
-
genBalances []banktypes.Balance
|
|
234
|
-
genFiles []string
|
|
235
|
-
)
|
|
236
|
-
|
|
237
|
-
inBuf := bufio.NewReader(cmd.InOrStdin())
|
|
238
|
-
// generate private keys, node IDs, and initial transactions
|
|
239
|
-
for i := 0; i < args.numValidators; i++ {
|
|
240
|
-
nodeDirName := fmt.Sprintf("%s%d", args.nodeDirPrefix, i)
|
|
241
|
-
nodeDir := filepath.Join(args.outputDir, nodeDirName, args.nodeDaemonHome)
|
|
242
|
-
gentxsDir := filepath.Join(args.outputDir, "gentxs")
|
|
243
|
-
|
|
244
|
-
nodeConfig.SetRoot(nodeDir)
|
|
245
|
-
nodeConfig.Moniker = nodeDirName
|
|
246
|
-
nodeConfig.RPC.ListenAddress = "tcp://0.0.0.0:26657"
|
|
247
|
-
|
|
248
|
-
if err := os.MkdirAll(filepath.Join(nodeDir, "config"), nodeDirPerm); err != nil {
|
|
249
|
-
_ = os.RemoveAll(args.outputDir)
|
|
250
|
-
return err
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
ip, err := getIP(i, args.startingIPAddress)
|
|
254
|
-
if err != nil {
|
|
255
|
-
_ = os.RemoveAll(args.outputDir)
|
|
256
|
-
return err
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
nodeIDs[i], valPubKeys[i], err = genutil.InitializeNodeValidatorFiles(nodeConfig)
|
|
260
|
-
if err != nil {
|
|
261
|
-
_ = os.RemoveAll(args.outputDir)
|
|
262
|
-
return err
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
memo := fmt.Sprintf("%s@%s:26656", nodeIDs[i], ip)
|
|
266
|
-
genFiles = append(genFiles, nodeConfig.GenesisFile())
|
|
267
|
-
|
|
268
|
-
kb, err := keyring.New(sdk.KeyringServiceName(), args.keyringBackend, nodeDir, inBuf, clientCtx.Codec)
|
|
269
|
-
if err != nil {
|
|
270
|
-
return err
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
keyringAlgos, _ := kb.SupportedAlgorithms()
|
|
274
|
-
algo, err := keyring.NewSigningAlgoFromString(args.algo, keyringAlgos)
|
|
275
|
-
if err != nil {
|
|
276
|
-
return err
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
addr, secret, err := testutil.GenerateSaveCoinKey(kb, nodeDirName, "", true, algo)
|
|
280
|
-
if err != nil {
|
|
281
|
-
_ = os.RemoveAll(args.outputDir)
|
|
282
|
-
return err
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
info := map[string]string{"secret": secret}
|
|
286
|
-
|
|
287
|
-
cliPrint, err := json.Marshal(info)
|
|
288
|
-
if err != nil {
|
|
289
|
-
return err
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// save private key seed words
|
|
293
|
-
if err := writeFile(fmt.Sprintf("%v.json", "key_seed"), nodeDir, cliPrint); err != nil {
|
|
294
|
-
return err
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
accTokens := sdk.TokensFromConsensusPower(1000, sdk.DefaultPowerReduction)
|
|
298
|
-
accStakingTokens := sdk.TokensFromConsensusPower(500, sdk.DefaultPowerReduction)
|
|
299
|
-
coins := sdk.Coins{
|
|
300
|
-
sdk.NewCoin("testtoken", accTokens),
|
|
301
|
-
sdk.NewCoin(sdk.DefaultBondDenom, accStakingTokens),
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
genBalances = append(genBalances, banktypes.Balance{Address: addr.String(), Coins: coins.Sort()})
|
|
305
|
-
genAccounts = append(genAccounts, authtypes.NewBaseAccount(addr, nil, 0, 0))
|
|
306
|
-
|
|
307
|
-
valTokens := sdk.TokensFromConsensusPower(100, sdk.DefaultPowerReduction)
|
|
308
|
-
createValMsg, err := stakingtypes.NewMsgCreateValidator(
|
|
309
|
-
sdk.ValAddress(addr),
|
|
310
|
-
valPubKeys[i],
|
|
311
|
-
sdk.NewCoin(sdk.DefaultBondDenom, valTokens),
|
|
312
|
-
stakingtypes.NewDescription(nodeDirName, "", "", "", ""),
|
|
313
|
-
stakingtypes.NewCommissionRates(math.LegacyOneDec(), math.LegacyOneDec(), math.LegacyOneDec()),
|
|
314
|
-
math.OneInt(),
|
|
315
|
-
)
|
|
316
|
-
if err != nil {
|
|
317
|
-
return err
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
txBuilder := clientCtx.TxConfig.NewTxBuilder()
|
|
321
|
-
if err := txBuilder.SetMsgs(createValMsg); err != nil {
|
|
322
|
-
return err
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
txBuilder.SetMemo(memo)
|
|
326
|
-
|
|
327
|
-
txFactory := tx.Factory{}
|
|
328
|
-
txFactory = txFactory.
|
|
329
|
-
WithChainID(args.chainID).
|
|
330
|
-
WithMemo(memo).
|
|
331
|
-
WithKeybase(kb).
|
|
332
|
-
WithTxConfig(clientCtx.TxConfig)
|
|
333
|
-
|
|
334
|
-
if err := tx.Sign(txFactory, nodeDirName, txBuilder, true); err != nil {
|
|
335
|
-
return err
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
txBz, err := clientCtx.TxConfig.TxJSONEncoder()(txBuilder.GetTx())
|
|
339
|
-
if err != nil {
|
|
340
|
-
return err
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
if err := writeFile(fmt.Sprintf("%v.json", nodeDirName), gentxsDir, txBz); err != nil {
|
|
344
|
-
return err
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
srvconfig.WriteConfigFile(filepath.Join(nodeDir, "config", "app.toml"), simappConfig)
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
if err := initGenFiles(clientCtx, mbm, args.chainID, genAccounts, genBalances, genFiles, args.numValidators); err != nil {
|
|
351
|
-
return err
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
err := collectGenFiles(
|
|
355
|
-
clientCtx, nodeConfig, args.chainID, nodeIDs, valPubKeys, args.numValidators,
|
|
356
|
-
args.outputDir, args.nodeDirPrefix, args.nodeDaemonHome, genBalIterator,
|
|
357
|
-
)
|
|
358
|
-
if err != nil {
|
|
359
|
-
return err
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
cmd.PrintErrf("Successfully initialized %d node directories\n", args.numValidators)
|
|
363
|
-
return nil
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
func initGenFiles(
|
|
367
|
-
clientCtx client.Context, mbm module.BasicManager, chainID string,
|
|
368
|
-
genAccounts []authtypes.GenesisAccount, genBalances []banktypes.Balance,
|
|
369
|
-
genFiles []string, numValidators int,
|
|
370
|
-
) error {
|
|
371
|
-
appGenState := mbm.DefaultGenesis(clientCtx.Codec)
|
|
372
|
-
|
|
373
|
-
// set the accounts in the genesis state
|
|
374
|
-
var authGenState authtypes.GenesisState
|
|
375
|
-
clientCtx.Codec.MustUnmarshalJSON(appGenState[authtypes.ModuleName], &authGenState)
|
|
376
|
-
|
|
377
|
-
accounts, err := authtypes.PackAccounts(genAccounts)
|
|
378
|
-
if err != nil {
|
|
379
|
-
return err
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
authGenState.Accounts = accounts
|
|
383
|
-
appGenState[authtypes.ModuleName] = clientCtx.Codec.MustMarshalJSON(&authGenState)
|
|
384
|
-
|
|
385
|
-
// set the balances in the genesis state
|
|
386
|
-
var bankGenState banktypes.GenesisState
|
|
387
|
-
clientCtx.Codec.MustUnmarshalJSON(appGenState[banktypes.ModuleName], &bankGenState)
|
|
388
|
-
|
|
389
|
-
bankGenState.Balances = banktypes.SanitizeGenesisBalances(genBalances)
|
|
390
|
-
for _, bal := range bankGenState.Balances {
|
|
391
|
-
bankGenState.Supply = bankGenState.Supply.Add(bal.Coins...)
|
|
392
|
-
}
|
|
393
|
-
appGenState[banktypes.ModuleName] = clientCtx.Codec.MustMarshalJSON(&bankGenState)
|
|
394
|
-
|
|
395
|
-
appGenStateJSON, err := json.MarshalIndent(appGenState, "", " ")
|
|
396
|
-
if err != nil {
|
|
397
|
-
return err
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
genDoc := types.GenesisDoc{
|
|
401
|
-
ChainID: chainID,
|
|
402
|
-
AppState: appGenStateJSON,
|
|
403
|
-
Validators: nil,
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
// generate empty genesis files for each validator and save
|
|
407
|
-
for i := 0; i < numValidators; i++ {
|
|
408
|
-
if err := genDoc.SaveAs(genFiles[i]); err != nil {
|
|
409
|
-
return err
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
return nil
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
func collectGenFiles(
|
|
416
|
-
clientCtx client.Context, nodeConfig *tmconfig.Config, chainID string,
|
|
417
|
-
nodeIDs []string, valPubKeys []cryptotypes.PubKey, numValidators int,
|
|
418
|
-
outputDir, nodeDirPrefix, nodeDaemonHome string, genBalIterator banktypes.GenesisBalancesIterator,
|
|
419
|
-
) error {
|
|
420
|
-
var appState json.RawMessage
|
|
421
|
-
genTime := tmtime.Now()
|
|
422
|
-
|
|
423
|
-
for i := 0; i < numValidators; i++ {
|
|
424
|
-
nodeDirName := fmt.Sprintf("%s%d", nodeDirPrefix, i)
|
|
425
|
-
nodeDir := filepath.Join(outputDir, nodeDirName, nodeDaemonHome)
|
|
426
|
-
gentxsDir := filepath.Join(outputDir, "gentxs")
|
|
427
|
-
nodeConfig.Moniker = nodeDirName
|
|
428
|
-
|
|
429
|
-
nodeConfig.SetRoot(nodeDir)
|
|
430
|
-
|
|
431
|
-
nodeID, valPubKey := nodeIDs[i], valPubKeys[i]
|
|
432
|
-
initCfg := genutiltypes.NewInitConfig(chainID, gentxsDir, nodeID, valPubKey)
|
|
433
|
-
|
|
434
|
-
genDoc, err := types.GenesisDocFromFile(nodeConfig.GenesisFile())
|
|
435
|
-
if err != nil {
|
|
436
|
-
return err
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
nodeAppState, err := genutil.GenAppStateFromConfig(clientCtx.Codec, clientCtx.TxConfig, nodeConfig, initCfg, *genDoc, genBalIterator, genutiltypes.DefaultMessageValidator)
|
|
440
|
-
if err != nil {
|
|
441
|
-
return err
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
if appState == nil {
|
|
445
|
-
// set the canonical application state (they should not differ)
|
|
446
|
-
appState = nodeAppState
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
genFile := nodeConfig.GenesisFile()
|
|
450
|
-
|
|
451
|
-
// overwrite each validator's genesis file to have a canonical genesis time
|
|
452
|
-
if err := genutil.ExportGenesisFileWithTime(genFile, chainID, nil, appState, genTime); err != nil {
|
|
453
|
-
return err
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
return nil
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
func getIP(i int, startingIPAddr string) (ip string, err error) {
|
|
461
|
-
if len(startingIPAddr) == 0 {
|
|
462
|
-
ip, err = server.ExternalIP()
|
|
463
|
-
if err != nil {
|
|
464
|
-
return "", err
|
|
465
|
-
}
|
|
466
|
-
return ip, nil
|
|
467
|
-
}
|
|
468
|
-
return calculateIP(startingIPAddr, i)
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
func calculateIP(ip string, i int) (string, error) {
|
|
472
|
-
ipv4 := net.ParseIP(ip).To4()
|
|
473
|
-
if ipv4 == nil {
|
|
474
|
-
return "", fmt.Errorf("%v: non ipv4 address", ip)
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
for j := 0; j < i; j++ {
|
|
478
|
-
ipv4[3]++
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
return ipv4.String(), nil
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
func writeFile(name string, dir string, contents []byte) error {
|
|
485
|
-
file := filepath.Join(dir, name)
|
|
486
|
-
|
|
487
|
-
if err := os.MkdirAll(dir, 0o755); err != nil {
|
|
488
|
-
return fmt.Errorf("could not create directory %q: %s", dir, err)
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
if err := os.WriteFile(file, contents, 0o644); err != nil { //nolint: gosec
|
|
492
|
-
return err
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
return nil
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
// startTestnet starts an in-process testnet
|
|
499
|
-
func startTestnet(cmd *cobra.Command, args startArgs) error {
|
|
500
|
-
networkConfig := network.DefaultConfig(simapp.NewTestNetworkFixture)
|
|
501
|
-
|
|
502
|
-
// Default networkConfig.ChainID is random, and we should only override it if chainID provided
|
|
503
|
-
// is non-empty
|
|
504
|
-
if args.chainID != "" {
|
|
505
|
-
networkConfig.ChainID = args.chainID
|
|
506
|
-
}
|
|
507
|
-
networkConfig.SigningAlgo = args.algo
|
|
508
|
-
networkConfig.MinGasPrices = args.minGasPrices
|
|
509
|
-
networkConfig.NumValidators = args.numValidators
|
|
510
|
-
networkConfig.EnableTMLogging = args.enableLogging
|
|
511
|
-
networkConfig.RPCAddress = args.rpcAddress
|
|
512
|
-
networkConfig.APIAddress = args.apiAddress
|
|
513
|
-
networkConfig.GRPCAddress = args.grpcAddress
|
|
514
|
-
networkConfig.PrintMnemonic = args.printMnemonic
|
|
515
|
-
networkLogger := network.NewCLILogger(cmd)
|
|
516
|
-
|
|
517
|
-
baseDir := fmt.Sprintf("%s/%s", args.outputDir, networkConfig.ChainID)
|
|
518
|
-
if _, err := os.Stat(baseDir); !os.IsNotExist(err) {
|
|
519
|
-
return fmt.Errorf(
|
|
520
|
-
"testnests directory already exists for chain-id '%s': %s, please remove or select a new --chain-id",
|
|
521
|
-
networkConfig.ChainID, baseDir)
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
testnet, err := network.New(networkLogger, baseDir, networkConfig)
|
|
525
|
-
if err != nil {
|
|
526
|
-
return err
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
if _, err := testnet.WaitForHeight(1); err != nil {
|
|
530
|
-
return err
|
|
531
|
-
}
|
|
532
|
-
cmd.Println("press the Enter Key to terminate")
|
|
533
|
-
if _, err := fmt.Scanln(); err != nil { // wait for Enter Key
|
|
534
|
-
return err
|
|
535
|
-
}
|
|
536
|
-
testnet.Cleanup()
|
|
537
|
-
|
|
538
|
-
return nil
|
|
539
|
-
}
|