• EOS概念理解总结


    本文参考EOS版本:v1.1.1

    一.EOS投票相关

    //用户投票
    1.不能自己代理自己,但可以自己给自己投票;
    2.投票的生产节点名称不能重复;
    3.投票人设置了投票代理人后自己不能再投票;
    4.投票人需要先抵押EOS,才有资格进行投票(多索引列表voters);
    5.用户投票随时可以撤销再次进行投票,需要花费一定数量的CPU与NET资源;
    6.一个EOS分为30票,一次最多可以投给30个节点;
    7.用户一次投一个节和投多个节点,对于每个节点得到的票数是一样的。
    例如用户抵押100EOS给节点a投票,节点a得到3000票;如果用户抵押100EOS给节点a,b同时投票,则节点a,b分别都得到3000票

    //注册节点
    1.所有已注册成的节点只有在运行时(active状态)才能获得用户的选票,否则用户给此节点投票是无效的;
    2. 所有已注册成的节点的获得的选票是实时统计的,如果有一个超过21个主节点,将会成为超级节点进行出块;
    3.用户user1,user2,user1抵押100个EOS,user2抵押1000个EOS,进行投票给一个节点,则user2的投票数量是user1的10倍;
    4.用户user1先抵押100个EOS,后面再抵押1000个EOS投票,如果用户已投票,那么后面再做抵押的时候,用户不用手动再进行投票,系统会自动把此次新增的抵押对应的选票数给用户已投的节点;
    5.如果用户usr1给usr2抵押100EOS,usr2用这100 EOS来投票的话是无效的(没有异常,但节点不会增加选票),只能是usr1有投票权;


    注:投票对于用户来说是没有任何奖励和好处的,相反会因此抵押EOS,赎回也需要三天时间。

    二.RAM的交易

      基本的介绍与概念可以参考:https://blog.csdn.net/w7849516230/article/details/80836913

      在查看相关源代码时主要有三个文件:

      exchange_state.cpp  eosio.system.cpp delegate_bandwidth.cpp

      在源码中由于convert是一个公共函数,有点绕,这里以买buyrambytes为例展开讲一下。

      首先,接口如下:

    void system_contract::buyrambytes( account_name payer, account_name receiver, uint32_t bytes ) {
           //在数据库中查找接口
         auto itr = _rammarket.find(S(4,RAMCORE)); auto tmp = *itr;
         
        //这里先计算出买 * bytes 内存需要多少EOS
       auto eosout = tmp.convert( asset(bytes,S(0,RAM)), CORE_SYMBOL );   
      
      //购买内存
      buyram( payer, receiver, eosout );

    }

      

    extended_asset exchange_state::convert( extended_asset from, extended_symbol to ) {
          auto sell_symbol  = from.get_extended_symbol();
          auto ex_symbol    = supply.get_extended_symbol();
          auto base_symbol  = base.balance.get_extended_symbol();
          auto quote_symbol = quote.balance.get_extended_symbol();
    
          if( sell_symbol != ex_symbol ) {
             if( sell_symbol == base_symbol ) {
                from = convert_to_exchange( base, from );
             } else if( sell_symbol == quote_symbol ) {
                from = convert_to_exchange( quote, from );
             } else { 
                eosio_assert( false, "invalid sell" );
             }
          } else {
             if( to == base_symbol ) {
                from = convert_from_exchange( base, from ); 
             } else if( to == quote_symbol ) {
                from = convert_from_exchange( quote, from ); 
             } else {
                eosio_assert( false, "invalid conversion" );
             }
          }
    
          if( to != from.get_extended_symbol() )
             return convert( from, to );
    
          return from;
       }

      

    convert是一个公共接口,这里多次比较是为了查看RAM,EOS,RERAM,三者之间相互转换,先看看初始化的动作
    system_contract::system_contract( account_name s )
       :native(s),
        _voters(_self,_self),
        _producers(_self,_self),
        _global(_self,_self),
        _rammarket(_self,_self)
       {
          //print( "construct system
    " );
          _gstate = _global.exists() ? _global.get() : get_default_parameters();
    
          auto itr = _rammarket.find(S(4,RAMCORE));
    
          if( itr == _rammarket.end() ) {
             auto system_token_supply   = eosio::token(N(eosio.token)).get_supply(eosio::symbol_type(system_token_symbol).name()).amount;
             if( system_token_supply > 0 ) {
                itr = _rammarket.emplace( _self, [&]( auto& m ) {
                   m.supply.amount = 100000000000000ll;
                   m.supply.symbol = S(4,RAMCORE);
                   m.base.balance.amount = int64_t(_gstate.free_ram());
                   m.base.balance.symbol = S(0,RAM);
                   m.quote.balance.amount = system_token_supply / 1000;
                   m.quote.balance.symbol = CORE_SYMBOL;
                });
             }
          } else {
             //print( "ram market already created" );
          }
       }

    把类型和对应的整形简单地区别一下,翻译成如下对应:

    supply  S(4,RAMCORE)
    base  S(0,RAM)
    quote   S(4,SYS)

    此时,再回到buyrambytes这个函数,发现那四个参数分别对应如下 :

    sell_symbol  S(0,RAM))
    ex_symbol  S(4,RAMCORE)
    base_symbol  S(0,RAM)
    quote_symbol    S(4,SYS)

    此时再看convert接口逻辑一目了然,无非就是三者之间的换算关系和数据存储。

    其它的买卖和此原理一样,自己看源码或许是最好的选择~

    三.RAM的使用率

      相关的源码文件为resource_limits.cpp,函数为add_pending_ram_usage,所有内存的使用和释放都通过此接口进行调用,以下操作会影响RAM的使用率:

      1.增加内存:

    • 延时交易 
    • 使用system newaccount创建帐户
    • 关联权限(linkauth)
    • 即时交易
    • chainbase::database中数据表的创建或者数据的存储操作

      2.减少内存

    • 取消延时交易
    • 删除子权限
    • 取消关联权限(unlinkauth)
    • chainbase::database中数据的删除操作

      3.其它

    • 更新合约(abi文件类似)
    • 更新权限
  • 相关阅读:
    Silverlight/Windows8/WPF/WP7/HTML5周学习导读(8月20日8月26日)
    Silverlight/Windows8/WPF/WP7/HTML5周学习导读(9月24日9月30日)
    获取免费Windows Store开发者账户方法
    QOCIDriver: unable to create environment Unable to free Error handle: 2 Unable to free Environment
    C:\workdir\dbManager\lib>c:\Qt\Qt5.9.9\5.9.9\mingw53_32\bin\windeployqt.exe ./db ManagerDll.dll
    QT5.9.932 oracle1032 驱动编译
    sqlplus
    c++const成员函数*
    C++ 函数内静态静态变量
    c++构造/拷贝构造函数初始化变量*
  • 原文地址:https://www.cnblogs.com/hbright/p/9454366.html
Copyright © 2020-2023  润新知