# Portaldot 黑客屋 2026 | Rootmark：用于 Portaldot V3 的可验证双虚拟机数据与查询中间件

**URL:** <https://portaldot.discourse.group/t/topic/194>\
**Category:** Hackathon\
**Created:** [2026 年11 月 8 日 07:04 UTC](https://portaldot.discourse.group/t/topic/194 "2026-11-08T07:04:35Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

作者： ![Sketchify](https://avatars.discourse-cdn.com/v4/letter/s/e99b99/32.png) [@Sketchify](https://portaldot.discourse.group/u/Sketchify)\
发布日期： [2026 年11 月 8 日 07:04 UTC](https://portaldot.discourse.group/t/topic/194/1 "2026-11-08T07:04:35Z")

</div>

## 项目介绍

**Rootmark** 是 Portaldot V3 链的可验证数据与查询中间件。

Portaldot V3 在两个执行环境中运行一条链：通过 EVM 端点运行 Solidity 合约，通过 `pallet_contracts` 运行 ink! 合约。Rootmark 将两者索引为单一的标准化 `EventRecord`（包含 `vm, chainId, blockNumber, blockHash, txHash, contract, event, args, leaf` 字段），并通过统一的查询 API 和控制台提供服务，同时在链上提交每一批次的 Merkle 根。任何读取者都可以获取结果及其 Merkle 路径，在本地重建根节点，并将其与锚定合约中存储的根节点进行比较。如果索引器伪造了记录，验证将失败。

赛道：模块化云与中间件。已在 Portaldot V3 测试网上线，链 ID 为 420420777。

## 解决的问题

这两个虚拟机暴露了不同的事件模型（Solidity 日志与 Substrate `system.events` 加上 ink! `ContractEmitted`），没有共享索引，且每个通过索引器读取的应用都必须信任其提供的信息。

Rootmark 用“验证”取代了“信任”。一个索引涵盖两个 VM。每批数据都归约为一个 32 字节的根，存储在 `PortalAnchor` 合约中。验证在读取者自己的进程中重新计算（浏览器标签页或脚本），而非直接从服务器输出获取。未上链承诺的批次会明确标记为 `unsigned`，因此界面永远不会暗示其并不具备的证明。

## 链接

**实时网站：** [https://rootmark-seven.vercel.app](https://rootmark-seven.vercel.app)

**控制台（查询加验证）：** [Console: query and verify every record | Rootmark](https://rootmark-seven.vercel.app/console)

**锚点（批次、根节点、交易）：** [Anchors: Merkle batches on chain | Rootmark](https://rootmark-seven.vercel.app/anchors)

**合约（链上实时状态）：** [Contracts: anchor state live from chain | Rootmark](https://rootmark-seven.vercel.app/contracts)

**演示视频（30秒，真实屏幕，光标点击“验证”）：** [https://youtu.be/HhubgdyP3U8](https://youtu.be/HhubgdyP3U8)

**GitHub：** [GitHub - Sketchify-Dev/rootmark: Verifiable data and query middleware for the Portaldot V3 chain. One query across EVM and ink! events, every result carries a Merkle proof. · GitHub](https://github.com/Sketchify-Dev/rootmark)

**路演文稿：** [Rootmark - Pitch Deck | Rootmark](https://rootmark-seven.vercel.app/pitch-deck)

**API：** `GET /api/v1/events`, `GET /api/v1/proof/:id`, `GET /api/v1/anchors`

**链上证明（从 `PortalAnchor` 存储中读回）：**

- `PortalAnchor`（EVM）：`0x92B79C5cD9CC8235e3e2718a739BE825e2bd5430`，部署交易 `0x6e33aa2d09f1a32b076df8297529e8cf87f57bb9a777570ed2624ec9e822a923`（区块 204392）
- `Emitter`（测试事件）：`0x178B9ED9dB766d2ecda393ca0b780A643a12C31E`
- 最新提示批次 `0x068e2ffd...0bf8f798`，根节点 `0x3aa9be70...c0c7f21083`，计数 1，记录区块 204924，锚定交易 `0x3f5a2af5...` 位于区块 204947
- `PortalAnchor` 上共有 4 个真实锚点，已于 11 月 2 日从合约存储中验证

## 技术亮点

**1. 跨越两个 VM 的统一记录格式**

索引器同时追踪 EVM 端点（`eth_getBlockByNumber`、收据、ABI 解码日志）和 Substrate 节点（`system.events`，包括 ink! `ContractEmitted`）。两个数据源都标准化为一种可查询的格式。控制台的 `Env` 列显示每一行数据来自哪个 VM，单次查询结合事件和合约过滤器即可跨越两者。

**2. 每批数据都锚定在链上，并附带收据**

记录分组为批次，哈希为叶子节点，进行 Merkle 化，并通过 `anchor(root, count, fromBlock)` 提交。目前 `PortalAnchor` 存储中有四个锚点，包含批次 ID、根节点、计数、区块范围和交易哈希。落地页上的最新提示行即为实时最新数据，而非模拟数据。

**3. 验证在您的浏览器中运行**

点击控制台任意行上的“验证”，面板将显示四个值：叶子节点、本地重建的根节点、锚定的根节点以及从合约存储中读取的根节点。重建过程使用与索引器相同的哈希代码，在标签页中执行。伪造的记录会产生不匹配，并以红色显示。

**4. 设计上的诚实信任状态**

公共部署是无状态的，因此其 26 条记录的快照和 8 个快照批次被标记为 `unsigned`（`onChainRoot: null`；`verified: true` 意味着本地 Merkle 计算通过，而非链上一致）。真实批次携带交易哈希和区块信息。这一区别在 API 和 UI 中均有明确体现。

**5. 完全可复现的评审路径**

从全新克隆到生成证明只需几分钟：`npm install`, `npm run typecheck`, `npm test`, `npm run build`，然后运行 `npm run indexer` 配合 `npm run dev`。无状态索引无需密钥。使用持有资金 tPOT 的 `PORTALDOT_MNEMONIC`，同一索引器可签署并锚定新批次。仓库包含 README、部署说明、架构图（`docs/architecture.svg`）、演示脚本（`DEMO.md`）以及 `contracts/deployments.json` 流程。

## 团队

由 **Sketchify** 独立构建。

- GitHub: [@Sketchify-Dev](https://github.com/Sketchify-Dev)
- 端到端负责范围：双 VM 索引器、Solidity 锚点、Merkle 证明系统、REST API、Next.js 控制台、合约部署、文档和路演文稿

## 评委与投票契合度

**对于评委：** Rootmark 是中间件，而非又一个仪表盘。它直接对应评分标准：技术可行性（工作正常的双 VM 索引器、具有可验证交易的已部署合约、通过的类型检查加测试加构建、浏览器端证明重算）；创新性（专为双 VM 链设计的可检查索引，其中唯一受信任的值是每批次一个 32 字节的根节点）；生态系统贡献（开源的查询加证明 API，任何 Portaldot 开发者均可复用，附带文档和架构）；商业潜力（每一个读取链的应用都需要一个不必盲目信任的索引）。

**对于社区投票者：** 如果你曾好奇一个浏览器或索引器是否说了真话，这是为你打造的。打开控制台，运行一个跨越两个 VM 的查询，点击任意行的“验证”，看着根节点在你自己的标签页中重新计算。无需安装，无需钱包，无需注册。

---

<div class="post-metadata">

作者： ![ympangbill](https://avatars.discourse-cdn.com/v4/letter/y/779978/32.png) [@ympangbill](https://portaldot.discourse.group/u/ympangbill)\
发布日期： [2026 年11 月 9 日 14:29 UTC](https://portaldot.discourse.group/t/topic/194/2 "2026-11-09T14:29:37Z")

</div>

技术可行，创新可见，商业与社群贡献可行。76分

---

<div class="post-metadata">

作者： ![Sketchify](https://avatars.discourse-cdn.com/v4/letter/s/e99b99/32.png) [@Sketchify](https://portaldot.discourse.group/u/Sketchify)\
发布日期： [2026 年11 月 9 日 20:51 UTC](https://portaldot.discourse.group/t/topic/194/3 "2026-11-09T20:51:48Z")

</div>

（帖子已被作者删除）

---

<div class="post-metadata">

作者： ![Sketchify](https://avatars.discourse-cdn.com/v4/letter/s/e99b99/32.png) [@Sketchify](https://portaldot.discourse.group/u/Sketchify)\
发布日期： [2026 年11 月 9 日 20:52 UTC](https://portaldot.discourse.group/t/topic/194/4 "2026-11-09T20:52:20Z")

</div>

感谢你的评分
