mirror of
https://github.com/fluencelabs/tendermint
synced 2025-06-05 17:41:20 +00:00
merge in origin/develop
This commit is contained in:
commit
f9a564cfc3
59
CHANGELOG.md
59
CHANGELOG.md
@ -1,5 +1,54 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## v0.27.3
|
||||||
|
|
||||||
|
*December 16th, 2018*
|
||||||
|
|
||||||
|
### BREAKING CHANGES:
|
||||||
|
|
||||||
|
* Go API
|
||||||
|
|
||||||
|
- [dep] [\#3027](https://github.com/tendermint/tendermint/issues/3027) Revert to mainline Go crypto library, eliminating the modified
|
||||||
|
`bcrypt.GenerateFromPassword`
|
||||||
|
|
||||||
|
## v0.27.2
|
||||||
|
|
||||||
|
*December 16th, 2018*
|
||||||
|
|
||||||
|
### IMPROVEMENTS:
|
||||||
|
|
||||||
|
- [node] [\#3025](https://github.com/tendermint/tendermint/issues/3025) Validate NodeInfo addresses on startup.
|
||||||
|
|
||||||
|
### BUG FIXES:
|
||||||
|
|
||||||
|
- [p2p] [\#3025](https://github.com/tendermint/tendermint/pull/3025) Revert to using defers in addrbook. Fixes deadlocks in pex and consensus upon invalid ExternalAddr/ListenAddr configuration.
|
||||||
|
|
||||||
|
## v0.27.1
|
||||||
|
|
||||||
|
*December 15th, 2018*
|
||||||
|
|
||||||
|
Special thanks to external contributors on this release:
|
||||||
|
@danil-lashin, @hleb-albau, @james-ray, @leo-xinwang
|
||||||
|
|
||||||
|
### FEATURES:
|
||||||
|
- [rpc] [\#2964](https://github.com/tendermint/tendermint/issues/2964) Add `UnconfirmedTxs(limit)` and `NumUnconfirmedTxs()` methods to HTTP/Local clients (@danil-lashin)
|
||||||
|
- [docs] [\#3004](https://github.com/tendermint/tendermint/issues/3004) Enable full-text search on docs pages
|
||||||
|
|
||||||
|
### IMPROVEMENTS:
|
||||||
|
- [consensus] [\#2971](https://github.com/tendermint/tendermint/issues/2971) Return error if ValidatorSet is empty after InitChain
|
||||||
|
(@leo-xinwang)
|
||||||
|
- [ci/cd] [\#3005](https://github.com/tendermint/tendermint/issues/3005) Updated CircleCI job to trigger website build when docs are updated
|
||||||
|
- [docs] Various updates
|
||||||
|
|
||||||
|
### BUG FIXES:
|
||||||
|
- [cmd] [\#2983](https://github.com/tendermint/tendermint/issues/2983) `testnet` command always sets `addr_book_strict = false`
|
||||||
|
- [config] [\#2980](https://github.com/tendermint/tendermint/issues/2980) Fix CORS options formatting
|
||||||
|
- [kv indexer] [\#2912](https://github.com/tendermint/tendermint/issues/2912) Don't ignore key when executing CONTAINS
|
||||||
|
- [mempool] [\#2961](https://github.com/tendermint/tendermint/issues/2961) Call `notifyTxsAvailable` if there're txs left after committing a block, but recheck=false
|
||||||
|
- [mempool] [\#2994](https://github.com/tendermint/tendermint/issues/2994) Reject txs with negative GasWanted
|
||||||
|
- [p2p] [\#2990](https://github.com/tendermint/tendermint/issues/2990) Fix a bug where seeds don't disconnect from a peer after 3h
|
||||||
|
- [consensus] [\#3006](https://github.com/tendermint/tendermint/issues/3006) Save state after InitChain only when stateHeight is also 0 (@james-ray)
|
||||||
|
|
||||||
## v0.27.0
|
## v0.27.0
|
||||||
|
|
||||||
*December 5th, 2018*
|
*December 5th, 2018*
|
||||||
@ -46,17 +95,17 @@ message.
|
|||||||
### IMPROVEMENTS:
|
### IMPROVEMENTS:
|
||||||
|
|
||||||
- [state] [\#2929](https://github.com/tendermint/tendermint/issues/2929) Minor refactor of updateState logic (@danil-lashin)
|
- [state] [\#2929](https://github.com/tendermint/tendermint/issues/2929) Minor refactor of updateState logic (@danil-lashin)
|
||||||
- [node] \#2959 Allow node to start even if software's BlockProtocol is
|
- [node] [\#2959](https://github.com/tendermint/tendermint/issues/2959) Allow node to start even if software's BlockProtocol is
|
||||||
different from state's BlockProtocol
|
different from state's BlockProtocol
|
||||||
- [pex] \#2959 Pex reactor logger uses `module=pex`
|
- [pex] [\#2959](https://github.com/tendermint/tendermint/issues/2959) Pex reactor logger uses `module=pex`
|
||||||
|
|
||||||
### BUG FIXES:
|
### BUG FIXES:
|
||||||
|
|
||||||
- [p2p] \#2968 Panic on transport error rather than continuing to run but not
|
- [p2p] [\#2968](https://github.com/tendermint/tendermint/issues/2968) Panic on transport error rather than continuing to run but not
|
||||||
accept new connections
|
accept new connections
|
||||||
- [p2p] \#2969 Fix mismatch in peer count between `/net_info` and the prometheus
|
- [p2p] [\#2969](https://github.com/tendermint/tendermint/issues/2969) Fix mismatch in peer count between `/net_info` and the prometheus
|
||||||
metrics
|
metrics
|
||||||
- [rpc] \#2408 `/broadcast_tx_commit`: Fix "interface conversion: interface {} in nil, not EventDataTx" panic (could happen if somebody sent a tx using `/broadcast_tx_commit` while Tendermint was being stopped)
|
- [rpc] [\#2408](https://github.com/tendermint/tendermint/issues/2408) `/broadcast_tx_commit`: Fix "interface conversion: interface {} in nil, not EventDataTx" panic (could happen if somebody sent a tx using `/broadcast_tx_commit` while Tendermint was being stopped)
|
||||||
- [state] [\#2785](https://github.com/tendermint/tendermint/issues/2785) Fix accum for new validators to be `-1.125*totalVotingPower`
|
- [state] [\#2785](https://github.com/tendermint/tendermint/issues/2785) Fix accum for new validators to be `-1.125*totalVotingPower`
|
||||||
instead of 0, forcing them to wait before becoming the proposer. Also:
|
instead of 0, forcing them to wait before becoming the proposer. Also:
|
||||||
- do not batch clip
|
- do not batch clip
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
## v0.27.1
|
## v0.27.4
|
||||||
|
|
||||||
*TBD*
|
*TBD*
|
||||||
|
|
||||||
@ -7,6 +7,8 @@ Special thanks to external contributors on this release:
|
|||||||
### BREAKING CHANGES:
|
### BREAKING CHANGES:
|
||||||
|
|
||||||
* CLI/RPC/Config
|
* CLI/RPC/Config
|
||||||
|
- [cli] Removed `node` `--proxy_app=dummy` option. Use `kvstore` (`persistent_kvstore`) instead.
|
||||||
|
- [cli] Renamed `node` `--proxy_app=nilapp` to `--proxy_app=noop`.
|
||||||
|
|
||||||
- [privval] \#2926 split up `PubKeyMsg` into `PubKeyRequest` and `PubKeyResponse` to be consistent with other message types
|
- [privval] \#2926 split up `PubKeyMsg` into `PubKeyRequest` and `PubKeyResponse` to be consistent with other message types
|
||||||
|
|
||||||
@ -24,11 +26,6 @@ Special thanks to external contributors on this release:
|
|||||||
### FEATURES:
|
### FEATURES:
|
||||||
|
|
||||||
### IMPROVEMENTS:
|
### IMPROVEMENTS:
|
||||||
- [rpc] Add `UnconfirmedTxs(limit)` and `NumUnconfirmedTxs()` methods to HTTP/Local clients (@danil-lashin)
|
|
||||||
- [ci/cd] Updated CircleCI job to trigger website build when docs are updated
|
|
||||||
|
|
||||||
### BUG FIXES:
|
### BUG FIXES:
|
||||||
- [kv indexer] \#2912 don't ignore key when executing CONTAINS
|
|
||||||
- [types] \#2926 do not panic if retrieving the private validator's public key fails
|
- [types] \#2926 do not panic if retrieving the private validator's public key fails
|
||||||
- [mempool] \#2994 Don't allow txs with negative gas wanted
|
|
||||||
- [p2p] \#2715 fix a bug where seeds don't disconnect from a peer after 3h
|
|
||||||
|
5
Gopkg.lock
generated
5
Gopkg.lock
generated
@ -376,7 +376,7 @@
|
|||||||
version = "v0.14.1"
|
version = "v0.14.1"
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:72b71e3a29775e5752ed7a8012052a3dee165e27ec18cedddae5288058f09acf"
|
digest = "1:00d2b3e64cdc3fa69aa250dfbe4cc38c4837d4f37e62279be2ae52107ffbbb44"
|
||||||
name = "golang.org/x/crypto"
|
name = "golang.org/x/crypto"
|
||||||
packages = [
|
packages = [
|
||||||
"bcrypt",
|
"bcrypt",
|
||||||
@ -397,8 +397,7 @@
|
|||||||
"salsa20/salsa",
|
"salsa20/salsa",
|
||||||
]
|
]
|
||||||
pruneopts = "UT"
|
pruneopts = "UT"
|
||||||
revision = "3764759f34a542a3aef74d6b02e35be7ab893bba"
|
revision = "505ab145d0a99da450461ae2c1a9f6cd10d1f447"
|
||||||
source = "github.com/tendermint/crypto"
|
|
||||||
|
|
||||||
[[projects]]
|
[[projects]]
|
||||||
digest = "1:d36f55a999540d29b6ea3c2ea29d71c76b1d9853fdcd3e5c5cb4836f2ba118f1"
|
digest = "1:d36f55a999540d29b6ea3c2ea29d71c76b1d9853fdcd3e5c5cb4836f2ba118f1"
|
||||||
|
@ -81,8 +81,7 @@
|
|||||||
|
|
||||||
[[constraint]]
|
[[constraint]]
|
||||||
name = "golang.org/x/crypto"
|
name = "golang.org/x/crypto"
|
||||||
source = "github.com/tendermint/crypto"
|
revision = "505ab145d0a99da450461ae2c1a9f6cd10d1f447"
|
||||||
revision = "3764759f34a542a3aef74d6b02e35be7ab893bba"
|
|
||||||
|
|
||||||
[[override]]
|
[[override]]
|
||||||
name = "github.com/jmhodges/levigo"
|
name = "github.com/jmhodges/levigo"
|
||||||
|
1
Makefile
1
Makefile
@ -294,6 +294,7 @@ build-linux:
|
|||||||
build-docker-localnode:
|
build-docker-localnode:
|
||||||
cd networks/local
|
cd networks/local
|
||||||
make
|
make
|
||||||
|
cd -
|
||||||
|
|
||||||
# Run a 4-node testnet locally
|
# Run a 4-node testnet locally
|
||||||
localnet-start: localnet-stop
|
localnet-start: localnet-stop
|
||||||
|
@ -58,7 +58,7 @@ var RootCmd = &cobra.Command{
|
|||||||
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
|
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
|
||||||
switch cmd.Use {
|
switch cmd.Use {
|
||||||
case "counter", "kvstore", "dummy": // for the examples apps, don't pre-run
|
case "counter", "kvstore": // for the examples apps, don't pre-run
|
||||||
return nil
|
return nil
|
||||||
case "version": // skip running for version command
|
case "version": // skip running for version command
|
||||||
return nil
|
return nil
|
||||||
@ -127,10 +127,6 @@ func addCounterFlags() {
|
|||||||
counterCmd.PersistentFlags().BoolVarP(&flagSerial, "serial", "", false, "enforce incrementing (serial) transactions")
|
counterCmd.PersistentFlags().BoolVarP(&flagSerial, "serial", "", false, "enforce incrementing (serial) transactions")
|
||||||
}
|
}
|
||||||
|
|
||||||
func addDummyFlags() {
|
|
||||||
dummyCmd.PersistentFlags().StringVarP(&flagPersist, "persist", "", "", "directory to use for a database")
|
|
||||||
}
|
|
||||||
|
|
||||||
func addKVStoreFlags() {
|
func addKVStoreFlags() {
|
||||||
kvstoreCmd.PersistentFlags().StringVarP(&flagPersist, "persist", "", "", "directory to use for a database")
|
kvstoreCmd.PersistentFlags().StringVarP(&flagPersist, "persist", "", "", "directory to use for a database")
|
||||||
}
|
}
|
||||||
@ -152,10 +148,6 @@ func addCommands() {
|
|||||||
// examples
|
// examples
|
||||||
addCounterFlags()
|
addCounterFlags()
|
||||||
RootCmd.AddCommand(counterCmd)
|
RootCmd.AddCommand(counterCmd)
|
||||||
// deprecated, left for backwards compatibility
|
|
||||||
addDummyFlags()
|
|
||||||
RootCmd.AddCommand(dummyCmd)
|
|
||||||
// replaces dummy, see issue #196
|
|
||||||
addKVStoreFlags()
|
addKVStoreFlags()
|
||||||
RootCmd.AddCommand(kvstoreCmd)
|
RootCmd.AddCommand(kvstoreCmd)
|
||||||
}
|
}
|
||||||
@ -291,18 +283,6 @@ var counterCmd = &cobra.Command{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// deprecated, left for backwards compatibility
|
|
||||||
var dummyCmd = &cobra.Command{
|
|
||||||
Use: "dummy",
|
|
||||||
Deprecated: "use: [abci-cli kvstore] instead",
|
|
||||||
Short: "ABCI demo example",
|
|
||||||
Long: "ABCI demo example",
|
|
||||||
Args: cobra.ExactArgs(0),
|
|
||||||
RunE: func(cmd *cobra.Command, args []string) error {
|
|
||||||
return cmdKVStore(cmd, args)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
var kvstoreCmd = &cobra.Command{
|
var kvstoreCmd = &cobra.Command{
|
||||||
Use: "kvstore",
|
Use: "kvstore",
|
||||||
Short: "ABCI demo example",
|
Short: "ABCI demo example",
|
||||||
|
@ -24,7 +24,7 @@ func AddNodeFlags(cmd *cobra.Command) {
|
|||||||
cmd.Flags().Bool("fast_sync", config.FastSync, "Fast blockchain syncing")
|
cmd.Flags().Bool("fast_sync", config.FastSync, "Fast blockchain syncing")
|
||||||
|
|
||||||
// abci flags
|
// abci flags
|
||||||
cmd.Flags().String("proxy_app", config.ProxyApp, "Proxy app address, or 'nilapp' or 'kvstore' for local testing.")
|
cmd.Flags().String("proxy_app", config.ProxyApp, "Proxy app address, or one of: 'kvstore', 'persistent_kvstore', 'counter', 'counter_serial' or 'noop' for local testing.")
|
||||||
cmd.Flags().String("abci", config.ABCI, "Specify abci transport (socket | grpc)")
|
cmd.Flags().String("abci", config.ABCI, "Specify abci transport (socket | grpc)")
|
||||||
|
|
||||||
// rpc flags
|
// rpc flags
|
||||||
|
@ -283,7 +283,7 @@ type RPCConfig struct {
|
|||||||
|
|
||||||
// Maximum number of simultaneous connections.
|
// Maximum number of simultaneous connections.
|
||||||
// Does not include RPC (HTTP&WebSocket) connections. See max_open_connections
|
// Does not include RPC (HTTP&WebSocket) connections. See max_open_connections
|
||||||
// If you want to accept more significant number than the default, make sure
|
// If you want to accept a larger number than the default, make sure
|
||||||
// you increase your OS limits.
|
// you increase your OS limits.
|
||||||
// 0 - unlimited.
|
// 0 - unlimited.
|
||||||
GRPCMaxOpenConnections int `mapstructure:"grpc_max_open_connections"`
|
GRPCMaxOpenConnections int `mapstructure:"grpc_max_open_connections"`
|
||||||
@ -293,7 +293,7 @@ type RPCConfig struct {
|
|||||||
|
|
||||||
// Maximum number of simultaneous connections (including WebSocket).
|
// Maximum number of simultaneous connections (including WebSocket).
|
||||||
// Does not include gRPC connections. See grpc_max_open_connections
|
// Does not include gRPC connections. See grpc_max_open_connections
|
||||||
// If you want to accept more significant number than the default, make sure
|
// If you want to accept a larger number than the default, make sure
|
||||||
// you increase your OS limits.
|
// you increase your OS limits.
|
||||||
// 0 - unlimited.
|
// 0 - unlimited.
|
||||||
// Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files}
|
// Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files}
|
||||||
@ -774,12 +774,12 @@ type InstrumentationConfig struct {
|
|||||||
PrometheusListenAddr string `mapstructure:"prometheus_listen_addr"`
|
PrometheusListenAddr string `mapstructure:"prometheus_listen_addr"`
|
||||||
|
|
||||||
// Maximum number of simultaneous connections.
|
// Maximum number of simultaneous connections.
|
||||||
// If you want to accept more significant number than the default, make sure
|
// If you want to accept a larger number than the default, make sure
|
||||||
// you increase your OS limits.
|
// you increase your OS limits.
|
||||||
// 0 - unlimited.
|
// 0 - unlimited.
|
||||||
MaxOpenConnections int `mapstructure:"max_open_connections"`
|
MaxOpenConnections int `mapstructure:"max_open_connections"`
|
||||||
|
|
||||||
// Tendermint instrumentation namespace.
|
// Instrumentation namespace.
|
||||||
Namespace string `mapstructure:"namespace"`
|
Namespace string `mapstructure:"namespace"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,13 +125,13 @@ laddr = "{{ .RPC.ListenAddress }}"
|
|||||||
# A list of origins a cross-domain request can be executed from
|
# A list of origins a cross-domain request can be executed from
|
||||||
# Default value '[]' disables cors support
|
# Default value '[]' disables cors support
|
||||||
# Use '["*"]' to allow any origin
|
# Use '["*"]' to allow any origin
|
||||||
cors_allowed_origins = "{{ .RPC.CORSAllowedOrigins }}"
|
cors_allowed_origins = [{{ range .RPC.CORSAllowedOrigins }}{{ printf "%q, " . }}{{end}}]
|
||||||
|
|
||||||
# A list of methods the client is allowed to use with cross-domain requests
|
# A list of methods the client is allowed to use with cross-domain requests
|
||||||
cors_allowed_methods = "{{ .RPC.CORSAllowedMethods }}"
|
cors_allowed_methods = [{{ range .RPC.CORSAllowedMethods }}{{ printf "%q, " . }}{{end}}]
|
||||||
|
|
||||||
# A list of non simple headers the client is allowed to use with cross-domain requests
|
# A list of non simple headers the client is allowed to use with cross-domain requests
|
||||||
cors_allowed_headers = "{{ .RPC.CORSAllowedHeaders }}"
|
cors_allowed_headers = [{{ range .RPC.CORSAllowedHeaders }}{{ printf "%q, " . }}{{end}}]
|
||||||
|
|
||||||
# TCP or UNIX socket address for the gRPC server to listen on
|
# TCP or UNIX socket address for the gRPC server to listen on
|
||||||
# NOTE: This server only supports /broadcast_tx_commit
|
# NOTE: This server only supports /broadcast_tx_commit
|
||||||
@ -139,7 +139,7 @@ grpc_laddr = "{{ .RPC.GRPCListenAddress }}"
|
|||||||
|
|
||||||
# Maximum number of simultaneous connections.
|
# Maximum number of simultaneous connections.
|
||||||
# Does not include RPC (HTTP&WebSocket) connections. See max_open_connections
|
# Does not include RPC (HTTP&WebSocket) connections. See max_open_connections
|
||||||
# If you want to accept more significant number than the default, make sure
|
# If you want to accept a larger number than the default, make sure
|
||||||
# you increase your OS limits.
|
# you increase your OS limits.
|
||||||
# 0 - unlimited.
|
# 0 - unlimited.
|
||||||
# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files}
|
# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files}
|
||||||
@ -151,7 +151,7 @@ unsafe = {{ .RPC.Unsafe }}
|
|||||||
|
|
||||||
# Maximum number of simultaneous connections (including WebSocket).
|
# Maximum number of simultaneous connections (including WebSocket).
|
||||||
# Does not include gRPC connections. See grpc_max_open_connections
|
# Does not include gRPC connections. See grpc_max_open_connections
|
||||||
# If you want to accept more significant number than the default, make sure
|
# If you want to accept a larger number than the default, make sure
|
||||||
# you increase your OS limits.
|
# you increase your OS limits.
|
||||||
# 0 - unlimited.
|
# 0 - unlimited.
|
||||||
# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files}
|
# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files}
|
||||||
@ -269,8 +269,8 @@ blocktime_iota = "{{ .Consensus.BlockTimeIota }}"
|
|||||||
# What indexer to use for transactions
|
# What indexer to use for transactions
|
||||||
#
|
#
|
||||||
# Options:
|
# Options:
|
||||||
# 1) "null" (default)
|
# 1) "null"
|
||||||
# 2) "kv" - the simplest possible indexer, backed by key-value storage (defaults to levelDB; see DBBackend).
|
# 2) "kv" (default) - the simplest possible indexer, backed by key-value storage (defaults to levelDB; see DBBackend).
|
||||||
indexer = "{{ .TxIndex.Indexer }}"
|
indexer = "{{ .TxIndex.Indexer }}"
|
||||||
|
|
||||||
# Comma-separated list of tags to index (by default the only tag is "tx.hash")
|
# Comma-separated list of tags to index (by default the only tag is "tx.hash")
|
||||||
@ -302,7 +302,7 @@ prometheus = {{ .Instrumentation.Prometheus }}
|
|||||||
prometheus_listen_addr = "{{ .Instrumentation.PrometheusListenAddr }}"
|
prometheus_listen_addr = "{{ .Instrumentation.PrometheusListenAddr }}"
|
||||||
|
|
||||||
# Maximum number of simultaneous connections.
|
# Maximum number of simultaneous connections.
|
||||||
# If you want to accept more significant number than the default, make sure
|
# If you want to accept a larger number than the default, make sure
|
||||||
# you increase your OS limits.
|
# you increase your OS limits.
|
||||||
# 0 - unlimited.
|
# 0 - unlimited.
|
||||||
max_open_connections = {{ .Instrumentation.MaxOpenConnections }}
|
max_open_connections = {{ .Instrumentation.MaxOpenConnections }}
|
||||||
|
@ -11,7 +11,6 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
abci "github.com/tendermint/tendermint/abci/types"
|
abci "github.com/tendermint/tendermint/abci/types"
|
||||||
"github.com/tendermint/tendermint/version"
|
|
||||||
//auto "github.com/tendermint/tendermint/libs/autofile"
|
//auto "github.com/tendermint/tendermint/libs/autofile"
|
||||||
cmn "github.com/tendermint/tendermint/libs/common"
|
cmn "github.com/tendermint/tendermint/libs/common"
|
||||||
dbm "github.com/tendermint/tendermint/libs/db"
|
dbm "github.com/tendermint/tendermint/libs/db"
|
||||||
@ -20,6 +19,7 @@ import (
|
|||||||
"github.com/tendermint/tendermint/proxy"
|
"github.com/tendermint/tendermint/proxy"
|
||||||
sm "github.com/tendermint/tendermint/state"
|
sm "github.com/tendermint/tendermint/state"
|
||||||
"github.com/tendermint/tendermint/types"
|
"github.com/tendermint/tendermint/types"
|
||||||
|
"github.com/tendermint/tendermint/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
var crc32c = crc32.MakeTable(crc32.Castagnoli)
|
var crc32c = crc32.MakeTable(crc32.Castagnoli)
|
||||||
@ -247,6 +247,7 @@ func (h *Handshaker) Handshake(proxyApp proxy.AppConns) error {
|
|||||||
|
|
||||||
// Set AppVersion on the state.
|
// Set AppVersion on the state.
|
||||||
h.initialState.Version.Consensus.App = version.Protocol(res.AppVersion)
|
h.initialState.Version.Consensus.App = version.Protocol(res.AppVersion)
|
||||||
|
sm.SaveState(h.stateDB, h.initialState)
|
||||||
|
|
||||||
// Replay blocks up to the latest in the blockstore.
|
// Replay blocks up to the latest in the blockstore.
|
||||||
_, err = h.ReplayBlocks(h.initialState, appHash, blockHeight, proxyApp)
|
_, err = h.ReplayBlocks(h.initialState, appHash, blockHeight, proxyApp)
|
||||||
@ -295,25 +296,27 @@ func (h *Handshaker) ReplayBlocks(
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the app returned validators or consensus params, update the state.
|
if stateBlockHeight == 0 { //we only update state when we are in initial state
|
||||||
if len(res.Validators) > 0 {
|
// If the app returned validators or consensus params, update the state.
|
||||||
vals, err := types.PB2TM.ValidatorUpdates(res.Validators)
|
if len(res.Validators) > 0 {
|
||||||
if err != nil {
|
vals, err := types.PB2TM.ValidatorUpdates(res.Validators)
|
||||||
return nil, err
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
state.Validators = types.NewValidatorSet(vals)
|
||||||
|
state.NextValidators = types.NewValidatorSet(vals)
|
||||||
|
} else {
|
||||||
|
// If validator set is not set in genesis and still empty after InitChain, exit.
|
||||||
|
if len(h.genDoc.Validators) == 0 {
|
||||||
|
return nil, fmt.Errorf("Validator set is nil in genesis and still empty after InitChain")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
state.Validators = types.NewValidatorSet(vals)
|
|
||||||
state.NextValidators = types.NewValidatorSet(vals)
|
if res.ConsensusParams != nil {
|
||||||
} else {
|
state.ConsensusParams = types.PB2TM.ConsensusParams(res.ConsensusParams)
|
||||||
// If validator set is not set in genesis and still empty after InitChain, exit.
|
|
||||||
if len(h.genDoc.Validators) == 0 {
|
|
||||||
return nil, fmt.Errorf("Validator set is nil in genesis and still empty after InitChain")
|
|
||||||
}
|
}
|
||||||
|
sm.SaveState(h.stateDB, state)
|
||||||
}
|
}
|
||||||
|
|
||||||
if res.ConsensusParams != nil {
|
|
||||||
state.ConsensusParams = types.PB2TM.ConsensusParams(res.ConsensusParams)
|
|
||||||
}
|
|
||||||
sm.SaveState(h.stateDB, state)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// First handle edge cases and constraints on the storeBlockHeight.
|
// First handle edge cases and constraints on the storeBlockHeight.
|
||||||
|
@ -5,7 +5,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
|
||||||
"golang.org/x/crypto/openpgp/armor" // forked to github.com/tendermint/crypto
|
"golang.org/x/crypto/openpgp/armor"
|
||||||
)
|
)
|
||||||
|
|
||||||
func EncodeArmor(blockType string, headers map[string]string, data []byte) string {
|
func EncodeArmor(blockType string, headers map[string]string, data []byte) string {
|
||||||
|
@ -7,7 +7,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
|
|
||||||
amino "github.com/tendermint/go-amino"
|
amino "github.com/tendermint/go-amino"
|
||||||
"golang.org/x/crypto/ed25519" // forked to github.com/tendermint/crypto
|
"golang.org/x/crypto/ed25519"
|
||||||
|
|
||||||
"github.com/tendermint/tendermint/crypto"
|
"github.com/tendermint/tendermint/crypto"
|
||||||
"github.com/tendermint/tendermint/crypto/tmhash"
|
"github.com/tendermint/tendermint/crypto/tmhash"
|
||||||
|
@ -3,7 +3,7 @@ package crypto
|
|||||||
import (
|
import (
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
|
|
||||||
"golang.org/x/crypto/ripemd160" // forked to github.com/tendermint/crypto
|
"golang.org/x/crypto/ripemd160"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Sha256(bytes []byte) []byte {
|
func Sha256(bytes []byte) []byte {
|
||||||
|
@ -9,7 +9,7 @@ import (
|
|||||||
|
|
||||||
secp256k1 "github.com/tendermint/btcd/btcec"
|
secp256k1 "github.com/tendermint/btcd/btcec"
|
||||||
amino "github.com/tendermint/go-amino"
|
amino "github.com/tendermint/go-amino"
|
||||||
"golang.org/x/crypto/ripemd160" // forked to github.com/tendermint/crypto
|
"golang.org/x/crypto/ripemd160"
|
||||||
|
|
||||||
"github.com/tendermint/tendermint/crypto"
|
"github.com/tendermint/tendermint/crypto"
|
||||||
)
|
)
|
||||||
|
@ -8,7 +8,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"golang.org/x/crypto/chacha20poly1305" // forked to github.com/tendermint/crypto
|
"golang.org/x/crypto/chacha20poly1305"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Implements crypto.AEAD
|
// Implements crypto.AEAD
|
||||||
|
@ -4,7 +4,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"golang.org/x/crypto/nacl/secretbox" // forked to github.com/tendermint/crypto
|
"golang.org/x/crypto/nacl/secretbox"
|
||||||
|
|
||||||
"github.com/tendermint/tendermint/crypto"
|
"github.com/tendermint/tendermint/crypto"
|
||||||
cmn "github.com/tendermint/tendermint/libs/common"
|
cmn "github.com/tendermint/tendermint/libs/common"
|
||||||
|
@ -6,7 +6,7 @@ import (
|
|||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
"golang.org/x/crypto/bcrypt" // forked to github.com/tendermint/crypto
|
"golang.org/x/crypto/bcrypt"
|
||||||
|
|
||||||
"github.com/tendermint/tendermint/crypto"
|
"github.com/tendermint/tendermint/crypto"
|
||||||
)
|
)
|
||||||
@ -30,9 +30,7 @@ func TestSimpleWithKDF(t *testing.T) {
|
|||||||
|
|
||||||
plaintext := []byte("sometext")
|
plaintext := []byte("sometext")
|
||||||
secretPass := []byte("somesecret")
|
secretPass := []byte("somesecret")
|
||||||
salt := []byte("somesaltsomesalt") // len 16
|
secret, err := bcrypt.GenerateFromPassword(secretPass, 12)
|
||||||
// NOTE: we use a fork of x/crypto so we can inject our own randomness for salt
|
|
||||||
secret, err := bcrypt.GenerateFromPassword(salt, secretPass, 12)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,11 @@ module.exports = {
|
|||||||
lineNumbers: true
|
lineNumbers: true
|
||||||
},
|
},
|
||||||
themeConfig: {
|
themeConfig: {
|
||||||
|
repo: "tendermint/tendermint",
|
||||||
|
editLinks: true,
|
||||||
|
docsDir: "docs",
|
||||||
|
docsBranch: "develop",
|
||||||
|
editLinkText: 'Edit this page on Github',
|
||||||
lastUpdated: true,
|
lastUpdated: true,
|
||||||
algolia: {
|
algolia: {
|
||||||
apiKey: '59f0e2deb984aa9cdf2b3a5fd24ac501',
|
apiKey: '59f0e2deb984aa9cdf2b3a5fd24ac501',
|
||||||
|
@ -12,10 +12,10 @@ respectively.
|
|||||||
|
|
||||||
## How It Works
|
## How It Works
|
||||||
|
|
||||||
There is a Jenkins job listening for changes in the `/docs` directory, on both
|
There is a CircleCI job listening for changes in the `/docs` directory, on both
|
||||||
the `master` and `develop` branches. Any updates to files in this directory
|
the `master` and `develop` branches. Any updates to files in this directory
|
||||||
on those branches will automatically trigger a website deployment. Under the hood,
|
on those branches will automatically trigger a website deployment. Under the hood,
|
||||||
a private website repository has make targets consumed by a standard Jenkins task.
|
the private website repository has a `make build-docs` target consumed by a CircleCI job in that repo.
|
||||||
|
|
||||||
## README
|
## README
|
||||||
|
|
||||||
@ -93,6 +93,10 @@ python -m SimpleHTTPServer 8080
|
|||||||
|
|
||||||
then navigate to localhost:8080 in your browser.
|
then navigate to localhost:8080 in your browser.
|
||||||
|
|
||||||
|
## Search
|
||||||
|
|
||||||
|
We are using [Algolia](https://www.algolia.com) to power full-text search. This uses a public API search-only key in the `config.js` as well as a [tendermint.json](https://github.com/algolia/docsearch-configs/blob/master/configs/tendermint.json) configuration file that we can update with PRs.
|
||||||
|
|
||||||
## Consistency
|
## Consistency
|
||||||
|
|
||||||
Because the build processes are identical (as is the information contained herein), this file should be kept in sync as
|
Because the build processes are identical (as is the information contained herein), this file should be kept in sync as
|
||||||
|
@ -1,20 +1,17 @@
|
|||||||
# Docker Compose
|
# Docker Compose
|
||||||
|
|
||||||
With Docker Compose, we can spin up local testnets in a single command:
|
With Docker Compose, you can spin up local testnets with a single command.
|
||||||
|
|
||||||
```
|
|
||||||
make localnet-start
|
|
||||||
```
|
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
- [Install tendermint](/docs/install.md)
|
1. [Install tendermint](/docs/install.md)
|
||||||
- [Install docker](https://docs.docker.com/engine/installation/)
|
2. [Install docker](https://docs.docker.com/engine/installation/)
|
||||||
- [Install docker-compose](https://docs.docker.com/compose/install/)
|
3. [Install docker-compose](https://docs.docker.com/compose/install/)
|
||||||
|
|
||||||
## Build
|
## Build
|
||||||
|
|
||||||
Build the `tendermint` binary and the `tendermint/localnode` docker image.
|
Build the `tendermint` binary and, optionally, the `tendermint/localnode`
|
||||||
|
docker image.
|
||||||
|
|
||||||
Note the binary will be mounted into the container so it can be updated without
|
Note the binary will be mounted into the container so it can be updated without
|
||||||
rebuilding the image.
|
rebuilding the image.
|
||||||
@ -25,11 +22,10 @@ cd $GOPATH/src/github.com/tendermint/tendermint
|
|||||||
# Build the linux binary in ./build
|
# Build the linux binary in ./build
|
||||||
make build-linux
|
make build-linux
|
||||||
|
|
||||||
# Build tendermint/localnode image
|
# (optionally) Build tendermint/localnode image
|
||||||
make build-docker-localnode
|
make build-docker-localnode
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## Run a testnet
|
## Run a testnet
|
||||||
|
|
||||||
To start a 4 node testnet run:
|
To start a 4 node testnet run:
|
||||||
@ -38,9 +34,13 @@ To start a 4 node testnet run:
|
|||||||
make localnet-start
|
make localnet-start
|
||||||
```
|
```
|
||||||
|
|
||||||
The nodes bind their RPC servers to ports 26657, 26660, 26662, and 26664 on the host.
|
The nodes bind their RPC servers to ports 26657, 26660, 26662, and 26664 on the
|
||||||
|
host.
|
||||||
|
|
||||||
This file creates a 4-node network using the localnode image.
|
This file creates a 4-node network using the localnode image.
|
||||||
The nodes of the network expose their P2P and RPC endpoints to the host machine on ports 26656-26657, 26659-26660, 26661-26662, and 26663-26664 respectively.
|
|
||||||
|
The nodes of the network expose their P2P and RPC endpoints to the host machine
|
||||||
|
on ports 26656-26657, 26659-26660, 26661-26662, and 26663-26664 respectively.
|
||||||
|
|
||||||
To update the binary, just rebuild it and restart the nodes:
|
To update the binary, just rebuild it and restart the nodes:
|
||||||
|
|
||||||
@ -52,34 +52,40 @@ make localnet-start
|
|||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
The `make localnet-start` creates files for a 4-node testnet in `./build` by calling the `tendermint testnet` command.
|
The `make localnet-start` creates files for a 4-node testnet in `./build` by
|
||||||
|
calling the `tendermint testnet` command.
|
||||||
|
|
||||||
The `./build` directory is mounted to the `/tendermint` mount point to attach the binary and config files to the container.
|
The `./build` directory is mounted to the `/tendermint` mount point to attach
|
||||||
|
the binary and config files to the container.
|
||||||
|
|
||||||
For instance, to create a single node testnet:
|
To change the number of validators / non-validators change the `localnet-start` Makefile target:
|
||||||
|
|
||||||
|
```
|
||||||
|
localnet-start: localnet-stop
|
||||||
|
@if ! [ -f build/node0/config/genesis.json ]; then docker run --rm -v $(CURDIR)/build:/tendermint:Z tendermint/localnode testnet --v 5 --n 3 --o . --populate-persistent-peers --starting-ip-address 192.167.10.2 ; fi
|
||||||
|
docker-compose up
|
||||||
|
```
|
||||||
|
|
||||||
|
The command now will generate config files for 5 validators and 3
|
||||||
|
non-validators network.
|
||||||
|
|
||||||
|
Before running it, don't forget to cleanup the old files:
|
||||||
|
|
||||||
```
|
```
|
||||||
cd $GOPATH/src/github.com/tendermint/tendermint
|
cd $GOPATH/src/github.com/tendermint/tendermint
|
||||||
|
|
||||||
# Clear the build folder
|
# Clear the build folder
|
||||||
rm -rf ./build
|
rm -rf ./build/node*
|
||||||
|
|
||||||
# Build binary
|
|
||||||
make build-linux
|
|
||||||
|
|
||||||
# Create configuration
|
|
||||||
docker run -e LOG="stdout" -v `pwd`/build:/tendermint tendermint/localnode testnet --o . --v 1
|
|
||||||
|
|
||||||
#Run the node
|
|
||||||
docker run -v `pwd`/build:/tendermint tendermint/localnode
|
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Logging
|
## Logging
|
||||||
|
|
||||||
Log is saved under the attached volume, in the `tendermint.log` file. If the `LOG` environment variable is set to `stdout` at start, the log is not saved, but printed on the screen.
|
Log is saved under the attached volume, in the `tendermint.log` file. If the
|
||||||
|
`LOG` environment variable is set to `stdout` at start, the log is not saved,
|
||||||
|
but printed on the screen.
|
||||||
|
|
||||||
## Special binaries
|
## Special binaries
|
||||||
|
|
||||||
If you have multiple binaries with different names, you can specify which one to run with the BINARY environment variable. The path of the binary is relative to the attached volume.
|
If you have multiple binaries with different names, you can specify which one
|
||||||
|
to run with the `BINARY` environment variable. The path of the binary is relative
|
||||||
|
to the attached volume.
|
||||||
|
@ -36,22 +36,26 @@ db_backend = "leveldb"
|
|||||||
# Database directory
|
# Database directory
|
||||||
db_dir = "data"
|
db_dir = "data"
|
||||||
|
|
||||||
# Output level for logging
|
# Output level for logging, including package level options
|
||||||
log_level = "state:info,*:error"
|
log_level = "main:info,state:info,*:error"
|
||||||
|
|
||||||
# Output format: 'plain' (colored text) or 'json'
|
# Output format: 'plain' (colored text) or 'json'
|
||||||
log_format = "plain"
|
log_format = "plain"
|
||||||
|
|
||||||
##### additional base config options #####
|
##### additional base config options #####
|
||||||
|
|
||||||
# The ID of the chain to join (should be signed with every transaction and vote)
|
|
||||||
chain_id = ""
|
|
||||||
|
|
||||||
# Path to the JSON file containing the initial validator set and other meta data
|
# Path to the JSON file containing the initial validator set and other meta data
|
||||||
genesis_file = "genesis.json"
|
genesis_file = "config/genesis.json"
|
||||||
|
|
||||||
# Path to the JSON file containing the private key to use as a validator in the consensus protocol
|
# Path to the JSON file containing the private key to use as a validator in the consensus protocol
|
||||||
priv_validator_file = "priv_validator.json"
|
priv_validator_file = "config/priv_validator.json"
|
||||||
|
|
||||||
|
# TCP or UNIX socket address for Tendermint to listen on for
|
||||||
|
# connections from an external PrivValidator process
|
||||||
|
priv_validator_laddr = ""
|
||||||
|
|
||||||
|
# Path to the JSON file containing the private key to use for node authentication in the p2p protocol
|
||||||
|
node_key_file = "config/node_key.json"
|
||||||
|
|
||||||
# Mechanism to connect to the ABCI application: socket | grpc
|
# Mechanism to connect to the ABCI application: socket | grpc
|
||||||
abci = "socket"
|
abci = "socket"
|
||||||
@ -74,13 +78,13 @@ laddr = "tcp://0.0.0.0:26657"
|
|||||||
# A list of origins a cross-domain request can be executed from
|
# A list of origins a cross-domain request can be executed from
|
||||||
# Default value '[]' disables cors support
|
# Default value '[]' disables cors support
|
||||||
# Use '["*"]' to allow any origin
|
# Use '["*"]' to allow any origin
|
||||||
cors_allowed_origins = "[]"
|
cors_allowed_origins = []
|
||||||
|
|
||||||
# A list of methods the client is allowed to use with cross-domain requests
|
# A list of methods the client is allowed to use with cross-domain requests
|
||||||
cors_allowed_methods = "[HEAD GET POST]"
|
cors_allowed_methods = ["HEAD", "GET", "POST"]
|
||||||
|
|
||||||
# A list of non simple headers the client is allowed to use with cross-domain requests
|
# A list of non simple headers the client is allowed to use with cross-domain requests
|
||||||
cors_allowed_headers = "[Origin Accept Content-Type X-Requested-With X-Server-Time]"
|
cors_allowed_headers = ["Origin", "Accept", "Content-Type", "X-Requested-With", "X-Server-Time"]
|
||||||
|
|
||||||
# TCP or UNIX socket address for the gRPC server to listen on
|
# TCP or UNIX socket address for the gRPC server to listen on
|
||||||
# NOTE: This server only supports /broadcast_tx_commit
|
# NOTE: This server only supports /broadcast_tx_commit
|
||||||
@ -88,7 +92,7 @@ grpc_laddr = ""
|
|||||||
|
|
||||||
# Maximum number of simultaneous connections.
|
# Maximum number of simultaneous connections.
|
||||||
# Does not include RPC (HTTP&WebSocket) connections. See max_open_connections
|
# Does not include RPC (HTTP&WebSocket) connections. See max_open_connections
|
||||||
# If you want to accept more significant number than the default, make sure
|
# If you want to accept a larger number than the default, make sure
|
||||||
# you increase your OS limits.
|
# you increase your OS limits.
|
||||||
# 0 - unlimited.
|
# 0 - unlimited.
|
||||||
# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files}
|
# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files}
|
||||||
@ -100,7 +104,7 @@ unsafe = false
|
|||||||
|
|
||||||
# Maximum number of simultaneous connections (including WebSocket).
|
# Maximum number of simultaneous connections (including WebSocket).
|
||||||
# Does not include gRPC connections. See grpc_max_open_connections
|
# Does not include gRPC connections. See grpc_max_open_connections
|
||||||
# If you want to accept more significant number than the default, make sure
|
# If you want to accept a larger number than the default, make sure
|
||||||
# you increase your OS limits.
|
# you increase your OS limits.
|
||||||
# 0 - unlimited.
|
# 0 - unlimited.
|
||||||
# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files}
|
# Should be < {ulimit -Sn} - {MaxNumInboundPeers} - {MaxNumOutboundPeers} - {N of wal, db and other open files}
|
||||||
@ -113,6 +117,12 @@ max_open_connections = 900
|
|||||||
# Address to listen for incoming connections
|
# Address to listen for incoming connections
|
||||||
laddr = "tcp://0.0.0.0:26656"
|
laddr = "tcp://0.0.0.0:26656"
|
||||||
|
|
||||||
|
# Address to advertise to peers for them to dial
|
||||||
|
# If empty, will use the same port as the laddr,
|
||||||
|
# and will introspect on the listener or use UPnP
|
||||||
|
# to figure out the address.
|
||||||
|
external_address = ""
|
||||||
|
|
||||||
# Comma separated list of seed nodes to connect to
|
# Comma separated list of seed nodes to connect to
|
||||||
seeds = ""
|
seeds = ""
|
||||||
|
|
||||||
@ -123,7 +133,7 @@ persistent_peers = ""
|
|||||||
upnp = false
|
upnp = false
|
||||||
|
|
||||||
# Path to address book
|
# Path to address book
|
||||||
addr_book_file = "addrbook.json"
|
addr_book_file = "config/addrbook.json"
|
||||||
|
|
||||||
# Set true for strict address routability rules
|
# Set true for strict address routability rules
|
||||||
# Set false for private or local networks
|
# Set false for private or local networks
|
||||||
@ -171,26 +181,26 @@ dial_timeout = "3s"
|
|||||||
|
|
||||||
recheck = true
|
recheck = true
|
||||||
broadcast = true
|
broadcast = true
|
||||||
wal_dir = "data/mempool.wal"
|
wal_dir = ""
|
||||||
|
|
||||||
# size of the mempool
|
# size of the mempool
|
||||||
size = 100000
|
size = 5000
|
||||||
|
|
||||||
# size of the cache (used to filter transactions we saw earlier)
|
# size of the cache (used to filter transactions we saw earlier)
|
||||||
cache_size = 100000
|
cache_size = 10000
|
||||||
|
|
||||||
##### consensus configuration options #####
|
##### consensus configuration options #####
|
||||||
[consensus]
|
[consensus]
|
||||||
|
|
||||||
wal_file = "data/cs.wal/wal"
|
wal_file = "data/cs.wal/wal"
|
||||||
|
|
||||||
timeout_propose = "3000ms"
|
timeout_propose = "3s"
|
||||||
timeout_propose_delta = "500ms"
|
timeout_propose_delta = "500ms"
|
||||||
timeout_prevote = "1000ms"
|
timeout_prevote = "1s"
|
||||||
timeout_prevote_delta = "500ms"
|
timeout_prevote_delta = "500ms"
|
||||||
timeout_precommit = "1000ms"
|
timeout_precommit = "1s"
|
||||||
timeout_precommit_delta = "500ms"
|
timeout_precommit_delta = "500ms"
|
||||||
timeout_commit = "1000ms"
|
timeout_commit = "1s"
|
||||||
|
|
||||||
# Make progress as soon as we have all the precommits (as if TimeoutCommit = 0)
|
# Make progress as soon as we have all the precommits (as if TimeoutCommit = 0)
|
||||||
skip_timeout_commit = false
|
skip_timeout_commit = false
|
||||||
@ -201,10 +211,10 @@ create_empty_blocks_interval = "0s"
|
|||||||
|
|
||||||
# Reactor sleep duration parameters
|
# Reactor sleep duration parameters
|
||||||
peer_gossip_sleep_duration = "100ms"
|
peer_gossip_sleep_duration = "100ms"
|
||||||
peer_query_maj23_sleep_duration = "2000ms"
|
peer_query_maj23_sleep_duration = "2s"
|
||||||
|
|
||||||
# Block time parameters. Corresponds to the minimum time increment between consecutive blocks.
|
# Block time parameters. Corresponds to the minimum time increment between consecutive blocks.
|
||||||
blocktime_iota = "1000ms"
|
blocktime_iota = "1s"
|
||||||
|
|
||||||
##### transactions indexer configuration options #####
|
##### transactions indexer configuration options #####
|
||||||
[tx_index]
|
[tx_index]
|
||||||
@ -245,7 +255,7 @@ prometheus = false
|
|||||||
prometheus_listen_addr = ":26660"
|
prometheus_listen_addr = ":26660"
|
||||||
|
|
||||||
# Maximum number of simultaneous connections.
|
# Maximum number of simultaneous connections.
|
||||||
# If you want to accept a more significant number than the default, make sure
|
# If you want to accept a larger number than the default, make sure
|
||||||
# you increase your OS limits.
|
# you increase your OS limits.
|
||||||
# 0 - unlimited.
|
# 0 - unlimited.
|
||||||
max_open_connections = 3
|
max_open_connections = 3
|
||||||
|
@ -113,7 +113,7 @@ blocks are produced regularly, even if there are no transactions. See
|
|||||||
_No Empty Blocks_, below, to modify this setting.
|
_No Empty Blocks_, below, to modify this setting.
|
||||||
|
|
||||||
Tendermint supports in-process versions of the `counter`, `kvstore` and
|
Tendermint supports in-process versions of the `counter`, `kvstore` and
|
||||||
`nil` apps that ship as examples with `abci-cli`. It's easy to compile
|
`noop` apps that ship as examples with `abci-cli`. It's easy to compile
|
||||||
your own app in-process with Tendermint if it's written in Go. If your
|
your own app in-process with Tendermint if it's written in Go. If your
|
||||||
app is not written in Go, simply run it in another process, and use the
|
app is not written in Go, simply run it in another process, and use the
|
||||||
`--proxy_app` flag to specify the address of the socket it is listening
|
`--proxy_app` flag to specify the address of the socket it is listening
|
||||||
|
@ -556,13 +556,18 @@ func (mem *Mempool) Update(
|
|||||||
// Remove committed transactions.
|
// Remove committed transactions.
|
||||||
txsLeft := mem.removeTxs(txs)
|
txsLeft := mem.removeTxs(txs)
|
||||||
|
|
||||||
// Recheck mempool txs if any txs were committed in the block
|
// Either recheck non-committed txs to see if they became invalid
|
||||||
if mem.config.Recheck && len(txsLeft) > 0 {
|
// or just notify there're some txs left.
|
||||||
mem.logger.Info("Recheck txs", "numtxs", len(txsLeft), "height", height)
|
if len(txsLeft) > 0 {
|
||||||
mem.recheckTxs(txsLeft)
|
if mem.config.Recheck {
|
||||||
// At this point, mem.txs are being rechecked.
|
mem.logger.Info("Recheck txs", "numtxs", len(txsLeft), "height", height)
|
||||||
// mem.recheckCursor re-scans mem.txs and possibly removes some txs.
|
mem.recheckTxs(txsLeft)
|
||||||
// Before mem.Reap(), we should wait for mem.recheckCursor to be nil.
|
// At this point, mem.txs are being rechecked.
|
||||||
|
// mem.recheckCursor re-scans mem.txs and possibly removes some txs.
|
||||||
|
// Before mem.Reap(), we should wait for mem.recheckCursor to be nil.
|
||||||
|
} else {
|
||||||
|
mem.notifyTxsAvailable()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update metrics
|
// Update metrics
|
||||||
|
32
node/node.go
32
node/node.go
@ -351,20 +351,21 @@ func NewNode(config *cfg.Config,
|
|||||||
indexerService := txindex.NewIndexerService(txIndexer, eventBus)
|
indexerService := txindex.NewIndexerService(txIndexer, eventBus)
|
||||||
indexerService.SetLogger(logger.With("module", "txindex"))
|
indexerService.SetLogger(logger.With("module", "txindex"))
|
||||||
|
|
||||||
var (
|
p2pLogger := logger.With("module", "p2p")
|
||||||
p2pLogger = logger.With("module", "p2p")
|
nodeInfo, err := makeNodeInfo(
|
||||||
nodeInfo = makeNodeInfo(
|
config,
|
||||||
config,
|
nodeKey.ID(),
|
||||||
nodeKey.ID(),
|
txIndexer,
|
||||||
txIndexer,
|
genDoc.ChainID,
|
||||||
genDoc.ChainID,
|
p2p.NewProtocolVersion(
|
||||||
p2p.NewProtocolVersion(
|
version.P2PProtocol, // global
|
||||||
version.P2PProtocol, // global
|
state.Version.Consensus.Block,
|
||||||
state.Version.Consensus.Block,
|
state.Version.Consensus.App,
|
||||||
state.Version.Consensus.App,
|
),
|
||||||
),
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
// Setup Transport.
|
// Setup Transport.
|
||||||
var (
|
var (
|
||||||
@ -786,7 +787,7 @@ func makeNodeInfo(
|
|||||||
txIndexer txindex.TxIndexer,
|
txIndexer txindex.TxIndexer,
|
||||||
chainID string,
|
chainID string,
|
||||||
protocolVersion p2p.ProtocolVersion,
|
protocolVersion p2p.ProtocolVersion,
|
||||||
) p2p.NodeInfo {
|
) (p2p.NodeInfo, error) {
|
||||||
txIndexerStatus := "on"
|
txIndexerStatus := "on"
|
||||||
if _, ok := txIndexer.(*null.TxIndex); ok {
|
if _, ok := txIndexer.(*null.TxIndex); ok {
|
||||||
txIndexerStatus = "off"
|
txIndexerStatus = "off"
|
||||||
@ -821,7 +822,8 @@ func makeNodeInfo(
|
|||||||
|
|
||||||
nodeInfo.ListenAddr = lAddr
|
nodeInfo.ListenAddr = lAddr
|
||||||
|
|
||||||
return nodeInfo
|
err := nodeInfo.Validate()
|
||||||
|
return nodeInfo, err
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
@ -10,7 +10,6 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
// forked to github.com/tendermint/crypto
|
|
||||||
"golang.org/x/crypto/chacha20poly1305"
|
"golang.org/x/crypto/chacha20poly1305"
|
||||||
"golang.org/x/crypto/curve25519"
|
"golang.org/x/crypto/curve25519"
|
||||||
"golang.org/x/crypto/nacl/box"
|
"golang.org/x/crypto/nacl/box"
|
||||||
|
@ -175,6 +175,9 @@ func (na *NetAddress) Same(other interface{}) bool {
|
|||||||
|
|
||||||
// String representation: <ID>@<IP>:<PORT>
|
// String representation: <ID>@<IP>:<PORT>
|
||||||
func (na *NetAddress) String() string {
|
func (na *NetAddress) String() string {
|
||||||
|
if na == nil {
|
||||||
|
return "<nil-NetAddress>"
|
||||||
|
}
|
||||||
if na.str == "" {
|
if na.str == "" {
|
||||||
addrStr := na.DialString()
|
addrStr := na.DialString()
|
||||||
if na.ID != "" {
|
if na.ID != "" {
|
||||||
@ -186,6 +189,9 @@ func (na *NetAddress) String() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (na *NetAddress) DialString() string {
|
func (na *NetAddress) DialString() string {
|
||||||
|
if na == nil {
|
||||||
|
return "<nil-NetAddress>"
|
||||||
|
}
|
||||||
return net.JoinHostPort(
|
return net.JoinHostPort(
|
||||||
na.IP.String(),
|
na.IP.String(),
|
||||||
strconv.FormatUint(uint64(na.Port), 10),
|
strconv.FormatUint(uint64(na.Port), 10),
|
||||||
|
@ -36,7 +36,7 @@ type nodeInfoAddress interface {
|
|||||||
// nodeInfoTransport validates a nodeInfo and checks
|
// nodeInfoTransport validates a nodeInfo and checks
|
||||||
// our compatibility with it. It's for use in the handshake.
|
// our compatibility with it. It's for use in the handshake.
|
||||||
type nodeInfoTransport interface {
|
type nodeInfoTransport interface {
|
||||||
ValidateBasic() error
|
Validate() error
|
||||||
CompatibleWith(other NodeInfo) error
|
CompatibleWith(other NodeInfo) error
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,7 +103,7 @@ func (info DefaultNodeInfo) ID() ID {
|
|||||||
return info.ID_
|
return info.ID_
|
||||||
}
|
}
|
||||||
|
|
||||||
// ValidateBasic checks the self-reported DefaultNodeInfo is safe.
|
// Validate checks the self-reported DefaultNodeInfo is safe.
|
||||||
// It returns an error if there
|
// It returns an error if there
|
||||||
// are too many Channels, if there are any duplicate Channels,
|
// are too many Channels, if there are any duplicate Channels,
|
||||||
// if the ListenAddr is malformed, or if the ListenAddr is a host name
|
// if the ListenAddr is malformed, or if the ListenAddr is a host name
|
||||||
@ -116,7 +116,7 @@ func (info DefaultNodeInfo) ID() ID {
|
|||||||
// International clients could then use punycode (or we could use
|
// International clients could then use punycode (or we could use
|
||||||
// url-encoding), and we just need to be careful with how we handle that in our
|
// url-encoding), and we just need to be careful with how we handle that in our
|
||||||
// clients. (e.g. off by default).
|
// clients. (e.g. off by default).
|
||||||
func (info DefaultNodeInfo) ValidateBasic() error {
|
func (info DefaultNodeInfo) Validate() error {
|
||||||
|
|
||||||
// ID is already validated.
|
// ID is already validated.
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@ func TestNodeInfoValidate(t *testing.T) {
|
|||||||
|
|
||||||
// empty fails
|
// empty fails
|
||||||
ni := DefaultNodeInfo{}
|
ni := DefaultNodeInfo{}
|
||||||
assert.Error(t, ni.ValidateBasic())
|
assert.Error(t, ni.Validate())
|
||||||
|
|
||||||
channels := make([]byte, maxNumChannels)
|
channels := make([]byte, maxNumChannels)
|
||||||
for i := 0; i < maxNumChannels; i++ {
|
for i := 0; i < maxNumChannels; i++ {
|
||||||
@ -68,13 +68,13 @@ func TestNodeInfoValidate(t *testing.T) {
|
|||||||
// test case passes
|
// test case passes
|
||||||
ni = testNodeInfo(nodeKey.ID(), name).(DefaultNodeInfo)
|
ni = testNodeInfo(nodeKey.ID(), name).(DefaultNodeInfo)
|
||||||
ni.Channels = channels
|
ni.Channels = channels
|
||||||
assert.NoError(t, ni.ValidateBasic())
|
assert.NoError(t, ni.Validate())
|
||||||
|
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
ni := testNodeInfo(nodeKey.ID(), name).(DefaultNodeInfo)
|
ni := testNodeInfo(nodeKey.ID(), name).(DefaultNodeInfo)
|
||||||
ni.Channels = channels
|
ni.Channels = channels
|
||||||
tc.malleateNodeInfo(&ni)
|
tc.malleateNodeInfo(&ni)
|
||||||
err := ni.ValidateBasic()
|
err := ni.Validate()
|
||||||
if tc.expectErr {
|
if tc.expectErr {
|
||||||
assert.Error(t, err, tc.testName)
|
assert.Error(t, err, tc.testName)
|
||||||
} else {
|
} else {
|
||||||
|
@ -162,26 +162,29 @@ func (a *addrBook) FilePath() string {
|
|||||||
|
|
||||||
// AddOurAddress one of our addresses.
|
// AddOurAddress one of our addresses.
|
||||||
func (a *addrBook) AddOurAddress(addr *p2p.NetAddress) {
|
func (a *addrBook) AddOurAddress(addr *p2p.NetAddress) {
|
||||||
a.Logger.Info("Add our address to book", "addr", addr)
|
|
||||||
a.mtx.Lock()
|
a.mtx.Lock()
|
||||||
|
defer a.mtx.Unlock()
|
||||||
|
|
||||||
|
a.Logger.Info("Add our address to book", "addr", addr)
|
||||||
a.ourAddrs[addr.String()] = struct{}{}
|
a.ourAddrs[addr.String()] = struct{}{}
|
||||||
a.mtx.Unlock()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// OurAddress returns true if it is our address.
|
// OurAddress returns true if it is our address.
|
||||||
func (a *addrBook) OurAddress(addr *p2p.NetAddress) bool {
|
func (a *addrBook) OurAddress(addr *p2p.NetAddress) bool {
|
||||||
a.mtx.Lock()
|
a.mtx.Lock()
|
||||||
|
defer a.mtx.Unlock()
|
||||||
|
|
||||||
_, ok := a.ourAddrs[addr.String()]
|
_, ok := a.ourAddrs[addr.String()]
|
||||||
a.mtx.Unlock()
|
|
||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *addrBook) AddPrivateIDs(IDs []string) {
|
func (a *addrBook) AddPrivateIDs(IDs []string) {
|
||||||
a.mtx.Lock()
|
a.mtx.Lock()
|
||||||
|
defer a.mtx.Unlock()
|
||||||
|
|
||||||
for _, id := range IDs {
|
for _, id := range IDs {
|
||||||
a.privateIDs[p2p.ID(id)] = struct{}{}
|
a.privateIDs[p2p.ID(id)] = struct{}{}
|
||||||
}
|
}
|
||||||
a.mtx.Unlock()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddAddress implements AddrBook
|
// AddAddress implements AddrBook
|
||||||
@ -191,6 +194,7 @@ func (a *addrBook) AddPrivateIDs(IDs []string) {
|
|||||||
func (a *addrBook) AddAddress(addr *p2p.NetAddress, src *p2p.NetAddress) error {
|
func (a *addrBook) AddAddress(addr *p2p.NetAddress, src *p2p.NetAddress) error {
|
||||||
a.mtx.Lock()
|
a.mtx.Lock()
|
||||||
defer a.mtx.Unlock()
|
defer a.mtx.Unlock()
|
||||||
|
|
||||||
return a.addAddress(addr, src)
|
return a.addAddress(addr, src)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -198,6 +202,7 @@ func (a *addrBook) AddAddress(addr *p2p.NetAddress, src *p2p.NetAddress) error {
|
|||||||
func (a *addrBook) RemoveAddress(addr *p2p.NetAddress) {
|
func (a *addrBook) RemoveAddress(addr *p2p.NetAddress) {
|
||||||
a.mtx.Lock()
|
a.mtx.Lock()
|
||||||
defer a.mtx.Unlock()
|
defer a.mtx.Unlock()
|
||||||
|
|
||||||
ka := a.addrLookup[addr.ID]
|
ka := a.addrLookup[addr.ID]
|
||||||
if ka == nil {
|
if ka == nil {
|
||||||
return
|
return
|
||||||
@ -211,14 +216,16 @@ func (a *addrBook) RemoveAddress(addr *p2p.NetAddress) {
|
|||||||
func (a *addrBook) IsGood(addr *p2p.NetAddress) bool {
|
func (a *addrBook) IsGood(addr *p2p.NetAddress) bool {
|
||||||
a.mtx.Lock()
|
a.mtx.Lock()
|
||||||
defer a.mtx.Unlock()
|
defer a.mtx.Unlock()
|
||||||
|
|
||||||
return a.addrLookup[addr.ID].isOld()
|
return a.addrLookup[addr.ID].isOld()
|
||||||
}
|
}
|
||||||
|
|
||||||
// HasAddress returns true if the address is in the book.
|
// HasAddress returns true if the address is in the book.
|
||||||
func (a *addrBook) HasAddress(addr *p2p.NetAddress) bool {
|
func (a *addrBook) HasAddress(addr *p2p.NetAddress) bool {
|
||||||
a.mtx.Lock()
|
a.mtx.Lock()
|
||||||
|
defer a.mtx.Unlock()
|
||||||
|
|
||||||
ka := a.addrLookup[addr.ID]
|
ka := a.addrLookup[addr.ID]
|
||||||
a.mtx.Unlock()
|
|
||||||
return ka != nil
|
return ka != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -292,6 +299,7 @@ func (a *addrBook) PickAddress(biasTowardsNewAddrs int) *p2p.NetAddress {
|
|||||||
func (a *addrBook) MarkGood(addr *p2p.NetAddress) {
|
func (a *addrBook) MarkGood(addr *p2p.NetAddress) {
|
||||||
a.mtx.Lock()
|
a.mtx.Lock()
|
||||||
defer a.mtx.Unlock()
|
defer a.mtx.Unlock()
|
||||||
|
|
||||||
ka := a.addrLookup[addr.ID]
|
ka := a.addrLookup[addr.ID]
|
||||||
if ka == nil {
|
if ka == nil {
|
||||||
return
|
return
|
||||||
@ -306,6 +314,7 @@ func (a *addrBook) MarkGood(addr *p2p.NetAddress) {
|
|||||||
func (a *addrBook) MarkAttempt(addr *p2p.NetAddress) {
|
func (a *addrBook) MarkAttempt(addr *p2p.NetAddress) {
|
||||||
a.mtx.Lock()
|
a.mtx.Lock()
|
||||||
defer a.mtx.Unlock()
|
defer a.mtx.Unlock()
|
||||||
|
|
||||||
ka := a.addrLookup[addr.ID]
|
ka := a.addrLookup[addr.ID]
|
||||||
if ka == nil {
|
if ka == nil {
|
||||||
return
|
return
|
||||||
@ -461,12 +470,13 @@ ADDRS_LOOP:
|
|||||||
|
|
||||||
// ListOfKnownAddresses returns the new and old addresses.
|
// ListOfKnownAddresses returns the new and old addresses.
|
||||||
func (a *addrBook) ListOfKnownAddresses() []*knownAddress {
|
func (a *addrBook) ListOfKnownAddresses() []*knownAddress {
|
||||||
addrs := []*knownAddress{}
|
|
||||||
a.mtx.Lock()
|
a.mtx.Lock()
|
||||||
|
defer a.mtx.Unlock()
|
||||||
|
|
||||||
|
addrs := []*knownAddress{}
|
||||||
for _, addr := range a.addrLookup {
|
for _, addr := range a.addrLookup {
|
||||||
addrs = append(addrs, addr.copy())
|
addrs = append(addrs, addr.copy())
|
||||||
}
|
}
|
||||||
a.mtx.Unlock()
|
|
||||||
return addrs
|
return addrs
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -476,6 +486,7 @@ func (a *addrBook) ListOfKnownAddresses() []*knownAddress {
|
|||||||
func (a *addrBook) Size() int {
|
func (a *addrBook) Size() int {
|
||||||
a.mtx.Lock()
|
a.mtx.Lock()
|
||||||
defer a.mtx.Unlock()
|
defer a.mtx.Unlock()
|
||||||
|
|
||||||
return a.size()
|
return a.size()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ type mockNodeInfo struct {
|
|||||||
|
|
||||||
func (ni mockNodeInfo) ID() ID { return ni.addr.ID }
|
func (ni mockNodeInfo) ID() ID { return ni.addr.ID }
|
||||||
func (ni mockNodeInfo) NetAddress() *NetAddress { return ni.addr }
|
func (ni mockNodeInfo) NetAddress() *NetAddress { return ni.addr }
|
||||||
func (ni mockNodeInfo) ValidateBasic() error { return nil }
|
func (ni mockNodeInfo) Validate() error { return nil }
|
||||||
func (ni mockNodeInfo) CompatibleWith(other NodeInfo) error { return nil }
|
func (ni mockNodeInfo) CompatibleWith(other NodeInfo) error { return nil }
|
||||||
|
|
||||||
func AddPeerToSwitch(sw *Switch, peer Peer) {
|
func AddPeerToSwitch(sw *Switch, peer Peer) {
|
||||||
|
@ -350,7 +350,7 @@ func (mt *MultiplexTransport) upgrade(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := nodeInfo.ValidateBasic(); err != nil {
|
if err := nodeInfo.Validate(); err != nil {
|
||||||
return nil, nil, ErrRejected{
|
return nil, nil, ErrRejected{
|
||||||
conn: c,
|
conn: c,
|
||||||
err: err,
|
err: err,
|
||||||
|
@ -6,6 +6,7 @@ import (
|
|||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
abcicli "github.com/tendermint/tendermint/abci/client"
|
abcicli "github.com/tendermint/tendermint/abci/client"
|
||||||
|
"github.com/tendermint/tendermint/abci/example/counter"
|
||||||
"github.com/tendermint/tendermint/abci/example/kvstore"
|
"github.com/tendermint/tendermint/abci/example/kvstore"
|
||||||
"github.com/tendermint/tendermint/abci/types"
|
"github.com/tendermint/tendermint/abci/types"
|
||||||
)
|
)
|
||||||
@ -64,15 +65,15 @@ func (r *remoteClientCreator) NewABCIClient() (abcicli.Client, error) {
|
|||||||
|
|
||||||
func DefaultClientCreator(addr, transport, dbDir string) ClientCreator {
|
func DefaultClientCreator(addr, transport, dbDir string) ClientCreator {
|
||||||
switch addr {
|
switch addr {
|
||||||
|
case "counter":
|
||||||
|
return NewLocalClientCreator(counter.NewCounterApplication(false))
|
||||||
|
case "counter_serial":
|
||||||
|
return NewLocalClientCreator(counter.NewCounterApplication(true))
|
||||||
case "kvstore":
|
case "kvstore":
|
||||||
fallthrough
|
|
||||||
case "dummy":
|
|
||||||
return NewLocalClientCreator(kvstore.NewKVStoreApplication())
|
return NewLocalClientCreator(kvstore.NewKVStoreApplication())
|
||||||
case "persistent_kvstore":
|
case "persistent_kvstore":
|
||||||
fallthrough
|
|
||||||
case "persistent_dummy":
|
|
||||||
return NewLocalClientCreator(kvstore.NewPersistentKVStoreApplication(dbDir))
|
return NewLocalClientCreator(kvstore.NewPersistentKVStoreApplication(dbDir))
|
||||||
case "nilapp":
|
case "noop":
|
||||||
return NewLocalClientCreator(types.NewBaseApplication())
|
return NewLocalClientCreator(types.NewBaseApplication())
|
||||||
default:
|
default:
|
||||||
mustConnect := false // loop retrying
|
mustConnect := false // loop retrying
|
||||||
|
@ -18,7 +18,7 @@ const (
|
|||||||
// TMCoreSemVer is the current version of Tendermint Core.
|
// TMCoreSemVer is the current version of Tendermint Core.
|
||||||
// It's the Semantic Version of the software.
|
// It's the Semantic Version of the software.
|
||||||
// Must be a string because scripts like dist.sh read this file.
|
// Must be a string because scripts like dist.sh read this file.
|
||||||
TMCoreSemVer = "0.27.0"
|
TMCoreSemVer = "0.27.3"
|
||||||
|
|
||||||
// ABCISemVer is the semantic version of the ABCI library
|
// ABCISemVer is the semantic version of the ABCI library
|
||||||
ABCISemVer = "0.15.0"
|
ABCISemVer = "0.15.0"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user