JavaScript·加密货币·密码学
大家好!我想你已经知道,大约一年来,Telegram 中的迷你应用程序出现了热潮每个人都点击了仓鼠。这些迷你应用程序大多数都与加密货币有关。许多开发者希望在应用程序内为用户提供一个钱包(EVM、TON、Solana 等)——基本上是一个可以充值、可以提取资金、最重要的是可以调用智能合约的虚拟账户。
一个简单但不安全的解决方案是将所有密钥存储在您的服务器上并代表用户进行交易。如果有人入侵您的服务器,所有客户资金都会丢失。在这种情况下很难赢得人们的信任。
一个复杂但不方便的解决方案是用户必须将其写在一张纸上并自行管理的钱包。在这种情况下,您不妨只使用 WalletConnect 或者根本不构建迷你应用程序。问题是你的迷你应用程序的 UI 可能会变得很痛苦:用户必须确认外部应用程序中的每个操作。
我们为我们的迷你应用程序寻找一个选项,该选项可以提供非托管钱包的安全性和尽可能流畅的用户体验/用户界面。我们找到了它。
在本文中,我将回顾 TMA 钱包(npm 包、网站、GitHub)——一个适用于任何链的开源、非托管、多方钱包,它使用最近推出了Telegram Cloud Storage API。
我们走吧!
钱包=私钥。该私钥用于签署交易并授予其所有者控制特定区块链地址资金的权利。
托管钱包 = 某些组织拥有您的私钥并可以代表您行事。一个典型的例子是像币安这样的加密货币交易所。这很方便,但需要对组织有极大的信任。
非托管钱包 = 您独自拥有您的私钥。它存储在您的设备上,所有使用您的资金的操作均由您完成或经过您的确认。主要问题是很容易丢失。如果您丢失私钥,您就会丢失资金。
MPC(多方计算) = 解决“钱包丢失”问题的尝试:密钥被分成几部分,存储在不同的地方,所有部分都需要在交易上形成签名。在这种情况下,黑客攻击一方不会让您访问用户的资金。同时,用户不需要完全自己存储密钥。
因此,非托管 MPC 钱包 是一种私钥被分成多个部分存储在不同位置且永远不会由任何一方完全组装的钱包。
TMA 钱包 是一种非托管多方 (MPC) 钱包,它使用 Telegram Cloud Storage 进行安全密钥存储。一切都链接到用户的 Telegram 帐户,因此他们不必记住任何助记词或设置外部钱包。流程非常流畅,您的用户甚至可能没有意识到幕后有一个加密钱包 - 您可以构建一个完全友好的 UI 并向用户隐藏区块链魔力。
以下是一些主要优点:
轻松集成:只需安装 npm 包,将其插入您的代码即可。现在,您的迷你应用程序的每个用户都有一个钱包。
无 TON Connect 或 WalletConnect 解决方法:用户完全留在 Telegram 中;所有交易均在“幕后”签署。
MPC 技术:任何人都无法使用私钥 — Telegram 不行,您的服务器不行,TMA Wallet 的服务器不行。它仅在用户设备上组合几纳秒(在签署交易时),然后消失。
轻松恢复:丢失手机?没问题——换一个新钱包,登录 Telegram,钱包就会自动恢复。
从多个设备访问:如果用户使用相同的 Telegram 帐户从桌面客户端打开迷你应用程序,他们将可以访问与手机上相同的钱包。
开源:一切都在 GitHub 上。您可以自行审查和验证安全性或委托审核。
Viem/Wagmi/Ethers.js 支持:如果您正在开发任何 EVM 兼容链(以太坊、BSC、Polygon 等),则可以使用标准库。
支持任何链:EVM 链开箱即用,但 TMA 钱包基本上是一个用于单独存储任何秘密的系统。因此,您可以存储 TON、Solana 或任何其他链的私钥。
正如我所提到的,TMA 钱包基于 MPC 原则,其中私钥在多方之间有效共享,并且仅在客户端短暂重组以签署交易。这是一个简短的摘要:
当用户首次打开您的小应用程序时,用户的设备会生成 ClientPublicKey 和 ClientSecretKey。 ClientSecretKey 保存在 Telegram Cloud Storage 中。
ClientPublicKey 和 WebApp.initData(由 Telegram 签名)发送到服务器。
服务器检查 Telegram 的签名是否有效,并(可选)要求用户进行额外身份验证 (2FA)。这是可选的,如果您不想,则不必这样做。
服务器然后通过使用自己的 ServerSecretKey 签名(ClientPublicKey telegramUserId)来生成 IntermediaryKey。然后它会加密此 IntermediaryKey,然后再将其发送回客户端。
IntermediaryKey 返回到客户端并在那里解密。
最后,客户端用ClientSecretKey签署IntermediaryKey,得到WalletPrivateKey(钱包的实际私钥)。
此密钥用于签署交易,并且不会长期保存在任何地方。对于每个新操作,都会重复该步骤链(步骤 1 除外)。
最终,该应用程序的用户体验看起来很完美:由于迷你应用程序中的自动身份验证,登录是无缝的,并且由于有应用内钱包,因此交易是无缝的。
npm install --save @tmawallet/sdk
import { TMAWalletClient } from '@tmawallet/sdk'; import { ethers } from 'ethers'; // Don't forget to sign up at dash.tmawallet.com const myApiKey = '1234567812345678'; // Your API key const client = new TMAWalletClient(myApiKey); // Authorize the user and create/load their wallet await client.authenticate(); console.log('Your wallet address: ', client.walletAddress);
// Use TMA Wallet as the "signer" for ethers const provider = new ethers.JsonRpcProvider(); const signer = client.getEthersSigner(provider); const tx = await signer.sendTransaction({ to: '0x...', value: ethers.parseEther('1.0'), }); console.log('Transaction hash:', tx.hash);
就是这样。
以下是 TMA 钱包自述文件中的问题(略有编辑)及其答案:
这绝对安全吗?
是的,这就是核心思想。得益于 MPC 协议,TMA 钱包的服务器、Telegram 和您都无法完全访问私钥,只有用户可以。
我必须授予您访问我的机器人令牌的权限吗?
不会。我们是最早支持 Telegram 新的非对称签名方案的公司之一。我们只需要您的机器人 ID,该 ID 已经公开。
可以支持哪些区块链?
任何。 EVM 区块链(以太坊等)可以与 ethers.js 一起开箱即用。对于自定义的内容,您可以使用 accessPrivateKey 方法。
如果用户丢失设备怎么办?
只要他们能够访问自己的 Telegram 帐户,他们只需在新设备上登录,钱包就会自动恢复。不需要助记词。
我可以备份密钥吗?
从技术上讲是可以的,但你可能不需要。钱包已经可以通过 Telegram 恢复。如果您愿意,您可以让用户备份,但这需要您自担风险。
我们在我们自己的两个应用程序中使用了TMA 钱包。一个已经在制作中(我有点害羞地在开始时发布链接,但我认为可以在页脚中提及:Only100x)。
对于任何构建 Telegram 迷你应用程序并希望为用户提供安全钱包而又不会因外部连接器而扰乱用户体验的人来说,这是一个不错的选择。
请随意尝试并探索文档。该项目的所有代码均在 GitHub 上开放。祝你好运!
标签:
telegram 迷你应用 · 加密货币 · 非托管钱包 · tma 钱包
以上是TMA 钱包 — 适用于 Telegram Mini 应用程序的非托管 MPC 钱包的详细内容。更多信息请关注PHP中文网其他相关文章!