====== 差别 ====== 这里会显示出您选择的修订版和当前版本之间的差别。
— |
zh:开发:dht_协议:结构 [2014/09/28 01:34] (当前版本) xiaolan 创建 |
||
---|---|---|---|
行 1: | 行 1: | ||
+ | ====== DHT 协议结构 ====== | ||
+ | |||
+ | ===== 用户发贴 ===== | ||
+ | |||
+ | 用户的发贴是B编码后的结构,并且具有以下字段: | ||
+ | |||
+ | <code javascript> | ||
+ | "userpost" : | ||
+ | { | ||
+ | "n" : username, | ||
+ | "k" : seq number, | ||
+ | "msg" : message, | ||
+ | "time" : unix utc, | ||
+ | "height" : best height at user (number of blocks), | ||
+ | "lastk" : seq number of previous public post -opt, | ||
+ | "dm" : encrypted message (dm) -opt, | ||
+ | "rt" : original userpost - opt, | ||
+ | "sig_rt" : sig of rt - opt, | ||
+ | "reply" : - opt, | ||
+ | { | ||
+ | "n" : reference username, | ||
+ | "k" : reference k, | ||
+ | } | ||
+ | } | ||
+ | "sig_userpost" : signature of bencoded "userpost" by user "n" | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ===== 基本结构 ===== | ||
+ | |||
+ | 例如在 [[zh:开发:dht_协议:apis#getData]] 和 [[zh:开发:dht_协议:apis#putData]] 中的DHT命令 | ||
+ | |||
+ | <code javascript> | ||
+ | { | ||
+ | "p" : { | ||
+ | "height" : number of blocks at time it was created, | ||
+ | "seq" : update sequence (for single type values), | ||
+ | "target" : { | ||
+ | "n" : user name or hashtag name etc, | ||
+ | "r" : name of the resource, | ||
+ | "t" : either "s" (single) or "m" (multi) | ||
+ | }, | ||
+ | "time" : unix utc timestamp in seconds, | ||
+ | "v" : this is the actual value (string, dict etc) | ||
+ | }, | ||
+ | "sig_p" : signature of "p" contents (bencoded), | ||
+ | "sig_user" : user signing this | ||
+ | } | ||
+ | </code> | ||
+ | 每一个资源在关注列表中定义了什么将要到上面“v”值。 | ||
+ | |||
+ | ==== 资料 ==== | ||
+ | |||
+ | <code javascript> | ||
+ | "target": {"n":username,"r":"profile","t":"s"} | ||
+ | { | ||
+ | "fullname" : presentation name, | ||
+ | "bio" : short bio, | ||
+ | "location" : location, | ||
+ | "url" : user home page url, | ||
+ | "background" : background img url | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== 头像 ==== | ||
+ | |||
+ | <code javascript> | ||
+ | "target": {"n":username,"r":"avatar","t":"s"} | ||
+ | </code> | ||
+ | 嵌入式图片 (最大 4kB): | ||
+ | ''"data:image/jpg;base64,/9j..."'' | ||
+ | 或者链接到外部图片: | ||
+ | ''"http://www.gravatar.com/avatar/205e460b..."'' | ||
+ | |||
+ | ==== 关注 ==== | ||
+ | |||
+ | <code javascript> | ||
+ | "target": {"n":username,"r":"following" + N,"t":"s"} | ||
+ | </code> | ||
+ | 这是一个关注指定用户的列表。因为在DHT网络中存储的空间限制,这个列表或许被通过增加中的N值(从1开始)分成数页。N被作为字符串连接在一起到“r”字段。 | ||
+ | ["user1","user2","user3"...] | ||
+ | |||
+ | 必须有一个与最后一页N + 1的空列表。 | ||
+ | |||
+ | ==== 帖子 ==== | ||
+ | |||
+ | <code javascript> | ||
+ | "target": {"n":username,"r":"post" + K,"t":"s"} | ||
+ | </code> | ||
+ | 这是一个用户"n"的 K-th (公开) 帖子,在 "userpost" 中定义。 | ||
+ | |||
+ | ==== 状态 ==== | ||
+ | |||
+ | <code javascript> | ||
+ | "target": {"n":username,"r":"status","t":"s"} | ||
+ | </code> | ||
+ | 这个资源包含了用户最后的发贴。因为一个相同资源被更新数次对于“seq”列的增长很重要。事实上,“seq” = K。 | ||
+ | |||
+ | ==== 回复 ==== | ||
+ | |||
+ | <code javascript> | ||
+ | "target": {"n":username,"r":"replies" + K,"t":"m"} | ||
+ | </code> | ||
+ | 这是一个回复用户"n"的K-th帖子列表。它包括了帖子本身。因为它是一个“m”类型,一个新帖子可能被任何一个有效用户添加到这个资源中。 | ||
+ | |||
+ | ==== 转推 ==== | ||
+ | |||
+ | <code javascript> | ||
+ | "target": {"n":username,"r":"rts" + K,"t":"m"} | ||
+ | </code> | ||
+ | 这是一个RTs (转推)用户"n"的K-th的帖子列表。它包括了帖子本身。因为它是一个“m”类型,一个新帖子可能被任何一个有效用户添加到这个资源中。 | ||
+ | |||
+ | ==== hashtag ==== | ||
+ | |||
+ | <code javascript> | ||
+ | "target": {"n":tag,"r":"hashtag","t":"m"} | ||
+ | </code> | ||
+ | 这是一个包含 hashtag "n" 的帖子列表。它包括了帖子本身。因为它是一个“m”类型,一个新帖子可能被任何一个有效用户添加到这个资源中。 | ||
+ | |||
+ | ==== 提及 ==== | ||
+ | |||
+ | <code javascript> | ||
+ | "target": {"n":username,"r":"mention","t":"m"} | ||
+ | </code> | ||
+ | 这是一个提及@username的帖子列表。它包括了帖子本身。因为它是一个“m”类型,一个新帖子可能被任何一个有效用户添加到这个资源中。 | ||
+ | |||
+ | ==== 跟踪 ==== | ||
+ | |||
+ | <code javascript> | ||
+ | "target": {"n":username,"r":"tracker","t":"m"} | ||
+ | </code> | ||
+ | 这是一个特殊的只读资源,用于获取的用户群分发帖子所用的节点。 | ||