提交 93026fb1 编写于 作者: A Anton Perkov

Merge branch 'master' into contracts-use-new-dbapi

......@@ -131,17 +131,6 @@ namespace eosio { namespace chain { namespace contracts {
FC_ASSERT( tables.size() == abi.tables.size() );
}
void abi_serializer::append_system_abi(account_name account, abi_def& abi) {
if ( account == eosio::chain::config::system_account_name ) {
abi_def eos_abi = chain_initializer::eos_contract_abi();
abi.actions.insert(abi.actions.end(), eos_abi.actions.cbegin(), eos_abi.actions.cend());
abi.structs.insert(abi.structs.end(), eos_abi.structs.cbegin(), eos_abi.structs.cend());
abi.tables.insert(abi.tables.end(), eos_abi.tables.cbegin(), eos_abi.tables.cend());
abi.types.insert(abi.types.end(), eos_abi.types.cbegin(), eos_abi.types.cend());
}
}
bool abi_serializer::is_builtin_type(const type_name& type)const {
return built_in_types.find(type) != built_in_types.end();
}
......
......@@ -50,9 +50,9 @@ void chain_initializer::register_types(chain_controller& chain, chainbase::datab
}
abi_def chain_initializer::eos_contract_abi()
abi_def chain_initializer::eos_contract_abi(const abi_def& eosio_system_abi)
{
abi_def eos_abi;
abi_def eos_abi(eosio_system_abi);
eos_abi.types.push_back( type_def{"account_name","name"} );
eos_abi.types.push_back( type_def{"share_type","int64"} );
eos_abi.types.push_back( type_def{"onerror","bytes"} );
......
......@@ -142,10 +142,15 @@ void apply_eosio_setabi(apply_context& context) {
context.require_authorization(act.account);
// if system account append native abi
if ( act.account == eosio::chain::config::system_account_name ) {
act.abi = chain_initializer::eos_contract_abi(act.abi);
}
/// if an ABI is specified make sure it is well formed and doesn't
/// reference any undefined types
abi_serializer(act.abi).validate();
// todo: figure out abi serilization location
// todo: figure out abi serialization location
const auto& account = db.get<account_object,by_name>(act.account);
db.modify( account, [&]( auto& a ) {
......@@ -306,7 +311,7 @@ void apply_eosio_onerror(apply_context& context) {
static const abi_serializer& get_abi_serializer() {
static optional<abi_serializer> _abi_serializer;
if (!_abi_serializer) {
_abi_serializer.emplace(chain_initializer::eos_contract_abi());
_abi_serializer.emplace(chain_initializer::eos_contract_abi(abi_def()));
}
return *_abi_serializer;
......
......@@ -73,12 +73,11 @@ struct abi_serializer {
}
template<typename Vec>
static bool to_abi(account_name account, const Vec& abi_vec, abi_def& abi)
static bool to_abi(const Vec& abi_vec, abi_def& abi)
{
if( !is_empty_abi(abi_vec) || account == eosio::chain::config::system_account_name ) { /// 4 == packsize of empty Abi
if( !is_empty_abi(abi_vec) ) { /// 4 == packsize of empty Abi
fc::datastream<const char*> ds( abi_vec.data(), abi_vec.size() );
fc::raw::unpack( ds, abi );
append_system_abi(account, abi);
return true;
}
return false;
......@@ -86,7 +85,6 @@ struct abi_serializer {
private:
void binary_to_variant(const type_name& type, fc::datastream<const char*>& stream, fc::mutable_variant_object& obj)const;
static void append_system_abi(account_name account, abi_def& abi);
};
namespace impl {
......
......@@ -24,7 +24,7 @@ namespace eosio { namespace chain { namespace contracts {
void prepare_database(chain::chain_controller& chain, chainbase::database& db);
static abi_def eos_contract_abi();
static abi_def eos_contract_abi(const abi_def& eosio_system_abi);
private:
genesis_state_type genesis;
......
......@@ -85,7 +85,7 @@ namespace eosio { namespace testing {
try {
const auto &accnt = control->get_database().get<account_object, by_name>(name);
contracts::abi_def abi;
if (contracts::abi_serializer::to_abi(accnt.name, accnt.abi, abi)) {
if (contracts::abi_serializer::to_abi(accnt.abi, abi)) {
return contracts::abi_serializer(abi);
}
return optional<contracts::abi_serializer>();
......
......@@ -413,7 +413,7 @@ fc::variant account_history_plugin_impl::transaction_to_variant(const packed_tra
const auto* accnt = database.find<chain::account_object,chain::by_name>( name );
if (accnt != nullptr) {
abi_def abi;
if (abi_serializer::to_abi(accnt->name, accnt->abi, abi)) {
if (abi_serializer::to_abi(accnt->abi, abi)) {
return abi_serializer(abi);
}
}
......
......@@ -284,7 +284,7 @@ abi_def get_abi( const chain_controller& db, const name& account ) {
const auto& code_accnt = d.get<account_object,by_name>( account );
abi_def abi;
abi_serializer::to_abi(code_accnt.name, code_accnt.abi, abi);
abi_serializer::to_abi(code_accnt.abi, abi);
return abi;
}
......@@ -365,7 +365,7 @@ struct resolver_factory {
const auto *accnt = api->db.get_database().template find<account_object, by_name>(name);
if (accnt != nullptr) {
abi_def abi;
if (abi_serializer::to_abi(accnt->name, accnt->abi, abi)) {
if (abi_serializer::to_abi(accnt->abi, abi)) {
return abi_serializer(abi);
}
}
......@@ -450,7 +450,7 @@ read_only::get_code_results read_only::get_code( const get_code_params& params )
}
abi_def abi;
if( abi_serializer::to_abi(accnt.name, accnt.abi, abi) ) {
if( abi_serializer::to_abi(accnt.abi, abi) ) {
result.abi = std::move(abi);
}
......@@ -492,7 +492,7 @@ read_only::abi_json_to_bin_result read_only::abi_json_to_bin( const read_only::a
abi_json_to_bin_result result;
const auto& code_account = db.get_database().get<account_object,by_name>( params.code );
abi_def abi;
if( abi_serializer::to_abi(code_account.name, code_account.abi, abi) ) {
if( abi_serializer::to_abi(code_account.abi, abi) ) {
abi_serializer abis( abi );
result.binargs = abis.variant_to_binary( abis.get_action_type( params.action ), params.args );
}
......@@ -503,7 +503,7 @@ read_only::abi_bin_to_json_result read_only::abi_bin_to_json( const read_only::a
abi_bin_to_json_result result;
const auto& code_account = db.get_database().get<account_object,by_name>( params.code );
abi_def abi;
if( abi_serializer::to_abi(code_account.name, code_account.abi, abi) ) {
if( abi_serializer::to_abi(code_account.abi, abi) ) {
abi_serializer abis( abi );
result.args = abis.binary_to_variant( abis.get_action_type( params.action ), params.binargs );
}
......
......@@ -73,7 +73,6 @@ public:
void consum_blocks();
bool is_scope_relevant(const vector<account_name>& scope);
void update_account(const chain::action& msg);
static const account_name newaccount;
......@@ -90,8 +89,6 @@ public:
static const std::string accounts_col;
};
abi_def mongo_db_plugin_impl::eos_abi;
const account_name mongo_db_plugin_impl::newaccount = "newaccount";
const account_name mongo_db_plugin_impl::transfer = "transfer";
const account_name mongo_db_plugin_impl::lock = "lock";
......@@ -181,14 +178,13 @@ namespace {
{
using bsoncxx::builder::basic::kvp;
try {
auto from_account = find_account(accounts, msg.account);
auto abi = fc::json::from_string(bsoncxx::to_json(from_account.view()["abi"].get_document())).as<abi_def>();
abi_serializer abis;
if (msg.account == chain::config::system_account_name) {
abis.set_abi(mongo_db_plugin_impl::eos_abi);
} else {
auto from_account = find_account(accounts, msg.account);
auto abi = fc::json::from_string(bsoncxx::to_json(from_account.view()["abi"].get_document())).as<abi_def>();
abis.set_abi(abi);
abi = chain::contracts::chain_initializer::eos_contract_abi(abi);
}
abis.set_abi(abi);
auto v = abis.binary_to_variant(abis.get_action_type(msg.name), msg.data);
auto json = fc::json::to_string(v);
try {
......@@ -264,15 +260,10 @@ void mongo_db_plugin_impl::_process_irreversible_block(const signed_block& block
auto block_num = block.block_num();
if (processed == 0) {
if (startup) {
if (wipe_database_on_startup) {
// verify on start we have no previous blocks
verify_no_blocks(blocks);
FC_ASSERT(block_num < 2, "Expected start of block, instead received block_num: ${bn}", ("bn", block_num));
// Currently we are creating a 'fake' block in chain_controller::initialize_chain() since initial accounts
// and producers are not written to the block log. If this is the fake block, indicate it as block_num 0.
if (block_num == 1 && block.producer == chain::config::system_account_name) {
block_num = 0;
}
} else {
// verify on restart we have previous block
verify_last_block(blocks, prev_block_id_str);
......@@ -403,17 +394,22 @@ void mongo_db_plugin_impl::update_account(const chain::action& msg) {
if (msg.name == transfer) {
auto now = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::microseconds{fc::time_point::now().time_since_epoch().count()});
/* todo need to follow eosio.system transfer
auto transfer = msg.as<chain::contracts::transfer>();
auto from_name = transfer.from.to_string();
auto to_name = transfer.to.to_string();
auto from_account = find_account(accounts, transfer.from);
auto to_account = find_account(accounts, transfer.to);
abi_serializer abis;
auto eosio_account = find_account(accounts, msg.account);
auto abi = fc::json::from_string(bsoncxx::to_json(eosio_account.view()["abi"].get_document())).as<abi_def>();
abis.set_abi(abi);
auto transfer = abis.binary_to_variant(abis.get_action_type(msg.name), msg.data);
auto from_name = transfer["from"].as<name>().to_string();
auto to_name = transfer["to"].as<name>().to_string();
auto from_account = find_account(accounts, from_name);
auto to_account = find_account(accounts, to_name);
asset from_balance = asset::from_string(from_account.view()["eos_balance"].get_utf8().value.to_string());
asset to_balance = asset::from_string(to_account.view()["eos_balance"].get_utf8().value.to_string());
from_balance -= asset(chain::share_type(transfer.amount));
to_balance += asset(chain::share_type(transfer.amount));
auto asset_quantity = transfer["quantity"].as<asset>();
from_balance -= asset_quantity;
to_balance += asset_quantity;
document update_from{};
update_from << "$set" << open_document << "eos_balance" << from_balance.to_string()
......@@ -426,7 +422,7 @@ void mongo_db_plugin_impl::update_account(const chain::action& msg) {
accounts.update_one(document{} << "_id" << from_account.view()["_id"].get_oid() << finalize, update_from.view());
accounts.update_one(document{} << "_id" << to_account.view()["_id"].get_oid() << finalize, update_to.view());
*/
} else if (msg.name == newaccount) {
auto now = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::microseconds{fc::time_point::now().time_since_epoch().count()});
......@@ -496,8 +492,6 @@ void mongo_db_plugin_impl::init() {
// Create the native contract accounts manually; sadly, we can't run their contracts to make them create themselves
// See native_contract_chain_initializer::prepare_database()
eos_abi = chain::contracts::chain_initializer::eos_contract_abi();
accounts = mongo_conn[db_name][accounts_col]; // Accounts
bsoncxx::builder::stream::document doc{};
if (accounts.count(doc.view()) == 0) {
......@@ -507,7 +501,6 @@ void mongo_db_plugin_impl::init() {
<< "eos_balance" << asset(chain::config::initial_token_supply).to_string()
<< "staked_balance" << asset().to_string()
<< "unstaking_balance" << asset().to_string()
<< "abi" << bsoncxx::from_json(fc::json::to_string(eos_abi))
<< "createdAt" << b_date{now}
<< "updatedAt" << b_date{now};
......
......@@ -74,13 +74,14 @@ add_test(chain_test chain_test --report_level=detailed)
add_test(NAME eosiod_run_test COMMAND tests/eosiod_run_test.py -v --dump-error-detail WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
add_test(NAME eosiod_run_remote_test COMMAND tests/eosiod_run_remote_test.py --dump-error-detail WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
add_test(NAME p2p_dawn515_test COMMAND tests/p2p_tests/dawn_515/test.sh WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
if(BUILD_MONGO_DB_PLUGIN)
add_test(NAME eosiod_run_test-mongodb COMMAND tests/eosiod_run_test.py --mongodb --dump-error-detail WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
endif()
# TODO: Tests removed until working again on master.
# TODO: add_test(NAME p2p_sync_test COMMAND tests/p2p_tests/sync/test.sh WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
# TODO: add_test(NAME p2p_sync_test_p2_d10 COMMAND tests/p2p_tests/sync/test.sh -p 2 -d 10 WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
# TODO: add_test(NAME message_storm COMMAND tests/p2p_tests/sync/test.sh -m -p 21 -n 21 -d 5 -l WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
# TODO: if(BUILD_MONGO_DB_PLUGIN)
# TODO: add_test(NAME eosiod_run_test-mongodb COMMAND tests/eosiod_run_test.py --mongodb --dump-error-detail WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
# TODO: endif()
# TODO: add_test(NAME trans_sync_across_mixed_cluster_test COMMAND tests/trans_sync_across_mixed_cluster_test.sh -p 1 -n 2 WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
# TODO: add_test(NAME distributed-transactions-test COMMAND tests/distributed-transactions-test.py -p 1 -n 4 --dump-error-detail WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
# TODO: add_test(NAME distributed-transactions-remote-test COMMAND tests/distributed-transactions-remote-test.py --dump-error-detail WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
......
......@@ -14,10 +14,8 @@ import re
###############################################################
Print=testUtils.Utils.Print
errorExit=testUtils.Utils.errorExit
def errorExit(msg="", raw=False, errorCode=1):
Print("ERROR:" if not raw else "", msg)
exit(errorCode)
def cmdError(name, code=0, exitNow=False):
msg="FAILURE - %s%s" % (name, ("" if code == 0 else (" returned error code %d" % code)))
......@@ -374,7 +372,8 @@ try:
amountVal=int(decimal.Decimal(amountVal.split()[0])*10000)
else:
typeVal= transaction["name"]
amountVal=transaction["data"]["amount"]
amountVal=transaction["data"]["quantity"]
amountVal=int(decimal.Decimal(amountVal.split()[0])*10000)
else:
if not enableMongo:
typeVal= transaction["transaction"]["messages"][0]["type"]
......@@ -582,7 +581,7 @@ try:
for blockNum in range(1, currentBlockNum+1):
block=node.getBlock(blockNum, retry=False)
if block is None:
cmdError("% get block" % (ClientName))
cmdError("%s get block" % (ClientName))
errorExit("mongo get block by num %d" % blockNum)
if enableMongo:
......
......@@ -81,6 +81,11 @@ class Utils:
return chainSyncStrategies
@staticmethod
def errorExit(msg="", raw=False, errorCode=1):
Utils.Print("ERROR:" if not raw else "", msg)
exit(errorCode)
###########################################################################################
class Table(object):
def __init__(self, name):
......@@ -405,7 +410,7 @@ class Node(object):
Utils.Print("Publish eosio.system contract")
trans=self.publishContract(eosio.name, wastFile, abiFile, waitForTransBlock=True)
if trans is None:
errorExit("Failed to publish oesio.system.")
Utils.errorExit("Failed to publish oesio.system.")
Utils.Print("push issue action to eosio contract")
contract=eosio.name
......@@ -511,7 +516,7 @@ class Node(object):
for i in range(2):
ret=self.getEosAccountFromDb(account.name)
if ret is not None:
account_name=ret["account_name"]
account_name=ret["name"]
if account_name is None:
Utils.Print("ERROR: Failed to verify account creation.", account.name)
return None
......@@ -1112,7 +1117,7 @@ class Cluster(object):
cmdArr.append("--plugin eosio::wallet_api_plugin")
if self.enableMongo:
if Utils.amINoon:
cmdArr.append("--plugin eosio::mongo_db_plugin --mongodb-uri %s" % self.mongoUri)
cmdArr.append("--plugin eosio::mongo_db_plugin --resync --mongodb-uri %s" % self.mongoUri)
else:
cmdArr.append("--plugin eosio::db_plugin --mongodb-uri %s" % self.mongoUri)
......@@ -1294,7 +1299,7 @@ class Cluster(object):
for account in accounts:
Utils.Print("Importing keys for account %s into wallet %s." % (account.name, wallet.name))
if not self.walletMgr.importKey(account, wallet):
errorExit("Failed to import key for account %s" % (account.name))
Utils.errorExit("Failed to import key for account %s" % (account.name))
return False
self.accounts=accounts
......
......@@ -1536,7 +1536,7 @@ BOOST_AUTO_TEST_CASE(abi_cycle)
BOOST_AUTO_TEST_CASE(linkauth)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
BOOST_CHECK(true);
const char* test_data = R"=====(
......@@ -1568,7 +1568,7 @@ BOOST_AUTO_TEST_CASE(linkauth)
BOOST_AUTO_TEST_CASE(unlinkauth)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
BOOST_CHECK(true);
const char* test_data = R"=====(
......@@ -1597,7 +1597,7 @@ BOOST_AUTO_TEST_CASE(unlinkauth)
BOOST_AUTO_TEST_CASE(updateauth)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
BOOST_CHECK(true);
const char* test_data = R"=====(
......@@ -1664,7 +1664,7 @@ BOOST_AUTO_TEST_CASE(updateauth)
BOOST_AUTO_TEST_CASE(deleteauth)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
BOOST_CHECK(true);
const char* test_data = R"=====(
......@@ -1690,7 +1690,7 @@ BOOST_AUTO_TEST_CASE(deleteauth)
BOOST_AUTO_TEST_CASE(newaccount)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
BOOST_CHECK(true);
const char* test_data = R"=====(
......@@ -1834,7 +1834,7 @@ BOOST_AUTO_TEST_CASE(newaccount)
BOOST_AUTO_TEST_CASE(setcode)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
const char* test_data = R"=====(
{
......@@ -1865,7 +1865,7 @@ BOOST_AUTO_TEST_CASE(setcode)
BOOST_AUTO_TEST_CASE(setabi)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
const char* test_data = R"=====(
{
......@@ -2028,7 +2028,7 @@ BOOST_AUTO_TEST_CASE(setabi)
BOOST_AUTO_TEST_CASE(postrecovery)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
const char* test_data = R"=====(
{
......@@ -2078,7 +2078,7 @@ BOOST_AUTO_TEST_CASE(postrecovery)
BOOST_AUTO_TEST_CASE(passrecovery)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
const char* test_data = R"=====(
{
......@@ -2100,7 +2100,7 @@ BOOST_AUTO_TEST_CASE(passrecovery)
BOOST_AUTO_TEST_CASE(vetorecovery)
{ try {
abi_serializer abis(chain_initializer::eos_contract_abi());
abi_serializer abis(chain_initializer::eos_contract_abi(abi_def()));
const char* test_data = R"=====(
{
......
......@@ -38,12 +38,12 @@ public:
const auto& accnt = control->get_database().get<account_object,by_name>( N(identity) );
abi_def abi;
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(accnt.name, accnt.abi, abi), true);
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(accnt.abi, abi), true);
abi_ser.set_abi(abi);
const auto& acnt_test = control->get_database().get<account_object,by_name>( N(identitytest) );
abi_def abi_test;
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(accnt.name, acnt_test.abi, abi_test), true);
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(acnt_test.abi, abi_test), true);
abi_ser_test.set_abi(abi_test);
const global_property_object &gpo = control->get_global_properties();
......
......@@ -190,7 +190,7 @@ BOOST_FIXTURE_TEST_CASE( abi_from_variant, tester ) try {
try {
const auto& accnt = this->control->get_database().get<account_object,by_name>( name );
abi_def abi;
if (abi_serializer::to_abi(accnt.name, accnt.abi, abi)) {
if (abi_serializer::to_abi(accnt.abi, abi)) {
return abi_serializer(abi);
}
return optional<abi_serializer>();
......@@ -364,7 +364,7 @@ BOOST_FIXTURE_TEST_CASE( stl_test, tester ) try {
const auto& accnt = control->get_database().get<account_object,by_name>( N(stltest) );
abi_def abi;
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(accnt.name, accnt.abi, abi), true);
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(accnt.abi, abi), true);
abi_serializer abi_ser(abi);
//send message
......@@ -582,7 +582,7 @@ BOOST_FIXTURE_TEST_CASE(noop, tester) try {
set_abi(N(noop), noop_abi);
const auto& accnt = control->get_database().get<account_object,by_name>(N(noop));
abi_def abi;
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(accnt.name, accnt.abi, abi), true);
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(accnt.abi, abi), true);
abi_serializer abi_ser(abi);
{
......@@ -647,7 +647,7 @@ BOOST_FIXTURE_TEST_CASE(eosio_abi, tester) try {
const auto& accnt = control->get_database().get<account_object,by_name>(config::system_account_name);
abi_def abi;
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(accnt.name, accnt.abi, abi), true);
BOOST_REQUIRE_EQUAL(abi_serializer::to_abi(accnt.abi, abi), true);
abi_serializer abi_ser(abi);
abi_ser.validate();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册