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

深夜来发个小折腾,玩家声望数据库

  •  1
     
  •   phoenixlzx ·
    phoenixlzx · 2021-08-25 02:05:31 +08:00 · 2711 次点击
    这是一个创建于 968 天前的主题,其中的信息可能已经有所发展或是发生改变。

    起源是一些 Minecraft 服务器主之间的讨论,共享行为恶劣的玩家 ID 以早做预防。类似话题讨论多了之后便有了一个类似 “云 ban” 的系统,即共享 banlist 。但是这些设计通常有些弱点:

    • 中心化方案:需要中心服务器,无法确保中心服务器的中立性,无法确保云上数据是否被篡改。
    • 去中心化方案:需要每个服务器自行提供共享接口,包括 HTTP 服务器或放在 Minecraft 的协议包中等,有些管理员不希望暴露服务器地址,直接向封闭协议包里塞数据也可能导致未知问题。

    于是就引出了这个小项目:Minecraft Player Reputation Database “Minecraft 玩家声望数据库”。

    它的基本原理非常简单,即

    1. 通过他人无法篡改的方式来提供数据交换。
    2. 使用数值来量化“声望”。

    于是就有了两种实现思路:

    • 中心化:基于 PGP 签名消息,简易实现、无需公开特定 Minecraft 服务器地址,例如 MySQL 数据库 <> 后端 API <=> 客户端(插件)。由于签名消息无法被篡改的特性,网络上的任何人都可以开设一个中心服务器。
    • 去中心化:基于区块链实现信息交换,客户端本地进行数据提取。需要 ledger 服务器。

    由于时间略紧想快就只做了中心化的方案(因为可以 CRUD 直接出样品)。

    任何人都可以向中心服务器提交签名的声望数据,作为服务器管理员则可以只获取信任签名的数据并在本地基于信任度对声望数据做加权处理,最后得出一份本地的声望数据,即可根据这份数据做进一步的操作。

    项目主页(包括服务端实现和一些客户端实现): https://openmprdb.org

    类似的思路可以推广到任何基于 ID 的平台,不仅仅是 Minecraft 。由于平时没什么时间所以各种设计实现都还比较粗糙,欢迎各路大神吐槽批评哈哈)

    8 条回复    2021-08-25 15:58:31 +08:00
    halfcrazy
        1
    halfcrazy  
       2021-08-25 02:13:54 +08:00
    以前收游戏用过一个 steam 的 https://steamrepcn.com/
    boboliu
        2
    boboliu  
       2021-08-25 04:48:59 +08:00
    用 PGP 好处还是很大的,信任网络的机制足够灵活

    现在比较困难的部分反而可能是对于部分 mc 服主的学习成本,有几个想法:
    - 创建 keypair 和签名的部分可能可以用 keybase 来简化?但是 keybase 似乎不会把它的 keyserver 直接暴露,可能需要其他的东西,比如这个 https://github.com/anapsix/keybase-keyserver-proxy
    - 为了对 pubkey 方便访问,卷菊苣可以考虑自己整个 keyserver
    - 有了 keyserver 之后,接口就没必要发完整的 pubkey 而是 id 就可以了
    - 有了上面两条之后,信任网络( key 的 sign )就可以灵活更新了
    - 此时可以构建一个相对直白的 index 和 graph,提供比较权威 key 的 sign key 动向啊什么的,或者在已知某 key 时获取该 key 及其信任 key 签名的列表
    totoro625
        3
    totoro625  
       2021-08-25 08:28:28 +08:00
    ① mc 盗版用户偏多,服务器绝大部分没有开正版验证,导致用户注册新账户非常容易
    ② 正版账户改 ID 也很简单

    解决办法:
    ① 正版验证
    ② 邀请制注册或限量邀请码
    ③ 注册用户内审机制,对于新注册的用户跟踪一段时间
    ④ 类似于 keybase 要求认证身份,用微博、贴吧、qq 、微信等方式认证身份
    2i2Re2PLMaDnghL
        4
    2i2Re2PLMaDnghL  
       2021-08-25 10:10:07 +08:00
    话说 PGP 的 Keyserver 采用了一种半中心化机制
    所有的 keyserver 间进行仅新增的同步,所有数据不可修改删除,密钥无效化必须通过新增一条密钥删除记录实现。
    基于这种想法呢?
    zjyl1994
        5
    zjyl1994  
       2021-08-25 11:24:42 +08:00
    好耶,是卷老师(喵窝鸽子路过
    phoenixlzx
        6
    phoenixlzx  
    OP
       2021-08-25 14:07:33 +08:00
    @boboliu 没有必要 keybase,中心服务器存储的公钥只是用来验证公钥本身有效性的,不然签名没法验证哇(

    @totoro625 你可能需要了解一下正版是有 UUID 这个东西的,跟你用什么游戏 ID 没有关系。至于盗版...谁关心?

    @2i2Re2PLMaDnghL 虽然这里没有设计 keyserver,但是删除从规则上禁止的话怎么保证中心服务器没有**有意图**地删除某些数据?
    2i2Re2PLMaDnghL
        7
    2i2Re2PLMaDnghL  
       2021-08-25 14:50:35 +08:00
    @phoenixlzx PGP 本来就考虑到作恶者存在,所有 keyserver 进行完全仅新增同步,除非某一个 keyserver 程序上进行持续屏蔽,影响也仅限于此服务器。不是单一中心服务器,而是多个中心服务器相互同步,单一服务器作恶只会影响只使用这个服务器的用户。
    我的意思是,像 PGP 体系那样采用『去中心化的服务端间结构』和『多中心化的服务端-客户端结构』的混合半中心化结构。
    更有效地,可以将「某个服务器提供的所有声望数据」作为打包和签名的粒度,这样不太会产生包庇玩家的行为。
    phoenixlzx
        8
    phoenixlzx  
    OP
       2021-08-25 15:58:31 +08:00
    @2i2Re2PLMaDnghL 我觉得这个放在客户端上实现也可以,目前的客户端设计基本都是可以支持多个“中心服务器”的。

    不过中心服务器之间互相验证数据也可以算是互相监督,提升中立公平和透明的方案
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3062 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 11:02 · PVG 19:02 · LAX 04:02 · JFK 07:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.