All notable changes to this project will be documented in this file. The project adheres to Semantic Versioning.
-
Dependencies have been updated. (#1111, #1162, #1167, #1168)
-
ctrl+c
handler has been added for correct node stopping. (#1163)
pwbox
dependency has been updated. (#1164)
-
Changed the message format, which, in turn, has led to changes in the byte representation of transactions and precommit messages. (#916)
-
Transaction::execute
now acceptsTransactionContext
as the second parameter.TransactionContext
provides the public key of transaction author, ID of current service, and transaction hash. (#943) -
Transaction::verify
method has been removed. (#1085) -
Every transaction that contains the public key of the author was refactored to use the author indicated in
TransactionContext
. (#984 #980 #979 #975 #971) -
/transactions/
endpoint can now handle transaction messages in hex format. Services that used custom endpoints were refactored to useexplorer/v1/transactions
. (#943 #984 #980 #979 #975 #971) -
majority_count
parameter has been moved fromStoredConfiguration
toConfigurationService
configuration. (#828) -
Removed obsolete
enable_blockchain_explorer
option fromNodeApiConfig
. (#891) -
Consensus messages and inner structs are now serialized with protobuf. (#1028)
-
tx_pool_capacity
parameter has been removed fromMemoryPoolConfig
. (#1036) -
Custom serialization has been removed. (#1088)
-
Trait
TransactionSend
was removed.ApiSender
now containsbroadcast_transaction
method. (#943) -
api::Error::InternalError
now containsfailure::Error
instead ofBox<::std::error::Error>
. (#879) -
TransactionSend::send
now returnsResult<(), failure::Error>
instead ofio::Result
. (#879) -
ApiSender
methodssend_external_message
andpeer_add
now returnsResult<(), failure::Error>
instead ofio::Result
. (#879) -
majority_count
parameter has been added togenerate-template
andgenerate-testnet
commands. (#828) -
NodePrivateConfig
fields have been renamed:listen_addr
tolisten_address
andexternal_addr
toexternal_address
. (#809) -
NodePublicConfig
addr
field has been renamed toaddress
. (#809) -
Config parameter
external_address
is now a required value. (#826) -
Config parameter
round_timeout
has been renamed tofirst_round_timeout
. Now timeout for round r isfirst_round_timeout + (r-1)*round_timeout_increase
, whereround_timeout_increase
is determined as a certain percentage offirst_round_timeout
. The value of this percentage is defined inConsensusConfig::TIMEOUT_LINEAR_INCREASE_PERCENT
constant (10%). (#848) -
missing_keys
,entries
,all_entries
methods ofCheckedMapProof
andMapProof::missing_keys_unchecked
method now returnimpl Iterator
instead ofVec
. (#918) -
Connect
message fieldaddr
withSocketAddr
has been removed,pub_addr
withstr
of unresolved external address of the peer is used instead. (#942) -
Endpoint
v1/peers
now returnsConnectInfo
in incoming connections instead of single IP-addresses. (#959) -
Fork::remove_by_prefix()
method now specifies prefix asOption<&[u8]>
instead ofOption<&Vec<u8>>
. (#1042) -
TransactionResult
is now serialized using protobuf. Empty description of the result is now the equivalent of there being no description of the result. (#1075) -
Service::tx_from_raw
now usesfailure::Error
as an error type. (#1088) -
transactions!
macro has been removed,TransactionSet
derive macro fromexonum-derive
should be used instead. (#1088) -
encoding_struct!
macro has been removed, protobuf should be used instead. (#1088)
- Structures in tests and examples are serialized using protobuf now. (#1078)
- Structures in tests and examples are serialized using protobuf now. (#1081)
- Structures in tests and examples are serialized using protobuf now. (#1081)
-
The
Vote
andVoteAgainst
now save the transaction hash instead of full transaction message. (#984) -
Structures are serialized using protobuf now. (#1086)
- Structures are serialized using protobuf now. (#1086)
- Added
utils
module with functionscreate_keys_file
for creating andread_keys_from_file
for reading files that contain a public key and encrypted secret key. (#1056)
-
Added possibility to use domain names instead of IP addresses as a peer's addresses. (#826)
-
Added
v1/rebroadcast
endpoint that can be used to broadcast all transactions from the pool to other nodes. (#859) -
Now each consecutive round is longer than previous by some constant percentage of
first_round_timeout
. (#848) -
Added
/v1/blocks/subscribe
endpoint for following block commit events through WebSockets (#792). -
Added
MapProof::all_entries_unchecked
method. It is used for more efficient calculations in Exonum Java Bindings, but can be used for debug purposes as well. (#918) -
Added
listen-address
command line argument to specify different external address (peer-address
) and listen address when generating config files. (#942) -
Peer address is resolved on connect instead of resolving on node startup. (#942)
-
Now peers require only one connection to exchange messages between them. (#945)
exonum-build
crate has been added to simplify writingbuild.rs
files for services that use protobuf code generation. (#1076)
exonum-derive
crate has been added with custom derives forProtobufConvert
andTransactionSet
. (#1055)
-
Bug with pool size overflow has been fixed. (#853)
-
Bug in
NoiseWrapper::decrypt_msg
caused by wrong calculation of encrypted and decrypted message sizes has been fixed. (#873) -
Transactions (signature) verification benchmark has been fixed. (#673)
-
Node no longer panics when transaction pool has a lot of transactions and consensus is at round 0. (#673)
-
Node now works correctly after consensus re-enable via API. (#902)
-
Bug with incorrect EOF handling while decoding network messages has been fixed. (#917)
-
Bug leading to deletion of excessive data when
clear
ing an index belonging to an index family has been fixed. (#1042)
new_in_family
index constructor introduced in #531 now accepts&str
and&[u8]
as anindex_id
value.
-
NodeHandler::run_handler
now returnsResult<(), failure::Error>
instead ofio::Result
. (#879) -
Transactions (signature) verification benchmark has been added. (#808)
-
A new function
storage::proof_list_index::root_hash()
has been added to efficiently compute Merkle root hash from a list of hashes without an intermediateProofListIndex
. Verification of block root hashes has been optimized as well. (#802) -
NoiseHandshake::finalize
now returns error if remote peer's public key is not inConnectList
. (#811) -
Now nodes will switch to
min_propose_timeout
for block proposal timeout faster if they receive more thanpropose_timeout_threshold
transactions duringmax_propose_timeout
. (#844) -
Custom log formatting (along with
colored
andterm
dependencies) has been removed in favor ofenv_logger
. (#857). -
Several dependencies have been updated. (#861, #865, #871)
-
Transactions are now verified in a thread pool. Thread pool size is set to optimal value by default (CPU count) or can be configured manually. (#673)
-
The
finalize
command now does not include the node itself as its own trusted peer in the generated configuration. (#892) -
Added a possibility to create
ServiceApiBuilder
with blockchain. (#929) -
ConnectInfo
andConnectList
now stores unresolved addresses as strings. (#942) -
Now
network
module usesPublicKeys
to identify peers. (#942) -
system/v1/peers
endpoint now properly returns incoming and outgoing connections of the node. (#942)
- A version of
snow
dependency has been updated.
- SegmentField implementation for Option has been added, allowing to store optional values inside of transactions. (#1004)
- Config parameter
external_address
is now a required value. (#826)
- Added possibility to use domain names instead of IP addresses as a peer's
addresses. In config file domain names can be used in
ConnectList
configuration and addresses will be resolved once on startup. (#826)
- Added a possibility to create
ServiceApiBuilder
with blockchain. (#929)
-
failure
version has been updated to0.1.2
in order to fix the build issue withfailure_derive
. (#845) -
Bug with "unknown propose" execution has been fixed. (#841)
-
Command
trait inhelpers::fabric
module became public. (#778)Migration path:
If you override
ServiceFactory::command
method and do a match by a command name, just adduse helpers::fabric::Command
import. -
schema_version
field inBlock
has been removed. (#774) -
Storage in exonum is now versioned. Old databases will not work with this update. (#707)
-
Iron
-based web API has been replaced by the new implementation based onactix-web
. (#727)Migration path:
For backend:
- Remove old dependencies on
iron
and its companionsbodyparser
,router
and others. - Simplify the API handlers as follows:
where
fn my_handler(state: &ServiceApiState, query: MyQueryType) -> Result<MyResponse, ApiError> { // ... }
MyQueryType
type implementsDeserialize
trait andMyResponse
implementsSerialize
trait. - Replace old methods
public_api_handler
andprivate_api_handler
ofService
trait by a singlewire_api
method which takesServiceApiBuilder
. You can use this builder as a factory for your service API. get
,get_err
andpost
methods inTestKitApi
have been replaced by the more convenientRequestBuilder
. Don't forget to update your testkit-based API tests.
For frontend:
- New API implementation supports only query parameters in
GET
requests. In this way requests likeGET api/my_method/:first/:second
should be replaced by theGET api/my_method?first=value1&second=value2
. - JSON parser for
POST
requests is now more strict. In this way you should sendnull
in request body even for handlers without query parameters.
See our examples for more details.
- Remove old dependencies on
-
storage::base_index
module has become private along withBaseIndex
andBaseIndexIter
types. (#723) -
ServiceFactory
trait has been extended withservice_name
function.(#730) -
Method
name
has been removed fromRun
,GenerateCommonConfig
,GenerateNodeConfig
,Finalize
,GenerateTestnet
andMaintenance
structures (helpers/fabric
module). (#731) -
Whitelist
has been replaced byConnectList
. Now connection between nodes can only be established if nodes exist in each other's connect lists. (#739)Migration path:
- Replace
[whitelist]
section in config with[connect_list.peers]
section and specify here all validators' consensus public keys with corresponding ip-addresses. For example16ef83ca...da72 = "127.0.0.1:6333"
.
- Replace
-
Healthcheck and consensus endpoints (
v1/healthcheck
andv1/consensus_status
) have been merged tov1/healthcheck
. (#736, #766) -
Node configuration file is now updated at
ConnectList
update. This is achieved via newConfigManager
entity. (#777)Migration path (required only if you create
Node
manually):If you need to update
ConnectList
on file system, passSome(path_to_node_config)
as the last argument of theNode::new
method. Otherwise, passNone
. -
exonum::crypto
types now have truncatedDisplay
/Debug
representations. (#797)Migration path:
Use
encoding::serialize::ToHex
instead ofDisplay
to produce full hexadecimal representation. You have to manually check if you need to switch or can keep using the truncated representation.Use
encoding::serialize::FromHex
instead ofFromStr
for reverse conversion.FromStr
implementation has been removed from crypto types to avoid errors.
-
Existing sodiumoxide-based cryptographic backend behind opt-out sodiumoxide-crypto feature. It also allows to use your own cryptographic library with exonum. (#756)
-
New kind of CLI commands has been added:
info
command that can be used for getting various information from a node that has not been started yet. (#731) Currently supported sub-commands:core-version
- prints Exonum version as a plain string.list-services
- prints the list of the services the node is built with in the JSON format.
-
exonum::crypto::x25519
module to convert keys from Ed25519 to X25519 format has been introduced. (#722) -
storage::Entry
has been extended withtake
andswap
methods. (#781) -
Added remote public key validation when handling incoming
Connect
message. (#786)
-
Fixed bug with incorrect peer status for a turned-off node. (#730)
-
handle_consensus
does not write warning for message from previous height any more. (#729) -
new_in_family
constructor has been added to theEntry
index. (#790) -
Added missing
external_address
field to the auditor final configuration. (#805)
BlockResponse
sends transactions byHash
instead ofRawMessage
. If the node does not have some transactions, requests are created for the corresponding transactions. Due to these changes, the block size became significantly smaller. (#664)
-
RunDev
structure has been made public, so it can be extended now. -
RunDev
command now generates default values for api addresses in the config.
- Dependencies versions have been updated:
exonum_sodiumoxide
to0.0.19
.exonum_rocksdb
to0.7.4
.
-
handle_commit
method inService
trait has been renamed toafter_commit
. (#715) -
TimeoutAdjusterConfig
has been removed along with different timeout adjusters. Current behavior is similar to theDynamic
timeout adjuster and can be modified throughmin_propose_timeout
,max_propose_timeout
andpropose_timeout_threshold
fields in theConsensusConfig
. (#643)Migration path:
Constant
timeout adjuster can be emulated by setting equalmin_propose_timeout
andmax_propose_timeout
values.- For
Dynamic
timeout adjuster simply movemin
,max
andthreshold
values intomin_propose_timeout
,max_propose_timeout
andpropose_timeout_threshold
correspondingly. - There is no possibility to emulate
MovingAverage
now, soDynamic
should be used as the closest alternative.
-
Network connections are now encrypted using Noise Protocol. Nodes compiled with old version will not connect to the new ones. Therefore you need to update all node instances for the network to work. (#678)
-
storage::Error
constructor has been made private. (#689) -
ConsensusConfig::validate_configuration
method has been renamed to thewarn_if_nonoptimal
. (#690)
- The service has been refactored and the following public structs has been
moved to separate modules:
TimeSchema
toexonum_time::schema
,TimeProvider
andMockTimeProvider
toexonum_time::time_provider
,ValidatorTime
toexonum_time::api
. (#604)
-
Private API now support CORS. (#675)
-
The
--public-allow-origin
and--private-allow-origin
parameters have been added to thefinalize
command. (#675) -
IPv6 addressing is now supported. (#615)
-
Field
,CryptoHash
,StorageValue
andExonumJson
traits have been implemented forchrono::Duration
structure. (#653) -
before_commit
method has been added inService
trait. (#667) (#715) -
Field
,CryptoHash
,StorageKey
,StorageValue
andExonumJson
traits have been implemented forrust_decimal::Decimal
. (#671) -
Maintenance CLI command for node management has been added. Currently the only supported command is
clear-cache
which clears node message cache. (#676) -
StoredConfiguration
validation has been extended withtxs_block_limit
parameter check. (#690) -
A warning for non-optimal
StoredConfiguration::txs_block_limit
value has been added. (#690) -
Private api
/v1/network/
endpoint now returns core version in addition to service info. (#701)
- Additional service example has been added along with frontend. (#646)
- Advanced cryptocurrency example becomes a public library (is published on crates.io). (#709)
-
Already processed transactions are rejected now in
NodeHandler::handle_incoming_tx
method. (#642) -
Fixed bug with shutdown requests handling. (#666)
-
Fixed deserialization of the
MapProof
data structure. (#674) -
Fixed a bug which prevented the node from reaching the actual round. (#680 #681)
- Error description has been added to the return value of the transactions. (#695)
- Error description has been added to the return value of the transactions. (#695)
- Frontend has been updated to reflect latest backend changes. (#602 #611)
-
Default implementation of
check
method was added toField
trait to reduce boilerplate. (#639) -
Metrics are now using
chrono::DateTime<Utc>
instead ofSystemTime
. (#620)
- Method
ProposeData::set_history_hash
has been removed. (#604)
-
POST-requests are now handled with
bodyparser
crate, so all the parameters must be passed in the body. (#529) -
ProofListIndex
andProofMapIndex
root_hash
method has been renamed tomerkle_root
. (#547) -
Proofs of existence / absence for
ProofMapIndex
s have been reworked. They now have a linear structure with two components: key-value pairs, and additional proof information allowing to restore the Merkle root of the entire index.MapProof
interface has been reworked correspondingly. (#380)Migration path:
- Consult documents for the updated workflow for creation and verification
of
MapProof
s. - See the README in the
storage::proof_map_index
module for theoretical details about the new proof structure.
- Consult documents for the updated workflow for creation and verification
of
-
with_prefix
constructor of all index types has been renamed tonew_in_family
. Now it usesindex_id
instead of prefixes. Moreover,blockchain::gen_prefix
method has been removed. Instead, any type that implementsStorageKey
trait, can serve as anindex_id
. (#531) -
Several
Schema
's methods have been renamed (#565):tx_location_by_tx_hash
totransactions_locations
.block_txs
toblock_transactions
.
-
SystemTime
previously used as storage key or value turned out to show different behavior on different platforms and, hence, has been replaced withchrono::DateTime<Utc>
that behaves the same in any environment. (#557)Migration path:
- Replace all
SystemTime
fields withchrono::DateTime<Utc>
ones. - Use
DateTime::from
andinto()
methods to convert your existingSystemTime
instances into suitable type when constructing transactions or working with database.
- Replace all
-
Blockchain
methodtx_from_raw()
now returnsResult<Box<Transaction>, MessageError>
instead ofOption<Box<Transaction>>
. (#567) -
events
module becomes private. (#568) -
CryptoHash
trait is no longer implemented forHash
. (#578) -
network_id
attribute has been removed fromNodeInfo
andRawMessage
.HEADER_LENGTH
remains the same, first byte ofRawMessage
is now reserved and always set to0
. (#579) -
exonum::explorer
module has been reworked to add new functionality. (#535, #600) In particular:- The explorer now allows to iterate over blocks in the blockchain in the
given height range, replacing old
blocks_range
method. block_info
andtx_info
methods of the explorer are renamed toblock
andtransaction
respectively.TransactionInfo
moved from theapi::public
module to theexplorer
module.BlocksRange
moved from theexplorer
module to theapi::public
module.TxInfo
is renamed toCommittedTransaction
.BlockInfo
fields are private now, yet accessible with getter methods.
Migration path:
- Rename imported types and methods as specified above
- Use explicit type parameter in
TransactionInfo
andCommittedTransaction
(e.g.,TransactionInfo<serde_json::Value>
orTransactionInfo<MyTransaction>
) if you need to deserialize transaction-related data returned from the explorer HTTP API. - Consult
explorer
module docs for further possible changes in API.
- The explorer now allows to iterate over blocks in the blockchain in the
given height range, replacing old
-
validators-count
command-line parameter has been added. Now, when generating config template usinggenerate-template
command, you must specify the number of validators. (#586) -
majority_count
parameter has been added to theStoredConfiguration
. Seeexonum-configuration
changes for more details. (#546)
-
Rollback mechanism in
Testkit
is reworked to work with checkpoints (#582):- old
rollback
by blocks inTestkit
was removed; checkpoint
method was introduced to set checkpoints;- new
rollback
rolls back to the last set checkpoint.
Migration path:
- Replace every old
rollback(blocks)
by a pair ofcheckpoint()
androllback()
.
- old
-
Testkit api now contains two methods to work with the transaction pool (#549):
is_tx_in_pool
- for checking transaction existence in the pool;add_tx
- for adding a new transaction into the pool.
Migration path:
- Instead of calling
mempool()
, one should useis_tx_in_pool
oradd_tx
methods.
-
TestKitApi::get_err
method now returnsApiError
, rather than a deserialized object, as it is forget
. For checking such results in tests you may want to useassert_matches
.
majority_count: Option<u16>
configuration parameter is introduced. Allows to increase the threshold amount of votes required to commit a new configuration proposal. By default the number of votes is calculated as 2/3 + 1 of total validators count. (#546)
SystemTime
has been replaced withchrono::DateTime<Utc>
, as it provides more predictable behavior on all systems. (#557)
-
ExecutionError::with_description
method now takesInto<String>
instead ofString
which allows to pass&str
directly. (#592) -
New
database
field added to theNodeConfig
. This optional setting adjusts database-specific settings, like number of simultaneously opened files. (#538) -
ExecutionError::with_description
method now takesInto<String>
instead ofString
which allows to pass&str
directly. (#592) -
New
database
field added to theNodeConfig
. This optional setting adjusts database-specific settings, like number of simultaneously opened files. (#538) -
Added
v1/user_agent
endpoint with information about Exonum, Rust and OS versions. (#548) -
ProofMapIndex
now allows to retrieve a proof of presence / absence for an arbitrary number of elements at one time with the help ofget_multiproof
method. Correspondingly,MapProof
allows to verify proofs for an arbitrary number of elements. (#380) -
storage::UniqueHash
trait that represents a unique, but not necessary cryptographic hash function, is introduced. (#579) -
Added the opportunity to parse configuration files with missing empty structures. Fields of such structures are equal to the default values. (#576)
-
CryptoHash
,Field
,StorageKey
andStorageValue
traits are implemented for theuuid::Uuid
. (#588) -
Display
trait is implemented for types from thecrypto
module. (#590) -
transactions!
macro now allows empty body. (#593)
-
create_block*
methods of theTestKit
now return the information about the created block. (#535) -
TestKit::explorer()
method allows to access the blockchain explorer. (#535)
- A more complex example has been added featuring best practices for service writing. (#595)
-
RawTransaction
now has its own implementation offmt::Debug
trait instead of#[derive(Debug)]
. The template ofRawTransaction
’s debug message isTransaction { version: #, service_id: #, message_type: #, length: #, hash: Hash(###) }
. (#603) -
Non-committed transactions are now stored persistently in the storage instead of memory pool. (#549)
-
Sandbox tests have been moved inside of the exonum core. (#568)
-
The requested transactions in the
TransactionsRequest
are now sent by batches, rather than one by one. The number of batches depends on the size limits of the message. (#583)
- Request logging for
TestKitApi
now encompasses all requests. The log format is slightly changed to allow for the generic request / response form. (#601)
-
exonum::crypto::CryptoHash
trait is introduced, andStorageValue::hash
andMessage::hash
methods are removed. (#442)Migration path:
- For implementations of
StorageValue
, move thehash
method toCryptoHash
implementation instead. - For implementations of
Message
simply removehash
method, there's a blanket impl ofCryptoHash
forMessage
. - Add
use exonum::crypto::CryptoHash
to use thehash
method.
- For implementations of
-
The
StorageKey
trait is re-implemented for signed integer types (i8
,i16
,i32
andi64
) to achieve the natural ordering of produced keys. (#443)This change will break indices using signed integers as keys. To emulate the old implementation, you may create a wrapper around a type (e.g.,
struct QuirkyI32Key(i32)
) and implementStorageKey
for it using big endian encoding. Then, use the wrapper instead of the int type in indices. See the unit tests forStorageKey
for an example. -
Transaction::execute
method now returnsTransactionResult
that is stored in the blockchain and can be accessed through api. The changes made by transactions that returnErr
are discarded. To migrate, addOk(())
as the last line to theexecute
method. More generally, make sure that the method returnsOk(())
on successful execution. (#385) -
Service transactions are now defined through
transactions!
macro that automatically assigns transaction IDs based on the declaration order. (#457)Migration path:
- Move all separate transactions declared as
message!
into onetransactions!
macro. - Remove
ID
constants. - Replace
TYPE
constants with a singleSERVICE_ID
constant.
- Move all separate transactions declared as
-
Several variants were removed from
ApiError
enum. (#474)Migration path:
- Use generic
ApiError::BadRequest
variant or createIronError
directly.
- Use generic
-
CommandExtension
usesfailure::Error
instead ofBox<std::error::Error>
for errors. (#474)Migration path:
std::error::Error
can be converted tofailure::Error
via.into()
method.
-
storage::Error
implementsfailure::Fail
instead ofstd::error::Error
. (#474) -
CryptoHash
for()
now correctly calculates a hash of an empty byte array instead of returningHash::zero()
. (#483) -
Removed the
'static
bound from the return value of theblockchain::Service::service_name()
method. (#485) -
StorageKey
trait now requiresToOwned
implementation. (#392) -
Connect
message has been extended with a user agent string, which breaks binary compatibility with previous versions. (#362) -
Log output become more human-readable. Now it uses
rfc2822
for time formatting. This change can break scripts that analyze the log output. (#514) -
output_dir
argument of thegenerate-testnet
command has been renamed tooutput-dir
. (#528) -
peer_addr
argument of thegenerate-config
command has been renamed topeer-address
. (#528) -
Blockchain::new
andNode::new
now acceptInto<Arc<Database>>
instead ofBox<Database>
. (#530)Migration path:
- Just pass database argument as is, for example instead of
Box::new(MemoryDb::new())
useMemoryDb::new()
.
- Just pass database argument as is, for example instead of
-
Most types renamed to avoid stuttering (see here for an explanation of the term) (#496):
ConfigurationService
toService
ConfigurationServiceFactory
toServiceFactory
TxConfigPropose
toPropose
TxConfigVote
toVote
ConfigurationSchema
toSchema
StorageValueConfigProposeData
toProposeData
CONFIG_SERVICE
constant toSERVICE_ID
Check the crate documentation for more details.
Migration path: Rename imported types from the crate, using aliases or qualified names if necessary:
use exonum_configuration::Service as ConfigService
.
-
Multiple APIs are no longer public (#496):
- Message identifiers
- Mutating methods of the service schema
- Module implementing HTTP API of the service
Check the crate documentation for more details.
Migration path: The restrictions are security-based and should not influence intended service use.
ZEROVOTE
is replaced with theMaybeVote
type, which is now used instead ofVote
in the schema method signatures. The storage format itself is unchanged (#496).
-
The structure
Time
is removed, useSystemTime
for saving validators time inProofMapIndex
instead. (#20) -
Renamed methods
validators_time
/validators_time_mut
tovalidators_times
/validators_times_mut
inSchema
. (#20)
-
StorageKey
andStorageValue
traits are implemented forSystemTime
. (#456) -
StorageValue
andCryptoHash
traits are implemented forbool
. (#385) -
Height
implementsstd::str::FromStr
. (#474) -
v1/transactions
endpoint has been extended with the transaction execution status. (#488) -
Key-indexes interface now allows to use borrowed types for the search operations. (#392)
-
Added
v1/shutdown
endpoint for graceful node termination. (#526) -
TransactionInfo
from the public api module became public. (#537)
-
Modified signature of the
TestKitApi::send
method, which previously did not acceptBox<Transaction>
. (#505) -
Added possibility to init a logger in
TestKitBuilder
. (#524)
-
Information about configurations by
/v1/configs/actual
,/v1/configs/following
and/v1/configs/committed
endpoints is extended with the hash of the corresponding proposal and votes for the proposal (#481). -
Implemented error handling based on error codes (#496).
-
ExonumJsonDeserialize
trait is implemented forF32
andF64
. (#461) -
Added round and propose timeouts validation. (#523)
-
Fixed bug with the extra creation of the genesis configuration. (#527)
-
Fixed panic "can't cancel routine" during node shutdown. (#530)
-
Consensus messages are stored persistently (in the database), so restart will not affect the node's behavior. (#322)
-
Runtime index type checks have been implemented for every index. (#525)
- Fixed logger output. (#451)
-
The order of bytes and bits in the
DBKey
keys ofProofMapIndex
became consistent. (#419)The change influences how Merkle Patricia trees are built for
ProofMapIndex
: the bits in each byte of aDBKey
are now enumerated from the least significant bit (LSB) to the most significant bit (MSB), compared to MSB-to-LSB ordering used before. Note: this change will break old storages using map proofs. -
The
Database
trait is simplified: it is no longer required to implement state-sharingclone
method. Instead, themerge
method now takes a shared reference toself
. (#422) -
message!
andencoding_struct!
no longer require manualSIZE
and offset specification. (#413) -
from_raw(raw: RawMessage)
method is moved to theMessage
trait. To migrate, adduse exonum::messages::Message
. (#427) -
Changed iterators over
Patch
andChanges
data into custom types instead of standard collection iterators. (#393) -
Fixed typo in
SparceListIndexKeys
andSparceListIndexValues
. (#398) -
Removed default
state_hash
implementation in theService
trait. (#399) -
Removed
info
method from theTransaction
. (#402) -
Replaced config param
timeout_events_capacity
withinternal_events_capacity
. (#388) -
The
Transaction
trait now inherits fromExonumJson
. (#402) -
Renamed
DBKey
toProofPath
and moved a part of its functionality to theBitsRange
trait. (#420)
- Added
patch
method to theFork
structure. (#393) - Added a public
healthcheck
endpoint. (#405) - Added serialization support of floating point types through special wrapper
(
F32
andF64
). This feature is hidden behindfloat_serialize
gate. Note: special values (Infinity and NaN) aren't supported. (#384) - Added a possibility to set maximum message size (
pub max_message_len
field inConsensusConfig
). (#426) - Added support for CORS. (#406)
- Added
run-dev
command that performs a simplified node launch for testing purposes. (#423)
- Fixed consensus on the threshold of 1/3 sleeping validators. (#388)
- Fixed a bunch of inconsistencies and mistakes in the docs. (#439)
- Fixed a bug with message header validation. (#430)
- The list of peer connections is now restored to the latest state after the process is restarted. (#378)
- Log dependency was updated to 0.4, which can cause issues with the previous versions. (#433)
- Better error reporting for configs in the
.toml
format. (#429)
- Allow creating auditor node from command line. (#364)
- Added a new function
merge_sync
. In this function a write will be flushed from the operating system buffer cache before the write is considered complete. (#368) - Added conversion into boxed values for values which implement
Service
orTransaction
traits. (#366) - Added constructor for the
ServiceContext
which can be useful for the alternative node implementations. (#366) - Implemented
AsRef<RawMessage>
for any Exonum messages that were created using themessage!
macro. (#372) - Implemented additional checks for conversion from raw message. (#372)
- Changed a signature of
open
function in arocksdb
module.RocksDBOptions
should pass by the reference. (#369) ValidatorState
in theServiceContext
replaced by theValidatorId
. (#366)add_transaction
in theServiceContext
replaced by thetransaction_sender
which implements theTransactionSend
trait. (#366)- The
Node
constructor now requiresdb
andservices
variables instead ofblockchain
instance. (#366) - The
Blockchain
constructor now requires services keypair and anApiSender
instance. (#366) mount_*_api
methods inBlockchain
instance now do not requireApiContext
. (#366)- Rename method
last_height
toheight
inSchema
. (#379) last_block
now returnsBlock
instead ofOption<Block>
. (#379)- Replaced
rocksdb
command-line parameter to more genericdb-path
. (#376) - Obsolete trait
HexValue
replaced by theFromHex
andToHex
traits. (#372) - Changed
Patch
andChanges
from type definitions into opaque structures. (#371) - Help text is displayed if required argument is not specified. (#390)
- Removed
round
method from theServiceContext
. (#366) - Removed redundant
FromRaw
trait. (#372) - Removed redundant
current_height
method inSchema
. (#379)
- Fixed
crate_authors!
macro usage, this macro can't return static string in new clap version. (#370) - Fixed mistake in description of the height getter in the
ServiceContext
. (#366) - Fixed #15 consensus on the threshold of 1/3 sleeping validators. (#388)
- New events implementation based on the
tokio
with the separated queues for network events and timeouts and different threads for the network and node code (#300) - Added a new index
SparseListIndex
. It is a list of items stored in sequential order. Similar toListIndex
but it may contain indexes without elements (#312) - Implement
FromStr
andToString
traits for public sodium types (#318) - Add a new macro
metric!
for collecting statistical information (#329) - Make type
DBKey
public because it is used inMapProof
(#306)
RocksDB
is a default storage (#178)- Field
events_pool_capacity
inMemoryPoolConfig
replaced by the newEventsPoolCapacity
configuration (#300) - Changed a build method
new
and added a new build methodwith_prefix
for indexes (#178) - Changed a signature of
gen_prefix
function in aschema
module (#178) NodeBuilder
works withServiceFactory
as trait object instead (#357)- Debug formatting for crypto types are improved (#353)
- Added description of deserialization error for message types (#337)
- Clarified
Transaction.info()
usage (#345)
- Support of
LevelDB
is removed (#178)
- Fix the issue causing timeouts are ignored when the event pool is full (#300)
- Fix network failure due to incorrect processing of the incoming buffer (#322)
- Add
RockDB
support (#273) - Add
TimeoutAdjusterConfig
,Constant
andDynamic
timeout adjusters (#256) - Add stream hashing and signing:
HashStream
andSignStream
(#254) - Add new type definitions
Height
andValidatorId
(#262) - Fields of
BlockInfo
andTxInfo
are now public (#283) - Public export of
PROOF_MAP_KEY_SIZE
constant (#270)
MapProof
variant fields are renamed:left_hash
andright_hash
toleft_node
andright_node
(#286)RequestBlock
is renamed toBlockRequest
andBlock
is renamed toBlockResponse
(#287)- All request messages are renamed:
RequestFoo
toFooRequest
(#287) - Improve log formatting (#291 #294)
- Make panic message during command line arguments parsing cleaner (#257)
- Fix network discover failure due to incorrect processing of the incoming buffer (#299)
- Fix snapshot behavior for
MemoryDB
(#292) - Disallow generate-testnet with 0 nodes (#258)
- Fix segfault when
LevelDBSnapshot
is destroyed afterLevelDB
(#285) - Fix panic during
BlockResponse
message processing if the transaction pool is full (#264) - Fix panic during deserialization of malformed messages (#278 #297)
The first release of Exonum.