在传统的中心化的社交系统(如微信/QQ/微博/Twitter)中,有两大弊端:
- 匿名/隐私性问题:用户信息、通讯录信息完全掌握在聊天服务提供商中,用户无法真正自主掌控个人信息。
- 可用性问题:聊天服务的可靠性易受所在地区的政策、法律等不可抵外力因素的影响,一旦服务器被攻击或查封,用户数据也就丢失了。
为此,我们提出一种基于区块链的去中心化社交系统。
该系统由三部分组成:
- 区块链:利用其去中心化的本质特征,将用户最关心的用户信息、通讯录信息记录到区块链上,其他人无法篡改、伪造、查封其账号,用户可真正自主掌握个人信息。
- 客户端:直接面向用户的聊天App,一方面从区块链读写用户信息、一方面和聊天服务器建立长连接,收发消息。
- 聊天服务器:为用户提供消息发送、存储服务。只要遵从一定的协议,服务节点可随意加入、退出。面向各类终端用户群体,不同机构、企业可部署不同的聊天服务节点,这样各机构、企业节点可自主掌握其服务器产生的聊天数据。
下面,分别针对这三部分详细阐述:
区块链
基于chain33开发框架的bty区块链支持各种平行链,我们的通讯录合约就是运行在一条平行链中。
合约记录内容:
- 个人信息:昵称、手机号等
- 好友关系:好友可设置tag实现分组
- 黑名单:可设置周期,如永久、一段时间
- 隐私权限:公开(默认,即任何人皆可根据地址查询该用户信息)、私有(只有本人才可查看)、规则(按照用户定义的某种规则确定其他人是否有权限查看其用户信息,比如:A设置了tag为“朋友”的用户才可查看其用户信息)
- 最近登录的聊天服务节点:我们假设,用户转移聊天服务节点的频率是比较低的。当用户连接上某个可用的聊天节点时,会将该节点写入合约,其他用户方可通过合约查询到该用户目前在哪个聊天节点,从而调用该聊天节点的发消息接口给该用户。这样,实现了不同服务器节点间用户的通讯机制。
客户端
假设用户为A:
- 生成、导入用户身份:能唯一标示用户身份的是区块链地址(助记词–>私钥–>公钥–>地址)
- 登录、退出服务器:A登录(助记词/手机号/邮箱)时,若客户端本地缓存了用户上次登录过的服务器节点,假设为 srv-A,则向该节点建立连接,否则,将到区块链查询A最近登录的服务器节点。
- 收发消息:和服务器节点建立连接后,A只会在该服务器节点接收消息。假设此时有另外一个用户B要发消息给A,B需先得知目前A在哪个服务器节点(同样可通过查询合约获得):
- B和A在同一个服务器:B通过长连接往 srv-A 发消息给 A
- B和A不在同一个服务器:B调用 srv-A 的 rpc 接口发消息给 A
客户端不应将区块链节点或聊天服务器节点写死,而应分别做成配置:
- 区块链节点列表
- 聊天服务节点列表
初始化时,从官方提供的注册中心拉取节点列表,若节点列表均不可用,要能支持用户手动输入某个节点。
客户端按照某种策略(如轮询、加权轮询、哈希、随机)自主选择某个区块链节点或服务器节点进行相关服务请求。这里之所以采用客户端进程内负载均衡也是为了避免某服务端节点故障导致客户端不可用。
客户端连接上某个服务器节后,应缓存在本地,以便下次复用,避免频繁写入区块链合约。
服务器
一个最简单的聊天服务器只需提供三个功能:
- 鉴权:客户端跟服务器建立连接后,客户端调用该接口验证身份,客户端和服务器保持ws长连接,方便推送消息
- 发送消息:例如 A → B 箭头方向
- 推送消息:通过ws长连接推送消息给接受者所在客户端