EOS智能合约之eosio.system整理解读

Previous

上文(链接在这)整理了multi_index相关的内容,这篇接着学习合约部分的细节。

预备知识

  • DPoS(委托权益证明)

EOS的共识机制为DPoS,委托权益证明,英文全称Delegated Proof-of-Stake (DPoS) ,基于这个算法,持有token的人可以通过持续的审批投票系统来选择出块者(producer, 有些英文文档里也简称bp,即block producer)。

eosio允许区块精准的以每0.5秒产生一个区块,只有一个生产者(producer)被授权在任何给定的时间点生产一个区块。如果区块在预定的时间没有被生产出来,那么,那个时间的区块将被跳过,将会产生区块间隔:0.5秒*跳过的区块数量。

产生区块以126个区块为一轮(每个producer可以生产6个,有21个生产者,二者相乘),每轮63秒。在每一轮的开始,21个区块producer通过token持有者的投票被选中。选中的生产者依据商定好的顺序生产区块,这个顺序由15个或者更多的生产者商定。

显然,让每个token持有者经常参与投票是不现实的事,所以有proxy(代理)这个角色,proxy可以替token持有者去投票,而且投票的权重(weight)会随着时间过去而逐步降低。

如果一个生产者错过了一个区块,并且在24小时内没有生产任何区块,他们将会被移除。直到这些不活跃的producer及时通知区块链,他们将打算再次生产区块才被重新加入。

  • token(翻译为通证/令牌通证)

Token代表了一个权益证明,只是一个权益证明,有三个要素,缺一不可。

第一是数字权益证明,也就是说通证必须是以数字形式存在的权益凭证,它必须代表的是一种权利,一种固有和内在的价值。

第二是加密,也就是说通证的真实性,防篡改性,保护隐私等能力,由密码学予以保障。

第三是可流通,也就是说通证必须能够在一个网络中流动,从而随时随地可以验证。

正文

  • 资源介绍

EOS 共有三大资源:CPU、NET(网络带宽)和RAM(内存)。

用户的一般操作,包括合约代码的执行,对CPU和网络带宽消耗持续一小段时间,因此EOS中采用抵押(stake)的机制来换取,抵押物就是EOS Token。例如抵押1%的Token,最多能够获得1%的网络带宽。就像你使用共享单车要交个押金一样,不用了押金可以赎回。

 

CPU和NET需要临时抵押EOS获取,类似于交押金,不用了可以赎回EOS。

RAM只能用EOS直接购买,会在使用过程中被消耗掉。

任意钱包都可以直接抵押CPU和NET的和购买RAM。

 

RAM的分配稍有不同,它是存储状态的,是长期占用的。简单来说,就是根据链上的数据产生的状态是存储在RAM中的,如一个账号的信息,包括余额的当前状态都是存储在RAM中的,因此需要购买RAM来长期存储数据。相应的,超级节点(producer)的RAM也是相当大(为了保证出块的时间,区块信息也放在内存中,一般1TB以上)。

  • 账户(account)

在 EOS 里,不论是真人用户还是智能合约,本质上都是一个账户(Account)。或者说,真人账户也是一个智能合约,都可以对外声明别人可以对其做什么操作(比如buy ram,或sell ram),官方称之为 “Action”。

官方教程里两个概念很容易把人搞晕: Account(账户)和 Wallet (钱包)。

Wallet 跟其他区块链项目是类似的,都是一个基本功能:本地储存密钥。一个 eosc (eos客户端) 可以建立多个 Wallet,每个 Wallet 可以存多个密钥(公/私钥对),不管这些密钥之间有没有关系,都能直接存在一起。每个 Wallet 都可以通过密码加密。EOS 公网上线后,一定要将存有密钥的 Wallet 加密,并且将 Wallet 文件单独备份好。 Wallet 密码也要单独备份。总而言之:私钥、Wallet 文件、Wallet 密码永远都在本地,不要跟任何人分享。

 

目前注册账户名字必须12位字符,可用字符包含“.”、阿拉伯数字1-9、英文字母a-z,少于12位的账户名只能通过特殊方式(bid,竞价)分配。

包含“.”的帐号必须有“.”之前帐号的权限。比如要注册12345aaa.xyz,就必须拥有xyz账号的权限。从这点看,.xyz就如同顶级域名一般。

相关源码:bidname (账户名竞标)

  • 账户的权限(permission)

EOS 里,账户默认会有两种权限:Owner 和 Active。Owner 是最高权限,Active 是操作智能合约权限。所有权限都是基于权重(weight)和阈值(threashold)管理的。EOS 在此基础上,增加了分级并分组的自定义权限。Owner 权限是账户最高权限,可以恢复 Active 密钥,反之则不行。

附录:源码对应功能

name_bid

name_bid_table(存放账户名竞价的表)

数据结构

1. produccer_info, producers_table

2. voter_info, voters_table

3. eosio_global_state

4. global_state_singleton

5. rammarket (包含了exchange_state)

Action

  • system相关

1. bidname (账户名竞标)

2. setpriv (设置权限,是否为特权级)

3. rmvproducer(移除producer)

4. setram / setparms (系统参数设置)

  • 资源操作

1. delegatebw / undelegatebw / changebw (net, cpu资源)

2. buyram / buyrambytes / sellram (toke <-> ram bytes相互转换)

3. refund(使用完资源后,赎回抵押的EOS)

  • 投票

1. regproducer / unregprod 注册/解除producer 

2. regproxy(注册代理)

3. voteproducer / update_votes (投票的核心函数) 

4. propagate_weight_change 

5. update_elected_producers 

  • producer_pay

1. claimrewards

2. onblock 

参考

许晓笛:新共识机制BFT-DPoS,深入理解EOS账户权限映射

EOS系统资源-RAM/NET/CPU

EOS 账户名查询

你可能感兴趣的:(EOS学习)