V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
SuperFashi
V2EX  ›  分享创造

Nymo:一个匿名分布式的消息网络

  •  6
     
  •   SuperFashi ·
    superfashi · 2022-04-13 03:00:26 +08:00 · 4907 次点击
    这是一个创建于 940 天前的主题,其中的信息可能已经有所发展或是发生改变。

    过去一年在写一个匿名分布式的消息网络,取名叫 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

    44 条回复    2022-04-16 13:29:17 +08:00
    AIML
        1
    AIML  
       2022-04-13 03:51:38 +08:00 via Android
    厉害呀,我之前也有类似的想法,不过拖延癌让我寸步未行
    aima
        2
    aima  
       2022-04-13 04:01:41 +08:00 via iPhone
    没文化的我只能说 牛批
    aima
        3
    aima  
       2022-04-13 04:04:56 +08:00 via iPhone
    工作量证明生成消息和加入网络可以详细说说么? 期待白皮书早日完工
    AIML
        4
    AIML  
       2022-04-13 04:18:07 +08:00 via Android
    怎么解决广告问题呢?
    SuperFashi
        5
    SuperFashi  
    OP
       2022-04-13 04:36:19 +08:00 via iPhone
    @AIML 群发广告相当于 flooding ,pow 应该就可以解决。定向广告的话可以在客户端做个黑名单 /未知发件人过滤。
    SuperFashi
        6
    SuperFashi  
    OP
       2022-04-13 04:37:48 +08:00 via iPhone   ❤️ 1
    @aima 就是哈希碰撞,和 hashcash /比特币差不多。
    sujin190
        7
    sujin190  
       2022-04-13 09:19:13 +08:00
    @SuperFashi #5 滥发广告 pow 解决不了吧,这就是成本收益的问题,过高发送成本会影响普通消息发送,过低发送成本完全阻挡不了发广告,毕竟大部分广告的收益都毕竟高或者根本不关心成本,你这个又不能有低成本的反垃圾滥用的问题,虽然你可以在接收端屏蔽,但是且不说依然占用网络资源,而且匿名特性本身创建用户是无成本的拉黑基本意义不大

    还是不应该低估垃圾消息的量,感觉你可以按垃圾消息是常规消息万倍以上这个量级来考量,之前也有好多版去中心化的 sns 产品了吧,用户稍微上来一点就被垃圾信息淹没了,啥用没有,所以这个去中心不是难点,重点还是在如何不破坏匿名性的情况下设计效率极高的反垃圾,否则注定会是白花功夫,还有一点也很重要去中心和匿名并不能规避法律风险
    SuperFashi
        8
    SuperFashi  
    OP
       2022-04-13 10:19:53 +08:00
    @sujin190 使用 pow 就是将发送成本和发送量挂钩:如果垃圾消息是常规消息万倍,那发送者就需要常规用户万倍的计算量。以后的实现中还可以加上 p2p 上下行对等,保证 fairness 之类的算法。完全避免垃圾消息是不可能的,因为网络设计出来就是不可以区分垃圾消息或者普通消息。
    Dkngit
        9
    Dkngit  
       2022-04-13 10:26:38 +08:00
    一个匿名分布式的消息网络: https://tox.chat/
    给楼主一个参考
    sujin190
        10
    sujin190  
       2022-04-13 10:26:55 +08:00
    @SuperFashi #8 你这是想发的越多付钱越多?可是消息本来就有的人有需要发更多,有的人不怎么发,本身就不平衡,你这样不正好把很需要你的人拦在外面,不怎么需要你无所谓的人到用的挺好,看看现实微信就是这样的啊,多的好友成千上万,一天各种消息几千几万的,少的好友几百,一天消息几条几十条,这样肯定不科学,太小众了,通信工具这种太小众怎么用啊!否则你是想做地下工具么。。
    SuperFashi
        11
    SuperFashi  
    OP
       2022-04-13 11:10:45 +08:00
    @Dkngit 不是匿名的 https://tox.chat/faq.html#tox-leak-ip ,看着也不是 0-RTT 的样子。这种网络比较好 route ,和 bt 一样维护一个 DHT 就好,看着也是这么实现的。
    SuperFashi
        12
    SuperFashi  
    OP
       2022-04-13 11:12:44 +08:00
    @sujin190 proof-of-work 不是 proof-of-stake 或者你可能在想 gas fee ,可以多了解一下。
    ZE3kr
        13
    ZE3kr  
       2022-04-13 11:34:45 +08:00 via iPhone
    能否支持群发呢?比如实现类似邮件列表的需求
    ZE3kr
        14
    ZE3kr  
       2022-04-13 11:35:05 +08:00 via iPhone
    这种需求岂不是会需要很大的 pow
    lookStupiToForce
        15
    lookStupiToForce  
       2022-04-13 11:40:08 +08:00
    是大佬! star 了再拉下来学习!
    看了一圈讨论,感觉随机分配入群可能不可取,还是得按需加群,而且还得有权限控制(不过这样又绕回了传统身份控制了,匿名性网络顿时变熟人身份网络)
    去中心化真是不可避免要应付垃圾节点以及衍生的垃圾信息
    fgwmlhdkkkw
        16
    fgwmlhdkkkw  
       2022-04-13 11:53:55 +08:00
    我有一个问题。
    ```
    message Digest {
    bytes hash = 1;
    uint32 cohort = 2;
    }
    ```
    因为用了 protobuf ,所以如果我发一个 2GB 的这个结构,那接受方需要全部接受,在 protobuf 解析之后才能报错。但是如果自己实现的话,就可以提前报错。
    SuperFashi
        17
    SuperFashi  
    OP
       2022-04-13 13:34:57 +08:00
    @ZE3kr 群发可以直接用发多条来实现。的确这样会需要很多的 pow 但是逻辑上是合理的(否则可以滥用群发)。如果想要更好的用户体验(比如群发列表接收者也可以看到),可以做 message 上的 extension 。
    SuperFashi
        18
    SuperFashi  
    OP
       2022-04-13 13:36:10 +08:00
    @fgwmlhdkkkw 每一条 protobuf 有大小限制,目前为 ~65536 b (~16 kb)
    SuperFashi
        19
    SuperFashi  
    OP
       2022-04-13 13:37:46 +08:00
    @lookStupiToForce 为何不可取可以详细说一下吗?
    lookStupiToForce
        20
    lookStupiToForce  
       2022-04-13 14:08:46 +08:00
    @SuperFashi #19 我不懂里面的技术原理和真实实现啊,只是最初看到“加入随机群组”这种说法,我以为是类似于古早聊天室的功能,这样可能会直接落入 [一条垃圾信息-多条对垃圾信息的回馈 /咒骂-有价值信息减少,发言者参与意愿降低-更多垃圾信息] 的恶性循环(除非单点的 pow 会根据群组用户投票而动态变化,但因为匿名性,弃号重生的成本太低,用户为了对付垃圾节点可能每天都疲于投票了;总之没有类似准入准出机制 /权限管理的群组很难不沦为垃圾场 /广告群)。
    但看你后面说群发需要发多条即多个 pow 来实现,似乎消息又是 P2P 而不是广播机制? P2P 的话本地可以实施黑名单策略,但网络通信部分还是会被垃圾信息占用资源,很难解决吧?
    nielinjie
        21
    nielinjie  
       2022-04-13 14:21:21 +08:00
    为啥有人要看匿名发布的消息?
    lzcers
        22
    lzcers  
       2022-04-13 14:37:50 +08:00
    厉害!我之前也想用 Rust 基于 libp2p 写一个,没想楼主竟然已经做到了!
    777777
        23
    777777  
       2022-04-13 14:40:58 +08:00
    感觉有很多类似的项目,楼主此项目的优势是什么呢?😀
    SuperFashi
        24
    SuperFashi  
    OP
       2022-04-13 15:05:27 +08:00
    @lookStupiToForce 我表述不够详细。加入随机群组是指的用户会被分配到一个虚拟的组内 /给一个不唯一的编号,没有方法可以区分任何两个在同一组内的用户,以达成匿名性。消息是通过 p2p 的广播( gossip ),网络通信部分是可能被垃圾信息占用资源,但是如上面所说有 pow 和日后可以通过别的方式改善(比如上下行对等的策略)。
    SuperFashi
        25
    SuperFashi  
    OP
       2022-04-13 15:10:10 +08:00
    @nielinjie 这个不是匿名的布告栏,是保证匿名性的分布式消息传递网络。
    lookStupiToForce
        26
    lookStupiToForce  
       2022-04-13 15:25:27 +08:00
    @SuperFashi #24 感谢解答。这样从结果来看,就是将用户身份识别从单点放到了群组上?其他收到消息的用户只知道是这个组发出的,没法溯源是这个组下哪个用户嘛? Group 2 Peer XD ?咦,那这个接收消息的 Peer 想反向发消息,怎么发给原来的人呢,还是说加密只在群组外进行,群组内还是可以互相识别?(原谅我密码学小白,不知道这种不对等加密解决方式)
    SuperFashi
        27
    SuperFashi  
    OP
       2022-04-13 15:46:17 +08:00 via iPhone
    @lookStupiToForce 类似于 ECIES:发送的时候发送者把自己的公钥也嵌在消息里面一起加密,然后给消息用私钥签个名。消息的收件地址是收件人所在的组。消息传到这个组内的时候所以组内成员都会尝试解密,能够成功解密的就是收件人。收件人解密完后用消息内部的公钥就可以知道谁是发件人,并且通过公钥和签名可以验证消息的确是这个发件人发的。
    lookStupiToForce
        28
    lookStupiToForce  
       2022-04-13 15:55:34 +08:00
    @SuperFashi #27 看完仍不得要领,不得不再次感慨密码学的牛逼😂我得补补课
    smallyu
        29
    smallyu  
       2022-04-13 16:55:08 +08:00
    工作量证明生成消息,效率不会很低吗
    est
        30
    est  
       2022-04-13 17:50:02 +08:00
    whitepaper.md 不存在。
    sewer
        31
    sewer  
       2022-04-13 19:12:03 +08:00
    @777777 优势就是你写不出来 smile
    SuperFashi
        32
    SuperFashi  
    OP
       2022-04-13 22:14:00 +08:00 via iPhone
    @smallyu 什么样的效率会低?
    120267583
        33
    120267583  
       2022-04-14 00:28:12 +08:00
    解决广告滥用,我提供一个思路
    1 、引入代币、前期 POW 挖矿、后期质押挖矿
    2 、发帖消耗代币、并且消耗的代币空投给所有质押挖矿者
    3 、消息查看可以按照质押代币数量显示、质押的代币越多、质押的时间越长、可信度越高
    4 、加入黑名单机制、如果有一个账号持币量很大进行滥用、用户可以进行主动拉黑操作

    感觉以上几个思路可以很好的起到广告滥用的情况,同时又保证了匿名信
    SuperFashi
        34
    SuperFashi  
    OP
       2022-04-14 00:55:22 +08:00
    @120267583 似乎你又发明了一个分布式账本(区块链)
    LeeReamond
        35
    LeeReamond  
       2022-04-14 04:11:22 +08:00   ❤️ 1
    很好奇 LZ 如何解决工作量证明抖动的问题,比如寻找某 hash 前 n 位为 0 作为工作量证明的话,位数太少,很快就找到了,没有意义,位数每多 1 位,工作时间增加若干倍,再加上搜索时间本身有抖动,最低值可以很低,最高值又变得非常大,那么实际发消息的体验是否是发出一条消息,等 1 分钟后才提示发送成功,然后再等一分钟对方才会回一句话
    SuperFashi
        36
    SuperFashi  
    OP
       2022-04-14 05:57:00 +08:00 via iPhone
    @LeeReamond 有期望值,方差也不是很大,目前设定的参数在现代电脑上 1-5s 之间。实际上可以考虑成邮件形式,虽然 webui 做成了及时聊天的样子(可能是个错误)
    LeeReamond
        37
    LeeReamond  
       2022-04-14 13:27:51 +08:00
    @SuperFashi 很喜欢你的匿名消息网络想法,但感觉有些问题,为了保证程序兼容性一般是使用 cpu 计算,但这份工作量证明对于显卡计算来说又显得微不足道,对于 2022 年这种即使是个人用户也可以掌握充分算力的情况,系统的防洪机制显得很脆弱。另外我很好奇你的工作量证明实现如何保证 1-5 秒计算,起码我个人测试当中以 sha256 算 0 来看单次计算超过均值百倍情况也有出现,这意味着普通用户如果需要 5 秒发出,偶尔有的人会需要 5 分钟才能发出。另外 5 秒的工作量感觉即使是作为 cpu 计算也显得少了,但同时你很难控制比如想要将 5 秒增加到 10 秒。
    SuperFashi
        38
    SuperFashi  
    OP
       2022-04-14 13:51:59 +08:00
    @LeeReamond 嗯有道理,做参照的话 BitMessage 他们选了 SHA512 所以比特币的 ASIC 不能拿来直接做 PoW 。他们的 PoW 难度也大,期望值大概是 5 、6 分钟左右(他们是邮件的形式)。所以感觉是可以在 peer 交换之间再设一条坎,比如上下行对等、频率限制等。
    ufan0
        39
    ufan0  
       2022-04-14 16:16:32 +08:00
    @sewer #31 你这个是讽刺楼上的意思吗?

    楼上的提问对于个人开发者来说是不错并且值得回应的问题。
    liuser666
        40
    liuser666  
       2022-04-14 17:22:21 +08:00
    我擦,我就是想弄这种东西,但是原理性的东西和具体的 api 都不熟悉,先看看大佬的代码借鉴一下!!!如果好的话直接当 contributor !!!
    sewer
        41
    sewer  
       2022-04-14 23:05:50 +08:00 via iPhone
    @ufan0 讽刺不至于吧 我明着挖苦他啊
    ufan0
        42
    ufan0  
       2022-04-15 09:33:45 +08:00
    @sewer #41 不是很理解挖苦他的心态是什么
    mutalisk
        43
    mutalisk  
       2022-04-15 13:12:19 +08:00   ❤️ 1
    先不说 asic 了,就连 cuda 和 fpga 都会让这个 pow 防线变得非常脆弱,这个问题如何解决呢。
    0xFish
        44
    0xFish  
       2022-04-16 13:29:17 +08:00
    蹲一个白皮书
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1003 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 20:42 · PVG 04:42 · LAX 12:42 · JFK 15:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.