美文网首页
EOS中的权限模型

EOS中的权限模型

作者: CharlesJu | 来源:发表于2018-05-17 22:42 被阅读0次

    EOS里的权限模型在白皮书中有描述,在wiki中也有描述,这里结合代码来解释一下。

    EOS中的账户有两种,一种是用户使用的账户,另一种是用来部署智能合约的账户。一个智能合约账户只能部署一个智能合约。

    在代码中,智能合约用变量code来表示,它的类型是account_name,实际是包装了uint64_t的数据结构。这个uint64_t用来存储一个base32编码的字符串,大致上最多可以存12字符长。

    智能合约中有一些message,或者叫action,就是智能合约的接口供用户调用。比如一个叫ExchangeContract的智能合约,下面有两个接口,CreateOrderMessageCancelOrderMessage

    在合约端,这些接口被组织成一个Permissions层级结构。下图中的TradeAuthority是个逻辑分组,合约的管理者可以加这样的逻辑分组,也可以不加。

    ExchangeContract
        TradeAuthority
            CreateOrderMessage
            CancelOrderMessage
    

    在用户的账户中,用户可以配置定义一个Authority Levels的层级结构。

    Owner
        Active
            Trading
    

    其中Owner 和Active是固定都有的,Active下可以由用户定义配置。这里的每个节点都是一个Authority的数据结构。这个结构里定义了一个阀值,以及一些key和对应的权重。下图中active这一authority level的阀值是1,key EOS61chK8GbH4ukWcbom8HgK95AeUfP8MBPn7XRq8FeMBYYTgwmcX的权重是1。所以用户只要能提供这个key,用户就有了active这个authority。如果这个key是别人的,就表示这个key的所有者可以代表bob来行使bob的active authority.

    @bob account authorities

    Permission Account Weight Threshold
    owner 1
    EOS5EzTZZQQxdrDaJAPD9pDzGJZ5bj34HaAb8yuvjFHGWzqV25Dch 1
    active 1
    EOS61chK8GbH4ukWcbom8HgK95AeUfP8MBPn7XRq8FeMBYYTgwmcX 1
    trading 1
    EOS7Hnv4iBWo1pcEpP8JyFYCJLRUzYcXSqt... 1

    那么bob的active authority可以做什么呢?这就需要在合约的Permission和用户的authority间建立一个映射。这个映射是在用户端配置的。这个映射的形式是:

     (code, message)-> authority
    

    也就是说,用户定义哪些authority可以代表自己去调用合约code中的message。 例如,如果bob定义了下面的映射

    (ExchangeContract, CreateOrderMessage)-> trading
    

    那么拥有EOS7Hnv4iBWo1pcEpP8JyFYCJLRUzYcXSqt...的人(不一定是bob)就可以代表bob来调用CreateOrderMessage了。

    在用户端的Authority Levels的层级结构中,子节点能做的事,父节点都可以做。拿上面的例子,Active是Trading的父节点,所有拥有EOS61chK8GbH4ukWcbom8HgK95AeUfP8MBPn7XRq8FeMBYYTgwmcX的人,更可以调用CreateOrderMessage了。

    在EOS代码中,在libraries/chain/include/eosio/chain/permission_link_object.hpp有下面的类定义了这个映射关系。

    class permission_link_object : public chainbase::object<permission_link_object_type, permission_link_object> {
    
     OBJECT_CTOR(permission_link_object)
    
     id_type id;     
     /// The account which is defining its permission requirements
    
     account_name account; 
     /// The contract which account requires @ref required_permission to invoke
    
     account_name code; /// TODO: rename to scope
     /// The message type which account requires @ref required_permission to invoke
     /// May be empty; if so, it sets a default @ref required_permission for all messages to @ref code
    
     action_name message_type;
     /// The permission level which @ref account requires for the specified message types
    
     permission_name required_permission;
    
     };
    

    在上面的类中,account是用户账户名,例如bob。code是智能合约账户名,例如ExchangeContract。message_type 是接口名,例如CreateOrderMessage。这个类的实例都存储在EOS的内存数据库中。这也是chainbase这个命名空间的由来,代表了chain的内存数据库(base).

    相关文章

      网友评论

          本文标题:EOS中的权限模型

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