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

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

  •  6
     
  •   SuperFashi ·
    superfashi · 175 天前 · 3940 次点击
    这是一个创建于 175 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    楼上的提问对于个人开发者来说是不错并且值得回应的问题。
    liuser666
        40
    liuser666  
       174 天前
    我擦,我就是想弄这种东西,但是原理性的东西和具体的 api 都不熟悉,先看看大佬的代码借鉴一下!!!如果好的话直接当 contributor !!!
    sewer
        41
    sewer  
       173 天前 via iPhone
    @ufan0 讽刺不至于吧 我明着挖苦他啊
    ufan0
        42
    ufan0  
       173 天前
    @sewer #41 不是很理解挖苦他的心态是什么
    mutalisk
        43
    mutalisk  
       173 天前   ❤️ 1
    先不说 asic 了,就连 cuda 和 fpga 都会让这个 pow 防线变得非常脆弱,这个问题如何解决呢。
    mgy309502059
        44
    mgy309502059  
       172 天前
    蹲一个白皮书
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2207 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 12:53 · PVG 20:53 · LAX 05:53 · JFK 08:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.