در کد تلگرام دسکتاپ، قابلیت اتصال کیف پول به وب‌سایت مستقیماً در پنجره ورود از طریق تلگرام آماده شده است. وب‌سایتی که با حساب تلگرام خود وارد آن می‌شوید، می‌تواند در همان درخواست، آدرس کیف پول داخلی شما را درخواست کند؛ با یک تأییدیه، هم وارد وب‌سایت می‌شوید و هم کیف پول شما از طریق TON Connect به آن متصل می‌شود. این کد از تاریخ ۱۲ تا ۱۳ اکتبر در شاخه توسعه (development branch) کلاینت قرار دارد و همین نوع داده در نسخه بتا (beta build) تلگرام برای macOS از ۲۰ اکتبر موجود است. در نسخه‌های منتشر شده و مستندات API، این قابلیت هنوز وجود ندارد.

شکل ظاهری آن چگونه خواهد بود

پنجره تأیید ورود در حال حاضر نشان می‌دهد که کدام وب‌سایت درخواست دسترسی دارد، درخواست از کدام دستگاه آمده است، و یک سوئیچ (toggle switch) با عنوان «Allow Messages» برای اجازه دادن به ربات وب‌سایت جهت ارسال پیام به شما وجود دارد. طبق کد کلاینت، اگر وب‌سایت درخواست کیف پول کرده باشد، موارد زیر در زیر آن ظاهر می‌شوند:

  • یک خط با عنوان «Wallet» شامل آدرس کیف پول تلگرام شما که به دو نیمه تقسیم شده است (با کلیک کردن، آدرس کپی می‌شود)؛
  • یک سوئیچ (toggle switch) با عنوان «Connect Wallet» که به صورت پیش‌فرض فعال است؛
  • توضیحی: «{bot} درخواست اتصال کیف پول شما به این وب‌سایت را دارد. وب‌سایت آدرس TON، موجودی و تراکنش‌های شما را مشاهده خواهد کرد، اما بدون اجازه شما قادر به انتقال وجوه نخواهد بود. این اتصال یک امضا برای ورود است، نه برای انتقال.»

تمام شش خط جدید رابط کاربری در یک کامیت در ۱۲ اکتبر با توضیحات «Grant site wallet access from the login confirmation» اضافه شده‌اند. اگر سوئیچ فعال بماند، پس از تأیید ورود، کلاینت از شما می‌خواهد کیف پول را باز کنید و تنها پس از آن، رضایت را به سرور ارسال می‌کند.

درخواست کیف پول فقط در ورود از طریق لینک، زمانی که وب‌سایت شما را برای تأیید به تلگرام می‌فرستد، انجام می‌شود. دکمه‌های ورود زیر پیام‌های ربات‌ها در چت‌ها این درخواست را شامل نمی‌شوند: در شاخه کد آن‌ها، فیلد کیف پول خالی ارسال می‌شود.

وب‌سایت چه چیزی دریافت می‌کند

اتصال از طریق TON Connect انجام می‌شود — پروتکلی که وب‌سایت‌ها و مینی‌اپ‌ها برای اتصال کیف پول‌های TON از آن استفاده می‌کنند. در سناریوی عادی، وب‌سایت لیستی از کیف پول‌ها را نمایش می‌دهد، کاربر کیف پول خود را انتخاب می‌کند و اتصال را در کیف پول تأیید می‌کند. در اینجا، این مرحله در پنجره ورود ادغام شده است: همراه با درخواست ورود، سرور تلگرام شماره جلسه TON Connect و شناسه وب‌سایت را در آن به کلاینت منتقل می‌کند.

با تأیید ورود، کلاینت یک جلسه در سمت کیف پول ایجاد می‌کند، ton_proof را با آن امضا می‌کند و امضا را همراه با رضایت برای ورود ارسال می‌کند. ton_proof امضایی است که کیف پول با آن به وب‌سایت ثابت می‌کند که آدرس متعلق به آن است؛ این امضا اجازه انتقال را نمی‌دهد. متن امضا از سه مقدار تشکیل شده است: شناسه ربات وب‌سایت، شناسه وب‌سایت در TON Connect و شماره جلسه، با پیشوند tc-login. به این ترتیب، امضا به یک ورود خاص گره خورده و برای ورود دیگری معتبر نیست.

در طرح API، سه فیلد برای پاسخ به درخواست ورود (پرچم «کیف پول لازم است»، شماره جلسه، شناسه وب‌سایت) و یک فیلد برای تأیید ورود — tonconnect_session با امضای مالکیت کیف پول — اضافه شده است. طبق تاریخچه طرح، این لایه ۲۳۱ از ۱۲ اکتبر است. در core.telegram.org، لایه ۲۲۵ توضیح داده شده است و فیلدهای کیف پول در آنجا وجود ندارد.

زنجیره فراخوانی‌ها در کد کلاینت

۱. سرور به درخواست ورود urlAuthResultRequest با پرچم request_wallet و فیلدهای tc_session_id، tc_client_id پاسخ می‌دهد. ۲. پس از کلیک بر روی «ورود»، کلاینت wallet.tonConnectCreateSession را با شناسه وب‌سایت و آدرس مانیفست فراخوانی می‌کند. ۳. منتظر می‌ماند تا سرور مانیفست را بخواند: نظرسنجی wallet.tonConnectGetPending هر ۵ ثانیه، حداکثر ۱۲ بار، یعنی تا یک دقیقه. ۴. کلید جلسه را ثبت می‌کند (wallet.tonConnectRegisterKey)، فراخوانی را دریافت می‌کند و پاسخ را همراه با ton_proof امضا می‌کند. ۵. messages.acceptUrlAuth را با فیلد tonconnect_session ارسال می‌کند — شماره جلسه، پاسخ به فراخوانی، بدنه و امضای مالکیت کیف پول.

کدام وب‌سایت‌ها کیف پول را دریافت نخواهند کرد

کلاینت آدرس مانیفست را از وب‌سایت نمی‌گیرد، بلکه خودش آن را می‌سازد: https://<domain>/tonconnect-manifest.json. مانیفست یک فایل کوچک شامل نام و آیکون وب‌سایت است که TON Connect در کیف پول نمایش می‌دهد. اگر سرور مانیفست را از یک هاست دیگر برگرداند، کلاینت با خطای مانیفست نامعتبر رد می‌کند. به این ترتیب، وب‌سایتی که شما وارد آن می‌شوید و وب‌سایتی که کیف پول را دریافت می‌کند، همیشه یکسان هستند.

به دو دامنه اصلاً کیف پول داده نمی‌شود و پنجره پیام «Wallet access can't be granted to this site» را نمایش می‌دهد. اولی telegram.org است. دومی را کلاینت از سرور می‌شناسد: این دامنه‌ای است که تلگرام خودش برای تأیید مالکیت کیف پول در پاسخ wallet.getProofChallenge استفاده می‌کند. طبق کد، به این ترتیب امضایی که کیف پول با آن مالکیت را به خود تلگرام تأیید می‌کند، نمی‌تواند از طریق یک وب‌سایت دیگر دریافت شود.

اگر کیف پول در دستگاه دیگری ایجاد شده باشد

کیف پول داخلی تلگرام کلید را روی دستگاه نگه می‌دارد. اگر کلید فعلی روی این کامپیوتر موجود نباشد، پنجره ورود پیام «This device doesn't hold the current key of this wallet» و لینک «Restore the key» را نمایش می‌دهد: می‌توانید کلید را بدون بستن پنجره ورود بازیابی کنید. بدون کلید، سوئیچ غیرفعال است و ورود به وب‌سایت طبق معمول، بدون کیف پول، انجام می‌شود.

این قابلیت در کجا موجود است

کجاچه چیزیتاریخ
tdesktop، شاخه devپنجره ورود با کیف پول، شش خط رابط کاربری۱۲ اکتبر
tdesktop، شاخه devرفع مشکلات رقابتی پنجره، بارگذاری زودهنگام کیف پول۱۳ اکتبر
بتا تلگرام برای macOS 13.0.283345نوع inputTonConnectOauthSession در کد، خطوط رابط کاربری وجود ندارد۲۰ اکتبر
آخرین نسخه منتشر شده تلگرام دسکتاپ 7.3.1ندارد۱۰ اکتبر
TDLibندارد—

اینکه آیا درخواست کیف پول در سرور فعال شده است یا خیر، از طریق کلاینت‌ها قابل مشاهده نیست: پنجره تنها زمانی ظاهر می‌شود که وب‌سایت آن را درخواست کند، و تلگرام هنوز دستورالعملی برای وب‌سایت‌ها منتشر نکرده است. تا کنون، بسیاری از وب‌سایت‌ها نمی‌توانستند امضای ton_proof را هنگام اتصال از طریق TON Connect با کیف پول داخلی تلگرام بررسی کنند — برای این کار از نسخه TON Connect 5.0 به یک شاخه بررسی جداگانه نیاز است.