提交 e311680f 编写于 作者: K Khaled Al-Hassanieh

Fix #2140 - Check that producers are unique and corresponding accounts exist

上级 addbe2fa
......@@ -142,6 +142,13 @@ class privileged_api : public context_aware_api {
datastream<const char*> ds( packed_producer_schedule, datalen );
producer_schedule_type psch;
fc::raw::unpack(ds, psch);
// check that producers are unique
std::set<account_name> unique_producers;
for (const auto& p: psch.producers) {
EOS_ASSERT(context.is_account(p.producer_name), wasm_execution_error, "producer schedule includes a nonexisting account");
unique_producers.insert(p.producer_name);
}
EOS_ASSERT(psch.producers.size() == unique_producers.size(), wasm_execution_error, "duplicate producer name in producer schedule");
context.mutable_db.modify( context.controller.get_global_properties(),
[&]( auto& gprops ) {
gprops.new_active_producers = psch;
......
......@@ -376,6 +376,7 @@ BOOST_AUTO_TEST_CASE(missed_blocks)
for (char i = 'a'; i <= 'u'; i++) {
producer_names.emplace_back(std::string("init") + i);
}
chain.create_accounts(producer_names);
chain.set_producers(producer_names);
// Produce blocks until the next block production will use the new set of producers from beginning
......
......@@ -114,6 +114,31 @@ BOOST_AUTO_TEST_SUITE(producer_schedule_tests)
} FC_LOG_AND_RETHROW()
BOOST_FIXTURE_TEST_CASE( verify_producers, TESTER ) try {
vector<account_name> valid_producers = {
"inita", "initb", "initc", "initd", "inite", "initf", "initg",
"inith", "initi", "initj", "initk", "initl", "initm", "initn",
"inito", "initp", "initq", "initr", "inits", "initt", "initu"
};
create_accounts(valid_producers);
set_producers(valid_producers);
// account initz does not exist
vector<account_name> nonexisting_producer = { "initz" };
BOOST_CHECK_THROW(set_producers(nonexisting_producer), wasm_execution_error);
// replace initg with inita, inita is now duplicate
vector<account_name> invalid_producers = {
"inita", "initb", "initc", "initd", "inite", "initf", "inita",
"inith", "initi", "initj", "initk", "initl", "initm", "initn",
"inito", "initp", "initq", "initr", "inits", "initt", "initu"
};
BOOST_CHECK_THROW(set_producers(invalid_producers), wasm_execution_error);
} FC_LOG_AND_RETHROW()
BOOST_FIXTURE_TEST_CASE( verify_header_schedule_version, TESTER ) try {
// Utility function to ensure that producer schedule version in the header is correct
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册