Infra
学门联合产品部基础设施项目
需求概况
Infra为共同体部署者提供统一的软件模块,由所有共同体的成员共享,包括以下需求:
协作网络CO
共同体部署者定义一系列的event lisetener,根据事件创建工单、日志等文件,驱动协作。
-
创建共同体:
- createCOD(url,author,name,callback)
- url: 部署代码的存放地址
- author:作者(部署者)的简称。
- name:COD的名称
- callback:创建结束后的回调函数。参数是COD文件前缀。
- 部署代码中导出事件listener时,导出名称应与事件名称一致。
-
查询共同体的角色清单,这些共同体是部署者注册成功的;
- getCODlist()
-
选择角色查看协议,调整参数并签署;
- getCODObj(CODName)
- CODName:COD的名称
- 返回COD对象,读取其中的角色清单,和对应的用户协议。
- 根据用户操作产生数字签名的契约。
- 读取COM对象的角色清单,选取对象
-
根据角色接收工单;
-
根据工单提交工作结果;
-
根据工作结果获得利益。
-
发布预售计划;
-
申请预购,同时确定提货|兑现;
-
申请贷款;
-
针对贷款、预购的投资回报提交意见。
-
针对投资回报意见获得回报。
信任网络 DTT:Distributed Trust Table
- 发布一个产品;
- 发布针对对象(产品、成员)的属性;
- 针对对象属性提交评价,这些评价信息沿着信任关系传递;
- 促成交易的评价者可以获得回报;
- 发布广告;
- 针对有影响力的评价者提供优惠价格。
联合提货权 JT:Joint Token
联合提货权是共同体内部记账单位。模型
- 创建账号;
- createNor(name,id,email,passphrase,callback)(普通账号:主要由成员使用,2048位openpgp密钥对)
- name:户名
- id:账号ID
- email:联系email
- passphrase:私钥口令
- callback:回调函数
- createAuto(url,listener,author,name,callback)(自动帐号:根据事件触发对外转账)
- url:自动账户代码地址
- listener:事件处理函数对象,key=事件名称,value=处理函数名称。
- author:作者(部署者)签名。
- name:户名
- callback:回调函数
- 根账号:创建一种新的提货权,根据事件触发发行、销毁;
- 建立账号列表
- readKey()返回key对象
- key[fingerprint | id] = obj
- owner: userid | cod
- keyprefix :可选
- norfilename
- balance
- 导入密钥对,从本路径下的sec、pub文件导入nor账号并提交。
- importNor()
- 更新余额,包括各种账号类别。
- updatebalance(callback)
- 发行,仅供测试使用。
- Issue()
- 普通账号转账;
- transfer(payerid,payeeid,amount,passphrase,callback){
- payerid:付款人
- payeeid:收款人
- amount:金额
- passphrase:付款人私钥口令
- callback:回调函数
- 自动账户转账,记录在local文件夹
- CODtransfer(payerid,payeeid,amount,callback)
- payerid:付款COD ID
- payeeid:收款人
- amount:金额
- callback:回调函数
- 兑换成外部货币。
- 申请外部货币直接支付网关。
以上三套基础设施,共享下面的分布式底层功能:
分布式存储
- 提交工作记录,使它自动同步到其他成员的本地文件系统;
- sent(item,method,callback)
- item:提交的对象
- method:http方法
- callback:回调函数
- 提交工作记录到本地
- sentlocal(item,callback)
- 同步工作计划,即把其他人提交的工作记录同步到本地文件系统;
- postsync(finish)
- localsync(item)
- item:本地文件中解析得到的对象。
- 只在sentlocal结尾时调用,更新数据。
- 在重启软件(或操作系统)后仍然能恢复已有的[事件:处理函数]映射关系。
- localindexinit()读取或建立post、put、local的index
- init()重启后重建数据和事件,读取各账户并计算余额。
分布式事件驱动机制
- 提交事件处理函数;
- eventloop() 处理"eventloop"事件。 从eventqueue对象中取出最小key(时间in unix time),按照nor、deploy、auto、transfer、newday的顺序处理,同类事件不排序。每处理一个事件,通过eventcallback()计数器收集足够的回调后,激发一个新的eventloop事件,计数器初始化为事件listener数量。因此,意味着这个事件所有listener回调后才处理下一个。
- 原生提供以下事件激发:
- newday:每天凌晨(北京时间8:00)发出。
- nor:创建普通账户时发出。
- auto:创建自动账户时发出。
- deploy:部署共同体时发出。
- transfer:转账时发出。
- 在重启软件(或操作系统)后仍然能恢复已有的[事件:处理函数]映射关系。
- eventinit()遍历post文件夹,建立auto文件对应的事件处理函数。
-
为了确保分布式底层功能有效运行,需要一套机制:
- 能够从零成员启动;
- 任何阶段劫持成本高于收益;
- 根据上一点原则,逐步升级分布式机制。
去中心化
Infra项目从有中心方案启动,每当新方案的去中心化程度更高、且劫持成本高于收益时,由学门联合产品部(JPU)实施升级。具体步骤如下:
- 任何成员可以对commit提交comment;
- JPU汇总思路,整理为各种新方案并公布在本git库,具体路径:(第一个方案公布时确定)。
- 针对具体去中心方案的劫持方案,任何成员可以在本git库提交issue。
- 针对具体劫持方案的成本和收益,任何成员可以在issue下发表comment。
- 由JPU判定:某个去中心方案的所有劫持方案,均符合“劫持成本高于收益”。
各阶段方案
- 有中心:中心服务器供各方共享数据,尽量不处理业务逻辑。
- 弱中心:
- qiniu:数据保存在专业数据服务器上,中心服务器只管理访问权限。
- git
- 无中心
文件夹结构
.
├── deployer.pubkey
├── config.yaml
├── put
| ├── index.yaml
| ├── [cod.]tag.author.[id.]xxx
| ├── [cod.]tag.author.[id.]xxx
| └── [cod.]tag.author.[id.]xxx
├── post
| ├── index.yaml
| ├── [cod.]tag.author.id.xxx
| ├── [cod.]tag.author.id.xxx
| └── [cod.]tag.author.id.xxx
├── local
| ├── index.yaml
| ├── [cod.]tag.id.xxx
| ├── [cod.]tag.id.xxx
| └── [cod.]tag.id.xxx
└── listener
├── index.yaml
├── [cod.]tag.js
├── [cod.]tag.js
└── [cod.]tag.js
- 文件格式:
- cod:共同体部署标识。
- author:提交者标识。
- tag:种类标识。
- id:put下任意自取,post下是自动取[cod.tag]或[tag.author]范围内唯一的自增数。
- xxx:文件后缀,通常时yaml。
- put文件夹:可以增、改。暂时不能删,可以设置失效标志。失效后不可重启。
- 只能由原author修改。
- post文件夹:只增不删不改。
- listener文件夹:处理事件的代码。
http API
- POST | PUT :
- 入口:http://url:port/xxx
- 其中xxx是文件后缀
- GET:
- 入口:http://url:port/post/cod.tag.author.xxx
- 其中xxx是文件后缀
文件内容.yaml
- cod
- tag
- author
- id:PUT时可以指定
- data: 数据(含数字签名)
- signtype: 数字签名类型
- createat:创建时间unixtime
- remark: 备注
提交规则
- 全局部署者的公钥与部署包一同发布,存放在根目录下\deployer.pubkey。
- 接受全局部署者签名的全局成员memberid.person.yaml。
- 接受全局部署者签名的cod部署者cod.deployer.person.yaml。
- 接受cod部署者签名的cod成员cod.memberid.person.yaml。
- 接受testnet中表现良好的成员,具体规则待定。
- 其它数据,由合法author签名即可接受。
type
-
hashtype: 哈希算法类型
- -1: default, SHA1 hex for now.
- 1:MD5 hex
- 2:MD5 b64
- 3:SHA1 hex
- 4:SHA1 b64
- 5:SHA256 hex
- 6:SHA256 b64
- 7:SHA512 hex
- 8:SHA512 b64
- 9:RIPEMD-160 hex
- 10:RIPEMD-160 b64
-
signtype: 数字签名类型
- 缺省:没有签名
- 0: no sign | 没有签名
- 1: openpgp detach
- 2: openpgp clear
-
keytype: 密钥类型。
-
codetype: 源代码类型。