将 TON 区块链集成到 Trust Wallet:案例研究
Source: Dev.to
请提供您希望翻译的具体文本内容,我将为您翻译成简体中文并保留原有的格式、Markdown 语法以及技术术语。谢谢!
旅程
-
第1个月: TON 在一个拥有 1.3亿 用户的钱包中上线。
-
资助: 我看到 TON 基金会提供开发资助,提交申请后,他们几乎立刻联系了我。
-
合作: 我给在 Trust Wallet 工作的朋友发了信息。我们一起创建了一个群聊,成员包括:
- Wallet Core 开发者
- TON 团队
- 我的工程师朋友
- 我
-
复杂情况: Trust Wallet 由两部分组成:
- Wallet Core – 开源库,负责密钥生成、地址校验、交易签名等。
- App layer – 闭源代码,用于获取余额、广播交易以及与 UI 交互。
只有 Trust Wallet 内部团队可以修改 App 层,这意味着 管理层批准、分配的工程时间以及责任追究。
-
基金会的担忧: “如果 Trust Wallet 从未将其加入应用会怎样?为何要资助这个项目?”
-
解决方案: 双方团队达成了折中方案。
- TON 批准了资助。
- Trust Wallet 承诺优先进行集成。
结果: 为 Trust Wallet 用户提供了新的区块链,为 TON 用户提供了新的钱包——双赢。
-
开发: 我的朋友完成了大部分编码工作;我负责审查和完善。该 PR 大约在一个月内合并。
Trust Wallet 平台
| 平台 | 描述 |
|---|---|
| Android | 原生应用 |
| iOS | 原生应用 |
| Browser Extension | 基于网页的钱包 |
其核心是 Wallet Core,一个开源的 C++/Rust 库,支持 130+ 条区块链。它不仅被 Trust Wallet 使用,也被其他主流钱包(例如 Crypto.com)使用。该库处理:
- 私钥生成
- 地址创建与验证
- 交易签名
- 智能合约交互
这就是我们添加 TON 的地方。
TON 背景
- 原始项目: 由 Pavel Durov 发起;开发部分由 TON Labs 负责。
- 制裁: 在美国制裁后,Durov 退出,但 TON Labs 继续开发了一个名为 Free TON 的分叉,后更名为 Everscale。
- 当前状态: 一个新的 TON Foundation(得到 Durov 认可)复活了该项目,将其集成到 Telegram 中,项目已起飞。
TON Labs 做出了大量令人印象深刻的技术工作。Everscale 已经在 Wallet Core 中出现;我们将共享代码提取到一个名为 CommonTON 的模块中,该模块现在为 Everscale 和 TON 提供动力。
钱包模型差异
| 链 | 钱包类型 | 实现 |
|---|---|---|
| Everscale | V3 钱包(旧) | 已在 Wallet Core 中 |
| TON | V4R2 钱包(新) | 为此集成实现 |
在 TON 中,钱包 不仅仅是一个地址——它是一个完整的智能合约。要创建交易,需要向钱包合约发送 外部消息,钱包合约随后会转发 内部消息 给接收方。
External Message (user → wallet contract)
├─ header: sender’s contract address
├─ stateInit: code & data (only on first transaction)
└─ body
├─ signature: Ed25519 signature
└─ signing_message
├─ wallet_id, expire_at, seqno
└─ Internal Message (to recipient)
├─ header: "send Y nanotons to address Z"
└─ body: transfer comment
技术细节
单元结构(Bag‑of‑Cells)
所有 TON 数据都是由 单元(最大 1023 比特 + 最多 4 个引用)构成的树。下面是我们为创建 V4R2 钱包数据单元添加的代码(C++ 风格,编译进 Wallet Core)。
// Create the data cell for a V4R2 wallet
Cell::Ref WalletV4R2::createDataCell() const {
CellBuilder builder;
builder.appendU32(0); // sequence_number
builder.appendU32(walletId); // wallet_id
builder.appendRaw(publicKey.bytes, 256); // public key (256 bits)
builder.appendBitZero(); // "no plugins" flag
// Total: 321 bits → fits into a single cell
return builder.intoCell();
}
要构建一笔交易,我们会为以下内容组装单元:
- 接收方地址
- 金额
- 可选备注
所有单元都会被打包进已经在 Wallet Core 中实现的 BOC(Bag‑of‑Cells)序列化器。
地址格式
| 链 | 原始地址示例 | 用户友好格式 |
|---|---|---|
| Everscale | 0:4f6bbb5de550f01a5b73792ceca77d8c933ab396a1e300eb0ab5a5f49a430986 | — |
| TON | — | EQBPa7td5VDwGltzeSzsp32MkzqzlqHjAOsKtaX0mkMJhq_B |
TON 格式是一个 Base64 字符串,内部嵌入了地址类型信息和 校验和,用于捕捉输入错误。
助记词 & 密钥派生
-
BIP‑39 定义:
seed = hash(mnemonic + salt) -
标准盐:
"mnemonic"+password -
TON 盐:
"TON default seed"
由于盐不同,相同的助记词在 Tonkeeper 与 Trust Wallet 中会生成不同的私钥。因此,这些钱包 不可互换。同样的问题也出现在 Waves、Qtum 和 Polkadot(sr25519)中。
TON 地址中的校验和还能在助记词出现拼写错误导致地址无效时,立即提醒用户。
超出代码的贡献
- 为 Trust Wallet 团队提供了 代码示例,包括:
- 获取交易数据
- 查询钱包状态
- 对与 TON 相关的 应用集成 问题提供咨询。
- 向资产库添加了区块链元数据和 TON 标志。
Outcomes
| 指标 | 数值 |
|---|---|
| 通过 Trust Wallet 获得 TON 访问的用户 | 130 million |
| 区块链集成补助金 | $4,250 |
| 添加 Jettons(TON 代币)补助金 | $4,000 |
| PR 合并到 Wallet Core | January 2023 |
在最初的集成之后,我随后添加了 Jetton 支持(TON 代币),并转向了其他 TON 和 NEAR 项目。
我偶尔会在 Twitter 上分享开发笔记及其他内容。
致谢
衷心感谢所有贡献者:
- Tao Xu
- Roman Sztergbaum
- optout
- Sergei(Trust Wallet 团队)– 组织与代码审查
- Kirill(TON 基金会)– 协助管理所有事务
- Narek – 来自 TON 的技术支持
- Vyacheslav – 实现了主要集成
- Vladimir(Trust Wallet)– 使其成为可能并进行代码审查
- 以及所有其他为本项目做出贡献的人