Skip to content

With broadcast=false all nodes on the network do not perform check_tx #2162

@shahbazn

Description

@shahbazn

Tendermint version (tendermint version: 0.22.4-c64a3c74

ABCI app (name for built-in, URL for self-written if it's publicly available): https://github.com/bigchaindb

What happened: I have a four node network with the following config.toml

# This is a TOML config file.
# For more information, see https://github.com/toml-lang/toml

##### main base config options #####

# TCP or UNIX socket address of the ABCI application,
# or the name of an ABCI application compiled in with the Tendermint binary
proxy_app = "tcp://127.0.0.1:26658"

# A custom human readable name for this node
moniker = "benchmark-1"

# If this node is many blocks behind the tip of the chain, FastSync
# allows them to catchup quickly by downloading blocks in parallel

# and verifying their commits                                                                                                                                        [147/190]
fast_sync = true

# Database backend: leveldb | memdb
db_backend = "leveldb"

# Database directory
db_path = "data"

# Output level for logging, including package level options
log_level = "main:info,state:info,*:error"

##### additional base config options #####

# Path to the JSON file containing the initial validator set and other meta data
genesis_file = "config/genesis.json"

# Path to the JSON file containing the private key to use as a validator in the consensus protocol
priv_validator_file = "config/priv_validator.json"

# 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
abci = "socket"

# TCP or UNIX socket address for the profiling server to listen on
prof_laddr = ""

# If true, query the ABCI app on connecting to a new peer
# so the app can decide if we should keep the connection or not
filter_peers = false

##### advanced configuration options #####

##### rpc server configuration options #####
[rpc]

# TCP or UNIX socket address for the RPC server to listen on
laddr = "tcp://0.0.0.0:26657"

# TCP or UNIX socket address for the gRPC server to listen on
# NOTE: This server only supports /broadcast_tx_commit
grpc_laddr = ""

# Maximum number of simultaneous 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
# you increase your OS limits.

# 0 - unlimited.                                                                                                                                                      [98/190]
grpc_max_open_connections = 900

# Activate unsafe RPC commands like /dial_seeds and /unsafe_flush_mempool
unsafe = false

# Maximum number of simultaneous connections (including WebSocket).
# Does not include gRPC connections. See grpc_max_open_connections
# If you want to accept more significant number than the default, make sure
# you increase your OS limits.
# 0 - unlimited.
max_open_connections = 900

##### peer to peer configuration options #####
[p2p]

# Address to listen for incoming connections
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
seeds = ""

# Comma separated list of nodes to keep persistent connections to
# Do not add private peers to this list if you don't want them advertised
persistent_peers = "*******"

# UPNP port forwarding
upnp = false

# Path to address book
addr_book_file = "config/addrbook.json"

# Set true for strict address routability rules
addr_book_strict = true

# Time to wait before flushing messages out on the connection, in ms
flush_throttle_timeout = 100

# Maximum number of peers to connect to
max_num_peers = 50

# Maximum size of a message packet payload, in bytes                                                                                                                  [48/190]
max_packet_msg_payload_size = 1024

# Rate at which packets can be sent, in bytes/second
send_rate = 102400000

# Rate at which packets can be received, in bytes/second
recv_rate = 102400000

# Set true to enable the peer-exchange reactor
pex = true

# Seed mode, in which node constantly crawls the network and looks for
# peers. If another node asks it for addresses, it responds and disconnects.
#
# Does not work if the peer-exchange reactor is disabled.
seed_mode = false

# Comma separated list of peer IDs to keep private (will not be gossiped to other peers)
private_peer_ids = ""

##### mempool configuration options #####
[mempool]

recheck = false
recheck_empty = true
broadcast = false
wal_dir = "data/mempool.wal"

# size of the mempool
size = 100000

# size of the cache (used to filter transactions we saw earlier)
cache_size = 100000

##### consensus configuration options #####
[consensus]

wal_file = "data/cs.wal/wal"

# All timeouts are in milliseconds
timeout_propose = 10000
timeout_propose_delta = 500
timeout_prevote = 10000
timeout_prevote_delta = 500
timeout_precommit = 10000
timeout_precommit_delta = 500
timeout_commit = 10000

# Make progress as soon as we have all the precommits (as if TimeoutCommit = 0)
skip_timeout_commit = false

# EmptyBlocks mode and possible interval between empty blocks in seconds
create_empty_blocks = false
create_empty_blocks_interval = 0

# Reactor sleep duration parameters are in milliseconds
peer_gossip_sleep_duration = 100
peer_query_maj23_sleep_duration = 2000

##### transactions indexer configuration options #####
[tx_index]

# What indexer to use for transactions
#
# Options:
#   1) "null" (default)
#   2) "kv" - the simplest possible indexer, backed by key-value storage (defaults to levelDB; see DBBackend).
indexer = "kv"

# Comma-separated list of tags to index (by default the only tag is tx hash)
#
# It's recommended to index only a subset of tags due to possible memory
# bloat. This is, of course, depends on the indexer's DB and the volume of
# transactions.
index_tags = ""

# When set to true, tells indexer to index all tags. Note this may be not
# desirable (see the comment above). IndexTags has a precedence over
# IndexAllTags (i.e. when given both, IndexTags will be indexed).
index_all_tags = false

##### instrumentation configuration options #####
[instrumentation]

# When true, Prometheus metrics are served under /metrics on
# PrometheusListenAddr.
# Check out the documentation for the list of available metrics.
prometheus = false

# Address to listen for Prometheus collector(s) connections
prometheus_listen_addr = ":26660"

# Maximum number of simultaneous connections.
# If you want to accept more significant number than the default, make sure
# you increase your OS limits.
# 0 - unlimited.
max_open_connections = 3

Now when I post a transaction to Node-1 it performs check_tx as expected creates a block and broadcast that block to Node-2, Node-3 and Node-4. Now nodes Node-2, Node-3 and Node-4 all skip the check_tx step and go directly to deliver_tx.

What you expected to happen: According to this tendermint transaction flow diagram Once the proposed block is broadcasted to all nodes there is a validation check for pre-vote on the block. This pre-vote validation does not include the check_tx step when [mempool] broadcast=false in config.toml and thus presumably accepts any proposed block as valid which can allow byzantine behavior. Does tendermint expects all the validation in check_tx and deliver_tx to be exactly identical? If yes then what is the purpose of check_tx?

How to reproduce it (as minimally and precisely as possible): Use above config.toml and send transaction to just one node

Logs: Attached are the logs for all four nodes in my setup. Said transaction was committed at block height 3. https://drive.google.com/file/d/1Is9BnaGxaAXTUumFCOA9JwO00LnUpiuj/view?usp=sharing

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions