{"ObjectType":400,"Sequence":5,"PreHash":"2F517BD4E0234346CB66626FD1A2EBA4","Tag":["Bulletin","公告","个人","网络空间","RippleMessenger","BlockChain"],"Quote":[{"Address":"rBoy4AAAAA9qxv7WANSdP5j5y59NP6soJS","Sequence":1,"Hash":"FE63CFBA2728A23F736EDB9662104FB9"},{"Address":"rBoy4AAAAA9qxv7WANSdP5j5y59NP6soJS","Sequence":2,"Hash":"13920332B96454D16EAE781C637296F8"},{"Address":"rBoy4AAAAA9qxv7WANSdP5j5y59NP6soJS","Sequence":3,"Hash":"75529289D8D30C70462C08468F4D4204"},{"Address":"rBoy4AAAAA9qxv7WANSdP5j5y59NP6soJS","Sequence":4,"Hash":"C8C9B220CBE3258BE2727EE07422DCBD"},{"Address":"rBBBBBRrtZqCYD8YYQqWujpKUEYqFwrVcZ","Sequence":1,"Hash":"EBAC76E0068B4DDF4C9034C0EFD18F06"},{"Address":"rLondondYY5Tf1T9fcRMP9KDF9ZS2dUHZZ","Sequence":2,"Hash":"2C3A602441F1124CCCCF10B9B22E7574"},{"Address":"rLondondYY5Tf1T9fcRMP9KDF9ZS2dUHZZ","Sequence":3,"Hash":"3DC99EF697D0672C817084B45EB92064"},{"Address":"rLondondYY5Tf1T9fcRMP9KDF9ZS2dUHZZ","Sequence":4,"Hash":"2F517BD4E0234346CB66626FD1A2EBA4"}],"Content":"基于前文对个人数据权力的分析,在网络空间个人能够获得的最大程度的公平、自由能到什么程度?\n- 个人在自己计算机(亦是网络空间)上是近乎主宰的存在,个人想存储什么数据就存储什么数据,想读取就读取,想删除就删除,想生成就生成(写小说、剪片子、搞设计),想装什么软件就装什么软件(甚至可以自己写软件),想开机就开机,想关机就关机,想联网就联网,想断网就断网,所以请多用计算机,用计算机的时候个人是主人。\n- 个人在不受自己控制的网络空间服务面前所能争取到的最大权力就是发布的数据不被删除的权力,要实现这一点需要满足3个条件:\n 1. 数据本地存储备份。个人的计算机要存储自己的数据,即便网络空间服务删除了数据,至少本地计算机还有再次上传发布的能力;\n 2. 数据规范公开独立。个人发布的数据要符合公开、独立的格式规则,规范公开好理解,规范独立是指不依赖于受人控制的条件(比如TCP/IP数据包标准被公开发布以后,只要符合标准的数据包都可以在互联网上传输),换句话说就是数据可以脱离系统而存在,系统只是负责服从个人操作传输、存储、展示数据,是否存储、传输、展示由个人来决定,这样任何个人都可以在网络空间提供数据服务,也就是实现了单个网络空间服务提供者无法在整个网络空间删除个人发布的数据;\n 3. 数据不可伪造抵赖。使用密码学技术对要发布的数据进行签名,个人发布的带签名信息的数据是其他个人无法伪造的,同时个人也无法否认带签名信息的数据是其他个人发布的,考虑到签名使用的密钥是基于算法的、本地生成的,不依赖于其他个人授权、不受其他个人管理,个人可以做到匿名发布(这里所说的匿名是指具备对网络空间服务提供者及非交互对象保持匿名的能力,个人可以选择向交互对象实名,也可以选择不实名,即便向交互对象实名,交互对象这个个人也可以选择相信或者不相信,总的来说个人与个人的互动、信任最终依赖的是每一个具体个人的判断,我说我是秦始皇也得你相信才行)。\n- 除了上述两条权力外,个人没有必要争取其他权力,可以考虑主动放弃。\n\n因此,基于以上分析,个人应该选择一个数据格式在网络空间发布数据,这也就是**RippleMessenger**中**公告**(**Bulletin**)功能要实现的能力,赋予个人自由发布数据的能力。\n\n数据格式如下:\n```\nconst BulletinSchema = {\n \"type\": \"object\",\n \"required\": [\"ObjectType\", \"Sequence\", \"PreHash\", \"Content\", \"Timestamp\", \"PublicKey\", \"Signature\"],\n \"maxProperties\": 10,\n \"properties\": {\n \"ObjectType\": { \"type\": \"number\", \"const\": ObjectType.Bulletin },\n \"Sequence\": { \"type\": \"number\" },\n \"PreHash\": { \"type\": \"string\" },\n \"Content\": { \"type\": \"string\" },\n \n \"Tag\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": { \"type\": \"string\" }\n },\n\n \"Quote\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\n \"type\": \"object\",\n \"required\": [\"Address\", \"Sequence\", \"Hash\"],\n \"properties\": {\n \"Address\": { \"type\": \"string\" },\n \"Sequence\": { \"type\": \"number\" },\n \"Hash\": { \"type\": \"string\" }\n }\n }\n },\n\n \"File\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\n \"type\": \"object\",\n \"required\": [\"Name\", \"Ext\", \"Size\", \"Hash\"],\n \"properties\": {\n \"Name\": { \"type\": \"string\" },\n \"Ext\": { \"type\": \"string\" },\n \"Size\": { \"type\": \"number\" },\n \"Hash\": { \"type\": \"string\" }\n }\n }\n },\n\n \"Timestamp\": { \"type\": \"number\" },\n \"PublicKey\": { \"type\": \"string\" },\n \"Signature\": { \"type\": \"string\" }\n }\n}\n```\n数据格式说明如下:\n- ObjectType、Sequence、PreHash、Timestamp、PublicKey、Signature等6个属性为基础数据属性,具体作用如下:\n - **ObjectType**用于指明数据的类型;\n - **Sequence**用于说明本条数据是该账号(PublicKey)发布的该类型(ObjectType)数据的序号,从1开始记录,多一条数据加1,这样该账号该类型数据逻辑上就是一条数据链;**PreHash**用于说明该条数据前一条数据的Hash,第一条数据的PreHash为固定值44F8764BCACFF5424D4044B784549A1B,这样配合Sequence属性该账号该类型数据就是一条不可篡改的数据链;\n - **Timestamp**用于说明该条数据的生成时间,且这个生成时间应晚于该条数据所引用的生成时间;\n - **PublicKey**用于说明该条数据的**发布账号**;**Signature**用于签名该条数据,保证数据的完整性、不可伪造(配合**PublicKey**)、不可抵赖(配合**PublicKey**)。\n\n- Content、Tag、Quote、File等4个属性为公告数据的具体属性,作用如下:\n - **Content**用于指明公告数据的内容,需要个人来填写;\n - **Tag**用于指明公告数据的标签,需要个人来填写,后期可供系统来帮助个人进行查询检索;\n - **Quote**用于指明该公告数据引用(或者回复)的其他公告信息(发布账号、序号、hash),从而实现单条数据链与其他数据链的关联,公告数据的跨链互动;\n - **File**用于指明该公告数据发布的文件信息(文件名、大小、hash),公告数据本身不传输文件,但提供了文件hash,可供系统实现文件传输功能。\n\n任何个人或系统在存储一条**公告**前,均至少需要做以下校验:\n- 校验数据签名,确认数据完整性、发布账号;\n- 校验当前数据链最后一条数据的序号为 **Sequence**-1,确认数据链的下一个序号为 **Sequence**;\n- 校验前一条( **Sequence**-1)数据的Hash是否为**PreHash**,确认可以将该条数据从尾部插入数据链。","Timestamp":1772341586553,"PublicKey":"03A2CDA7FA600EE1491A52A38A52D8F81D3DBD1DD2B03C32D11D5344FA14F4C163","Signature":"30440220318846B50479B4C362120B9BB636266A6B21A6581D0B177D5DBCD2A8C6D11A94022060D25172CAC90679C1FA3589E52513BCFD260684BCB12AD9CC92336DEBB190F3"}