You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

161 lines
6.4 KiB

  1. package e2e
  2. import (
  3. "fmt"
  4. "os"
  5. "github.com/BurntSushi/toml"
  6. )
  7. // Manifest represents a TOML testnet manifest.
  8. type Manifest struct {
  9. // IPv6 uses IPv6 networking instead of IPv4. Defaults to IPv4.
  10. IPv6 bool `toml:"ipv6"`
  11. // InitialHeight specifies the initial block height, set in genesis. Defaults to 1.
  12. InitialHeight int64 `toml:"initial_height"`
  13. // InitialState is an initial set of key/value pairs for the application,
  14. // set in genesis. Defaults to nothing.
  15. InitialState map[string]string `toml:"initial_state"`
  16. // Validators is the initial validator set in genesis, given as node names
  17. // and power:
  18. //
  19. // validators = { validator01 = 10; validator02 = 20; validator03 = 30 }
  20. //
  21. // Defaults to all nodes that have mode=validator at power 100. Explicitly
  22. // specifying an empty set will start with no validators in genesis, and
  23. // the application must return the validator set in InitChain via the
  24. // setting validator_update.0 (see below).
  25. Validators *map[string]int64 `toml:"validators"`
  26. // ValidatorUpdates is a map of heights to validator names and their power,
  27. // and will be returned by the ABCI application. For example, the following
  28. // changes the power of validator01 and validator02 at height 1000:
  29. //
  30. // [validator_update.1000]
  31. // validator01 = 20
  32. // validator02 = 10
  33. //
  34. // Specifying height 0 returns the validator update during InitChain. The
  35. // application returns the validator updates as-is, i.e. removing a
  36. // validator must be done by returning it with power 0, and any validators
  37. // not specified are not changed.
  38. ValidatorUpdates map[string]map[string]int64 `toml:"validator_update"`
  39. // Nodes specifies the network nodes. At least one node must be given.
  40. Nodes map[string]*ManifestNode `toml:"node"`
  41. // KeyType sets the curve that will be used by validators.
  42. // Options are ed25519 & secp256k1
  43. KeyType string `toml:"key_type"`
  44. // LogLevel sets the log level of the entire testnet. This can be overridden
  45. // by individual nodes.
  46. LogLevel string `toml:"log_level"`
  47. }
  48. // ManifestNode represents a node in a testnet manifest.
  49. type ManifestNode struct {
  50. // Mode specifies the type of node: "validator", "full", or "seed". Defaults to
  51. // "validator". Full nodes do not get a signing key (a dummy key is generated),
  52. // and seed nodes run in seed mode with the PEX reactor enabled.
  53. Mode string `toml:"mode"`
  54. // Seeds is the list of node names to use as P2P seed nodes. Defaults to none.
  55. Seeds []string `toml:"seeds"`
  56. // PersistentPeers is a list of node names to maintain persistent P2P
  57. // connections to. If neither seeds nor persistent peers are specified,
  58. // this defaults to all other nodes in the network.
  59. PersistentPeers []string `toml:"persistent_peers"`
  60. // Database specifies the database backend: "goleveldb", "cleveldb",
  61. // "rocksdb", "boltdb", or "badgerdb". Defaults to goleveldb.
  62. Database string `toml:"database"`
  63. // ABCIProtocol specifies the protocol used to communicate with the ABCI
  64. // application: "unix", "tcp", "grpc", or "builtin". Defaults to unix.
  65. // builtin will build a complete Tendermint node into the application and
  66. // launch it instead of launching a separate Tendermint process.
  67. ABCIProtocol string `toml:"abci_protocol"`
  68. // PrivvalProtocol specifies the protocol used to sign consensus messages:
  69. // "file", "unix", "tcp", or "grpc". Defaults to "file". For tcp and unix, the ABCI
  70. // application will launch a remote signer client in a separate goroutine.
  71. // For grpc the ABCI application will launch a remote signer server.
  72. // Only nodes with mode=validator will actually make use of this.
  73. PrivvalProtocol string `toml:"privval_protocol"`
  74. // StartAt specifies the block height at which the node will be started. The
  75. // runner will wait for the network to reach at least this block height.
  76. StartAt int64 `toml:"start_at"`
  77. // FastSync specifies the fast sync mode: "" (disable), "v0" or "v2".
  78. // Defaults to disabled.
  79. FastSync string `toml:"fast_sync"`
  80. // StateSync enables state sync. The runner automatically configures trusted
  81. // block hashes and RPC servers. At least one node in the network must have
  82. // SnapshotInterval set to non-zero, and the state syncing node must have
  83. // StartAt set to an appropriate height where a snapshot is available.
  84. StateSync bool `toml:"state_sync"`
  85. // PersistInterval specifies the height interval at which the application
  86. // will persist state to disk. Defaults to 1 (every height), setting this to
  87. // 0 disables state persistence.
  88. PersistInterval *uint64 `toml:"persist_interval"`
  89. // SnapshotInterval specifies the height interval at which the application
  90. // will take state sync snapshots. Defaults to 0 (disabled).
  91. SnapshotInterval uint64 `toml:"snapshot_interval"`
  92. // RetainBlocks specifies the number of recent blocks to retain. Defaults to
  93. // 0, which retains all blocks. Must be greater that PersistInterval and
  94. // SnapshotInterval.
  95. RetainBlocks uint64 `toml:"retain_blocks"`
  96. // Perturb lists perturbations to apply to the node after it has been
  97. // started and synced with the network:
  98. //
  99. // disconnect: temporarily disconnects the node from the network
  100. // kill: kills the node with SIGKILL then restarts it
  101. // pause: temporarily pauses (freezes) the node
  102. // restart: restarts the node, shutting it down with SIGTERM
  103. Perturb []string `toml:"perturb"`
  104. // Misbehaviors sets how a validator behaves during consensus at a
  105. // certain height. Multiple misbehaviors at different heights can be used
  106. //
  107. // An example of misbehaviors
  108. // { 10 = "double-prevote", 20 = "double-prevote"}
  109. //
  110. // For more information, look at the readme in the maverick folder.
  111. // A list of all behaviors can be found in ../maverick/consensus/behavior.go
  112. Misbehaviors map[string]string `toml:"misbehaviors"`
  113. // Log level sets the log level of the specific node i.e. "consensus:info,*:error".
  114. // This is helpful when debugging a specific problem. This overrides the network
  115. // level.
  116. LogLevel string `toml:"log_level"`
  117. }
  118. // Save saves the testnet manifest to a file.
  119. func (m Manifest) Save(file string) error {
  120. f, err := os.Create(file)
  121. if err != nil {
  122. return fmt.Errorf("failed to create manifest file %q: %w", file, err)
  123. }
  124. return toml.NewEncoder(f).Encode(m)
  125. }
  126. // LoadManifest loads a testnet manifest from a file.
  127. func LoadManifest(file string) (Manifest, error) {
  128. manifest := Manifest{}
  129. _, err := toml.DecodeFile(file, &manifest)
  130. if err != nil {
  131. return manifest, fmt.Errorf("failed to load testnet manifest %q: %w", file, err)
  132. }
  133. return manifest, nil
  134. }