[eos23]协议-账号和权限-part1
1 概述
账号表示eosio区块链网络中的一个参与者。根据账号中的权限配置,账号可以是一个个体或者一个组织。
账号也可以表示智能合约活动者(actors),能够接收其他账号推送的操作,也可以向其他账号推送操作。
和账号相关的权限将操作和交易授权给其他账号。即其他账号可以行使这个权限。
每个权限和一个权限表关联,权限表包含一个阈值,只有达到阈值,才能操作该权限所具备的操作权限。
结构如下图:

2 账号
每一个账号由2-12个字符组成的人类可读的字符串表示。字符包括a-z,1-5,和可选的点号(.),点不能位于第一个和最后一个字符。
也就是说,大概有10的18次方个账号。
每个账号的所有权是由账号名唯一决定的。因此,一个账号能更新它的密钥,而无需重新将他们发布给其他人。
2.1 账号模式
除了账号名,区块链系统会其他和该账号相关的字段一起存储到链数据库(chain database)中,例如ram额度/使用、cpu/net限制/权重、投票信息等。
更重要的是,每个账号维护自己的权限列表。这种灵活的权限结构使得单个或者多用户的授权成为可能。
账号模式的具体参数如下:
https://developers.eos.io/welcome/latest/protocol/accounts_and_permissions/#account-schema
为便于理解,也可以在eospark中随便查一个账号信息。例如:https://eospark.com/account/iloveyou1btc
不太理解模式中的account_name的描述为啥是13个字符?
模式中的name类型设计比较巧妙,也能解释为啥账户名那样设计。
account_name字段的类型是name,name类型由一个64位(刚好8个字节)值组成。账号名的每个字符由5位组成(共31个,26个小写字母和5个数字,点号去没算进去??), 按照上面说的,账号名最多12个,也就是12*5=60个bit,最后的4个字节是指最后一个字符(即上面说的13个)。
这种设计应该是充分考虑了用户可读性和空间使用两点。
2.2 操作和交易
除了标记参与者,操作和交易是账号存在的其他的理由。操作需要一个或多个参与者推送或者发送操作,直接和接收者关联。
在一个操作收据中,操作需要被推送到指定的接收者账号,因此就需要存在一个接收者账号。
相反,交易对账号来说可以认为是透明的,尽管需要通过账号的密钥对交易进行签名。
这可以是接收帐户本身,也可以是接收帐户权限表中指定的其他授权参与者。
3 权限
权限控制eosio账号能做什么,和操作如何被授权。
每个账号会和多个权限关联,每个权限会对应一个权限表。
权限模式如下:https://developers.eos.io/welcome/latest/protocol/accounts_and_permissions/#permission-schema
3.1 权限级别
可以在另一个权限下创建命名权限,如上图中的actvie指向父权限owner,从而允许分层的父子权限结构。
这使得隐式操作授权成为可能,如果actor:parent-permission被操作授权,且该操作允许其子权限也被授权,则隐式的将actor:child-permission也授权了。
每个账号有两个默认的权限,即owner和active,默认active是owner的子权限,你可以定制化增加其他权限和层次。
合约级别的权限:
也可以在具有相同权限名的两个账号之间创建隐式的连接。可以通过将一个显式的权限名和一个智能合约关联起来(不同于contract[::action]的最小权限)。
意思就是账号的某个权限被授权执行某个智能合约的所有操作。然而,在操作中定义显式的actor::permission别将权限授权到整个合约是更推荐的。
3.1.1 owner权限
owner权限是每个账号权限体系的根权限。因此,owner具有最高的权限和所有的权限。
尽管owner权限能做低级别权限能做的任何事情,但是,owner典型上用于恢复低级别权限的目的,当低级别权限被攻击时。
因此,和owner权限相关的key需要被冷存储,而不是用于签名普通操作。