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中文網其他相關文章!