提交 ebcf4e12 编写于 作者: D Daniel Larimer

Fix #1848 - signatures no include CFA data if it is present, otherwise are unchanged

上级 360e3329
...@@ -8,11 +8,6 @@ ...@@ -8,11 +8,6 @@
#include "test_multi_index.cpp" #include "test_multi_index.cpp"
extern "C" { extern "C" {
void init() {
}
void apply( uint64_t receiver, uint64_t code, uint64_t action ) { void apply( uint64_t receiver, uint64_t code, uint64_t action ) {
WASM_TEST_HANDLER_EX(test_multi_index, idx64_general); WASM_TEST_HANDLER_EX(test_multi_index, idx64_general);
......
...@@ -260,7 +260,7 @@ transaction_trace chain_controller::_push_transaction(const packed_transaction& ...@@ -260,7 +260,7 @@ transaction_trace chain_controller::_push_transaction(const packed_transaction&
{ try { { try {
transaction_metadata mtrx( trx, get_chain_id(), head_block_time()); transaction_metadata mtrx( trx, get_chain_id(), head_block_time());
check_transaction_authorization(mtrx.trx(), trx.signatures); check_transaction_authorization(mtrx.trx(), trx.signatures, trx.context_free_data);
auto result = _push_transaction(std::move(mtrx)); auto result = _push_transaction(std::move(mtrx));
// notify anyone listening to pending transactions // notify anyone listening to pending transactions
...@@ -833,9 +833,10 @@ void chain_controller::check_authorization( const vector<action>& actions, ...@@ -833,9 +833,10 @@ void chain_controller::check_authorization( const vector<action>& actions,
void chain_controller::check_transaction_authorization(const transaction& trx, void chain_controller::check_transaction_authorization(const transaction& trx,
const vector<signature_type>& signatures, const vector<signature_type>& signatures,
const vector<bytes>& cfd,
bool allow_unused_signatures)const bool allow_unused_signatures)const
{ {
check_authorization( trx.actions, trx.get_signature_keys( signatures, chain_id_type{} ), allow_unused_signatures ); check_authorization( trx.actions, trx.get_signature_keys( signatures, chain_id_type{}, cfd ), allow_unused_signatures );
} }
optional<permission_name> chain_controller::lookup_minimum_permission(account_name authorizer_account, optional<permission_name> chain_controller::lookup_minimum_permission(account_name authorizer_account,
......
...@@ -339,6 +339,7 @@ namespace eosio { namespace chain { ...@@ -339,6 +339,7 @@ namespace eosio { namespace chain {
void check_transaction_authorization(const transaction& trx, void check_transaction_authorization(const transaction& trx,
const vector<signature_type>& signatures, const vector<signature_type>& signatures,
const vector<bytes>& cfd = vector<bytes>(),
bool allow_unused_signatures = false)const; bool allow_unused_signatures = false)const;
......
...@@ -138,8 +138,8 @@ namespace eosio { namespace chain { ...@@ -138,8 +138,8 @@ namespace eosio { namespace chain {
vector<action> actions; vector<action> actions;
transaction_id_type id()const; transaction_id_type id()const;
digest_type sig_digest( const chain_id_type& chain_id )const; digest_type sig_digest( const chain_id_type& chain_id, const vector<bytes>& cfd = vector<bytes>() )const;
flat_set<public_key_type> get_signature_keys( const vector<signature_type>& signatures, const chain_id_type& chain_id )const; flat_set<public_key_type> get_signature_keys( const vector<signature_type>& signatures, const chain_id_type& chain_id, const vector<bytes>& cfd = vector<bytes>() )const;
}; };
......
...@@ -64,20 +64,22 @@ transaction_id_type transaction::id() const { ...@@ -64,20 +64,22 @@ transaction_id_type transaction::id() const {
} }
digest_type transaction::sig_digest( const chain_id_type& chain_id )const { digest_type transaction::sig_digest( const chain_id_type& chain_id, const vector<bytes>& cfd )const {
digest_type::encoder enc; digest_type::encoder enc;
fc::raw::pack( enc, chain_id ); fc::raw::pack( enc, chain_id );
fc::raw::pack( enc, *this ); fc::raw::pack( enc, *this );
if( cfd.size() )
fc::raw::pack( enc, cfd );
return enc.result(); return enc.result();
} }
flat_set<public_key_type> transaction::get_signature_keys( const vector<signature_type>& signatures, const chain_id_type& chain_id )const flat_set<public_key_type> transaction::get_signature_keys( const vector<signature_type>& signatures, const chain_id_type& chain_id, const vector<bytes>& cfd )const
{ try { { try {
using boost::adaptors::transformed; using boost::adaptors::transformed;
constexpr size_t recovery_cache_size = 100000; constexpr size_t recovery_cache_size = 100000;
static recovery_cache_type recovery_cache; static recovery_cache_type recovery_cache;
const digest_type digest = sig_digest(chain_id); const digest_type digest = sig_digest(chain_id, cfd);
flat_set<public_key_type> recovered_pub_keys; flat_set<public_key_type> recovered_pub_keys;
for(const signature_type& sig : signatures) { for(const signature_type& sig : signatures) {
...@@ -100,17 +102,17 @@ flat_set<public_key_type> transaction::get_signature_keys( const vector<signatur ...@@ -100,17 +102,17 @@ flat_set<public_key_type> transaction::get_signature_keys( const vector<signatur
const signature_type& signed_transaction::sign(const private_key_type& key, const chain_id_type& chain_id) { const signature_type& signed_transaction::sign(const private_key_type& key, const chain_id_type& chain_id) {
signatures.push_back(key.sign(sig_digest(chain_id))); signatures.push_back(key.sign(sig_digest(chain_id, context_free_data)));
return signatures.back(); return signatures.back();
} }
signature_type signed_transaction::sign(const private_key_type& key, const chain_id_type& chain_id)const { signature_type signed_transaction::sign(const private_key_type& key, const chain_id_type& chain_id)const {
return key.sign(sig_digest(chain_id)); return key.sign(sig_digest(chain_id, context_free_data));
} }
flat_set<public_key_type> signed_transaction::get_signature_keys( const chain_id_type& chain_id )const flat_set<public_key_type> signed_transaction::get_signature_keys( const chain_id_type& chain_id )const
{ {
return transaction::get_signature_keys(signatures, chain_id); return transaction::get_signature_keys(signatures, chain_id, context_free_data);
} }
namespace bio = boost::iostreams; namespace bio = boost::iostreams;
......
...@@ -397,7 +397,7 @@ namespace eosio { namespace testing { ...@@ -397,7 +397,7 @@ namespace eosio { namespace testing {
void base_tester::set_code( account_name account, const char* wast ) try { void base_tester::set_code( account_name account, const char* wast ) try {
set_code(account, wast_to_wasm(wast)); set_code(account, wast_to_wasm(wast));
} FC_CAPTURE_AND_RETHROW( (account)(wast) ) } FC_CAPTURE_AND_RETHROW( (account) )
void base_tester::set_code( account_name account, const vector<uint8_t> wasm ) try { void base_tester::set_code( account_name account, const vector<uint8_t> wasm ) try {
signed_transaction trx; signed_transaction trx;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册