美文网首页
eos源码解析(六):资源

eos源码解析(六):资源

作者: 荒原葱郁 | 来源:发表于2023-02-21 11:34 被阅读0次

CHAINBASE_SET_INDEX_TYPE(uosio::chain::resource_limits::resource_limits_object, uosio::chain::resource_limits::resource_limits_index)

define CHAINBASE_SET_INDEX_TYPE( OBJECT_TYPE, INDEX_TYPE ) \

namespace chainbase { template<> struct get_index_type<OBJECT_TYPE> { typedef INDEX_TYPE type; }; }
所以:
get_index_type<uosio::chain::resource_limits::resource_limits_object>::type == uosio::chain::resource_limits::resource_limits_index

所以:
const ObjectType& create( Constructor&& con )
{
CHAINBASE_REQUIRE_WRITE_LOCK("create", ObjectType);
typedef typename get_index_type<ObjectType>::type index_type;
return get_mutable_index<index_type>().emplace( std::forward<Constructor>(con) );
}

等效于:
get_mutable_index< uosio::chain::resource_limits::resource_limits_index >().emplace( std::forward<Constructor>(con) );

     generic_index<MultiIndexType>& get_mutable_index()
     {
        CHAINBASE_REQUIRE_WRITE_LOCK("get_mutable_index", typename MultiIndexType::value_type);
        typedef generic_index<MultiIndexType> index_type;
        typedef index_type*                   index_type_ptr;
        assert( _index_map.size() > index_type::value_type::type_id );
        assert( _index_map[index_type::value_type::type_id] );
        return *index_type_ptr( _index_map[index_type::value_type::type_id]->get() );
     }

generic_index<MultiIndexType> index_type;
所以
index_type
等效于:
generic_index<uosio::chain::resource_limits::resource_limits_index>
因为:
typedef typename index_type::value_type value_type;
所以:
index_type::value_type::type_id
等效于:
uosio::chain::resource_limits::resource_limits_index::value_type::type_id

value_type::type_id是boost库生成的。。。

函数void add_indices() 添加系统表:resource_limits.add_indices(); --》resource_index_set::add_indices(_db);

using resource_index_set = index_set<
resource_limits_index,
resource_usage_index,
resource_limits_state_index,
resource_limits_config_index

最后还是到了db.add_index<Index>();
等效于:db.add_index<resource_limits_index>();

在controller.cpp的push_transaction中,初始化transaction_context的时候:
undo_session = c.mutable_db().start_undo_session(true);

database::session database::start_undo_session( bool enabled )
{
if( enabled ) {
vector< std::unique_ptr<abstract_session> > _sub_sessions;
_sub_sessions.reserve( _index_list.size() );
for( auto& item : _index_list ) {
_sub_sessions.push_back( item->start_undo_session( enabled ) );
}
return session( std::move( _sub_sessions ) );
} else {
return session();
}
}

auto& item : _index_list 这个list在前面db.add_index<Index>();中加入:
auto new_index = new index<index_type>( *idx_ptr );
_index_map[ type_id ].reset( new_index );
_index_list.push_back( new_index );

typedef generic_index<MultiIndexType> index_type;
index_type 为 generic_index<uosio::chain::resource_limits::resource_limits_index>

所以:
item->start_undo_session( enabled ) 《=》
generic_index<uosio::chain::resource_limits::resource_limits_index> ->start_undo_session( enabled )

     session start_undo_session( bool enabled ) {
        if( enabled ) {
           _stack.emplace_back( _indices.get_allocator() );
           _stack.back().old_next_id = _next_id;
           _stack.back().revision = ++_revision;
           return session( *this, _revision );
        } else {
           return session( *this, -1 );
        }
     }

           session( generic_index& idx, int64_t revision )
           :_index(idx),_revision(revision) {
              if( revision == -1 )
                 _apply = false;
           }

所以generic_index<uosio::chain::resource_limits::resource_limits_index> 这个对象相当于一个表栈,每个transaction执行的时候都会在不同的表栈上复制栈顶,然后压入这个复制的栈顶,在新栈顶上操作。

struct elastic_limit_parameters {
uint64_t target; // the desired usage
uint64_t max; // the maximum usage
uint32_t periods; // the number of aggregation periods that contribute to the average usage

  uint32_t max_multiplier;   // the multiplier by which virtual space can oversell usage when uncongested
  ratio    contract_rate;    // the rate at which a congested resource contracts its limit
  ratio    expand_rate;       // the rate at which an uncongested resource expands its limits

  void validate()const; // throws if the parameters do not satisfy basic sanity checks

};

相关文章

  • EOS出块和共识

    EOS生产区块:解析插件producer_plugin Controller:EOS区块链核心控制器 原创| 源码...

  • eos源码赏析(一):Ubuntu下eos代码编译

    网上已经有很多关于btc的源码分析了,由于eos主网上线还需时日,且网上关于eos的源码解析较少,斗胆尝试着...

  • 收藏夹

    网址 blog android 资源收集 codeKK 源码解析&开源项目集合 Android developme...

  • DisposeBag 资源源码解析

    DisposeBag 资源回收源码解析 举例 Observable 调用 subscribe()方法 返回值 是...

  • 创建型设计模式——抽象工厂模式

    《Android源码设计模式解析与实战》读书笔记(六)《Android源码设计模式解析与实战》PDF资料下载 一、...

  • spring源码解析-资源解析

    在上一篇中写了spring是如何定位资源的,现在我们有了Resource,下一步就是将其解析为BeanDefini...

  • HTML

    HTML的渲染过程 1、浏览器解析源码 => 创建DOM树(请求CSS,IMG,JS资源) 2、解析CSS =...

  • ios三方库解析

    YYCache 源码解析 YTKNetwork 源码解析 MJRefresh 源码解析 VVeboTableVie...

  • iOS 一些框架源码解析

    YYCache 源码解析 YTKNetwork源码解析 MJRefresh 源码解析 VVeboTableView...

  • 大佬资源z

    切记:复用已有资源,控制资源总量 知识图谱 常用三方框架GlideRetrofit源码设计模式解析Android ...

网友评论

      本文标题:eos源码解析(六):资源

      本文链接:https://www.haomeiwen.com/subject/ifkyaftx.html