
过去一年在写一个匿名分布式的消息网络,取名叫 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 应该就可以解决。定向广告的话可以在客户端做个黑名单 /未知发件人过滤。 |
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 |
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 很好奇 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 先不说 asic 了,就连 cuda 和 fpga 都会让这个 pow 防线变得非常脆弱,这个问题如何解决呢。 |
44 0xFish 2022-04-16 13:29:17 +08:00 蹲一个白皮书 |