未验证 提交 111f66c9 编写于 作者: W wanderingbort 提交者: GitHub

Merge pull request #2126 from EOSIO/1972-transaction-mroot

Changes to transaction receipt and transaction_mroot
......@@ -84,7 +84,7 @@ void apply_context::exec_one()
}
}
results.applied_actions.emplace_back(action_trace {receiver, context_free, _cpu_usage, act, _pending_console_output.str(), 0, 0, move(data_access)});
results.applied_actions.emplace_back(action_trace {receiver, context_free, _cpu_usage, act, _pending_console_output.str(), move(data_access)});
_pending_console_output = std::ostringstream();
_read_locks.clear();
_write_scopes.clear();
......
......@@ -43,20 +43,4 @@ namespace eosio { namespace chain {
return signee() == expected_signee;
}
checksum256_type signed_block_summary::calculate_transaction_mroot()const {
vector<digest_type> merkle_of_each_shard;
for(const region_summary& rs : regions) {
for(const cycle& cs : rs.cycles_summary) {
for(const shard_summary& ss: cs) {
vector<digest_type> merkle_list_for_txns_in_shard;
for(const transaction_receipt& tr : ss.transactions) {
merkle_list_for_txns_in_shard.emplace_back(tr.id);
}
merkle_of_each_shard.emplace_back( merkle(std::move(merkle_list_for_txns_in_shard)) );
}
}
}
return merkle( std::move(merkle_of_each_shard) );
}
} }
......@@ -11,42 +11,70 @@
namespace eosio { namespace chain {
void shard_trace::finalize_shard() {
static const size_t GUESS_ACTS_PER_TX = 10;
{
static const size_t GUESS_ACTS_PER_TX = 10;
vector<digest_type> action_roots;
cpu_usage = 0;
action_roots.reserve(transaction_traces.size() * GUESS_ACTS_PER_TX);
for (const auto& tx :transaction_traces) {
for (const auto& at: tx.action_traces) {
digest_type::encoder enc;
uint64_t region_id = tx.region_id;
uint64_t cycle_index = tx.cycle_index;
vector<digest_type> action_roots;
cpu_usage = 0;
action_roots.reserve(transaction_traces.size() * GUESS_ACTS_PER_TX);
for (const auto& tx :transaction_traces) {
for (const auto& at: tx.action_traces) {
digest_type::encoder enc;
fc::raw::pack(enc, at.receiver);
fc::raw::pack(enc, at.act.account);
fc::raw::pack(enc, at.act.name);
fc::raw::pack(enc, at.act.data);
fc::raw::pack(enc, region_id);
fc::raw::pack(enc, cycle_index);
fc::raw::pack(enc, at.data_access);
fc::raw::pack(enc, at.receiver);
fc::raw::pack(enc, at.act.account);
fc::raw::pack(enc, at.act.name);
fc::raw::pack(enc, at.act.data);
fc::raw::pack(enc, at.region_id);
fc::raw::pack(enc, at.cycle_index);
fc::raw::pack(enc, at.data_access);
action_roots.emplace_back(enc.result());
action_roots.emplace_back(enc.result());
cpu_usage += at.cpu_usage;
}
}
shard_action_root = merkle(action_roots);
}
cpu_usage += at.cpu_usage;
{
vector<digest_type> trx_roots;
trx_roots.reserve(transaction_traces.size());
for( uint64_t trx_index = 0, num_trxs = transaction_traces.size(); trx_index < num_trxs; ++trx_index ) {
const auto& tx = transaction_traces[trx_index];
digest_type::encoder enc;
uint64_t region_id = tx.region_id;
uint64_t cycle_index = tx.cycle_index;
uint64_t shard_index = tx.shard_index;
fc::raw::pack( enc, region_id ); // Technically redundant since it is included in the trx header, but can still be useful here.
fc::raw::pack( enc, cycle_index );
fc::raw::pack( enc, shard_index );
fc::raw::pack( enc, trx_index );
fc::raw::pack( enc, *static_cast<const transaction_receipt*>(&tx) );
if( tx.packed_trx_digest.valid() ) {
fc::raw::pack( enc, *tx.packed_trx_digest );
}
trx_roots.emplace_back(enc.result());
}
shard_transaction_root = merkle(trx_roots);
}
shard_root = merkle(action_roots);
}
digest_type block_trace::calculate_action_merkle_root()const {
vector<digest_type> shard_roots;
shard_roots.reserve(1024);
vector<digest_type> merkle_root_of_each_region; // Extra level of indirection is to allow parallel computation of region merkle roots
for(const auto& rt: region_traces ) {
vector<digest_type> merkle_list_for_region;
merkle_list_for_region.reserve(64);
for(const auto& ct: rt.cycle_traces ) {
for(const auto& st: ct.shard_traces) {
shard_roots.emplace_back(st.shard_root);
merkle_list_for_region.emplace_back(st.shard_action_root);
}
}
merkle_root_of_each_region.emplace_back( merkle(std::move(merkle_list_for_region)) );
}
return merkle(shard_roots);
return merkle( std::move(merkle_root_of_each_region) );
}
uint64_t block_trace::calculate_cpu_usage() const {
......@@ -62,4 +90,18 @@ namespace eosio { namespace chain {
return cpu_usage;
}
digest_type block_trace::calculate_transaction_merkle_root()const {
vector<digest_type> merkle_root_of_each_region; // Extra level of indirection is to allow parallel computation of region merkle roots
for( const auto& rt : region_traces ) {
vector<digest_type> merkle_list_for_region;
for( const auto& ct : rt.cycle_traces ) {
for( const auto& st: ct.shard_traces ) {
merkle_list_for_region.emplace_back(st.shard_transaction_root);
}
}
merkle_root_of_each_region.emplace_back( merkle(std::move(merkle_list_for_region)) );
}
return merkle( std::move(merkle_root_of_each_region) );
}
} }
......@@ -377,6 +377,8 @@ transaction_trace chain_controller::delayed_transaction_processing( const transa
FC_ASSERT(!payer.empty(), "Failed to find a payer for delayed transaction!");
update_resource_usage(result, mtrx);
auto sender_id = transaction_id_to_sender_id( mtrx.id );
const auto& generated_index = _db.get_index<generated_transaction_multi_index, by_sender_id>();
......@@ -661,7 +663,7 @@ signed_block chain_controller::_generate_block( block_timestamp_type when,
_pending_block->producer = producer_obj.owner;
_pending_block->previous = head_block_id();
_pending_block->block_mroot = get_dynamic_global_properties().block_merkle_root.get_root();
_pending_block->transaction_mroot = transaction_metadata::calculate_transaction_merkle_root( _pending_transaction_metas );
_pending_block->transaction_mroot = _pending_block_trace->calculate_transaction_merkle_root();
_pending_block->action_mroot = _pending_block_trace->calculate_action_merkle_root();
if( is_start_of_round( _pending_block->block_num() ) ) {
......@@ -892,6 +894,8 @@ void chain_controller::__apply_block(const signed_block& next_block)
auto *mtrx = make_metadata();
FC_ASSERT( mtrx->trx().region == r.region, "transaction was scheduled into wrong region" );
mtrx->region_id = r.region;
mtrx->cycle_index = cycle_index;
mtrx->shard_index = shard_index;
......@@ -904,9 +908,24 @@ void chain_controller::__apply_block(const signed_block& next_block)
} else {
s_trace.transaction_traces.emplace_back(delayed_transaction_processing(*mtrx));
}
auto& t_trace = s_trace.transaction_traces.back();
if( mtrx->raw_trx.valid() && !mtrx->is_implicit ) { // if an input transaction
t_trace.packed_trx_digest = mtrx->packed_digest;
}
t_trace.region_id = r.region;
t_trace.cycle_index = cycle_index;
t_trace.shard_index = shard_index;
EOS_ASSERT( receipt.status == s_trace.transaction_traces.back().status, tx_receipt_inconsistent_status,
"Received status of transaction from block (${rstatus}) does not match the applied transaction's status (${astatus})",
("rstatus",receipt.status)("astatus",s_trace.transaction_traces.back().status) );
EOS_ASSERT( receipt.kcpu_usage == s_trace.transaction_traces.back().kcpu_usage, tx_receipt_inconsistent_cpu,
"Received kcpu_usage of transaction from block (${rcpu}) does not match the applied transaction's kcpu_usage (${acpu})",
("rcpu",receipt.kcpu_usage)("acpu",s_trace.transaction_traces.back().kcpu_usage) );
EOS_ASSERT( receipt.net_usage_words == s_trace.transaction_traces.back().net_usage_words, tx_receipt_inconsistent_net,
"Received net_usage_words of transaction from block (${rnet}) does not match the applied transaction's net_usage_words (${anet})",
("rnet",receipt.net_usage_words)("anet",s_trace.transaction_traces.back().net_usage_words) );
} /// for each transaction id
......@@ -927,8 +946,8 @@ void chain_controller::__apply_block(const signed_block& next_block)
next_block_trace.region_traces.emplace_back(move(r_trace));
} /// for each region
FC_ASSERT(next_block.action_mroot == next_block_trace.calculate_action_merkle_root());
FC_ASSERT( transaction_metadata::calculate_transaction_merkle_root(input_metas) == next_block.transaction_mroot, "merkle root does not match" );
FC_ASSERT( next_block.action_mroot == next_block_trace.calculate_action_merkle_root(), "action merkle root does not match");
FC_ASSERT( next_block.transaction_mroot == next_block_trace.calculate_transaction_merkle_root(), "transaction merkle root does not match" );
_finalize_block( next_block_trace, signing_producer );
} FC_CAPTURE_AND_RETHROW( (next_block.block_num()) ) }
......@@ -1214,6 +1233,7 @@ static uint32_t calculate_transaction_cpu_usage( const transaction_trace& trace,
action_cpu_usage +
context_free_cpu_usage +
signature_cpu_usage;
actual_cpu_usage = ((actual_cpu_usage + 1023)/1024) * 1024; // Round up to nearest multiple of 1024
uint32_t cpu_usage_limit = meta.trx().max_kcpu_usage.value * 1024UL; // overflow checked in validate_transaction_without_state
EOS_ASSERT( cpu_usage_limit == 0 || actual_cpu_usage <= cpu_usage_limit, tx_resource_exhausted,
......@@ -1230,6 +1250,7 @@ static uint32_t calculate_transaction_net_usage( const transaction_trace& trace,
auto actual_net_usage = chain_configuration.base_per_transaction_net_usage +
meta.billable_packed_size +
lock_net_usage;
actual_net_usage = ((actual_net_usage + 7)/8) * 8; // Round up to nearest multiple of 8
uint32_t net_usage_limit = meta.trx().max_net_usage_words.value * 8UL; // overflow checked in validate_transaction_without_state
......@@ -1245,6 +1266,8 @@ void chain_controller::update_resource_usage( transaction_trace& trace, const tr
trace.cpu_usage = calculate_transaction_cpu_usage(trace, meta, chain_configuration);
trace.net_usage = calculate_transaction_net_usage(trace, meta, chain_configuration);
trace.kcpu_usage = trace.cpu_usage / 1024;
trace.net_usage_words = trace.net_usage / 8;
// enforce that the system controlled per tx limits are not violated
EOS_ASSERT(trace.cpu_usage <= chain_configuration.max_transaction_cpu_usage,
......@@ -2003,11 +2026,6 @@ transaction_trace chain_controller::_apply_error( transaction_metadata& meta ) {
uint32_t act_usage = result.action_traces.size();
for (auto &at: result.action_traces) {
at.region_id = meta.region_id;
at.cycle_index = meta.cycle_index;
}
update_resource_usage(result, meta);
record_transaction(meta.trx());
......@@ -2153,6 +2171,8 @@ transaction_trace chain_controller::wrap_transaction_processing( transaction_met
const transaction& trx = data.trx();
FC_ASSERT( trx.region == 0, "currently only region 0 is supported" );
//wdump((transaction_header(trx)));
auto temp_session = _db.start_undo_session(true);
......@@ -2170,6 +2190,14 @@ transaction_trace chain_controller::wrap_transaction_processing( transaction_met
bshard.transactions.emplace_back( result );
if( data.raw_trx.valid() && !data.is_implicit ) { // if an input transaction
result.packed_trx_digest = data.packed_digest;
}
result.region_id = 0; // Currently we only support region 0.
result.cycle_index = _pending_block->regions.back().cycles_summary.size() - 1;
result.shard_index = 0; // Currently we only have one shard per cycle.
bshard_trace.append(result);
// The transaction applied successfully. Merge its changes into the pending block session.
......
......@@ -98,7 +98,6 @@ namespace eosio { namespace chain {
*/
struct signed_block_summary : public signed_block_header {
vector<region_summary> regions;
checksum256_type calculate_transaction_mroot() const;
};
/**
......
......@@ -9,7 +9,8 @@
namespace eosio { namespace chain {
struct shard_trace {
digest_type shard_root;
digest_type shard_action_root;
digest_type shard_transaction_root;
vector<transaction_trace> transaction_traces;
uint64_t cpu_usage;
......@@ -44,13 +45,14 @@ namespace eosio { namespace chain {
vector<region_trace> region_traces;
vector<transaction> implicit_transactions;
digest_type calculate_action_merkle_root()const;
digest_type calculate_transaction_merkle_root()const;
uint64_t calculate_cpu_usage() const;
};
} } // eosio::chain
FC_REFLECT( eosio::chain::shard_trace, (shard_root)(transaction_traces)(cpu_usage)(read_locks)(write_locks))
FC_REFLECT( eosio::chain::shard_trace, (shard_action_root)(shard_transaction_root)(transaction_traces)(cpu_usage)(read_locks)(write_locks))
FC_REFLECT( eosio::chain::cycle_trace, (shard_traces))
FC_REFLECT( eosio::chain::region_trace, (cycle_traces))
FC_REFLECT( eosio::chain::block_trace, (region_traces))
......@@ -67,7 +67,8 @@ namespace eosio { namespace chain {
FC_DECLARE_DERIVED_EXCEPTION( cfa_irrelevant_auth, eosio::chain::transaction_exception, 3030031, "context-free action should have no required authority" )
FC_DECLARE_DERIVED_EXCEPTION( tx_no_action, eosio::chain::transaction_exception, 3030032, "transaction should have at least one normal action" )
FC_DECLARE_DERIVED_EXCEPTION( tx_no_auths, eosio::chain::transaction_exception, 3030033, "transaction should have at least one required authority" )
FC_DECLARE_DERIVED_EXCEPTION( tx_receipt_inconsistent_cpu, eosio::chain::transaction_exception, 3030034, "Transaction receipt applied kcpu_usage does not match received kcpu_usage" )
FC_DECLARE_DERIVED_EXCEPTION( tx_receipt_inconsistent_net, eosio::chain::transaction_exception, 3030035, "Transaction receipt applied net_usage_words does not match received net_usage_words" )
FC_DECLARE_DERIVED_EXCEPTION( account_name_exists_exception, eosio::chain::action_validate_exception, 3040001, "account name already exists" )
FC_DECLARE_DERIVED_EXCEPTION( invalid_action_args_exception, eosio::chain::action_validate_exception, 3040002, "Invalid Action Arguments" )
......
......@@ -94,6 +94,8 @@ namespace eosio { namespace chain {
transaction_receipt( transaction_id_type tid ):status(executed),id(tid){}
fc::enum_type<uint8_t,status_enum> status;
fc::unsigned_int kcpu_usage;
fc::unsigned_int net_usage_words;
transaction_id_type id;
};
......@@ -254,7 +256,7 @@ namespace eosio { namespace chain {
FC_REFLECT( eosio::chain::permission_level, (actor)(permission) )
FC_REFLECT( eosio::chain::action, (account)(name)(authorization)(data) )
FC_REFLECT( eosio::chain::transaction_receipt, (status)(id))
FC_REFLECT( eosio::chain::transaction_receipt, (status)(kcpu_usage)(net_usage_words)(id))
FC_REFLECT( eosio::chain::transaction_header, (expiration)(region)(ref_block_num)(ref_block_prefix)
(max_net_usage_words)(max_kcpu_usage)(delay_sec) )
FC_REFLECT_DERIVED( eosio::chain::transaction, (eosio::chain::transaction_header), (context_free_actions)(actions) )
......
......@@ -27,6 +27,7 @@ class transaction_metadata {
optional<bytes> raw_trx;
optional<transaction> decompressed_trx;
vector<bytes> context_free_data;
digest_type packed_digest;
// things for signed/packed transactions
optional<flat_set<public_key_type>> signing_keys;
......@@ -69,7 +70,6 @@ class transaction_metadata {
// limits
optional<time_point> processing_deadline;
static digest_type calculate_transaction_merkle_root( const vector<transaction_metadata>& metas );
private:
const transaction* _trx = nullptr;
};
......
......@@ -30,8 +30,6 @@ namespace eosio { namespace chain {
uint64_t cpu_usage;
action act;
string console;
uint32_t region_id;
uint32_t cycle_index;
vector<data_access_info> data_access;
uint32_t auths_used;
......@@ -50,6 +48,11 @@ namespace eosio { namespace chain {
uint64_t cpu_usage;
uint64_t net_usage;
optional<digest_type> packed_trx_digest;
uint64_t region_id;
uint64_t cycle_index;
uint64_t shard_index;
fc::microseconds _profiling_us = fc::microseconds(0);
fc::microseconds _setup_profiling_us = fc::microseconds(0);
};
......@@ -57,9 +60,6 @@ namespace eosio { namespace chain {
FC_REFLECT_ENUM( eosio::chain::data_access_info::access_type, (read)(write))
FC_REFLECT( eosio::chain::data_access_info, (type)(code)(scope)(sequence))
FC_REFLECT( eosio::chain::action_trace, (receiver)(context_free)(cpu_usage)(act)(console)(region_id)(cycle_index)(data_access)(_profiling_us) )
FC_REFLECT( eosio::chain::action_trace, (receiver)(context_free)(cpu_usage)(act)(console)(data_access)(_profiling_us) )
FC_REFLECT_ENUM( eosio::chain::transaction_receipt::status_enum, (executed)(soft_fail)(hard_fail)(delayed) )
FC_REFLECT_DERIVED( eosio::chain::transaction_trace, (eosio::chain::transaction_receipt), (action_traces)(deferred_transaction_requests)(read_locks)(write_locks)(cpu_usage)(net_usage)(_profiling_us)(_setup_profiling_us) )
FC_REFLECT_DERIVED( eosio::chain::transaction_trace, (eosio::chain::transaction_receipt), (action_traces)(deferred_transaction_requests)(read_locks)(write_locks)(cpu_usage)(net_usage)(packed_trx_digest)(region_id)(cycle_index)(shard_index)(_profiling_us)(_setup_profiling_us) )
......@@ -56,14 +56,12 @@ bool transaction_header::verify_reference_block( const block_id_type& reference_
ref_block_prefix == (decltype(ref_block_prefix))reference_block._hash[1];
}
transaction_id_type transaction::id() const {
digest_type::encoder enc;
fc::raw::pack( enc, *this );
return enc.result();
}
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 );
......
......@@ -12,21 +12,11 @@ transaction_metadata::transaction_metadata( const packed_transaction& t, chain_i
,billable_packed_size( t.get_billable_size() )
,signature_count(t.signatures.size())
,published(published)
,packed_digest(t.packed_digest())
,raw_data(raw_trx->data())
,raw_size(raw_trx->size())
,is_implicit(implicit)
,processing_deadline(processing_deadline)
{ }
digest_type transaction_metadata::calculate_transaction_merkle_root( const vector<transaction_metadata>& metas ) {
vector<digest_type> ids;
ids.reserve(metas.size());
for( const auto& t : metas ) {
ids.emplace_back(t.id);
}
return merkle( std::move(ids) );
}
} } // eosio::chain
......@@ -405,9 +405,7 @@ void mongo_db_plugin_impl::_process_block(const block_trace& bt, const signed_bl
kvp("transaction_id", trans_id_str),
kvp("receiver", act.receiver.to_string()),
kvp("action", b_oid{msg_oid}),
kvp("console", act.console),
kvp("region_id", b_int64{act.region_id}),
kvp("cycle_index", b_int64{act.cycle_index}));
kvp("console", act.console));
act_doc.append(kvp("data_access", [&act](bsoncxx::builder::basic::sub_array subarr) {
for (const auto& data : act.data_access) {
subarr.append([&data](bsoncxx::builder::basic::sub_document subdoc) {
......
......@@ -85,8 +85,6 @@ BOOST_AUTO_TEST_CASE( push_invalid_block ) { try {
new_block.producer = sch_pro;
new_block.block_mroot = chain.control->get_dynamic_global_properties().block_merkle_root.get_root();
vector<transaction_metadata> input_metas;
input_metas.emplace_back(packed_transaction(trx), chain.control->get_chain_id(), chain.control->head_block_time(), optional<time_point>(), true);
new_block.transaction_mroot = transaction_metadata::calculate_transaction_merkle_root(input_metas);
new_block.sign(priv_key);
// Create a new empty region
......@@ -902,8 +900,6 @@ BOOST_AUTO_TEST_CASE(block_id_sig_independent)
new_block.producer = sch_pro;
new_block.block_mroot = chain.control->get_dynamic_global_properties().block_merkle_root.get_root();
vector<transaction_metadata> input_metas;
input_metas.emplace_back(packed_transaction(trx), chain.control->get_chain_id(), chain.control->head_block_time(), optional<time_point>(), true);
new_block.transaction_mroot = transaction_metadata::calculate_transaction_merkle_root(input_metas);
// Sign the block with active signature
new_block.sign(chain.get_private_key( sch_pro, "active" ));
......
......@@ -18,8 +18,8 @@ struct action_proof_data {
scope_name scope;
action_name name;
bytes data;
uint32_t region_id;
uint32_t cycle_index;
uint64_t region_id;
uint64_t cycle_index;
vector<data_access_info> data_access;
};
FC_REFLECT(action_proof_data, (receiver)(scope)(name)(data)(region_id)(cycle_index)(data_access));
......@@ -200,10 +200,14 @@ BOOST_FIXTURE_TEST_CASE( prove_action_in_block, validating_tester ) { try {
nodes.emplace_back(merkle_node{bt.block.id()});
size_t block_leaf = nodes.size() - 1;
block_leaves.push_back(block_leaf);
vector<size_t> shard_leaves;
vector<size_t> region_leaves;
for (uint32_t r_idx = 0; r_idx < bt.region_traces.size(); r_idx++) {
const auto& rt = bt.region_traces.at(r_idx);
vector<size_t> shard_leaves;
for (uint32_t c_idx = 0; c_idx < rt.cycle_traces.size(); c_idx++) {
const auto& ct = rt.cycle_traces.at(c_idx);
......@@ -219,8 +223,8 @@ BOOST_FIXTURE_TEST_CASE( prove_action_in_block, validating_tester ) { try {
at.act.account,
at.act.name,
at.act.data,
at.region_id,
at.cycle_index,
tt.region_id,
tt.cycle_index,
at.data_access
};
fc::raw::pack(enc, a_data);
......@@ -239,9 +243,17 @@ BOOST_FIXTURE_TEST_CASE( prove_action_in_block, validating_tester ) { try {
shard_leaves.emplace_back(nodes.size() - 1);
}
}
if (shard_leaves.size() > 0) {
process_merkle(nodes, move(shard_leaves));
} else {
nodes.emplace_back(merkle_node{digest_type()});
}
region_leaves.emplace_back(nodes.size() - 1);
}
digest_type action_mroot = process_merkle(nodes, move(shard_leaves));
digest_type action_mroot = process_merkle(nodes, move(region_leaves));
BOOST_REQUIRE_EQUAL((std::string)bt.block.action_mroot, (std::string)action_mroot);
last_block_header = bt.block;
......
......@@ -31,7 +31,7 @@ public:
create_accounts( { N(eosio.msig), N(alice), N(bob), N(carol) } );
produce_block();
auto trace = base_tester::push_action(config::system_account_name, N(setpriv),
auto trace = base_tester::push_action(config::system_account_name, N(setpriv),
config::system_account_name, mutable_variant_object()
("account", "eosio.msig")
("is_priv", 1)
......@@ -74,7 +74,7 @@ transaction eosio_msig_tester::reqauth( account_name from, const vector<permissi
}
variant pretty_trx = fc::mutable_variant_object()
("expiration", "2020-01-01T00:30")
("region", 1)
("region", 0)
("ref_block_num", 2)
("ref_block_prefix", 3)
("max_net_usage_words", 0)
......@@ -119,7 +119,7 @@ BOOST_FIXTURE_TEST_CASE( propose_approve_execute, eosio_msig_tester ) try {
("proposal_name", "first")
("level", permission_level{ N(alice), config::active_name })
));
BOOST_REQUIRE_EQUAL( success(), push_action( N(alice), N(exec), mvo()
("proposer", "alice")
("proposal_name", "first")
......@@ -148,7 +148,7 @@ BOOST_FIXTURE_TEST_CASE( propose_approve_unapprove, eosio_msig_tester ) try {
("proposal_name", "first")
("level", permission_level{ N(alice), config::active_name })
));
BOOST_REQUIRE_EQUAL( success(), push_action( N(alice), N(unapprove), mvo()
("proposer", "alice")
("proposal_name", "first")
......@@ -225,7 +225,7 @@ BOOST_FIXTURE_TEST_CASE( big_transaction, eosio_msig_tester ) try {
variant pretty_trx = fc::mutable_variant_object()
("expiration", "2020-01-01T00:30")
("region", 1)
("region", 0)
("ref_block_num", 2)
("ref_block_prefix", 3)
("max_net_usage_words", 0)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册