Skip to content

4.数据存储

obeTvR9XDbUwquA6JPQhmbgaCCaiFa2rvf edited this page Nov 25, 2019 · 2 revisions

如前所述,并且再次强调,数据存储在个体的本地系统远程系统只做消息转发。
远程系统不是特定一个系统,个体可以选择连接其他个体部署的远程系统,也可以自建远程系统

现在模式是本地系统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)

过滤器:

  1. 默认过滤器
    所有消息都需要校验Json格式、签名有效性、To字段是否为本地系统所使用的账号,识别所有消息的来源账号
  2. 公告过滤器
    本地系统只向关注个体表内的账号发送连续的公告请求消息,直至获取全部公告消息
    根据公告消息的引用关系,向引用账号发送离散的公告请求消息,获取被引用的单条公告消息
    TODO:单条被引用消息的获取来源,不应该局限于引用账号
  3. 聊天过滤器
    本地系统只与好友个体表内的账号,发送和接收密钥协商消息聊天消息聊天同步消息

公告表,表名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

说明:

  1. PRIMARY KEY (address, division, sequence)
  2. 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一起存储到本地数据库。

本地系统要发送的消息,签名完后,先写本地数据库,再发送。
本地系统接受到的消息,校验完后,先写本地数据库,再展示。

Clone this wiki locally