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(,RAMCORE));
       auto tmp = *itr;
     
    //这里先计算出买 * bytes 内存需要多少EOS
auto eosout = tmp.convert( asset(bytes,S(,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\n" );
_gstate = _global.exists() ? _global.get() : get_default_parameters(); auto itr = _rammarket.find(S(,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 > ) {
itr = _rammarket.emplace( _self, [&]( auto& m ) {
m.supply.amount = 100000000000000ll;
m.supply.symbol = S(,RAMCORE);
m.base.balance.amount = int64_t(_gstate.free_ram());
m.base.balance.symbol = S(,RAM);
m.quote.balance.amount = system_token_supply / ;
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文件类似)
 - 更新权限
 
EOS概念理解总结的更多相关文章
- 大数据核心知识点:Hbase、Spark、Hive、MapReduce概念理解,特点及机制
		
今天,上海尚学堂大数据培训班毕业的一位学生去参加易普软件公司面试,应聘的职位是大数据开发.面试官问了他10个问题,主要集中在Hbase.Spark.Hive和MapReduce上,基础概念.特点.应用 ...
 - SpringIOC的概念理解、构造器注入、setter注入、p命名空间注入、IOC容器介绍与比较
		
1.IOC概念理解 IOC(Inversion of Control)即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象 ...
 - Kubernetes重要概念理解
		
Kubernetes重要概念理解 kubernetes是目前最主流的容器编排工具,是下一代分布式架构的王者.2018年的kubernetes第一个版本1.10已经发布.下面整理一下,kubernete ...
 - SNF快速开发平台2019-角色、权限、账户的概念理解-非常全的理论讲解权限控制
		
组织模型 资源模型 操作模型 谁能够执行哪些操作 执行资源的范围 资源概念资源就是想要的到的最终物质,我们可以给每一个资源定义一个权限,也可以给某一类资源定义一个权限 权限概念权限是对资源 ...
 - elasticsearch基本概念理解+elasticsearch 的shards unassigned处理方法  -- 最佳运维实践 - 集群规划
		
1.es与MySQL的概念对比 2.概念理解 2.1 Index : 一个索引即是文档的集合 2.2 Document : 一个文档即是一个可被索引的基础单元信息,一条记录: 2.3 Replicas ...
 - fragment概念理解
		
fragment概念理解知识,fragment概念理解图片 fragment概念理解内容,fragment概念理介绍,fragment概念理正文 Fragment是Android honeycomb ...
 - ubuntn系统下将文件拷贝到优盘中及挂载概念理解
		
参考资料:http://jingyan.baidu.com/article/7082dc1c76f178e40a89bdd3.html: http://bbs.csdn.net/topics/3801 ...
 - Ceph 概念理解
		
简介 Ceph是一个可靠地.自动重均衡.自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储.块设备存储和文件系统服务. 在虚拟化领域里,比较常用到的是Ceph的块设备存储, ...
 - JavaScript的作用域和块级作用域概念理解
		
作用域 作用域永远都是任何一门编程语言中的重中之重,因为它控制着变量与参数的可见性与生命周期.说到这里我们需要理解两个概念:块级作用域与函数作用域. 函数作用域 这个应该好理解,函数作用域就是说定义在 ...
 
随机推荐
- 时间复杂度O(n)与空间复杂度O(1)
			
把输入规模看成x轴,所花时间/空间看成y轴.O(n)就是 y = x, y随x的增长而线性增长.一条斜线O(1)就是 y = 1,不管x如何变,y不变.一条与x平行的线 举个简单的例子,要从0加到n, ...
 - stl_list.h
			
stl_list.h // Filename: stl_list.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http://b ...
 - codeforces914G  Sum the Fibonacci
			
题目大意:给定一个长为$n$($n\leq 10^6$)的序列S,定义一个合法的五元组$(a,b,c,d,e)$合法当且仅当 $$ ( S_a \mid S_b ) and S_c and ( S_d ...
 - 堆排序的JavaScript实现
			
思想 把数组当做二叉树来排序: 索引0是树的根节点: 除根节点外,索引为N的节点的父节点索引是(N-1)/2: 索引为N的节点的左子节点索引是 2*N+1; 索引为N的节点的右子节点索引是 2*N+2 ...
 - Spring MVC配置详解(3)
			
一.Spring MVC环境搭建:(Spring 2.5.6 + Hibernate 3.2.0) 1. jar包引入 Spring 2.5.6:spring.jar.spring-webmvc.ja ...
 - QTP连接数据库
			
'注意:其中DSN=数据源名:UID=用户名:PWD=用户密码 Dim Conn Set Conn=CreateObject("ADODB.Connection") Const C ...
 - mysql错误代号大全
			
B.1. 服务器错误代码和消息 服务器错误信息来自下述源文件: · 错误消息信息列在share/errmsg.txt文件中."%d"和"%s"分别代表编号和字符 ...
 - mysql   nginx	 redis 配置文件
			
https://github.com/superhj1987/awesome-config
 - 关于ArcGis for javascript整合百度地图 天地图 高德地图进行搜索
			
1.ArcGis for javascript整合百度地图搜索 1.1.首先引入百度地图的api <!-- 引入百度地图API --> <script type="text ...
 - 【转】WebElement.getText()为空解决方法
			
WebElement.getText()为空解决方法 当使用getText()获取一个普通的链接文本时: <a href="http://www.baidu.com"> ...