Debug EOS:nodeos + mongo_db_plugin (7)

整合完毕,将trans_doc插入到transaction表中去。整个_process_accepted_transaction执行完毕,其中涉及到了transaction, action, accounts三张表的内容的增加与修改。

2. mongo_db_plugin_impl::_process_applied_transaction
执行应用交易,需要start_block_reached标识位为true。这个函数是对mongo中transaction_traces表的操作。同样的,是通过一个文本类型变量trans_traces_doc操作。这个函数的参数传入是transaction_trace_ptr类型的对象t(对应的上面_process_accepted_transaction接收的是transaction_metadata_ptr类型的)

abi_serializer::to_variant, 转化成abi格式的json数据。

abi_serializer::from_variant, 通过abi格式的json数据转换出来对应的对象数据。

3. mongo_db_plugin_impl::_process_accepted_block

这里先要从process_accepted_block函数进入,上面的下划线_开头的函数都是又没有下划线的相同名字的函数调用的,只是他们除了调用以外都是一些异常的处理,日志的输出工作。而process_accepted_block函数有了简单的逻辑,就是根据标志位start_block_reached作出了处理。前面我们介绍plugin_initialize函数的时候,通过配置文件的配置项"mongodb-block-start",我们设定了全局变量start_block_num作为标志位。这里面就是对于这个参数值的一个判断,如果达到了这个设定的起始区块,则设定全局变量标志位start_block_reached为true,那么就可以进入到_process_accepted_block函数进行处理了。

这个函数是接收区块处理。传入的参数为block_state_ptr类型的对象bs。它的路线与上面介绍过的其他函数的参数t是相同的,只是类结构不同,存的数据不同。该函数涉及到mongo的两张表,一个是block_states,另一个是blocks。我们分别来研究。

block_state_doc

mongocxx::options::update update_opts{}; update_opts.upsert( true );// upsert模式为true,代表update操作如果未找到对象则新增一条数据。 auto block_states = mongo_conn[db_name][block_states_col]; auto block_state_doc = bsoncxx::builder::basic::document{}; // 数据结构映射 block_state_doc.append(kvp( "block_num", b_int32{static_cast<int32_t>(block_num)} ), kvp( "block_id", block_id_str ), kvp( "validated", b_bool{bs->validated} ), kvp( "in_current_chain", b_bool{bs->in_current_chain} )); auto json = fc::json::to_string( bhs ); try { const auto& value = bsoncxx::from_json( json ); block_state_doc.append( kvp( "block_header_state", value ));// 追加block_header_state的值 } catch( bsoncxx::exception& ) { try { json = fc::prune_invalid_utf8(json); const auto& value = bsoncxx::from_json( json ); block_state_doc.append( kvp( "block_header_state", value )); block_state_doc.append( kvp( "non-utf8-purged", b_bool{true})); } catch( bsoncxx::exception& e ) { elog( "Unable to convert block_header_state JSON to MongoDB JSON: ${e}", ("e", e.what())); elog( " JSON: ${j}", ("j", json)); } } block_state_doc.append(kvp( "createdAt", b_date{now} ));// 追加createdAt的值 try { // update_one, 没有查询到相关数据则直接新增一条 if( !block_states.update_one( make_document( kvp( "block_id", block_id_str )), make_document( kvp( "$set", block_state_doc.view())), update_opts )) { EOS_ASSERT( false, chain::mongo_db_insert_fail, "Failed to insert block_state ${bid}", ("bid", block_id)); } } catch(...) { handle_mongo_exception("block_states insert: " + json, __LINE__); }

block_doc

auto blocks = mongo_conn[db_name][blocks_col]; auto block_doc = bsoncxx::builder::basic::document{}; // 数据结构映射 block_doc.append(kvp( "block_num", b_int32{static_cast<int32_t>(block_num)} ), kvp( "block_id", block_id_str ), kvp( "irreversible", b_bool{false} )); auto v = to_variant_with_abi( *bs->block, accounts, abi_serializer_max_time );// 转化为abi格式的数据存储。 json = fc::json::to_string( v ); try { const auto& value = bsoncxx::from_json( json ); block_doc.append( kvp( "block", value ));// 追加block的值,为json } catch( bsoncxx::exception& ) { try { json = fc::prune_invalid_utf8(json); const auto& value = bsoncxx::from_json( json ); block_doc.append( kvp( "block", value )); block_doc.append( kvp( "non-utf8-purged", b_bool{true})); } catch( bsoncxx::exception& e ) { elog( "Unable to convert block JSON to MongoDB JSON: ${e}", ("e", e.what())); elog( " JSON: ${j}", ("j", json)); } } block_doc.append(kvp( "createdAt", b_date{now} ));// 追加createdAt的值 try { // update_one, 没有查询到相关数据则直接新增一条 if( !blocks.update_one( make_document( kvp( "block_id", block_id_str )), make_document( kvp( "$set", block_doc.view())), update_opts )) { EOS_ASSERT( false, chain::mongo_db_insert_fail, "Failed to insert block ${bid}", ("bid", block_id)); } } catch(...) { handle_mongo_exception("blocks insert: " + json, __LINE__); } 4. mongo_db_plugin_impl::_process_irreversible_block
执行不可逆区块,,需要start_block_reached标识位为true。涉及mongo的两张表:blocks表和transactions表。 // 创世块区块号为1,没有信号到accepted_block处理。 if (block_num < 2) return;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssjyw.html