-
Notifications
You must be signed in to change notification settings - Fork 10
4.数据存储
如前所述,并且再次强调,数据存储在个体的本地系统,远程系统只做消息转发。
远程系统不是特定一个系统,个体可以选择连接其他个体部署的远程系统,也可以自建远程系统。
现在模式是本地系统B1,B2...都连接同一个远程系统Y1,B1,B2...都将消息发送给远程系统Y1,再由远程系统Y1将消息转发给B1,B2...。一旦Y1失效,B们就没法互相发送数据。
TODO:提升服务稳定性
方案1:实现本地系统的跨远程系统交互,远程系统之间形成路由互联机制
B1,B2...Bn可以连接不同远程系统Y1,Y2...Ym,只要Y1,Y2...Ym之间互相连接,B1,B2...Bn就可以互相发送数据。
方案2:实现本地系统的多远程系统连接
B1,B2...Bn均同时连接不同远程系统Y1,Y2...Ym中的若干个,只要远程系统Yx同时连接任意两个B,这两个B就可以通过Yx互相发送数据
因此,每个本地系统都需要对存储的数据进行校验,以保证呈现给个体的数据在机器层面是有效的。
联系人表,表名CONTACT
含义 | 字段 | 类型 |
---|---|---|
账号地址 | address | VARCHAR(35) |
个体昵称 | name | VARCHAR(20) |
前文提到账号形如oeZELFBq5mbE4y5XdvG1f3DsW85FM7HHGM,不适合个体去识别、记忆。
使用联系人表,可以在前端显示时,将账号地址替换为个体昵称。
关注个体表,表名FOLLOWS
含义 | 字段 | 类型 |
---|---|---|
账号地址 | address | VARCHAR(35) |
好友个体表,表名FRIENDS
含义 | 字段 | 类型 |
---|---|---|
账号地址 | address | VARCHAR(35) |
过滤器:
- 默认过滤器
所有消息都需要校验Json格式、签名有效性、To字段是否为本地系统所使用的账号,识别所有消息的来源账号 - 公告过滤器
本地系统只向关注个体表内的账号发送连续的公告请求消息,直至获取全部公告消息
根据公告消息的引用关系,向引用账号发送离散的公告请求消息,获取被引用的单条公告消息
TODO:单条被引用消息的获取来源,不应该局限于引用账号 - 聊天过滤器
本地系统只与好友个体表内的账号,发送和接收密钥协商消息、聊天消息、聊天同步消息
公告表,表名BULLETINS
含义 | 字段 | 类型 |
---|---|---|
公告消息散列值 | hash | VARCHAR(32) PRIMARY KEY |
账号地址 | address | VARCHAR(35) |
公告消息序号 | sequence | INTEGER |
前公告消息散列值 | pre_hash | VARCHAR(32) |
引用公告消息数量 | quote_size | INTEGER |
公告消息内容 | content | TEXT |
公告消息时间 | timestamp | INTEGER |
数据库记录创建时间 | created_at | INTEGER |
公告消息 | json | TEXT |
通过校验的公告响应消息,校验并提取公告消息,再将公告消息及提取信息存入数据库。
聊天密钥表,表名ECDHS
含义 | 字段 | 类型 |
---|---|---|
对方账号地址 | address | VARCHAR(35) |
对一天分块的个数 | division | INTEGER |
时间块序号 | sequence | INTEGER |
时间块内的消息加解密密钥 | aes_key | TEXT |
本方私钥 | private_key | TEXT |
本方公钥 | public_key | TEXT |
本方密钥交换消息 | self_json | TEXT |
对方密钥交换消息 | pair_json | TEXT |
说明:
- PRIMARY KEY (address, division, sequence)
- self_json和pair_json中的Pair字段不能为空,存储的两方json都是双方已经获得对方公钥的最终的密钥交换消息
聊天表,表名MESSAGES
含义 | 字段 | 类型 |
---|---|---|
聊天消息散列值 | hash | VARCHAR(32) PRIMARY KEY |
发送账号 | sour_address | VARCHAR(35) |
接受账号 | dest_address | VARCHAR(35) |
序号 | sequence | INTEGER |
前聊天消息散列值 | pre_hash | VARCHAR(32) |
内容明文 | content | TEXT |
生成时间 | timestamp | INTEGER |
接收时间 | created_at | INTEGER |
聊天消息 | json | TEXT |
是否被确认接受 | confirmed | BOOLEAN DEFAULT FALSE |
是否本地已读 | readed | BOOLEAN DEFAULT FALSE |
注意:
公告请求消息
公告响应消息
聊天同步消息
这3种类型的消息暂时都未进行存储
密钥协商消息
只存储最终态,未获取对方公钥的中间态也未进行存储
校验无误的公告消息和聊天消息,提取有用属性后,与原始json一起存储到本地数据库。
本地系统要发送的消息,签名完后,先写本地数据库,再发送。
本地系统接受到的消息,校验完后,先写本地数据库,再展示。