用户第一次用某个客户端,这个客户端里没有任何用户历史数据,它只有默认的relay servers list。此时,用kind 3来广播用户所用的relays,就是这些默认的relays,广播到哪里呢,就是这些默认的relay上。

此时用户所用的relay list,就是有两种:

1、用户以前的relay list,在以前的relay servers上

2、用户在新客户端所用的relay list,在这个list里的relay servers上。

两种完全不冲突。

如果用户手动添加以前使用的relay server,那么客户端应该先去以前这个relay server上查询用户的relay list,然后跟当前的relay list合并,最后再广播到默认relay list servers+用户添加的relay server上。【本质上就是个查询不同数据库,合并信息,并同步到这些数据库里】

所以我上面回复的逻辑,就是说,不管客户端使用哪些relay servers,都应该先去查kind 3,有则合并。

Reply to this note

Please Login to reply.

Discussion

抱歉我搞混淆了,kind 3--> kind 10002

晕头转向的一天……就是kind 3,content里有用户的relay list

是什么kind并不重要,重点是第一次广播后元数据/联系人就都被覆盖了,后面即使你再加回来relay,上面数据也变成旧的了,也还是会被覆盖,除非能够指明新加回来的relay是最高优先级。

所以说,重点是,在第一次广播前,要先去查历史,别啥也不查就去广播数据。

客户端默认relays如果不是正在使用的话,查了也是旧数据或者没有,不广播又该什么时候广播?客户端并不知道用户是否会加回自己的relays。

你说的情况我理解,我在另一个帖子上写了,没有妥善解决前,登入客户端第一步先去添加relay。

查了旧数据/没有,然后再去广播,就能有效避免历史信息被覆盖。

你说的方法:用户登录新客户端后,手工添加原来使用的relay

这种方式,在这个不分青红皂白就广播的客户端上,恰好可以清空用户历史数据。

没有数据则啥也不做,不要广播relay列表,relay列表数据只在用户手动post时才进行广播。就解决了这个问题。

不管是一开始就广播,还是用户post时再广播,只要不查历史数据,直接发新数据,就会覆盖Relay Server上的信息。

Nostr的核心思想是,Relay上不要做太多事,就是存储,删除,完全靠created time和id来对应消息,剩下很多拉取,合并等工作,要在客户端完成。

或者说,可以把Nostr Relay Server的设计,当成一个消息队列服务器。

用户不主动post, 就不存在新数据, 覆盖啥?

说的是手动post前也得查

还有一种方案是,任何relay里保存的relay列表中任何元素,只能写入,不可删除。

不再喜欢的following,用户可手动Block

Nostr的核心思想是服务端做尽可能少的事,这样可以用很低廉的硬件资源就建立服务,从而让服务器遍及全球。

你想啊,要是把Twitter或者微博服务器端开源,没几个人有那么多服务器去建立一套微博服务。最终还是只有少数几个服务。也就根本谈不上一个分布式全球服务。

Nostr协议层试图协调所有relay做同一件事,比如删除历史数据。

是完全错误的理念。

真正的去中心化协议,是不会允许有删除选项的。

有意思,尝试理解一下你的逻辑。

客户端初始化第一步都是先请求内置relay的元数据和联系人,显示给用户,如果这些内置relay比如都是一个月前用过的,客户端得到的就是旧数据,但用户需要今天的最新数据,接下来该怎么处理?

没有则啥也不做,因为反正用户也没post过relay列表,啥也不做就用默认的客户端relay就行了,直到用户post