过去一年在写一个匿名分布式的消息网络,取名叫 Nymo ( annonymous 中间的字母,读作 nemo )。
在这个网络中每个用户会持有一组非对称式密钥对,公钥用来做身份识别和消息加密,私钥用来做签名和消息解密。生成消息和加入网络需要工作量证明,以避免拒绝服务和中间人攻击。消息通信是每个节点尽力交付,目前用的是类似疫情传播的算法。每个用户会被随机分入不同的群组内,以做到 k-匿名性和有效率的消息传递。
协议还定义了节点交换、消息格式、本地节点发现协议和中继节点。协议会隐藏在常用应用层协议之下(如 HTTPS )以规避审查,在验证通过之后才会开始真正的 Nymo 网络通讯协议。
白皮书还在写,但是已经用 Go 写了一个实现,顺便还内置了 UPnP NAT 穿越。还写了一个 Web UI ,所以可以直接拿来用。希望有兴趣的朋友可以试一试,看看能不能找到安全方面的问题。
Nymo Core: https://github.com/nymo-net/nymo
Nymo WebUI: https://github.com/nymo-net/nymo-webui
1
AIML 2022-04-13 03:51:38 +08:00 via Android
厉害呀,我之前也有类似的想法,不过拖延癌让我寸步未行
|
2
aima 2022-04-13 04:01:41 +08:00 via iPhone
没文化的我只能说 牛批
|
3
aima 2022-04-13 04:04:56 +08:00 via iPhone
工作量证明生成消息和加入网络可以详细说说么? 期待白皮书早日完工
|
4
AIML 2022-04-13 04:18:07 +08:00 via Android
怎么解决广告问题呢?
|
5
SuperFashi OP @AIML 群发广告相当于 flooding ,pow 应该就可以解决。定向广告的话可以在客户端做个黑名单 /未知发件人过滤。
|
6
SuperFashi OP @aima 就是哈希碰撞,和 hashcash /比特币差不多。
|
7
sujin190 2022-04-13 09:19:13 +08:00
@SuperFashi #5 滥发广告 pow 解决不了吧,这就是成本收益的问题,过高发送成本会影响普通消息发送,过低发送成本完全阻挡不了发广告,毕竟大部分广告的收益都毕竟高或者根本不关心成本,你这个又不能有低成本的反垃圾滥用的问题,虽然你可以在接收端屏蔽,但是且不说依然占用网络资源,而且匿名特性本身创建用户是无成本的拉黑基本意义不大
还是不应该低估垃圾消息的量,感觉你可以按垃圾消息是常规消息万倍以上这个量级来考量,之前也有好多版去中心化的 sns 产品了吧,用户稍微上来一点就被垃圾信息淹没了,啥用没有,所以这个去中心不是难点,重点还是在如何不破坏匿名性的情况下设计效率极高的反垃圾,否则注定会是白花功夫,还有一点也很重要去中心和匿名并不能规避法律风险 |
8
SuperFashi OP @sujin190 使用 pow 就是将发送成本和发送量挂钩:如果垃圾消息是常规消息万倍,那发送者就需要常规用户万倍的计算量。以后的实现中还可以加上 p2p 上下行对等,保证 fairness 之类的算法。完全避免垃圾消息是不可能的,因为网络设计出来就是不可以区分垃圾消息或者普通消息。
|
9
Dkngit 2022-04-13 10:26:38 +08:00
一个匿名分布式的消息网络: https://tox.chat/
给楼主一个参考 |
10
sujin190 2022-04-13 10:26:55 +08:00
@SuperFashi #8 你这是想发的越多付钱越多?可是消息本来就有的人有需要发更多,有的人不怎么发,本身就不平衡,你这样不正好把很需要你的人拦在外面,不怎么需要你无所谓的人到用的挺好,看看现实微信就是这样的啊,多的好友成千上万,一天各种消息几千几万的,少的好友几百,一天消息几条几十条,这样肯定不科学,太小众了,通信工具这种太小众怎么用啊!否则你是想做地下工具么。。
|
11
SuperFashi OP @Dkngit 不是匿名的 https://tox.chat/faq.html#tox-leak-ip ,看着也不是 0-RTT 的样子。这种网络比较好 route ,和 bt 一样维护一个 DHT 就好,看着也是这么实现的。
|
12
SuperFashi OP @sujin190 proof-of-work 不是 proof-of-stake 或者你可能在想 gas fee ,可以多了解一下。
|
13
ZE3kr 2022-04-13 11:34:45 +08:00 via iPhone
能否支持群发呢?比如实现类似邮件列表的需求
|
14
ZE3kr 2022-04-13 11:35:05 +08:00 via iPhone
这种需求岂不是会需要很大的 pow
|
15
lookStupiToForce 2022-04-13 11:40:08 +08:00
是大佬! star 了再拉下来学习!
看了一圈讨论,感觉随机分配入群可能不可取,还是得按需加群,而且还得有权限控制(不过这样又绕回了传统身份控制了,匿名性网络顿时变熟人身份网络) 去中心化真是不可避免要应付垃圾节点以及衍生的垃圾信息 |
16
fgwmlhdkkkw 2022-04-13 11:53:55 +08:00
我有一个问题。
``` message Digest { bytes hash = 1; uint32 cohort = 2; } ``` 因为用了 protobuf ,所以如果我发一个 2GB 的这个结构,那接受方需要全部接受,在 protobuf 解析之后才能报错。但是如果自己实现的话,就可以提前报错。 |
17
SuperFashi OP @ZE3kr 群发可以直接用发多条来实现。的确这样会需要很多的 pow 但是逻辑上是合理的(否则可以滥用群发)。如果想要更好的用户体验(比如群发列表接收者也可以看到),可以做 message 上的 extension 。
|
18
SuperFashi OP @fgwmlhdkkkw 每一条 protobuf 有大小限制,目前为 ~65536 b (~16 kb)
|
19
SuperFashi OP @lookStupiToForce 为何不可取可以详细说一下吗?
|
20
lookStupiToForce 2022-04-13 14:08:46 +08:00
@SuperFashi #19 我不懂里面的技术原理和真实实现啊,只是最初看到“加入随机群组”这种说法,我以为是类似于古早聊天室的功能,这样可能会直接落入 [一条垃圾信息-多条对垃圾信息的回馈 /咒骂-有价值信息减少,发言者参与意愿降低-更多垃圾信息] 的恶性循环(除非单点的 pow 会根据群组用户投票而动态变化,但因为匿名性,弃号重生的成本太低,用户为了对付垃圾节点可能每天都疲于投票了;总之没有类似准入准出机制 /权限管理的群组很难不沦为垃圾场 /广告群)。
但看你后面说群发需要发多条即多个 pow 来实现,似乎消息又是 P2P 而不是广播机制? P2P 的话本地可以实施黑名单策略,但网络通信部分还是会被垃圾信息占用资源,很难解决吧? |
21
nielinjie 2022-04-13 14:21:21 +08:00
为啥有人要看匿名发布的消息?
|
22
lzcers 2022-04-13 14:37:50 +08:00
厉害!我之前也想用 Rust 基于 libp2p 写一个,没想楼主竟然已经做到了!
|
23
777777 2022-04-13 14:40:58 +08:00
感觉有很多类似的项目,楼主此项目的优势是什么呢?😀
|
24
SuperFashi OP @lookStupiToForce 我表述不够详细。加入随机群组是指的用户会被分配到一个虚拟的组内 /给一个不唯一的编号,没有方法可以区分任何两个在同一组内的用户,以达成匿名性。消息是通过 p2p 的广播( gossip ),网络通信部分是可能被垃圾信息占用资源,但是如上面所说有 pow 和日后可以通过别的方式改善(比如上下行对等的策略)。
|
25
SuperFashi OP @nielinjie 这个不是匿名的布告栏,是保证匿名性的分布式消息传递网络。
|
26
lookStupiToForce 2022-04-13 15:25:27 +08:00
@SuperFashi #24 感谢解答。这样从结果来看,就是将用户身份识别从单点放到了群组上?其他收到消息的用户只知道是这个组发出的,没法溯源是这个组下哪个用户嘛? Group 2 Peer XD ?咦,那这个接收消息的 Peer 想反向发消息,怎么发给原来的人呢,还是说加密只在群组外进行,群组内还是可以互相识别?(原谅我密码学小白,不知道这种不对等加密解决方式)
|
27
SuperFashi OP @lookStupiToForce 类似于 ECIES:发送的时候发送者把自己的公钥也嵌在消息里面一起加密,然后给消息用私钥签个名。消息的收件地址是收件人所在的组。消息传到这个组内的时候所以组内成员都会尝试解密,能够成功解密的就是收件人。收件人解密完后用消息内部的公钥就可以知道谁是发件人,并且通过公钥和签名可以验证消息的确是这个发件人发的。
|
28
lookStupiToForce 2022-04-13 15:55:34 +08:00
@SuperFashi #27 看完仍不得要领,不得不再次感慨密码学的牛逼😂我得补补课
|
29
smallyu 2022-04-13 16:55:08 +08:00
工作量证明生成消息,效率不会很低吗
|
30
est 2022-04-13 17:50:02 +08:00
whitepaper.md 不存在。
|
32
SuperFashi OP @smallyu 什么样的效率会低?
|
33
120267583 2022-04-14 00:28:12 +08:00
解决广告滥用,我提供一个思路
1 、引入代币、前期 POW 挖矿、后期质押挖矿 2 、发帖消耗代币、并且消耗的代币空投给所有质押挖矿者 3 、消息查看可以按照质押代币数量显示、质押的代币越多、质押的时间越长、可信度越高 4 、加入黑名单机制、如果有一个账号持币量很大进行滥用、用户可以进行主动拉黑操作 感觉以上几个思路可以很好的起到广告滥用的情况,同时又保证了匿名信 |
34
SuperFashi OP @120267583 似乎你又发明了一个分布式账本(区块链)
|
35
LeeReamond 2022-04-14 04:11:22 +08:00 1
很好奇 LZ 如何解决工作量证明抖动的问题,比如寻找某 hash 前 n 位为 0 作为工作量证明的话,位数太少,很快就找到了,没有意义,位数每多 1 位,工作时间增加若干倍,再加上搜索时间本身有抖动,最低值可以很低,最高值又变得非常大,那么实际发消息的体验是否是发出一条消息,等 1 分钟后才提示发送成功,然后再等一分钟对方才会回一句话
|
36
SuperFashi OP @LeeReamond 有期望值,方差也不是很大,目前设定的参数在现代电脑上 1-5s 之间。实际上可以考虑成邮件形式,虽然 webui 做成了及时聊天的样子(可能是个错误)
|
37
LeeReamond 2022-04-14 13:27:51 +08:00
@SuperFashi 很喜欢你的匿名消息网络想法,但感觉有些问题,为了保证程序兼容性一般是使用 cpu 计算,但这份工作量证明对于显卡计算来说又显得微不足道,对于 2022 年这种即使是个人用户也可以掌握充分算力的情况,系统的防洪机制显得很脆弱。另外我很好奇你的工作量证明实现如何保证 1-5 秒计算,起码我个人测试当中以 sha256 算 0 来看单次计算超过均值百倍情况也有出现,这意味着普通用户如果需要 5 秒发出,偶尔有的人会需要 5 分钟才能发出。另外 5 秒的工作量感觉即使是作为 cpu 计算也显得少了,但同时你很难控制比如想要将 5 秒增加到 10 秒。
|
38
SuperFashi OP @LeeReamond 嗯有道理,做参照的话 BitMessage 他们选了 SHA512 所以比特币的 ASIC 不能拿来直接做 PoW 。他们的 PoW 难度也大,期望值大概是 5 、6 分钟左右(他们是邮件的形式)。所以感觉是可以在 peer 交换之间再设一条坎,比如上下行对等、频率限制等。
|
40
liuser666 2022-04-14 17:22:21 +08:00
我擦,我就是想弄这种东西,但是原理性的东西和具体的 api 都不熟悉,先看看大佬的代码借鉴一下!!!如果好的话直接当 contributor !!!
|
43
mutalisk 2022-04-15 13:12:19 +08:00 1
先不说 asic 了,就连 cuda 和 fpga 都会让这个 pow 防线变得非常脆弱,这个问题如何解决呢。
|
44
0xFish 2022-04-16 13:29:17 +08:00
蹲一个白皮书
|