账号系统的构成如下:
- SDK 可能包含多种版本,如 JAVA,js,go,python 等,提供用户调用账号系统的工具。社区所有的设计用户的功能都应该使用 SDK 调用账号系统。
- Server 是账号系统的主要业务逻辑,也负责和数据库的交换以及链上调用的中间代理或者缓存
- 数据层用于保存账号数据和权限信息(如果采用链,则数据在链上的智能合约中,数据库仅保存一些必要的辅助的管理数据,比如账号类型)
1. 背景与目标
1.1. 提出背景
技术服务于人,才有其价值,人在数据世界的抽象就是一个唯一 ID 加上其他一系列表征这个人的属性。密码以及其他如指纹、人脸等是验证当前操作主体与这个 ID 所代表的物理人的一致性。为了提升系统的适用性,这个 ID 代表的主体扩展到人之外,可以是某个组织、某个系统、某个 App 等,也可以是某个虚拟角色或者某个 AI 主体。在 Web3.0,数据的主权回归到个体的人本身,因此与该 ID 有关的属性及数值,都需要经过授权,才可以被另一个 ID 查看或者修改。
账号系统是其他所有系统的基础。需要提供 SDK 为其他服务提供使用上的便利。
1.1.1. 目标与内容
- 账号主体包括人以外的实体,具备实体的扩展性
- 属性不确定性,账号的属性具备扩展性,为了约束扩展性,特定实体可以包含某些必要的属性
- 属性的访问与修改是受控的
-
- 如果主体 A 对主体 B 的属性 X 具有写权限,那么必然包含读权限,反之不必然,即如果有读权限,则不一定拥有写权限
- 主体 A 对自身的属性 X 不一定具有写权限
- 除属性的读写权限外,增加属性,删除属性也是权限之一
2. 数据结构
数据对象 | 字段 |
账号类型(AccountType) | 类型名称[char[256],类型 ID[long],必要的属性字段,密码 |
账号(Account) | 账号 ID,账号类型[数组],是否允许密码登录,手机号(非必填) |
属性值(AttributeValue) | 账号 ID,属性 ID,属性值(数值加密) |
属性(Attribute) | 属性 ID,属性名称,归属类型,属性取值类型[address, number, char[256]],默认权限(r/w) |
权限(Permission) | 账号 ID,属性ID,授权 ID,授予权限(r,w,r/w,禁r,禁w) |
SBT | 名称,合约地址,图标 |
使用数值表示权限:
1000: 读权限 8
0010:写权限 2(不存在)
1010: 读写权限 10
x1x1: 禁止读写 15,5,7,13
x0x1: 禁止写 1,3,9,11
x1x0: 禁止读 4,6,12,24
所有账号都有的基础属性:积分,贡献分,持有的 SBT 列表
3. 核心接口
账号类型 | 增改查 |
属性 | 增改查 |
权限 | 授权,取消授权,增加属性授权(属性名称,属性说明) |
SBT | 增改查,绑定给某个账号 |
账号 | 账号登记,登录(密码登录,密钥登录) |
4. 核心业务逻辑
4.1. 登录
左侧为密码,右侧为密钥登录
4.2. 授权
业务系统也需要为自己创建地址和私钥。启动时,使用私钥登录账号系统,获取 APP Token。在用户登录账号系统获得 User Token 后,业务系统检查改用户是否已经授权了必要的属性访问权限。如果未授权,则在客户端唤起授权对话框,用户操作同意后,业务系统提交到账号系统进行授权。
5. 设想
授权收费,App 要获得属性数据授权,必需转一笔积分给用户以及该属性的提供者,通用属性,则只转给用户
账号是区块链地址,每个属性都是一份智能合约,将属性授权给某个地址,该地址需要支付属性合约所有者和属性所有者一笔积分,(也支付节点一些积分)。