上个月我写过怎么自己验证 BRL1.p 的"1:1 背书",那次只是 10 月 17 日的一张快照。后来我自己也往金库存了钱,就一直在想:快照之后的每一天,谁来盯着?这周我把检查做成每 6 小时自动跑一次,顺便把上线以来的每一笔跨链都翻出来对了一遍,结果比我预想的多了两个发现。
先给短答案:不够。一次快照只能证明那一刻两边数字相等。想持续放心,至少要做三件事:用消息编号把每一笔跨链在两条链上对上;把两条链的每一次余额变化排成一条时间线,看发行量有没有哪一刻超过金库;定期重读到底是谁在签字放行。
我在 BRL1.p 上把这三件事都做了。上线以来 18 笔跨链全部对上,36 次余额变化里,发行量没有一次超过金库。但有两件事是上次快照看不到的:三个必须签字的验证方里,有一个在 BRL1.p 上线第一天就换了签名密钥,之后在 LayerZero 登记表里的名字也从 Nethermind 变成了 Twinstake;另外,三个验证方的 54 次验证,全部由同一个账户提交上链。
一次快照漏掉了什么
BRL1.p 是巴西雷亚尔稳定币 BRL1 跨到 Rayls 公链上的版本。用户在 Polygon 上把 BRL1 存进一个金库合约,LayerZero 把消息传到 Rayls,Rayls 上再铸造同样数量的 BRL1.p;反方向则先销毁、再解锁。
10 月 17 日那次快照,金库余额和 BRL1.p 发行量都是 250,013.482911,一分不差。可两次快照之间发生过什么,快照本身说不出来。那次我是按金额、地址和先后顺序把锁定和铸造配对的,没有用到 LayerZero 的消息编号,万一配错了也看不出来。至于"三个验证方",快照里只有配置中的三个地址,地址背后是谁、用什么密钥签字,都没有。
这次的代码、逐笔记录和每次运行的日志都放在公开仓库 hansonhan0520-lang/rayls-verify 的 2026-11-brl1p-monitor 文件夹里,GitHub Actions 每 6 小时自动跑一遍并把结果提交回仓库。本文数字来自 2026 年 11 月 6 日 03:25 到 03:56(UTC)的几次运行。
第一件事:用消息编号逐笔对账
LayerZero 给每条跨链消息分配一个唯一编号 GUID,发出时写在源链的 OFTSent 事件里,到账时写在目标链的 OFTReceived 事件里。两边编号相同,才算同一笔。
结果是 18 笔:Polygon 到 Rayls 16 笔,Rayls 到 Polygon 2 笔。每一笔的 GUID 两边一致,锁定数等于铸造数,LayerZero 自己的消息浏览器 LayerZero Scan 列出的两端交易哈希也和链上一致。LayerZero 给每条通道的消息按顺序编号,这 16 笔的序号是 1 到 16,反方向是 1 和 2,中间没有缺号,所以表里没有漏掉的消息。反过来也查了:金库余额和 BRL1.p 发行量的每一次变化,都能找到对应的跨链消息,没有一次"凭空"的增发或转出。
到账时间:Polygon 到 Rayls 用了 248 到 293 秒,中位数 267 秒;反方向 57 秒和 63 秒。上次 13 笔的范围是 248 到 274 秒,10 月 28 日新增的一笔用了 293 秒,把上限拉长了。
第二件事:把两条链排成一条时间线
健康的锁定铸造桥有一个不变式:金库里的 BRL1 永远不少于 BRL1.p 的发行量。因为钱是先锁再铸、先销毁再解锁的,跨链途中的四五分钟里,金库会比发行量多出正在路上的那一笔。
我把两条链的 36 次余额变化按区块时间排在一起,逐次计算两边的差。每一次变化之后差值都不小于 0,最小正好是 0,也就是没有任何一刻发行量超过金库。Polygon 一侧不只靠事件推算:在 18 个余额变化的区块上,我用两家独立的归档节点(drpc 和 Tenderly)直接读金库的 balanceOf,和推算结果逐一相符,没有一处不符。
管理权限这一层也重读了。从 10 月 14 日到 11 月 6 日,每天 00:00(UTC)读一次 Polygon 金库的所有者、对端合约、LayerZero 代理人和验证方配置,24 天全部相同。两条链上能找到的 18 条管理和配置事件,全部发生在 10 月 13 日 18:05 到 18:10 的部署期间,之后再没有改过。上次指出的情况也没变:铸造和销毁权只在跨链适配器手里,管理员、暂停、升级权限和两边合约的所有权仍在同一个普通钱包地址上。
第三件事:到底是谁在签字放行
这一层今年出过大事。4 月 KelpDAO 的跨链桥被盗约 2.92 亿美元,LayerZero 在 5 月的事故报告里,把原因归到 RPC 节点被操纵,加上这个应用只依赖一个验证方的配置。验证方在 LayerZero 里叫 DVN,它们在源链上看到消息,等够确认数后去目标链签字放行。BRL1.p 两个方向都要求三个 DVN 全部签字:LayerZero Labs、Canary,以及一个 id 为 nethermind 的 DVN。
先看它们有没有真的签。每条消息到账前,目标链上会留下每个 DVN 的一条 PayloadVerified 记录。16 笔 Polygon 到 Rayls 的消息,在 Rayls 上各有三条,共 48 条;2 笔反方向的在 Polygon 上各有三条,共 6 条。每一条报告的确认数都正好是要求的数字:Polygon 120 个区块,Rayls 10 个区块。Rayls 上的验证在 Polygon 锁定后 232 到 253 秒到达,跨链那四分多钟,大部分就是在等 Polygon 的 120 个区块。
再看是谁签的。DVN 合约要求每次验证带够一定数量的签名人签名,这些签名就在验证交易的输入数据里,可以还原出签名地址。我把 54 次验证的签名逐一还原:LayerZero Labs 的门槛是 3 个签名人里签 2 个,16 笔全部由同样两把密钥签;Canary 的门槛是 1 个签名人签 1 个,16 笔都是同一把密钥。

变化出在第三个。前 4 笔(10 月 14 日)是密钥 0xbbd4 签的;从第 5 笔(10 月 15 日)开始换成了 0x86f0,其中一笔是 0x598c。链上记录显示,这个 DVN 在 10 月 14 日 19:55 到 15 日 00:30(UTC)之间,在 Polygon 和 Rayls 上同时加了两个签名人、删掉了原来的一个,正好卡在 BRL1.p 第 4 笔和第 5 笔之间。
名字也变了。我 10 月 17 日的运行日志里,LayerZero 的公开 DVN 登记表把这个地址标为 Nethermind;11 月 6 日再读,标的是 Twinstake,id 仍然是 nethermind。Nethermind 在 8 月 19 日宣布已停止运营 LayerZero DVN,转去做 Chainlink 节点。把这几件事连起来,最可能的解释是 Nethermind 的这个 DVN 交给了 Twinstake 运营,签名密钥也随之更换。这一步是我的推断:链上只能看到密钥在 10 月 14 日换了,看不到密钥在谁手里;登记表是 LayerZero 维护的链下标签,我也只读到了两个日期的版本,改名的具体时间不知道。
还有一个共同点。54 次验证交易,不分 DVN、不分哪条链,全部由同一个账户 0xb8ff…47cb 发出。这个账户和另一个账户 0xb52f…f0b6 在六个 DVN 合约(每条链三个)上都持有管理员角色,它在 Polygon 上已经发过 888 万多笔交易。按 LayerZero 的合约代码和文档,管理员负责提交,但每次提交都必须带够签名人的签名,管理员单独伪造不了验证。所以我对它的理解是:安全上,三把锁仍然是三组不同的密钥,伪造一条消息至少要拿到 4 把签名密钥(2 加 1 加 1);可用性上,提交通道集中在一个账户,它要是停了,两个方向的跨链都会卡在路上等。后半句是根据代码做的推断,我没有观测到停摆。
一个复现上的坑:官方节点重建不了历史
想让别人能复现,就得说明数据从哪来。Rayls 官方公共节点在这件事上帮不上大忙:读任何历史状态都返回"已裁剪",连 10 月 17 日的区块也读不了;对 BRL1.p 和适配器查日志,150 万个区块范围内返回 0 条;18 笔 Rayls 交易一笔回执都拿不到。但交易本身都能查到,而且 16 笔到账交易的输入数据里都带着对应的 GUID、收款地址和金额,2 笔发出交易也带着收款地址和金额。
所以 Rayls 一侧的事件历史,只能来自 Rayls 的区块浏览器。我用三样东西交叉核对它:LayerZero Scan 的记录、官方节点返回的交易输入,以及官方节点读到的当前发行量 255,291.961901,它和由浏览器事件重建出来的数字完全相等。Polygon 一侧则用了 PublicNode 和 Tenderly 两家节点取日志,两家逐条一致。
储备那一层:报告还是那份
跨链桥只负责 BRL1.p 和 BRL1 一比一,BRL1 本身有没有雷亚尔撑着,要看发行方的储备证明。11 月 6 日我从 brl1.io 能下载到的最新一份,仍是 10 月 1 日那份:储备 19,354,372 雷亚尔,对应 17,381,384.54 枚 BRL1,比率 111.35%,报告写明是内部编制、尚未经独立机构审计。网站上的链接文字却写着"已审计的最新储备证明"。"运作方式"页面里标为"最新"的链接,指向 2025 年 4 月 14 日的报告,同样是内部编制;另一个链接要登录 Google 才能看;网站链接的 Fact Finance 储备页面返回 404。
两份能读到的报告,我都按它们写的区块号核对了代币数量,两家归档节点的读数都与报告一致。这说明报告的"负债"那一半对得上链,"资产"那一半仍只有发行方自己的说法。11 月 6 日 Polygon 上 BRL1 已有 17,882,561.54 枚,比 10 月 1 日多了 501,177 枚,这部分对应的储备还没有任何公开报告覆盖。
独立保证长什么样,可以参考美国《GENIUS 法案》:发行方每月公布储备构成,由 CEO 和 CFO 签字认证,并由外部会计师事务所做鉴证。BRL1 是巴西的稳定币,不适用这部法律,这里只把它当作一个参照。等 BRL1 真的发布独立报告时,先看签字的是不是独立会计师事务所,报告有没有写明做的是哪种鉴证、依据什么准则。报告里的代币数量能不能在它写的区块上读出来,用仓库里的 por_check.py 就能查。
还没做到的
Rayls 一侧的事件历史依赖区块浏览器,官方节点只能交叉核对,不能独立重建。Polygon 的每日读数只在 00:00 取一次,但余额的每一次变化都另外按区块核对过。签名密钥由谁持有、0xb8ff 这个账户由谁运营,链上看不出来。自动检查从 11 月 6 日开始,只覆盖之后的时间,之前的部分靠历史重建。
我的看法
逐笔核对下来,跨链本身很干净,18 笔全部对上,发行量从没超过金库。签字这一层比"三个验证方"听起来要复杂:安全上确实是三组不同的密钥,但其中一组在上线第一天就换过,提交通道也只有一个。最弱的仍是发行方那一层,最新的储备证明还是一份未经审计的内部报告。
判断标准很简单。任何人都可以在 rayls-verify 仓库运行 brl1p-monitor 工作流,或者直接看它每 6 小时提交的结果。如果出现新的管理或配置事件、验证方换签名人、发行量哪怕一次超过金库,或者 BRL1 发布了独立鉴证的储备报告,都会在下一次运行里留下记录。
参考来源:
本文代码、逐笔记录与运行日志(2026 年 11 月 6 日提交):https://github.com/hansonhan0520-lang/rayls-verify/tree/4e37e76f7541fbea2cba1c0b8967c46afa905677/2026-11-brl1p-monitor
上一篇快照的运行日志(2026 年 10 月 17 日):https://github.com/hansonhan0520-lang/rayls-verify/tree/main/2026-10-brl1p-backing
LayerZero DVN 合约说明:https://docs.layerzero.network/v2/workers/off-chain/dvn-technical-reference
LayerZero DVN 公开登记表:https://metadata.layerzero-api.com/v1/metadata/dvns
LayerZero KelpDAO 事故报告(2026 年 5 月 18 日):https://layerzero.network/publications/kelpdao-incident-report.pdf
crypto.news,Nethermind 退出 LayerZero 验证方角色(2026 年 8 月 19 日):https://crypto.news/nethermind-leaves-layerzero-verifier-role-chainlink/
BRL1 官网与储备证明文件(2026 年 11 月 6 日读取):https://brl1.io/en
美国审计质量中心,GENIUS 法案对会计师的要求(2025 年 10 月 27 日):https://www.thecaq.org/audit-in-action-what-does-the-genius-act-require-of-accountants
#Rayls $RLS #稳定币
