Includes major updates to configuration, logging, and json serialization. Also includes the Grand Repo-Merge of 2017.
BREAKING CHANGES:
Config and Flags:
config
map is replaced with a Config
struct,
containing substructs: BaseConfig
, P2PConfig
, MempoolConfig
, ConsensusConfig
, RPCConfig
--seeds
is now --p2p.seeds
--node_laddr
is now --p2p.laddr
--pex
is now --p2p.pex
--skip_upnp
is now --p2p.skip_upnp
--rpc_laddr
is now --rpc.laddr
--grpc_laddr
is now --rpc.grpc_laddr
config.toml
, for instance:
[p2p]
laddr="tcp://1.2.3.4:46656"
[consensus]
timeout_propose=1000
DefaultConfig() / TestConfig()
functions to handle defaults, and remove config/tendermint
and config/tendermint_test
Logger
log15
logger with a simple interface, and provide a new implementation using go-kit
.
See our new logging library and blog post for more detailswarn
and notice
are removed (you may need to change them in your config.toml
!)JSON serialization:
[TypeByte, Xxx]
with {"type": "some-type", "data": Xxx}
in RPC and all .json
files by using go-wire/data
. For instance, a public key is now:
"pub_key": {
"type": "ed25519",
"data": "83DDF8775937A4A12A2704269E2729FCFCD491B933C4B0A7FFE37FE41D7760D0"
}
[TypeByte, {"jsonrpc": "2.0", ... }]
is now just {"jsonrpc": "2.0", ... }
[]byte
to data.Bytes
in all serialized types (for hex encoding)ValidatorSet
fieldsEventDataInner
for serializing eventsOther:
appBlockHeight == 0
Accum
field when computing the validator hash. This makes the ValidatorSetHash unique for a given validator set, rather than changing with every block (as the Accum changes)/dial_seeds
, and all calls prefixed with unsafe
. Use the --rpc.unsafe
flag to enable.FEATURES:
state:info,*:error
, which means the state
package logs at info
level, and everything else logs at error
leveladdress
and pub_key
fields in priv_validator.json
and overwrite them with the values derrived from the priv_key
IMPROVEMENTS:
tendermint/go-p2p -> tendermint/tendermint/p2p
and tendermint/go-rpc -> tendermint/tendermint/rpc/lib
go-common -> tmlibs/common
go-data -> go-wire/data
go-
libs, except go-crypto
and go-wire
, are merged under tmlibs
/blockchain_info
call to return a maximum of 20 blocks.Wrap()
and .Unwrap()
instead of eg. PubKeyS
for go-crypto
typesjson.MarshalIndent
)cmd/tendermint/commands
and do not read config from file for testsBUG FIXES:
ResetPrivValidator
where we were using the global config and log (causing external consumers, eg. basecoin, to fail).FEATURES:
/tx?hash=X
endpoint to query for transactions and their DeliverTx result by hash. Optionally returns a proof of the tx's inclusion in the blocktendermint testnet
command initializes files for a testnetIMPROVEMENTS:
/broadcast_tx_XXX
also returns the Hash (can be used to query for the tx)/broadcast_tx_commit
also returns the height the block was committed in--seeds
, under seeds
in the config, or in /dial_seeds
are now persistent, and will be reconnected to if the connection breaksBUG FIXES:
BREAKING CHANGES:
Query(RequestQuery) ResponseQuery
, enabling precise proofs at particular heights:message RequestQuery{
bytes data = 1;
string path = 2;
uint64 height = 3;
bool prove = 4;
}
message ResponseQuery{
CodeType code = 1;
int64 index = 2;
bytes key = 3;
bytes value = 4;
bytes proof = 5;
uint64 height = 6;
string log = 7;
}
BlockMeta
data type unifies its Hash and PartSetHash under a BlockID
:type BlockMeta struct {
BlockID BlockID `json:"block_id"` // the block hash and partsethash
Header *Header `json:"header"` // The block's Header
}
ValidatorSet.Proposer
is exposed as a field and persisted with the State
. Use GetProposer()
to initialize or update after validator-set changes.
tendermint gen_validator
command output is now pure JSON
FEATURES:
/commit?height=X
returns header and commit for block at height X
IMPROVEMENTS:
Node
is now a BaseService
CONTRIBUTING.md
, Github ISSUE_TEMPLATE
, CHANGELOG.md
BUG FIXES:
/dial_seeds
with invalid addressesaccumComparable
ValidatorSet.Proposer
across restarts by persisting it in the State
BREAKING CHANGES:
BlockID
to represent blocks:type BlockID struct {
Hash []byte `json:"hash"`
PartsHeader PartSetHeader `json:"parts"`
}
Vote
data type now includes validator address and index:type Vote struct {
ValidatorAddress []byte `json:"validator_address"`
ValidatorIndex int `json:"validator_index"`
Height int `json:"height"`
Round int `json:"round"`
Type byte `json:"type"`
BlockID BlockID `json:"block_id"` // zero if vote is nil.
Signature crypto.Signature `json:"signature"`
}
FEATURES:
Maj23Msg
, for peers to alert others they've seen a Maj23,
in order to track and handle conflicting votes intelligently to prevent Byzantine faults from causing halts:type VoteSetMaj23Message struct {
Height int
Round int
Type byte
BlockID types.BlockID
}
IMPROVEMENTS:
BUG FIXES:
Maj23Msg
.FEATURES:
--pex
flag for more resilient gossip network (feature still in development, beware dragons)IMPROVEMENTS:
/dial_seeds
to enable manual network configurationIMPROVEMENTS:
BUG FIXES:
BUG FIXES:
FEATURES:
tmsp_query
tmsp_info
IMPROVEMENTS:
BUG FIXES:
priv_validator.json
for recoveryBREAKING CHANGES:
FEATURES:
cswal_light
; logs only the validator's own votes/broadcast_tx_commit
, returns when tx is included in a block, else an error/unsafe_flush_mempool
, empties the mempoolIMPROVEMENTS:
BUG FIXES:
Strict versioning only began with the release of v0.7.0, in late summer 2016. The project itself began in early summer 2014 and was workable decentralized cryptocurrency software by the end of that year. Through the course of 2015, in collaboration with Eris Industries (now Monax Indsutries), many additional features were integrated, including an implementation from scratch of the Ethereum Virtual Machine. That implementation now forms the heart of ErisDB. In the later half of 2015, the consensus algorithm was upgraded with a more asynchronous design and a more deterministic and robust implementation.
By late 2015, frustration with the difficulty of forking a large monolithic stack to create alternative cryptocurrency designs led to the invention of the Application Blockchain Interface (ABCI), then called the Tendermint Socket Protocol (TMSP). The Ethereum Virtual Machine and various other transaction features were removed, and Tendermint was whittled down to a core consensus engine driving an application running in another process. The ABCI interface and implementation were iterated on and improved over the course of 2016, until versioned history kicked in with v0.7.0.