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

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

上级 360e3329
......@@ -8,11 +8,6 @@
#include "test_multi_index.cpp"
extern "C" {
void init() {
}
void apply( uint64_t receiver, uint64_t code, uint64_t action ) {
WASM_TEST_HANDLER_EX(test_multi_index, idx64_general);
......
......@@ -260,7 +260,7 @@ transaction_trace chain_controller::_push_transaction(const packed_transaction&
{ try {
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));
// notify anyone listening to pending transactions
......@@ -833,9 +833,10 @@ void chain_controller::check_authorization( const vector<action>& actions,
void chain_controller::check_transaction_authorization(const transaction& trx,
const vector<signature_type>& signatures,
const vector<bytes>& cfd,
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,
......
......@@ -339,6 +339,7 @@ namespace eosio { namespace chain {
void check_transaction_authorization(const transaction& trx,
const vector<signature_type>& signatures,
const vector<bytes>& cfd = vector<bytes>(),
bool allow_unused_signatures = false)const;
......
......@@ -138,8 +138,8 @@ namespace eosio { namespace chain {
vector<action> actions;
transaction_id_type id()const;
digest_type sig_digest( 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;
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 vector<bytes>& cfd = vector<bytes>() )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;
fc::raw::pack( enc, chain_id );
fc::raw::pack( enc, *this );
if( cfd.size() )
fc::raw::pack( enc, cfd );
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 {
using boost::adaptors::transformed;
constexpr size_t recovery_cache_size = 100000;
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;
for(const signature_type& sig : signatures) {
......@@ -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) {
signatures.push_back(key.sign(sig_digest(chain_id)));
signatures.push_back(key.sign(sig_digest(chain_id, context_free_data)));
return signatures.back();
}
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
{
return transaction::get_signature_keys(signatures, chain_id);
return transaction::get_signature_keys(signatures, chain_id, context_free_data);
}
namespace bio = boost::iostreams;
......
......@@ -397,7 +397,7 @@ namespace eosio { namespace testing {
void base_tester::set_code( account_name account, const char* wast ) try {
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 {
signed_transaction trx;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册