From 3b15c4f0d7bbd4c0138060a85dacce5711ba1b1c Mon Sep 17 00:00:00 2001
From: fsword
Date: Sat, 23 Feb 2019 14:44:29 -0800
Subject: [PATCH 01/12] Wrong tag/branch name
there is no tag or branch named "1.6.2", I think it should be "v1.6.2"?
---
Docker/README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Docker/README.md b/Docker/README.md
index 45459b11b4b..9e01fe71f65 100644
--- a/Docker/README.md
+++ b/Docker/README.md
@@ -23,7 +23,7 @@ docker build . -t eosio/eos
The above will build off the most recent commit to the master branch by default. If you would like to target a specific branch/tag, you may use a build argument. For example, if you wished to generate a docker image based off of the 1.6.2 tag, you could do the following:
```bash
-docker build -t eosio/eos:v1.6.2 --build-arg branch=1.6.2 .
+docker build -t eosio/eos:v1.6.2 --build-arg branch=v1.6.2 .
```
By default, the symbol in eosio.system is set to SYS. You can override this using the symbol argument while building the docker image.
From 7c1e14a81af8cf0f9da8e64774f411f4ccacc8f7 Mon Sep 17 00:00:00 2001
From: Kevin Heifner
Date: Tue, 5 Mar 2019 09:00:21 -0500
Subject: [PATCH 02/12] Call recover keys before transactions execution so
trx->sig_cpu_usage is set correctly
---
libraries/chain/controller.cpp | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp
index 2d2af25f0c1..8be2fa4ad7e 100644
--- a/libraries/chain/controller.cpp
+++ b/libraries/chain/controller.cpp
@@ -999,6 +999,9 @@ struct controller_impl {
transaction_trace_ptr trace;
try {
auto start = fc::time_point::now();
+ const bool check_auth = !self.skip_auth_check() && !trx->implicit;
+ // call recover keys so that trx->sig_cpu_usage is set correctly
+ const flat_set& recovered_keys = check_auth ? trx->recover_keys( chain_id ) : flat_set();
if( !explicit_billed_cpu_time ) {
fc::microseconds already_consumed_time( EOS_PERCENT(trx->sig_cpu_usage.count(), conf.sig_cpu_bill_pct) );
@@ -1031,10 +1034,10 @@ struct controller_impl {
trx_context.delay = fc::seconds(trn.delay_sec);
- if( !self.skip_auth_check() && !trx->implicit ) {
+ if( check_auth ) {
authorization.check_authorization(
trn.actions,
- trx->recover_keys( chain_id ),
+ recovered_keys,
{},
trx_context.delay,
[](){}
From 12d996150d233bff65d6bcc328e742a6d564b0cf Mon Sep 17 00:00:00 2001
From: Kevin Heifner
Date: Tue, 5 Mar 2019 16:23:34 -0500
Subject: [PATCH 03/12] Consolidated Security Fixes for 1.6.3
- Fix small memory leak in net_plugin.
- Add additional deadline checks to transaction authorization.
---
libraries/chain/controller.cpp | 4 +---
plugins/net_plugin/net_plugin.cpp | 17 ++++++++++++++++-
2 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp
index 2d2af25f0c1..cf904d6fb5b 100644
--- a/libraries/chain/controller.cpp
+++ b/libraries/chain/controller.cpp
@@ -1037,9 +1037,7 @@ struct controller_impl {
trx->recover_keys( chain_id ),
{},
trx_context.delay,
- [](){}
- /*std::bind(&transaction_context::add_cpu_usage_and_check_time, &trx_context,
- std::placeholders::_1)*/,
+ [&trx_context](){ trx_context.checktime(); },
false
);
}
diff --git a/plugins/net_plugin/net_plugin.cpp b/plugins/net_plugin/net_plugin.cpp
index 1b398a8b53a..ab36d06cc6a 100644
--- a/plugins/net_plugin/net_plugin.cpp
+++ b/plugins/net_plugin/net_plugin.cpp
@@ -724,6 +724,7 @@ namespace eosio {
void rejected_block(const block_id_type& id);
void recv_block(const connection_ptr& conn, const block_id_type& msg, uint32_t bnum);
+ void expire_blocks( uint32_t bnum );
void recv_transaction(const connection_ptr& conn, const transaction_id_type& id);
void recv_notice(const connection_ptr& conn, const notice_message& msg, bool generated);
@@ -1656,11 +1657,23 @@ namespace eosio {
}
void dispatch_manager::rejected_block(const block_id_type& id) {
- fc_dlog(logger,"not sending rejected transaction ${tid}",("tid",id));
+ fc_dlog( logger, "rejected block ${id}", ("id", id) );
auto range = received_blocks.equal_range(id);
received_blocks.erase(range.first, range.second);
}
+ void dispatch_manager::expire_blocks( uint32_t lib_num ) {
+ for( auto i = received_blocks.begin(); i != received_blocks.end(); ) {
+ const block_id_type& blk_id = i->first;
+ uint32_t blk_num = block_header::num_from_id( blk_id );
+ if( blk_num <= lib_num ) {
+ i = received_blocks.erase( i );
+ } else {
+ ++i;
+ }
+ }
+ }
+
void dispatch_manager::bcast_transaction(const transaction_metadata_ptr& ptrx) {
std::set skips;
const auto& id = ptrx->id;
@@ -2565,6 +2578,7 @@ namespace eosio {
}
else {
sync_master->rejected_block(c, blk_num);
+ dispatcher->rejected_block( blk_id );
}
}
@@ -2626,6 +2640,7 @@ namespace eosio {
controller& cc = chain_plug->chain();
uint32_t lib = cc.last_irreversible_block_num();
+ dispatcher->expire_blocks( lib );
for ( auto &c : connections ) {
auto &stale_txn = c->trx_state.get();
stale_txn.erase( stale_txn.lower_bound(1), stale_txn.upper_bound(lib) );
From bf85b4fcea6527882a0217fc0adab02cd3cd5bc2 Mon Sep 17 00:00:00 2001
From: Kevin Heifner
Date: Wed, 6 Mar 2019 17:14:48 -0500
Subject: [PATCH 04/12] Bump version to 1.6.3
---
CMakeLists.txt | 2 +-
Docker/README.md | 4 ++--
README.md | 16 ++++++++--------
3 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e35a98973f4..3a03c7b0ed2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -35,7 +35,7 @@ set( CXX_STANDARD_REQUIRED ON)
set(VERSION_MAJOR 1)
set(VERSION_MINOR 6)
-set(VERSION_PATCH 2)
+set(VERSION_PATCH 3)
if(VERSION_SUFFIX)
set(VERSION_FULL "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_SUFFIX}")
diff --git a/Docker/README.md b/Docker/README.md
index 9e01fe71f65..f697f1862a0 100644
--- a/Docker/README.md
+++ b/Docker/README.md
@@ -20,10 +20,10 @@ cd eos/Docker
docker build . -t eosio/eos
```
-The above will build off the most recent commit to the master branch by default. If you would like to target a specific branch/tag, you may use a build argument. For example, if you wished to generate a docker image based off of the 1.6.2 tag, you could do the following:
+The above will build off the most recent commit to the master branch by default. If you would like to target a specific branch/tag, you may use a build argument. For example, if you wished to generate a docker image based off of the 1.6.3 tag, you could do the following:
```bash
-docker build -t eosio/eos:v1.6.2 --build-arg branch=v1.6.2 .
+docker build -t eosio/eos:v1.6.3 --build-arg branch=v1.6.3 .
```
By default, the symbol in eosio.system is set to SYS. You can override this using the symbol argument while building the docker image.
diff --git a/README.md b/README.md
index 3009bfb4c01..9b39e234348 100644
--- a/README.md
+++ b/README.md
@@ -39,13 +39,13 @@ $ brew remove eosio
```
#### Ubuntu 18.04 Debian Package Install
```sh
-$ wget https://github.com/eosio/eos/releases/download/v1.6.2/eosio_1.6.2-1-ubuntu-18.04_amd64.deb
-$ sudo apt install ./eosio_1.6.2-1-ubuntu-18.04_amd64.deb
+$ wget https://github.com/eosio/eos/releases/download/v1.6.3/eosio_1.6.3-1-ubuntu-18.04_amd64.deb
+$ sudo apt install ./eosio_1.6.3-1-ubuntu-18.04_amd64.deb
```
#### Ubuntu 16.04 Debian Package Install
```sh
-$ wget https://github.com/eosio/eos/releases/download/v1.6.2/eosio_1.6.2-1-ubuntu-16.04_amd64.deb
-$ sudo apt install ./eosio_1.6.2-1-ubuntu-16.04_amd64.deb
+$ wget https://github.com/eosio/eos/releases/download/v1.6.3/eosio_1.6.3-1-ubuntu-16.04_amd64.deb
+$ sudo apt install ./eosio_1.6.3-1-ubuntu-16.04_amd64.deb
```
#### Debian Package Uninstall
```sh
@@ -53,8 +53,8 @@ $ sudo apt remove eosio
```
#### Centos RPM Package Install
```sh
-$ wget https://github.com/eosio/eos/releases/download/v1.6.2/eosio-1.6.2-1.el7.x86_64.rpm
-$ sudo yum install ./eosio-1.6.2-1.el7.x86_64.rpm
+$ wget https://github.com/eosio/eos/releases/download/v1.6.3/eosio-1.6.3-1.el7.x86_64.rpm
+$ sudo yum install ./eosio-1.6.3-1.el7.x86_64.rpm
```
#### Centos RPM Package Uninstall
```sh
@@ -62,8 +62,8 @@ $ sudo yum remove eosio.cdt
```
#### Fedora RPM Package Install
```sh
-$ wget https://github.com/eosio/eos/releases/download/v1.6.2/eosio-1.6.2-1.fc27.x86_64.rpm
-$ sudo yum install ./eosio-1.6.2-1.fc27.x86_64.rpm
+$ wget https://github.com/eosio/eos/releases/download/v1.6.3/eosio-1.6.3-1.fc27.x86_64.rpm
+$ sudo yum install ./eosio-1.6.3-1.fc27.x86_64.rpm
```
#### Fedora RPM Package Uninstall
```sh
From ac3051a4f34d3c665eb90d67252aff4cdcc5255b Mon Sep 17 00:00:00 2001
From: Matt Witherspoon <32485495+spoonincode@users.noreply.github.com>
Date: Fri, 29 Mar 2019 14:28:25 -0400
Subject: [PATCH 05/12] disable asio's experimental string_view usage on macos
Newer stdlibc++s can #error in experimental string_view
---
CMakeLists.txt | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3a03c7b0ed2..a15bd29f9c9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -126,6 +126,11 @@ FIND_PACKAGE(Boost 1.67 REQUIRED COMPONENTS
locale
iostreams)
+# Some new stdlibc++s will #error on ; a problem for boost pre-1.69
+if( APPLE AND UNIX )
+ add_definitions(-DBOOST_ASIO_DISABLE_STD_EXPERIMENTAL_STRING_VIEW)
+endif()
+
if( WIN32 )
message( STATUS "Configuring EOSIO on WIN32")
From 3a221ce45b6dbedd937fa7713334b21b48e407db Mon Sep 17 00:00:00 2001
From: Matt Witherspoon <32485495+spoonincode@users.noreply.github.com>
Date: Fri, 29 Mar 2019 17:55:20 -0400
Subject: [PATCH 06/12] fc sync - Remove fc::shared_ptr & refactor logging code
to not use it
---
libraries/fc | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/libraries/fc b/libraries/fc
index b2fa419ddf6..456b588290d 160000
--- a/libraries/fc
+++ b/libraries/fc
@@ -1 +1 @@
-Subproject commit b2fa419ddf68c6b5fc902de53cf8e691206cc8f3
+Subproject commit 456b588290d0e109a155b0dd9fdf7ec01163380a
From 920e81ffd07f6de0b950db54729e8a18adf73abb Mon Sep 17 00:00:00 2001
From: Matt Witherspoon <32485495+spoonincode@users.noreply.github.com>
Date: Fri, 29 Mar 2019 18:00:15 -0400
Subject: [PATCH 07/12] chainbase sync - Remove boost thread and locking code
---
libraries/chain/controller.cpp | 9 +--------
libraries/chainbase | 2 +-
2 files changed, 2 insertions(+), 9 deletions(-)
diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp
index 0c2ee1a05db..8f1f7291773 100644
--- a/libraries/chain/controller.cpp
+++ b/libraries/chain/controller.cpp
@@ -423,14 +423,7 @@ struct controller_impl {
void clear_all_undo() {
// Rewind the database to the last irreversible block
- db.with_write_lock([&] {
- db.undo_all();
- /*
- FC_ASSERT(db.revision() == self.head_block_num(),
- "Chainbase revision does not match head block num",
- ("rev", db.revision())("head_block", self.head_block_num()));
- */
- });
+ db.undo_all();
}
void add_contract_tables_to_snapshot( const snapshot_writer_ptr& snapshot ) const {
diff --git a/libraries/chainbase b/libraries/chainbase
index 8ca96ad6b18..5d8c0e1efeb 160000
--- a/libraries/chainbase
+++ b/libraries/chainbase
@@ -1 +1 @@
-Subproject commit 8ca96ad6b18709d65a7d1f67f8893978f25babcf
+Subproject commit 5d8c0e1efeb71c6bc1b7953b437507cfd233f278
From b01684c741d7ba8c3da9f7b1d803fb4939e09a0c Mon Sep 17 00:00:00 2001
From: Kevin Heifner
Date: Fri, 29 Mar 2019 15:59:30 -0500
Subject: [PATCH 08/12] Fix for close() called while async_read in-flight
---
plugins/net_plugin/net_plugin.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/plugins/net_plugin/net_plugin.cpp b/plugins/net_plugin/net_plugin.cpp
index ab36d06cc6a..19c3d09e39c 100644
--- a/plugins/net_plugin/net_plugin.cpp
+++ b/plugins/net_plugin/net_plugin.cpp
@@ -831,7 +831,6 @@ namespace eosio {
fc_dlog(logger, "canceling wait on ${p}", ("p",peer_name()));
cancel_wait();
if( read_delay_timer ) read_delay_timer->cancel();
- pending_message_buffer.reset();
}
void connection::txn_send_pending(const vector& ids) {
@@ -1898,6 +1897,7 @@ namespace eosio {
auto current_endpoint = *endpoint_itr;
++endpoint_itr;
c->connecting = true;
+ c->pending_message_buffer.reset();
connection_wptr weak_conn = c;
c->socket->async_connect( current_endpoint, [weak_conn, endpoint_itr, this] ( const boost::system::error_code& err ) {
auto c = weak_conn.lock();
@@ -2067,7 +2067,7 @@ namespace eosio {
conn->pending_message_buffer.get_buffer_sequence_for_boost_async_read(), completion_handler,
[this,weak_conn]( boost::system::error_code ec, std::size_t bytes_transferred ) {
auto conn = weak_conn.lock();
- if (!conn) {
+ if (!conn || !conn->connected()) {
return;
}
From 6584f17a2dd04a79661b2cb669cfa31e3548bee4 Mon Sep 17 00:00:00 2001
From: Kevin Heifner
Date: Fri, 29 Mar 2019 17:36:31 -0500
Subject: [PATCH 09/12] Can't call connected(), it checks flag that is only set
after first read
---
plugins/net_plugin/net_plugin.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/plugins/net_plugin/net_plugin.cpp b/plugins/net_plugin/net_plugin.cpp
index 19c3d09e39c..5641c661efb 100644
--- a/plugins/net_plugin/net_plugin.cpp
+++ b/plugins/net_plugin/net_plugin.cpp
@@ -2067,7 +2067,7 @@ namespace eosio {
conn->pending_message_buffer.get_buffer_sequence_for_boost_async_read(), completion_handler,
[this,weak_conn]( boost::system::error_code ec, std::size_t bytes_transferred ) {
auto conn = weak_conn.lock();
- if (!conn || !conn->connected()) {
+ if (!conn || !conn->socket || !conn->socket->is_open()) {
return;
}
From 53fca5066db0e9d0fea94af085a63edd98683e90 Mon Sep 17 00:00:00 2001
From: arhag
Date: Tue, 2 Apr 2019 14:25:48 -0400
Subject: [PATCH 10/12] print action traces in cleos even if nonmandatory
fields are missing
---
programs/cleos/main.cpp | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/programs/cleos/main.cpp b/programs/cleos/main.cpp
index 7abce5f79da..8a65bfd110c 100644
--- a/programs/cleos/main.cpp
+++ b/programs/cleos/main.cpp
@@ -438,9 +438,11 @@ bytes json_or_file_to_bin( const account_name& account, const action_name& actio
void print_action_tree( const fc::variant& action ) {
print_action( action );
- const auto& inline_traces = action["inline_traces"].get_array();
- for( const auto& t : inline_traces ) {
- print_action_tree( t );
+ if( action.get_object().contains( "inline_traces" ) ) {
+ const auto& inline_traces = action["inline_traces"].get_array();
+ for( const auto& t : inline_traces ) {
+ print_action_tree( t );
+ }
}
}
@@ -448,12 +450,13 @@ void print_result( const fc::variant& result ) { try {
if (result.is_object() && result.get_object().contains("processed")) {
const auto& processed = result["processed"];
const auto& transaction_id = processed["id"].as_string();
- string status = processed["receipt"].is_object() ? processed["receipt"]["status"].as_string() : "failed";
+ string status = "failed";
int64_t net = -1;
int64_t cpu = -1;
if( processed.get_object().contains( "receipt" )) {
const auto& receipt = processed["receipt"];
if( receipt.is_object()) {
+ status = receipt["status"].as_string();
net = receipt["net_usage_words"].as_int64() * 8;
cpu = receipt["cpu_usage_us"].as_int64();
}
From bf33876e10489a59ce1e0dc57580379ddb206a56 Mon Sep 17 00:00:00 2001
From: Kevin Heifner
Date: Tue, 2 Apr 2019 19:26:07 -0400
Subject: [PATCH 11/12] Consolidated Security Fixes for 1.6.4
- net_plugin security fixes
---
plugins/net_plugin/net_plugin.cpp | 45 +++++--------------------------
1 file changed, 7 insertions(+), 38 deletions(-)
diff --git a/plugins/net_plugin/net_plugin.cpp b/plugins/net_plugin/net_plugin.cpp
index 5641c661efb..07588b7c171 100644
--- a/plugins/net_plugin/net_plugin.cpp
+++ b/plugins/net_plugin/net_plugin.cpp
@@ -577,9 +577,6 @@ namespace eosio {
const string peer_name();
- void txn_send_pending(const vector& ids);
- void txn_send(const vector& txn_lis);
-
void blk_send_branch();
void blk_send(const block_id_type& blkid);
void stop_send();
@@ -833,26 +830,6 @@ namespace eosio {
if( read_delay_timer ) read_delay_timer->cancel();
}
- void connection::txn_send_pending(const vector& ids) {
- const std::set known_ids(ids.cbegin(), ids.cend());
- my_impl->expire_local_txns();
- for(auto tx = my_impl->local_txns.begin(); tx != my_impl->local_txns.end(); ++tx ){
- const bool found = known_ids.find( tx->id ) != known_ids.cend();
- if( !found ) {
- queue_write( tx->serialized_txn, true, []( boost::system::error_code ec, std::size_t ) {} );
- }
- }
- }
-
- void connection::txn_send(const vector& ids) {
- for(const auto& t : ids) {
- auto tx = my_impl->local_txns.get().find(t);
- if( tx != my_impl->local_txns.end() ) {
- queue_write( tx->serialized_txn, true, []( boost::system::error_code ec, std::size_t ) {} );
- }
- }
- }
-
void connection::blk_send_branch() {
controller& cc = my_impl->chain_plug->chain();
uint32_t head_num = cc.fork_db_head_block_num();
@@ -2375,17 +2352,6 @@ namespace eosio {
break;
}
case catch_up : {
- if( msg.known_trx.pending > 0) {
- // plan to get all except what we already know about.
- req.req_trx.mode = catch_up;
- send_req = true;
- size_t known_sum = local_txns.size();
- if( known_sum ) {
- for( const auto& t : local_txns.get() ) {
- req.req_trx.ids.push_back( t.id );
- }
- }
- }
break;
}
case normal: {
@@ -2443,14 +2409,17 @@ namespace eosio {
switch (msg.req_trx.mode) {
case catch_up :
- c->txn_send_pending(msg.req_trx.ids);
- break;
- case normal :
- c->txn_send(msg.req_trx.ids);
break;
case none :
if(msg.req_blocks.mode == none)
c->stop_send();
+ // no break
+ case normal :
+ if( !msg.req_trx.ids.empty() ) {
+ elog( "Invalid request_message, req_trx.ids.size ${s}", ("s", msg.req_trx.ids.size()) );
+ close(c);
+ return;
+ }
break;
default:;
}
From 4d85e7e88b04a0cfdf6904fd42a9ee477070f724 Mon Sep 17 00:00:00 2001
From: Kevin Heifner
Date: Tue, 2 Apr 2019 19:35:57 -0400
Subject: [PATCH 12/12] Bump version to 1.6.4
---
CMakeLists.txt | 2 +-
Docker/README.md | 4 ++--
README.md | 16 ++++++++--------
3 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index a15bd29f9c9..c73c0eff83c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -35,7 +35,7 @@ set( CXX_STANDARD_REQUIRED ON)
set(VERSION_MAJOR 1)
set(VERSION_MINOR 6)
-set(VERSION_PATCH 3)
+set(VERSION_PATCH 4)
if(VERSION_SUFFIX)
set(VERSION_FULL "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_SUFFIX}")
diff --git a/Docker/README.md b/Docker/README.md
index f697f1862a0..38fc82cf43b 100644
--- a/Docker/README.md
+++ b/Docker/README.md
@@ -20,10 +20,10 @@ cd eos/Docker
docker build . -t eosio/eos
```
-The above will build off the most recent commit to the master branch by default. If you would like to target a specific branch/tag, you may use a build argument. For example, if you wished to generate a docker image based off of the 1.6.3 tag, you could do the following:
+The above will build off the most recent commit to the master branch by default. If you would like to target a specific branch/tag, you may use a build argument. For example, if you wished to generate a docker image based off of the 1.6.4 tag, you could do the following:
```bash
-docker build -t eosio/eos:v1.6.3 --build-arg branch=v1.6.3 .
+docker build -t eosio/eos:v1.6.4 --build-arg branch=v1.6.4 .
```
By default, the symbol in eosio.system is set to SYS. You can override this using the symbol argument while building the docker image.
diff --git a/README.md b/README.md
index 9b39e234348..49b8a7554b0 100644
--- a/README.md
+++ b/README.md
@@ -39,13 +39,13 @@ $ brew remove eosio
```
#### Ubuntu 18.04 Debian Package Install
```sh
-$ wget https://github.com/eosio/eos/releases/download/v1.6.3/eosio_1.6.3-1-ubuntu-18.04_amd64.deb
-$ sudo apt install ./eosio_1.6.3-1-ubuntu-18.04_amd64.deb
+$ wget https://github.com/eosio/eos/releases/download/v1.6.4/eosio_1.6.4-1-ubuntu-18.04_amd64.deb
+$ sudo apt install ./eosio_1.6.4-1-ubuntu-18.04_amd64.deb
```
#### Ubuntu 16.04 Debian Package Install
```sh
-$ wget https://github.com/eosio/eos/releases/download/v1.6.3/eosio_1.6.3-1-ubuntu-16.04_amd64.deb
-$ sudo apt install ./eosio_1.6.3-1-ubuntu-16.04_amd64.deb
+$ wget https://github.com/eosio/eos/releases/download/v1.6.4/eosio_1.6.4-1-ubuntu-16.04_amd64.deb
+$ sudo apt install ./eosio_1.6.4-1-ubuntu-16.04_amd64.deb
```
#### Debian Package Uninstall
```sh
@@ -53,8 +53,8 @@ $ sudo apt remove eosio
```
#### Centos RPM Package Install
```sh
-$ wget https://github.com/eosio/eos/releases/download/v1.6.3/eosio-1.6.3-1.el7.x86_64.rpm
-$ sudo yum install ./eosio-1.6.3-1.el7.x86_64.rpm
+$ wget https://github.com/eosio/eos/releases/download/v1.6.4/eosio-1.6.4-1.el7.x86_64.rpm
+$ sudo yum install ./eosio-1.6.4-1.el7.x86_64.rpm
```
#### Centos RPM Package Uninstall
```sh
@@ -62,8 +62,8 @@ $ sudo yum remove eosio.cdt
```
#### Fedora RPM Package Install
```sh
-$ wget https://github.com/eosio/eos/releases/download/v1.6.3/eosio-1.6.3-1.fc27.x86_64.rpm
-$ sudo yum install ./eosio-1.6.3-1.fc27.x86_64.rpm
+$ wget https://github.com/eosio/eos/releases/download/v1.6.4/eosio-1.6.4-1.fc27.x86_64.rpm
+$ sudo yum install ./eosio-1.6.4-1.fc27.x86_64.rpm
```
#### Fedora RPM Package Uninstall
```sh