diff --git a/contracts/asserter/asserter.abi b/contracts/asserter/asserter.abi index 67a45d699e03b68c934ba2e140a0f65fefeceb50..d42fc9e096072873b47fb2571c40516b87648172 100644 --- a/contracts/asserter/asserter.abi +++ b/contracts/asserter/asserter.abi @@ -31,5 +31,5 @@ } ], "tables": [], - "clauses": [] + "ricardian_clauses": [] } diff --git a/contracts/currency/currency.abi b/contracts/currency/currency.abi index 23eb3a90959caa75cf253aa86901d2800d354381..1c677759c8cc4255210825eea169196ad3171da5 100644 --- a/contracts/currency/currency.abi +++ b/contracts/currency/currency.abi @@ -83,5 +83,5 @@ "key_types" : ["uint64"] } ], - "clauses": [] + "ricardian_clauses": [] } diff --git a/contracts/dice/dice.abi b/contracts/dice/dice.abi index b1786de9a6e1faed0e259a682ce6b52dd3e6aaf8..154f021c6f77827e02494b6db0d4e7855f14294a 100644 --- a/contracts/dice/dice.abi +++ b/contracts/dice/dice.abi @@ -213,5 +213,5 @@ "type": "account" } ], - "clauses": [] + "ricardian_clauses": [] } diff --git a/contracts/eosio.bios/eosio.bios.abi b/contracts/eosio.bios/eosio.bios.abi index 474bd4095ce563f92841a224f029b5799e94239a..416fa4338fecfdaf1b8a8f828ca15a431fb8f6e9 100644 --- a/contracts/eosio.bios/eosio.bios.abi +++ b/contracts/eosio.bios/eosio.bios.abi @@ -76,5 +76,5 @@ } ], "tables": [], - "clauses": [] + "ricardian_clauses": [] } diff --git a/contracts/eosio.msig/eosio.msig.abi b/contracts/eosio.msig/eosio.msig.abi index 1fd55b8777861556fc35bbb351271c1521f7ef68..9aa20238691a0f7188a4f2bccf368fa67ae3792f 100644 --- a/contracts/eosio.msig/eosio.msig.abi +++ b/contracts/eosio.msig/eosio.msig.abi @@ -125,5 +125,5 @@ "key_types" : ["name"] } ], - "clauses": [] + "ricardian_clauses": [] } diff --git a/contracts/eosio.system/eosio.system.abi b/contracts/eosio.system/eosio.system.abi index e338998ef983c63df18db88d704fbcf2ad7090ae..1d47e2e0d2e6f101a5cd3b9da0f09bfda55bab68 100644 --- a/contracts/eosio.system/eosio.system.abi +++ b/contracts/eosio.system/eosio.system.abi @@ -239,5 +239,5 @@ ], "tables": [ ], - "clauses": [] + "ricardian_clauses": [] } diff --git a/contracts/eosio.token/eosio.token.abi b/contracts/eosio.token/eosio.token.abi index fc2a359239a89d6235e14ab1e99641ba10645368..513d175b4f606936ca86e60f7734057b60b41507 100644 --- a/contracts/eosio.token/eosio.token.abi +++ b/contracts/eosio.token/eosio.token.abi @@ -72,5 +72,5 @@ "key_types" : ["uint64"] } ], - "clauses": [] + "ricardian_clauses": [] } diff --git a/contracts/exchange/exchange.abi b/contracts/exchange/exchange.abi index 4dbf618dffa3ec1c083aad2470f69d17bb94d4d0..5481c8cef70fbc5101f42ed67f44ebd7cc2611d9 100644 --- a/contracts/exchange/exchange.abi +++ b/contracts/exchange/exchange.abi @@ -160,5 +160,5 @@ "key_types" : ["uint64"] } ], - "clauses": [] + "ricardian_clauses": [] } diff --git a/contracts/identity/identity.abi b/contracts/identity/identity.abi index 2808fdbb0a2fb1d0ec09c4dfaccd566c72b440ab..c9e1605efd394217f3ccf136ecbfe8cdf31b32e4 100644 --- a/contracts/identity/identity.abi +++ b/contracts/identity/identity.abi @@ -112,5 +112,5 @@ "key_types": [ "account_name" ] } ], - "clauses": [] + "ricardian_clauses": [] } diff --git a/contracts/multi_index_test/multi_index_test.abi b/contracts/multi_index_test/multi_index_test.abi index 8ac4553ffac14a8b7b5216e1bcc6c9cc120bcce5..3eafc1c1cd18111c1c5613d2d4d753696389adcf 100644 --- a/contracts/multi_index_test/multi_index_test.abi +++ b/contracts/multi_index_test/multi_index_test.abi @@ -15,5 +15,5 @@ } ], "tables": [], - "clauses": [] + "ricardian_clauses": [] } diff --git a/contracts/noop/noop.abi b/contracts/noop/noop.abi index bf2021c23c155bb50e4ff5b3719fc54405da5b04..323cc24ab0ba26c81cedf510efe0744401416cec 100644 --- a/contracts/noop/noop.abi +++ b/contracts/noop/noop.abi @@ -21,5 +21,5 @@ } ], "tables": [], - "clauses": [] + "ricardian_clauses": [] } diff --git a/contracts/proxy/proxy.abi b/contracts/proxy/proxy.abi index 4554182c233bc1a971a9f717d1f93756b2285737..0449aaf852d3d711fb6fdf24efc85d331bbe7ff0 100644 --- a/contracts/proxy/proxy.abi +++ b/contracts/proxy/proxy.abi @@ -35,5 +35,5 @@ "key_types" : ["name"] } ], - "clauses": [] + "ricardian_clauses": [] } diff --git a/contracts/skeleton/skeleton.abi b/contracts/skeleton/skeleton.abi index d282123fa2485fa8d8cd0a140b05a485cf61c941..5e32bf0fce9cc7cc4214fda749f096c88b0cc7dc 100644 --- a/contracts/skeleton/skeleton.abi +++ b/contracts/skeleton/skeleton.abi @@ -35,5 +35,5 @@ "key_types" : ["name"] } ], - "clauses": [] + "ricardian_clauses": [] } diff --git a/contracts/stltest/stltest.abi b/contracts/stltest/stltest.abi index 5603dbd1e020f8a1c16f6930d5154d5007e6d784..69f33e29c715b59a671190e9ac47601309d69eca 100644 --- a/contracts/stltest/stltest.abi +++ b/contracts/stltest/stltest.abi @@ -41,5 +41,5 @@ "key_types" : ["my_account_name"] } ], - "clauses": [] + "ricardian_clauses": [] } diff --git a/contracts/tic_tac_toe/tic_tac_toe.abi b/contracts/tic_tac_toe/tic_tac_toe.abi index d04bcfd521f3f0662a865ccabc8e6656eb8e8eba..6f2bb8ec17de0a6ad3810ca4d0a69ff50d5c97da 100644 --- a/contracts/tic_tac_toe/tic_tac_toe.abi +++ b/contracts/tic_tac_toe/tic_tac_toe.abi @@ -76,5 +76,5 @@ "key_types" : ["account_name"] } ], - "clauses": [] + "ricardian_clauses": [] } diff --git a/libraries/chain/contracts/chain_initializer.cpp b/libraries/chain/contracts/chain_initializer.cpp index 52910defc46c6d30c92f22c2b53c1d0bdd2e1c96..f41cb284b5f583b8dc4beb3b839d8a7f1e889be2 100644 --- a/libraries/chain/contracts/chain_initializer.cpp +++ b/libraries/chain/contracts/chain_initializer.cpp @@ -76,7 +76,7 @@ abi_def chain_initializer::eos_contract_abi(const abi_def& eosio_system_abi) eos_abi.actions.push_back( action_def{name("onblock"), "onblock",""} ); eos_abi.actions.push_back( action_def{name("canceldelay"), "canceldelay",""} ); - // TODO add any clauses + // TODO add any ricardian_clauses // // ACTION PAYLOADS @@ -304,7 +304,7 @@ abi_def chain_initializer::eos_contract_abi(const abi_def& eosio_system_abi) {"structs", "struct_def[]"}, {"actions", "action_def[]"}, {"tables", "table_def[]"}, - {"clauses", "clause_pair[]"} + {"ricardian_clauses", "clause_pair[]"} } }); diff --git a/libraries/chain/include/eosio/chain/authority.hpp b/libraries/chain/include/eosio/chain/authority.hpp index 79fe1ce442c8c465d1ea397e75804baa578fa9c8..4520a8736aba43ca577bf1a5691a57030c2a6c4d 100644 --- a/libraries/chain/include/eosio/chain/authority.hpp +++ b/libraries/chain/include/eosio/chain/authority.hpp @@ -118,7 +118,7 @@ inline bool validate( const Authority& auth ) { total_weight += a.weight; pa = &a; } - return total_weight > 0 && total_weight >= auth.threshold; + return auth.threshold > 0 && total_weight >= auth.threshold; } } } // namespace eosio::chain diff --git a/libraries/chain/include/eosio/chain/contracts/types.hpp b/libraries/chain/include/eosio/chain/contracts/types.hpp index 90cde42acee5ae1d12ee969dc94e6e3515d8dac8..2008bfb83c795427f7b8ed82b08a93a13a198218 100644 --- a/libraries/chain/include/eosio/chain/contracts/types.hpp +++ b/libraries/chain/include/eosio/chain/contracts/types.hpp @@ -102,14 +102,14 @@ struct clause_pair { struct abi_def { abi_def() = default; abi_def(const vector& types, const vector& structs, const vector& actions, const vector& tables, const vector& clauses) - :types(types), structs(structs), actions(actions), tables(tables), clauses(clauses) + :types(types), structs(structs), actions(actions), tables(tables), ricardian_clauses(clauses) {} vector types; vector structs; vector actions; vector tables; - vector clauses; + vector ricardian_clauses; }; struct newaccount { @@ -301,7 +301,7 @@ FC_REFLECT( eosio::chain::contracts::struct_def , (name)(b FC_REFLECT( eosio::chain::contracts::action_def , (name)(type)(ricardian_contract) ) FC_REFLECT( eosio::chain::contracts::clause_pair , (id)(body) ) FC_REFLECT( eosio::chain::contracts::table_def , (name)(index_type)(key_names)(key_types)(type) ) -FC_REFLECT( eosio::chain::contracts::abi_def , (types)(structs)(actions)(tables)(clauses) ) +FC_REFLECT( eosio::chain::contracts::abi_def , (types)(structs)(actions)(tables)(ricardian_clauses) ) FC_REFLECT( eosio::chain::contracts::newaccount , (creator)(name)(owner)(active)(recovery) ) FC_REFLECT( eosio::chain::contracts::setcode , (account)(vmtype)(vmversion)(code) ) //abi diff --git a/libraries/chain/include/eosio/chain/resource_limits_private.hpp b/libraries/chain/include/eosio/chain/resource_limits_private.hpp index 4b6de5a17c3f92bbc8d7a625a2e35e2ffad3b15f..905eb7ca65f1d669f5eb3df6e393811aad3382e4 100644 --- a/libraries/chain/include/eosio/chain/resource_limits_private.hpp +++ b/libraries/chain/include/eosio/chain/resource_limits_private.hpp @@ -36,7 +36,7 @@ namespace eosio { namespace chain { namespace resource_limits { uint32_t last_ordinal; ///< The ordinal of the last period which has contributed to the average uint64_t value_ex; ///< The current average pre-multiplied by Precision - uint64_t consumed; ///< The the last periods average + the current periods contribution so far + uint64_t consumed; ///< The last periods average + the current periods contribution so far /** * return the average value diff --git a/tests/chain_tests/auth_tests.cpp b/tests/chain_tests/auth_tests.cpp index 7a783e4bcb4ebc4630cb1e930d8e493d0d86a01a..f4520e516c2ac0cd6e2278d77e59ee97b161c863 100644 --- a/tests/chain_tests/auth_tests.cpp +++ b/tests/chain_tests/auth_tests.cpp @@ -2,6 +2,9 @@ #include #include +#include +#include + #ifdef NON_VALIDATING_TEST #define TESTER tester #else @@ -318,4 +321,114 @@ BOOST_AUTO_TEST_CASE( any_auth ) { try { } FC_LOG_AND_RETHROW() } +BOOST_AUTO_TEST_CASE(no_double_billing) { +try { + TESTER chain; + + chain.produce_block(); + + account_name acc1 = N("bill1"); + account_name acc2 = N("bill2"); + account_name acc1a = N("bill1a"); + + chain.create_account(acc1); + chain.create_account(acc1a); + chain.produce_block(); + + chainbase::database &db = chain.control->get_mutable_database(); + + using resource_usage_object = eosio::chain::resource_limits::resource_usage_object; + using by_owner = eosio::chain::resource_limits::by_owner; + + auto create_acc = [&](account_name a) { + + signed_transaction trx; + chain.set_transaction_headers(trx); + + authority owner_auth = authority( chain.get_public_key( a, "owner" ) ); + + vector pls = {{acc1, "active"}}; + pls.push_back({acc1, "owner"}); // same account but different permission names + pls.push_back({acc1a, "owner"}); + trx.actions.emplace_back( pls, + contracts::newaccount{ + .creator = acc1, + .name = a, + .owner = owner_auth, + .active = authority( chain.get_public_key( a, "active" ) ), + .recovery = authority( chain.get_public_key( a, "recovery" ) ), + }); + + chain.set_transaction_headers(trx); + trx.sign( chain.get_private_key( acc1, "active" ), chain_id_type() ); + trx.sign( chain.get_private_key( acc1, "owner" ), chain_id_type() ); + trx.sign( chain.get_private_key( acc1a, "owner" ), chain_id_type() ); + return chain.push_transaction( trx ); + }; + + create_acc(acc2); + + const auto &usage = db.get(acc1); + + const auto &usage2 = db.get(acc1a); + + BOOST_TEST(usage.cpu_usage.average() > 0); + BOOST_TEST(usage.net_usage.average() > 0); + BOOST_REQUIRE_EQUAL(usage.cpu_usage.average(), usage2.cpu_usage.average()); + BOOST_REQUIRE_EQUAL(usage.net_usage.average(), usage2.net_usage.average()); + chain.produce_block(); + +} FC_LOG_AND_RETHROW() } + +BOOST_AUTO_TEST_CASE(stricter_auth) { +try { + TESTER chain; + + chain.produce_block(); + + account_name acc1 = N("acc1"); + account_name acc2 = N("acc2"); + account_name acc3 = N("acc3"); + account_name acc4 = N("acc4"); + + chain.create_account(acc1); + chain.produce_block(); + + auto create_acc = [&](account_name a, account_name creator, int threshold) { + + signed_transaction trx; + chain.set_transaction_headers(trx); + + authority invalid_auth = authority(threshold, {key_weight{chain.get_public_key( a, "owner" ), 1}}, {permission_level_weight{{creator, config::active_name}, 1}}); + + vector pls; + pls.push_back({creator, "active"}); + trx.actions.emplace_back( pls, + contracts::newaccount{ + .creator = creator, + .name = a, + .owner = authority( chain.get_public_key( a, "owner" ) ), + .active = invalid_auth,//authority( chain.get_public_key( a, "active" ) ), + .recovery = authority( chain.get_public_key( a, "recovery" ) ), + }); + + chain.set_transaction_headers(trx); + trx.sign( chain.get_private_key( creator, "active" ), chain_id_type() ); + return chain.push_transaction( trx ); + }; + + try { + create_acc(acc2, acc1, 0); + BOOST_FAIL("threshold can't be zero"); + } catch (...) { } + + try { + create_acc(acc4, acc1, 3); + BOOST_FAIL("threshold can't be more than total weight"); + } catch (...) { } + + create_acc(acc3, acc1, 1); + +} FC_LOG_AND_RETHROW() } + BOOST_AUTO_TEST_SUITE_END() diff --git a/tests/tests/abi_tests.cpp b/tests/tests/abi_tests.cpp index 01775c978bcd1d614c9d6d604b7896cb20a96d1e..8b0d3c9707b3ae45454e581ad06530ae2f0ad656 100644 --- a/tests/tests/abi_tests.cpp +++ b/tests/tests/abi_tests.cpp @@ -328,7 +328,7 @@ const char* my_abi = R"=====( ], "actions": [], "tables": [], - "clauses": [{"id":"clause A","body":"clause body A"}, + "ricardian_clauses": [{"id":"clause A","body":"clause body A"}, {"id":"clause B","body":"clause body B"}] } )====="; @@ -358,7 +358,7 @@ BOOST_AUTO_TEST_CASE(uint_types) }], "actions": [], "tables": [], - "clauses": [] + "ricardian_clauses": [] } )====="; @@ -654,7 +654,7 @@ BOOST_FIXTURE_TEST_CASE(abigen_all_types, abi_gen_helper) "type" : "test_struct" }], "tables": [], - "clauses": [] + "ricardian_clauses": [] } )====="; BOOST_TEST( generate_abi(all_types, all_types_abi) == true); @@ -895,7 +895,7 @@ BOOST_FIXTURE_TEST_CASE(abigen_all_indexes, abi_gen_helper) }, ], - "clauses": [] + "ricardian_clauses": [] } )====="; @@ -1053,7 +1053,7 @@ BOOST_FIXTURE_TEST_CASE(abigen_full_table_decl, abi_gen_helper) "uint64" ] }], - "clauses": [] + "ricardian_clauses": [] } )====="; @@ -1105,7 +1105,7 @@ BOOST_FIXTURE_TEST_CASE(abigen_str_table_decl, abi_gen_helper) "type": "table1" } ], - "clauses": [] + "ricardian_clauses": [] } )====="; @@ -1203,7 +1203,7 @@ BOOST_FIXTURE_TEST_CASE(abigen_template_base, abi_gen_helper) "uint64" ] }], - "clauses": [] + "ricardian_clauses": [] } )====="; @@ -1255,7 +1255,7 @@ BOOST_FIXTURE_TEST_CASE(abigen_action_and_table, abi_gen_helper) "uint64" ] }], - "clauses": [] + "ricardian_clauses": [] } )====="; @@ -1319,7 +1319,7 @@ BOOST_FIXTURE_TEST_CASE(abigen_simple_typedef, abi_gen_helper) "ricardian_contract" : "" }], "tables": [], - "clauses": [] + "ricardian_clauses": [] } )====="; @@ -1397,7 +1397,7 @@ BOOST_FIXTURE_TEST_CASE(abigen_field_typedef, abi_gen_helper) "uint64" ] }], - "clauses": [] + "ricardian_clauses": [] } )====="; @@ -1465,7 +1465,7 @@ BOOST_FIXTURE_TEST_CASE(abigen_vector_of_POD, abi_gen_helper) "type": "table1" } ], - "clauses": [] + "ricardian_clauses": [] } )====="; @@ -1549,7 +1549,7 @@ BOOST_FIXTURE_TEST_CASE(abigen_vector_of_structs, abi_gen_helper) "type": "table1" } ], - "clauses": [] + "ricardian_clauses": [] } )====="; @@ -1640,7 +1640,7 @@ BOOST_FIXTURE_TEST_CASE(abgigen_vector_alias, abi_gen_helper) } ], "tables": [], - "clauses": [] + "ricardian_clauses": [] } )====="; @@ -1700,7 +1700,7 @@ BOOST_FIXTURE_TEST_CASE(abgigen_eosioabi_macro, abi_gen_helper) } ], "tables": [], - "clauses": [] + "ricardian_clauses": [] } )====="; @@ -1773,7 +1773,7 @@ BOOST_FIXTURE_TEST_CASE(abgigen_contract_inheritance, abi_gen_helper) } ], "tables": [], - "clauses": [] + "ricardian_clauses": [] } )====="; @@ -1957,20 +1957,20 @@ BOOST_AUTO_TEST_CASE(general) "structs" : [{"name":"struct1", "base":"base1", "fields": [{"name":"name1", "type": "type1"}, {"name":"name2", "type": "type2"}] }], "actions" : [{"name":"action1","type":"type1", "ricardian_contract":""}], "tables" : [{"name":"table1","index_type":"indextype1","key_names":["keyname1"],"key_types":["typename1"],"type":"type1"}], - "clauses": [] + "ricardian_clauses": [] }, "abidef_arr": [{ "types" : [{"new_type_name":"new", "type":"old"}], "structs" : [{"name":"struct1", "base":"base1", "fields": [{"name":"name1", "type": "type1"}, {"name":"name2", "type": "type2"}] }], "actions" : [{"name":"action1","type":"type1", "ricardian_contract":""}], "tables" : [{"name":"table1","index_type":"indextype1","key_names":["keyname1"],"key_types":["typename1"],"type":"type1"}], - "clauses": [] + "ricardian_clauses": [] },{ "types" : [{"new_type_name":"new", "type":"old"}], "structs" : [{"name":"struct1", "base":"base1", "fields": [{"name":"name1", "type": "type1"}, {"name":"name2", "type": "type2"}] }], "actions" : [{"name":"action1","type":"type1", "ricardian_contract": ""}], "tables" : [{"name":"table1","index_type":"indextype1","key_names":["keyname1"],"key_types":["typename1"],"type":"type1"}], - "clauses": [] + "ricardian_clauses": [] }] } )====="; @@ -1995,7 +1995,7 @@ BOOST_AUTO_TEST_CASE(abi_cycle) "structs": [], "actions": [], "tables": [], - "clauses": [] + "ricardian_clauses": [] } )====="; @@ -2017,7 +2017,7 @@ BOOST_AUTO_TEST_CASE(abi_cycle) }], "actions": [], "tables": [], - "clauses": [] + "ricardian_clauses": [] } )====="; @@ -2437,7 +2437,7 @@ BOOST_AUTO_TEST_CASE(setabi) "key_types" : ["name"] } ], - "clauses": [] + "ricardian_clauses": [] } } )====="; @@ -2803,7 +2803,7 @@ BOOST_AUTO_TEST_CASE(packed_transaction) } ], "tables": [], - "clauses": [] + "ricardian_clauses": [] } )====="; fc::variant var; @@ -2879,7 +2879,7 @@ BOOST_AUTO_TEST_CASE(abi_type_repeat) "key_types" : ["name"] } ], - "clauses": [] + "ricardian_clauses": [] } )====="; @@ -2936,7 +2936,7 @@ BOOST_AUTO_TEST_CASE(abi_struct_repeat) "key_types" : ["name"] } ], - "clauses": [] + "ricardian_clauses": [] } )====="; @@ -2996,7 +2996,7 @@ BOOST_AUTO_TEST_CASE(abi_action_repeat) "key_types" : ["name"] } ], - "clauses": [] + "ricardian_clauses": [] } )=====";