[DIS] Community Fund DAO v1.1 Web5 优化提案/ Community Fund DAO v1.1 Web5 Optimization Proposal

English Version

亲爱的社区成员,特别是此次提案的参与者们:

我代表 DAO 管理委员会,就本次提案的投票结果,发布以下调查与仲裁结果说明。

一、背景

在提案投票结束后,社区收到了多起关于投票公正性的投诉。

公开的讨论可见此帖:https://talk.nervos.org/t/community-fund-dao-v1-1-web5-recommendation-for-a-revote-on-the-community-fund-dao-v1-1-web5-optimization-proposal/9655/1

此外,还有多位成员通过私下渠道反映相似问题。

投诉的主要焦点在于:

投票账户 BroAllen 与 Mod 的投票权重的最后五位数完全相同,疑似重复使用了相同的 NervosDAO 地址 进行投票。

在收到投诉后,DAO 管理委员会认为这些怀疑合理且值得调查

尽管当时尚无直接证据,但线索足以构成调查的起点。

我们随即启动了正式调查程序,期限为一周。


二、调查与结论摘要(TL;DR)

在截止日期前,我们找到了直接且可验证的证据。以下是调查与仲裁的主要结论:

  1. Bug 发现

    我们确认 Metaforo 在基于 NervosDAO 存款计算投票权重时存在一个漏洞:

    用户在绑定 NervosDAO 地址完成投票后,可以解除绑定(unbind),再绑定到另一个账户进行重复投票。

  2. 漏洞被实际利用

    调查确认该漏洞在本次投票中被利用。

    涉及的重复地址如下:

    ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsq22vda73jzdlu3lf6luskzcjz7z5ksa58stp95p5
    
    ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsqwpcdzq3q7klvy9esgjlsy9vrapke97kgsqmwwrp
    
    

    重复利用的权重合计:71,247,257

    该部分权重被用于反对票

  3. 未发现其他异常

    我们未发现除上述两个地址外的其他重复投票行为。

  4. 仲裁决定:修正投票结果

    因此,委员会决定剔除重复的 71,247,257 票权重,并重新计算投票结果:

    • 赞成票:343,524,829

    • 反对票(修正后):184,348,409 - 71,247,257 = 113,101,152

    • 新比例:343,524,829 / (343,524,829 + 113,101,152) = 75.23%

    :white_check_mark: 修正后投票结果:提案以 75.2% 赞成票通过。


三、调查过程说明

  1. 调查进展比预期更复杂。

    原因是 Metaforo 后端未保留完整的请求日志,数据库中也未记录 bind/unbind 状态变化

  2. 我们最终通过 Metaforo 前端实现细节,结合 CKB 浏览器后端日志,锁定了重复投票的证据。

  3. 在调查过程中,我们意外联系到了 MOD(BroAllen)本人

    他(她)承认了利用漏洞重复投票的事实,并提供了部分操作细节和动机。出于隐私考虑,本文不披露其个人信息。他(她)表示将在仲裁结果公布后以个人身份回应此事件。


四、致谢

此次调查和最终报告的形成得到了以下团队和个人的协助与支持:

  • App5 团队(CKB浏览器团队)

  • Metaforo 团队

  • 社区成员 Yixiu

五、调查报告与日志资料

Metaforo 投票权重获取逻辑

  • 绑定地址时,会去查询:

    • 该地址是否已被绑定(Metaforo平台内部)

    • 该地址下是否有处于「存款中」状态的 NervosDAO Cell(通过浏览器的/api/v2/dao_events接口获取),并拿到capacity,判断是否 > 0

  • 投票时,会去:

    • 查询用户下绑定了多少NervosDAO地址

    • 依次遍历请求这些地址下处于「存款中」状态的 NervosDAO Cell(通过浏览器的/api/v2/dao_events接口获取),并拿到capacity(权重)

    • 对各个地址权重进行累加,得到该用户的投票权重

获取权重的代码如下:


用户「Mod」的投票记录数据追踪

Metaforo 上 Mod 的投票完成的时间为 2025-10-28 08:18:27(UTC+0):

在ckb explorer的接口服务端,可以看到相同的时间段内,有三个地址顺序请求了/api/v2/dao_events 接口:

Table1

图中数据两两一组,分别记录了请求入口,以及数据返回的时间(UTC+8)、请求地址。上图的日志里展示了在投票时 Metaforo 后端请求该账号当前绑定的3个CKB地址的权重,结合CKB浏览器的数据,这三个地址以及权重如下:

考虑到 Metaforo 里忽略了小数点之后的权重,此累计权重与在 Metaforo 提案投票结果中 「Mod」的相符。

更进一步,我们抓取了Oct 28, 2025 @ 16:00:00.000 - Oct 28, 2025 @ 17:00:00.000 之间的请求记录(详细日志参见附件2):

image

Table2 BroAllen 投票前后的日志

发现只有上述3个地址相关的请求,由于来自 Metaforo 的投票均会进入这个请求,因此可以排除在此时间段有别的地址参与投票的可能性。


用户「BroAllen」的投票记录数据追踪

Metaforo 上 BroAllen 的投票完成的时间为 2025-11-03 19:44:05(UTC+0):

同样,我们抓取了 ckb explorer 后端的接口服务日志,看到该时段内有两个地址顺序请求了/api/v2/dao_events 接口(如图中红色标注区域),符合投票时 Metaforo 的请求行为:

Table3

这两个地址的信息分别如下:

考虑到 Metaforo 里忽略了小数点之后的权重,此累计权重与在 Metaforo 提案投票结果中 「BroAllen」的相符。

更进一步,我们抓取了 Nov 4, 2025 @ 03:00:00.000 → Nov 4, 2025 @ 04:00:00.000 之间的请求记录(详细日志参见附件3):

image

Table4 BroAllen 投票前后的日志

发现只有上述上述两个地址相关的请求,由于来自 Metaforo 的投票均会进入这个请求,因此可以排除在此时间段有别的地址参与投票的可能性,也即这一阶段只有 BroAllen 在 Metaforo 上投票。


分析

通过跟踪「Mod」和「BroAllen」的投票记录和请求日志,发现「BroAllen」和「Mod」两个账号在投票期间共用了以下地址来投票:

  • ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsq22vda73jzdlu3lf6luskzcjz7z5ksa58stp95p5

  • ckb1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsqwpcdzq3q7klvy9esgjlsy9vrapke97kgsqmwwrp

累计权重达到 71,247,257 。


附录(相关日志文件):

  1. https://dao.ckb.community/thread/64083 提案投票期间两个地址的请求日志:
    log1, log2

  2. 「Mod」投票前后的请求日志:
    log3

  3. 「BroAllen」投票前后的请求日志:
    log4

  4. 提案投票期间所有请求的日志(社区可以参考以上方法来进行验证):
    log5

  5. 日志文件重要字段说明

7 Likes