本文档介绍如何将 浏览器插件钱包移植到 Telegram Miniapp 环境中,实现跨端钱包能力。
| 维度 | 结论 |
|---|---|
| 安全性 | 等同插件钱包,存储加密后的钱包数据 |
| 成本 | 较小,复用现有钱包,主要工作在架构升级和接入 TON Connect |
| 跨端 | TG Miniapp 天然支持移动端和桌面端 |
在不重新开发整个钱包的前提下,通过适配层抹平浏览器插件和 TG Miniapp 之间的运行时差异。
浏览器插件依赖三个独立的运行环境:
| 环境 | 功能 | 依赖能力 |
|---|---|---|
| DAPP 环境 | 向 DAPP 页面注入代码并执行 | 插件代码注入能力 |
| Background 环境 | 私钥存储、钓鱼网站拦截 | 插件 Storage、后台常驻运行时 |
| UI 环境 | 页面渲染 | 浏览器 Webview |
graph TB
subgraph "浏览器插件"
A1[DAPP环境<br/>代码注入]
A2[Background环境<br/>Storage + 后台运行]
A3[UI环境<br/>插件页面]
end
subgraph "TG Miniapp"
B1[TON Connect<br/>/ Wallet Connect]
B2[TG本地存储<br/>或TG云存储]
B3[TG Miniapp Webview]
end
A1 -.->|替代| B1
A2 -.->|替代| B2
A3 -.->|替代| B3
关键差异:TG 中不支持向网页注入代码,DApp 交互需通过标准连接协议实现。
graph TB
subgraph "业务层(不变)"
BIZ[钱包业务逻辑]
end
subgraph "适配层(新增)"
AD[运行时适配器]
end
subgraph "运行时环境"
E1[浏览器插件 API]
E2[TG Miniapp API]
end
BIZ --> AD
AD --> E1
AD --> E2
在非插件环境中,模拟 Chrome 插件 API:
| Chrome API | TG 替代方案 |
|---|---|
chrome.storage.local | IndexedDB 实现相同 API |
chrome.runtime.reload | window.location.reload() |
chrome.runtime.getManifest | 返回固定版本信息 |
chrome.runtime.getURL | 直接返回 path |
chrome.tabs.create | 实现 Web 环境下的页面跳转 |
现有架构:插件由 Background 和 UI 两个独立进程组成,通过 Chrome API 通信。
目标架构:
backgroundConnect 对象调用 BG 模块暴露的 APIbackgroundConnect 监听 BG 模块的 sendUpdate 数据sequenceDiagram
participant UI as UI 模块
participant Adapter as 通信适配层
participant BG as Background 模块
UI->>Adapter: 调用钱包方法
Adapter->>BG: 转发请求(插件用chrome.runtime / Web用直接调用)
BG->>BG: 执行业务逻辑
BG->>Adapter: sendUpdate 通知
Adapter->>UI: 更新 UI 状态
sequenceDiagram
participant DApp as DApp
participant SDK as TON Connect SDK
participant Server as TonConnect Server
participant Wallet as TG Miniapp钱包
DApp->>SDK: 发起连接请求
SDK->>Server: 发送连接请求
Server->>Wallet: 推送连接请求
Wallet->>Wallet: 用户确认连接
Wallet->>Server: 返回连接结果
Server->>SDK: 转发结果
SDK->>DApp: 连接成功
DApp->>SDK: 发起交易请求
SDK->>Server: 转发交易
Server->>Wallet: 推送签名请求
Wallet->>Wallet: 用户确认签名
Wallet->>Server: 返回签名结果
Server->>DApp: 交易完成
两部分工作:
与 TonConnect 类似,但支持更多链。可与移动端团队共建该协议。
| 维度 | 方案一:本地存储 | 方案二:TG 云存储 |
|---|---|---|
| 存储位置 | 本地 | TG Cloud |
| 是否可跨端 | ❌ 不可以 | ✅ 可以 |
| 加密方案 | 密码/生物识别随机密码 | 密码/生物识别随机密码 |
| 安全性 | 加密 + 防暴力破解 | 加密 + 防暴力破解 + 上云 |
产品可选择只提供一种,或让用户自选(主要选择是否跨端)。
graph LR
A[用户触发生物识别] --> B[Face ID / 指纹]
B --> C[TG BiometricManager]
C --> D[读取随机密钥<br/>上限1024字节]
D --> E[系统Enclave解密]
E --> F[数十万次密钥衍生]
F --> G[解密助记词/私钥]
BiometricManager 生成超长密码(上限 1024 字节)| 钱包 | 助记词加密 | 保存位置 | 密钥保存 | 防暴力破解 | 评价 |
|---|---|---|---|---|---|
| TON Space | ❌ | 本地 | - | ❌ | 泄露后直接破解 |
| Wave Wallet | ✅ | 本地 | 本地 | ❌ | 泄露后直接破解 |
| UXUY(默认) | ✅ | TG Cloud | TG Cloud | ❌ | 加密向量与数据一起存储 |
| UXUY(设密码) | ✅ | TG Cloud | 用户记忆 | ❌ | 较安全 |
| TON Keeper | ✅ | TG Cloud | 用户记忆 | ❌ | 必须用户密码,较安全 |
| 本方案 | ✅ | 本地/TG Cloud | 用户记忆+生物识别 | ✅ | 数十万次密钥衍生防暴力破解 |
| 维度 | 主站域名 | 二级域名 | 独立域名 |
|---|---|---|---|
| 数据安全 | 钱包数据可被主站读取 | 数据独立,部分cookie共享 | 完全独立 |
| 隔离性 | 低 | 中 | 高 |
每个 TG Miniapp 需对应一个 TG Bot,需准备:
TG Miniapp Wallet 本质是 Web 钱包,架构完成后可直接:
类似 Particle WaaS、Phantom 嵌入式钱包、MetaMask 类似方案。
src/
├── background/ # BG代码(从原插件迁移)
│ ├── controller/
│ ├── entrypoint/
│ └── providers/
├── contentscript/ # 内容脚本(插件专用)
├── inpage/ # 注入DApp的脚本(插件专用)
├── shared/ # BG和UI公共部分
├── ui/ # UI代码
├── platform/
│ ├── extension/ # 插件打包入口
│ │ ├── background.js
│ │ └── ui.js
│ └── web/ # TG Wallet打包入口(新增)
│ ├── background.js
│ └── ui.js
└── locales/ # 多语言| 阶段 | 内容 |
|---|---|
| 第一期 | 支持除 DApp 外所有基础功能 |
| 第二期 | 支持 TON Connect、自定义 Connect 协议,允许第三方 DApp 连接;优化基础性能 |
TG Miniapp 钱包的核心思路是复用现有插件钱包的业务逻辑,通过适配层抹平运行时差异,重点解决 DApp 交互(用标准 Connect 协议替代代码注入)和安全存储(利用 TG 生物识别 + PBKDF2 密钥衍生)两大问题。
架构完成后还可延伸为 WaaS 服务,为三方提供嵌入式钱包能力。