首页
帖子
账号
关于
{"ObjectType":101,"Sequence":11,"PreHash":"048A2F0A54D305C083E740C468CC9F8C","Quote":[],"Content":"前几篇介绍了使用区块链技术设计非中心型的【公告】、【私聊】业务消息<br>本篇开始介绍非中心型的【群聊】业务<br><br>什么?非中心型的【群聊】?<br>没有中心,用户如何建群、加入、踢人,消息如何同步?<br>其实并没有那么难,无非就是根据需要多设计几条业务消息而已。<br><br>1、要创建群/解散群,其实就是声明一个群的唯一标识。<br>创建群/解散群消息(【群管理消息】GroupManage的一种,【群管理消息】全部由群主签发)<br>{<br>\"ObjectType\":301, //由于该消息没有特定发送对象,所以没有Action、To属性,而实ObjectType属性,301为GroupManage消息<br>\"GroupHash\":, //随机生成的哈希值<br>\"Sequence\":, <br>\"PreHash\":,<br>\"GroupManageAction\":1/0, //1为创建群组,0为解散群<br>\"Request\":{}, //创建群/解散群不需要申请,在处理申请、踢人时会用到<br>\"Timestamp\":,<br>\"PublicKey\":, //从PublicKey可以算出群主账号GroupFounderAccount<br>\"Signature\":<br>}<br><br>该消息设定了群组的唯一标识二元组(GroupFounderAccount,GroupHash)<br><br>2、要加入/离开群,需要加入/离开【申请消息】GroupRequest<br>{<br>\"Action\":401, //这是一条群【申请消息】<br>\"GroupHash\":, //唯一标识二元组的第二元<br>\"GroupManageAction\":1/2, //1是加入,2是离开<br>\"To\":, //唯一标识二元组的第一元,群主的账号<br>\"Timestamp\":,<br>\"PublicKey\":,<br>\"Signature\":<br>}<br><br>3、对于加入申请需要群主手动确认,生成确认允许加入【群管理消息】,拒绝加入申请无需任何操作<br>对于离开申请群主客户端自动生成确认(允许)离开【群管理消息】,离开申请无法被拒绝<br>同时需要引用【申请消息】<br>{<br>\"ObjectType\":301, //301为GroupManage消息<br>\"GroupHash\":, //唯一标识二元组的第二元<br>\"Sequence\":, <br>\"PreHash\":,<br>\"GroupManageAction\":2/4, //2为允许加入,4为允许离开<br>\"Request\":, //引用允许的【申请消息】<br>\"Timestamp\":,<br>\"PublicKey\":,<br>\"Signature\":<br>}<br><br>4、踢人(将账号【X】从群中移除),生成踢人【群管理消息】<br>{<br>\"ObjectType\":301, //301为GroupManage消息<br>\"GroupHash\":, //唯一标识二元组的第二元<br>\"Sequence\":, <br>\"PreHash\":,<br>\"GroupManageAction\":2/4, //2为允许加入,4为允许离开<br>\"Request\":{\"Address\":【X】}, //踢掉【X】<br>\"Timestamp\":,<br>\"PublicKey\":,<br>\"Signature\":<br>}<br><br>现在群主可以创建/解散群(生成301的【群管理消息】),接收加入和离开申请,并手动允许的加入和自动批准的离开(生成301的【群管理消息】),踢人(生成301的【群管理消息】)。<br>【群管理消息】全部由群主签发,形成一条【单链】。<br>群成员上线后需同步【群管理消息】消息,向群主或其他群成员,然后在本地维护群成员列表。<br>【群管理单链同步消息】GroupManageSync<br>{<br>\"Action\":402, //这是一条【群管理单链同步消息】<br>\"GroupHash\":, //唯一标识二元组的第二元<br>\"CurrentSequence\":, //本地【群管理单链】最大序号<br>\"To\":, //群成员账号<br>\"Timestamp\":,<br>\"PublicKey\":,<br>\"Signature\":<br>}<br><br>至此,在非固定中心环境(服务器不存储业务数据)下,利用区块链完成了群管理(维护可信可校验的群成员列表)的设计。<br>现在群有了,如何聊天,如何同步聊天消息?<br>群聊与私聊在消息上的区别是:群聊消息的接收对象是群成员(多个),而私聊消息的接收对象是确定的1个账号。<br>向多个账号发送的消息,同时还要保持机密性,导致其在发出之前不能是密文。<br>【群聊消息】GroupMessage<br>{<br>\"GroupHash\":, //唯一标识二元组的第二元<br>\"Sequence\":,<br>\"PreHash\":,<br>\"Confirm\":{}, //三元组(\"Address\", \"Sequence\", \"Hash\"),用于确认本地已经收到的最新一条群消息<br>\"Content\":, //明文!<br>\"Timestamp\":,<br>\"PublicKey\":,<br>\"Signature\":<br>}<br><br>生成【群聊消息】后,通过服务器中继,所有群成员发送,使用【对象消息】。<br>{<br>\"Action\":101, //表明这条消息是反馈1个对象<br>\"Object\":,<br>\"To\":,<br>\"Timestamp\":,<br>\"PublicKey\":,<br>\"Signature\":<br>}<br><br>其中Object为:<br>{<br>\"ObjectType\":302, //表明对象是一个【群聊消息】<br>\"GroupHash\":,<br>\"PublicKey\":,<br>\"Message\": 加密【群聊消息 - GroupHash - PublicKey】<br>}<br><br>群聊与私聊的消息加密方式雷同,任意两个群成员进行DH握手协商出对称加密密钥。<br>不同之处是暂定,一个群组的两个成员使用的对称加密密钥永久有效,未设计对称加密密钥更新机制。<br><br>【群聊消息】与【群管理消息】、【公告】的同步方式雷同,这里就不赘述了。<br><br>群组聊天总共用到了3个消息范式:<br>\"GroupRequest\": 401<br>\"GroupManageSync\": 402<br>\"GroupDH\": 403<br>\"GroupMessageSync\": 404<br><br>2个对象:<br>\"GroupManage\": 301<br>\"GroupMessage\": 302","Timestamp":1601911000624,"PublicKey":"0216B8875FE7513978CF2167C7AB7A3A6BC1F95E7DE20498980CACB70E51EA207A","Signature":"3045022100DD86FB655D1AD550E32F0D2CA46D56C4FB93D8352BDC1E787F0FB5739AABFB8402206424515AE149AFA663538C39D4E0E5E81E13E2E4BFF43EF854E2CC7A619DE05E"}

oxo