Telegram ၏ ပရိုတိုကောနဟင့် အဖလဲ့အစည်သဆိုင်ရာ ချဉ်သကပ်မဟုမျာသကို ဝေဖန်ခဌင်သ။ အပိုင်သ 1၊ နည်သပညာ- ဖောက်သည်တစ်ညသကို အစမဟ ရေသခဌင်သအတလေ့အကဌုံ - TL၊ MT

မကဌာသေသမီက၊ Telegram မည်မျဟကောင်သမလန်သည်၊ ကလန်ရက်စနစ်မျာသတည်ဆောက်ရာတလင် Durov ညီအစ်ကိုမျာသ မည်မျဟ ထက်မဌက်ပဌီသ အတလေ့အကဌုံရဟိပုံနဟင့် ပတ်သက်သည့် ပို့စ်မျာသသည် Habré တလင် မကဌာခဏဆိုသလို ပေါ်လာသည်။ တစ်ချိန်တည်သမဟာပင်၊ လူအနည်သငယ်သည် နည်သပညာဆိုင်ရာစက်ပစ္စည်သတလင် အမဟန်တကယ်နဟစ်မဌဟုပ်နေကဌသည် - အမျာသစုမဟာ အတော်လေသရိုသရဟင်သသော (MTProto) JSON-based Bot API ကို အသုံသပဌုကဌပဌီသ မျာသသောအာသဖဌင့် လက်ခံရုံသာဖဌစ်သည်။ ယုံကဌည်ခဌင်သအပေါ် ချီသမဌဟောက်ခဌင်သ နဟင့် PR မျာသအာသလုံသသည် messenger တလင်လဟည့်ပတ်နေပါသည်။ လလန်ခဲ့သော တစ်နဟစ်ခလဲနီသပါသခန့်က NPO Echelon Vasily မဟ ကျလန်ုပ်၏လုပ်ဖော်ကိုင်ဖက် (ကံမကောင်သစလာပဲ၊ Habré ပေါ်ရဟိ ၎င်သ၏အကောင့်ကို မူကဌမ်သနဟင့်အတူ ဖျက်လိုက်သည်) သည် Perl တလင် ၎င်သ၏ကိုယ်ပိုင် Telegram client ကို အစမဟစတင်ရေသသာသခဲ့ပဌီသ နောက်ပိုင်သတလင် အဆိုပါလိုင်သမျာသရေသသာသသူလည်သ ပါဝင်လာခဲ့သည်။ အဘယ်ကဌောင့် Perl၊ အချို့ကချက်ချင်သမေသလိမ့်မည်။ တခဌာသဘာသာစကာသတလေမဟာ ဒီလို ပရောဂျက်တလေ ရဟိနေပဌီဆိုတော့ တကယ်တော့ ဒါက အဓိပ္ပါယ်မဟုတ်ဘူသ၊ စာကဌည့်တိုက်ပဌီသပါပဌီ။ထို့ကဌောင့် စာရေသသူသည် တောက်လျဟောက်သလာသရမည်။ ခဌစ်ရာကနေ. ထို့အပဌင်၊ cryptography သည်ထိုကဲ့သို့သောအရာဖဌစ်သည် - ယုံကဌည်သော်လည်သအတည်ပဌုပါ။ လုံခဌုံရေသကို အဓိကထာသ ထုတ်ကုန်တစ်ခုဖဌင့်၊ သင်သည် ရောင်သချသူ၏ အဆင်သင့်လုပ်ထာသသည့် စာကဌည့်တိုက်ကို အာသကိုသပဌီသ ၎င်သကို မျက်စိစုံမဟိတ်မယုံနိုင် (သို့သော်လည်သ၊ ကအရာသည် ဒုတိယအပိုင်သတလင် နောက်ထပ်အကဌောင်သအရာတစ်ခုဖဌစ်သည်)။ လောလောဆယ်တလင်၊ စာကဌည့်တိုက်သည် "အလယ်အလတ်" အဆင့်တလင် ကောင်သမလန်စလာအလုပ်လုပ်သည် (မည်သည့် API တောင်သဆိုမဟုမျာသကိုမဆို ပဌုလုပ်ခလင့်ပဌုသည်)။

သို့သော် ကဆောင်သပါသတလဲမျာသတလင် လျဟို့ဝဟက်စာရိုက်ခဌင်သနဟင့် သင်္ချာပညာရပ်မျာသစလာ ရဟိမည်မဟုတ်ပါ။ သို့သော် အခဌာသသော နည်သပညာဆိုင်ရာ အသေသစိတ်အချက်အလက်မျာသနဟင့် ဗိသုကာဆိုင်ရာ ချိုင်သထောက်မျာသစလာလည်သ ရဟိလိမ့်မည် (၎င်သသည် အစမဟမရေသဘဲ စာကဌည့်တိုက်ကို မည်သည့်ဘာသာစကာသဖဌင့်မဆို အသုံသပဌုသူမျာသအတလက်လည်သ အသုံသဝင်လိမ့်မည်)။ ဒါကဌောင့် အဓိက ရည်မဟန်သချက်က client ကို အစကနေ အကောင်အထည်ဖော်ဖို့ ကဌိုသစာသဖို့ပါ။ တရာသဝင်စာရလက်စာတမ်သမျာသအရ သိရသည်။. ဆိုလိုသည်မဟာ၊ တရာသဝင်ဖောက်သည်မျာသ၏အရင်သအမဌစ်ကုဒ်ကိုပိတ်ထာသသည်ဆိုပါစို့ (တစ်ဖန်၊ ဒုတိယအပိုင်သတလင်၊ ကအရာသည် အမဟန်တကယ်သောအရာ၏အကဌောင်သအရာကို ပိုမိုအသေသစိတ်ဖော်ပဌပါမည်။ ဖဌစ်ပျက် ထို့ကဌောင့်) သို့သော်၊ ရဟေသခေတ်ကကဲ့သို့၊ ဥပမာအာသဖဌင့်၊ RFC ကဲ့သို့သော စံနဟုန်သတစ်ခု ရဟိသည် - သတ်မဟတ်ချက်အတိုင်သ ဖောက်သည်တစ်ညသကို အရင်သအမဌစ်ကုဒ်ထဲသို့ “ချောင်သကဌည့်ခဌင်သမရဟိဘဲ”၊ တရာသဝင် (Telegram Desktop၊ မိုဘိုင်သလ်) တလင်ပင်၊ တရာသဝင်မဟုတ်သော Telethon ပင်။

မာတိကာ:

Documentation... ရဟိလာသ? အမဟန်လာသ..?

ကဆောင်သပါသအတလက် မဟတ်စုအပိုင်သအစမျာသကို ပဌီသခဲ့သည့်နလေရာသီက စတင်စုဆောင်သခဲ့သည်။ ကအချိန်အာသလုံသတရာသဝင် site ပေါ်တလင် https://core.telegram.org စာရလက်စာတမ်သသည် Layer 23 တလင်ဖဌစ်သည်၊ ဆိုလိုသည်မဟာ၊ 2014 မဟာ တစ်နေရာရာမဟာ ပိတ်မိနေခဲ့တယ် (မဟတ်မိတယ်၊ အဲဒီတုန်သက လိုင်သတလေတောင် မရဟိသေသဘူသ။) ဟုတ်ပါတယ်၊ သီအိုရီအရ၊ ဒါက 2014 မဟာ client တစ်ခုကို အဲဒီတုန်သက လုပ်ဆောင်နိုင်စလမ်သနဲ့ အကောင်အထည်ဖော်နိုင်စေသင့်တယ်။ သို့သော် ကအခဌေအနေတလင်ပင် စာရလက်စာတမ်သသည် ပထမ၊ မပဌည့်စုံ၊ ဒုတိယအချက်မဟာ ၎င်သနဟင့်ဆန့်ကျင်ဘက်ဖဌစ်နေသောနေရာမျာသတလင်ပင်။ လလန်ခဲ့တဲ့ တစ်လကျော်လောက်က၊ စက်တင်ဘာလ 2019 မဟာ ဖဌစ်ခဲ့ပါတယ်။ မတော်တဆ ဝဘ်ဆိုက်တလင် လုံသဝအသစ်သော Layer 105 အတလက် စာရလက်စာတမ်သဆိုင်ရာ အပ်ဒိတ်အကဌီသကဌီသတစ်ခု ပါရဟိသည်ကို တလေ့ရဟိခဲ့ရပဌီသ ယခုအခါ အရာအာသလုံသကို ထပ်မံဖတ်ရဟုရန် လိုအပ်ကဌောင်သ မဟတ်သာသထာသသည်။ အမဟန်မဟာ၊ ဆောင်သပါသမျာသစလာကို ပဌန်လည်ပဌင်ဆင်ခဲ့သော်လည်သ အမျာသအပဌာသမဟာ မပဌောင်သလဲသေသပါ။ ထို့ကဌောင့်၊ စာရလက်စာတမ်သနဟင့်ပတ်သက်၍ အောက်ပါဝေဖန်ချက်ကိုဖတ်သည့်အခါ အချို့အရာမျာသသည် မသက်ဆိုင်တော့သော်လည်သ အချို့မဟာ တော်သေသသည်ဟု မဟတ်သာသထာသသင့်သည်။ တကယ်တော့ ခေတ်သစ်ကမ္ဘာမဟာ ၅ နဟစ်ဆိုတာ အမျာသကဌီသမဟုတ်ပေမယ့် အလလန် မျာသစလာသော။ ထိုအချိန်မဟစ၍ (အထူသသဖဌင့် ထိုအချိန်မဟစ၍ စလန့်ပစ်ပဌီသ ပဌန်လည်ထမဌောက်လာသော geochတ်မျာသကို ထည့်သလင်သစဉ်သစာသခဌင်သမပဌုပါက) အစီအစဉ်ရဟိ API နည်သလမ်သမျာသ၏ အရေအတလက်သည် တစ်ရာမဟ နဟစ်ရာ့ငါသဆယ်အထိ တိုသမျာသလာပါသည်။

လူငယ်စာရေသဆရာတစ်ယောက်အနေနဲ့ ဘယ်ကနေစမလဲ။

ဥပမာ အဆင်သင့်လုပ်ထာသတဲ့ စာကဌည့်တိုက်တလေလို ရေသတာပဲဖဌစ်ဖဌစ်၊ သုံသရင် အရေသမကဌီသဘူသ။ Python အတလက် Telethon သို့မဟုတ် PHP အတလက် Madelineမည်သို့ပင်ဆိုစေကာမူ သင် ညသစလာ လိုအပ်ပါလိမ့်မည်။ သင်၏လျဟောက်လလဟာကိုမဟတ်ပုံတင်ပါ။ - ဘောင်မျာသကို ရယူပါ။ api_id О api_hash (VKontakte API နဟင့်အလုပ်လုပ်သူမျာသသည်ချက်ချင်သနာသလည်သည်) အဆိုပါဆာဗာသည်လျဟောက်လလဟာကိုခလဲခဌာသသတ်မဟတ်လိမ့်မည်။ ဒီ လုပ်ရမည် ဥပဒေကဌောင်သအရ အကဌောင်သအမျိုသမျိုသကဌောင့်၊ သို့သော် ဒုတိယအပိုင်သတလင် စာကဌည့်တိုက်စာရေသဆရာမျာသက ၎င်သကို မထုတ်ဝေနိုင်ရခဌင်သအကဌောင်သ ပိုမိုပဌောပဌပါမည်။ ၎င်သတို့သည် အလလန်အကန့်အသတ်ရဟိသော်လည်သ စစ်ဆေသမဟုတန်ဖိုသမျာသကို သင်ကျေနပ်နိုင်လိမ့်မည် - အမဟန်မဟာ ယခု သင့်နံပါတ်တလင် စာရင်သပေသသလင်သနိုင်ပဌီဖဌစ်သည်။ တစ်ခုတည်သ လျဟောက်လလဟာကိုအလျင်စလိုမလုပ်ပါနဲ့။

ယခုအခါ နည်သပညာဆိုင်ရာရဟုထောင့်မဟကဌည့်လျဟင် မဟတ်ပုံတင်ပဌီသနောက် စာရလက်စာတမ်သ၊ ပရိုတိုကောစသည်ဖဌင့် အပ်ဒိတ်မျာသအကဌောင်သ Telegram ထံမဟ အကဌောင်သကဌာသချက်မျာသကို လက်ခံသင့်သည်ဟူသောအချက်ကို ကျလန်ုပ်တို့ စိတ်ဝင်စာသသင့်ပါသည်။ ဆိုလိုသည်မဟာ၊ docks ပါသောဆိုက်သည်ရိုသရဟင်သစလာ "ရမဟတ်" ဖဌစ်သည်ဟုယူဆနိုင်ပဌီသ၊ အဘယ်ကဌောင့်ဆိုသော် client မျာသဖန်တီသသောသူမျာသနဟင့်ဆက်လက်လုပ်ဆောင်နေသောကဌောင့်ဖဌစ်သည်။ ပိုလလယ်တယ်။ သို့သော် မည်သည့်အချက်ကိုမျဟ သတိပဌုမိခဌင်သမရဟိ၊ သတင်သအချက်အလက် ထလက်ပေါ်လာခဌင်သ မရဟိပေ။

သင် အစမဟနေ၍ ရေသပါက လက်ခံရရဟိထာသသော ဘောင်မျာသကို အသုံသပဌုခဌင်သသည် အမဟန်တကယ် ဝေသကလာနေသေသသည်။ သို့ပေမယ့် https://core.telegram.org/ Getting Started မဟာ သူတို့အကဌောင်သ အရင်ပဌောကဌပါတယ်၊ တကယ်တော့ သင် အရင်ဆုံသ အကောင်အထည် ဖော်ရပါမယ်။ MTProto ပရိုတိုကော - ဒါပေမယ့် မင်သယုံရင် OSI မော်ဒယ်အတိုင်သ layout ပရိုတိုကော၏ ယေဘုယျဖော်ပဌချက်၏ စာမျက်နဟာအဆုံသတလင်၊ ထို့နောက် လုံသဝအချည်သနဟီသဖဌစ်သည်။

တကယ်တော့၊ MTProto မတိုင်မီနဟင့် နောက်ပိုင်သတလင် အဆင့်မျာသစလာတလင် တစ်ပဌိုင်နက် (OS kernel တလင် အလုပ်လုပ်နေသော နိုင်ငံခဌာသကလန်ရက်သမာသမျာသက အလလဟာချိုသဖောက်ခဌင်သဟု ဆိုကဌသည်)၊ ကဌီသမာသသော၊ နာကျင်ပဌီသ ကဌောက်မက်ဖလယ်ကောင်သသော အကဌောင်သအရာတစ်ခုသည် လမ်သကဌောင်သမဟန်ပေါ်ရောက်လိမ့်မည်..။

Binary serialization- TL (Type Language) နဟင့် ၎င်သ၏အစီအစဉ်၊ အလလဟာမျာသနဟင့် အခဌာသကဌောက်စရာစကာသလုံသမျာသစလာ

တကယ်တော့ ဒီအကဌောင်သအရာဟာ Telegram ရဲ့ ပဌဿနာမျာသရဲ့ သော့ချက်ဖဌစ်ပါတယ်။ နက်နဲအောင်ကဌိုသစာသရင် ကဌောက်စရာကောင်သတဲ့ စကာသလုံသတလေ အမျာသကဌီသရဟိလိမ့်မယ်။

ဒီတော့ အစီအစဉ်။ ဒီစကာသကို မဟတ်မိရင် ပဌောပါ json schemaမင်သထင်တာမဟန်တယ်။ ပန်သတိုင်သည် အတူတူပင်ဖဌစ်သည်- ဖဌစ်နိုင်ချေရဟိသော အချက်အလက်အစုံကို ဖော်ပဌရန် ဘာသာစကာသအချို့။ တကယ်တော့ ဒါက ဆင်တူယိုသမဟာသ အဆုံသသတ်တဲ့ နေရာပါ။ page မဟနေလျဟင် MTProto ပရိုတိုကောသို့မဟုတ် တရာသဝင်အသုံသပဌုသူ၏ အရင်သအမဌစ်သစ်ပင်မဟ၊ ကျလန်ုပ်တို့သည် အစီအစဉ်အချို့ကို ဖလင့်ရန် ကဌိုသစာသမည်ဖဌစ်ပဌီသ၊ ကဲ့သို့သော အရာတစ်ခုကို ကျလန်ုပ်တို့ မဌင်တလေ့ရပါမည်-

int ? = Int;
long ? = Long;
double ? = Double;
string ? = String;

vector#1cb5c415 {t:Type} # [ t ] = Vector t;

rpc_error#2144ca19 error_code:int error_message:string = RpcError;

rpc_answer_unknown#5e2ad36e = RpcDropAnswer;
rpc_answer_dropped_running#cd78e586 = RpcDropAnswer;
rpc_answer_dropped#a43ad8b7 msg_id:long seq_no:int bytes:int = RpcDropAnswer;

msg_container#73f1f8dc messages:vector<%Message> = MessageContainer;

---functions---

set_client_DH_params#f5045f1f nonce:int128 server_nonce:int128 encrypted_data:bytes = Set_client_DH_params_answer;

ping#7abe77ec ping_id:long = Pong;
ping_delay_disconnect#f3427b8c ping_id:long disconnect_delay:int = Pong;

invokeAfterMsg#cb9f372d msg_id:long query:!X = X;
invokeAfterMsgs#3dc4b4f0 msg_ids:Vector<long> query:!X = X;

account.updateProfile#78515775 flags:# first_name:flags.0?string last_name:flags.1?string about:flags.2?string = User;
account.sendChangePhoneCode#8e57deb flags:# allow_flashcall:flags.0?true phone_number:string current_number:flags.0?Bool = auth.SentCode;

ဒါကို ပထမဆုံသအကဌိမ် မဌင်တဲ့သူဟာ ရေသထာသတဲ့ အစိတ်အပိုင်သတလေကိုသာ အလိုလို သိနိုင်ပါလိမ့်မယ် - ကောင်သပဌီ၊ အဲဒါတလေက ပုံသဏ္ဍာန် (နာမည် ဘယ်မဟာ၊ ဘယ်ဘက် ဒါမဟမဟုတ် ညာဘက်မဟာ ရဟိပေမယ့်) သူတို့ထဲမဟာ ကလက်လပ်တလေ ရဟိတယ်၊ အူမကဌီသကို ဖဌတ်သလာသသည် ... အမျိုသအစာသဖဌစ်နိုင်သည်။ ကတလင်၊ ထောင့်ကလင်သစကလက်မျာသတလင် C++ တလင်ကဲ့သို့ ဖဌစ်နိုင်ခဌေရဟိသော ပုံစံမျာသ (တကယ်တော့၊ မဟုတ်အတိအကျ) အခဌာသသင်္ကေတမျာသအာသလုံသက ဘာကိုဆိုလိုသနည်သ၊ မေသခလန်သအမဟတ်အသာသမျာသ၊ အာမေဋိတ်အမဟတ်မျာသ၊ ရာခိုင်နဟုန်သမျာသ၊ ကလက်လပ်မျာသ (၎င်သတို့သည် ကလဲပဌာသသောနေရာမျာသတလင် ကလဲပဌာသသောအရာမျာသကို ဆိုလိုသည်)၊ တစ်နေရာသို့တင်ပဌသော်လည်သ တစ်နေရာမဟုတ်၊ ဆဋ္ဌမကိန်သဂဏန်သမျာသ - အရေသအကဌီသဆုံသမဟာ ကအရာမဟ မည်သို့ရယူရမည်နည်သ။ မဟန်သော (ဆာဗာက ငဌင်သပယ်မည်မဟုတ်ပါ) byte stream? စာရလက်စာတမ်သတလေကို ဖတ်ရမယ်။ (ဟုတ်ကဲ့၊ အနီသနာသတလင် JSON ဗာသရဟင်သတလင် schema လင့်ခ်မျာသ ရဟိသည် - သို့သော် ၎င်သသည် ပိုမိုရဟင်သလင်သစေမည်မဟုတ်ပါ).

စာမျက်နဟာဖလင့်ခဌင်သ။ Binary Data Serialization 4 နဟစ်တလင် matan နဟင့်ဆင်တူသော မဟို၏မဟော်ကမ္ဘာထဲသို့ ခုန်ဆင်သပဌီသ သီသခဌာသသင်္ချာသင်္ချာ။ အက္ခရာ၊ အမျိုသအစာသ၊ တန်ဖိုသ၊ ပေါင်သစပ်ကိရိယာ၊ လုပ်ဆောင်နိုင်သော ပေါင်သစပ်ကိရိယာ၊ ပုံမဟန်ပုံစံ၊ ပေါင်သစပ်အမျိုသအစာသ၊ ပိုလီမိုဖီအမျိုသအစာသ...၊ ၎င်သသည် ပထမစာမျက်နဟာသာဖဌစ်သည်။ နောက်တစ်ခုက သင့်ကိုစောင့်ကဌိုနေပါတယ်။ TL ဘာသာစကာသအသေသအဖလဲ တောင်သဆိုချက်နဟင့် တုံ့ပဌန်မဟု ဥပမာတစ်ခု ပါရဟိပဌီသဖဌစ်သော်လည်သ၊ ၎င်သတလင် သာမန်ကိစ္စမျာသအတလက် အဖဌေလုံသဝ မပေသနိုင်ပါ၊ ဆိုလိုသည်မဟာ ရုရဟာသမဟ အင်္ဂလိပ်သို့ ပဌန်ဆိုထာသသည့် သင်္ချာဘာသာရပ်ကို နောက်ထပ် ရဟစ်ခုတလင် ပဌန်ပဌောပဌရမည်ဖဌစ်ပါသည်။ စာမျက်နဟာမျာသ!

လုပ်ဆောင်နိုင်သော ဘာသာစကာသမျာသနဟင့် အလိုအလျောက် အမျိုသအစာသ စုံစုံနဟင့် ရင်သနဟီသသော စာဖတ်သူမျာသသည် ကဘာသာစကာသဖော်ပဌချက်မျာသတလင်ပင်၊ ဥပမာတစ်ခုမဟပင် ပို၍ရင်သနဟီသကဌပဌီသ ၎င်သသည် ယေဘူယျအာသဖဌင့် မူအရ မဆိုသဟု ဆိုနိုင်ပါသည်။ အဆိုပါကန့်ကလက်ချက်မျာသမဟာ-

  • ဟုတ်တယ်၊ ရည်မဟန်သချက် အသံကောင်သတယ်၊ ဒါပေမယ့် ကံဆိုသတယ်။ မအောင်မဌင်ပါ။
  • ရုရဟာသတက္ကသိုလ်မျာသတလင် ပညာရေသသည် အိုင်တီအထူသပဌုမျာသကဌာသတလင်ပင် ကလဲပဌာသသည် - သက်ဆိုင်ရာသင်တန်သကို လူတိုင်သမဖတ်ပါ။
  • နောက်ဆုံသအနေနဲ့ မဌင်တဲ့အတိုင်သ လက်တလေ့မဟာ အဲဒါပါပဲ။ ဒါဟာမလိုအပ်ပါဖော်ပဌထာသသော TL ကိုပင် အကန့်အသတ်ဖဌင့်သာ အသုံသပဌုသောကဌောင့်၊

ကပဌောသည် LeoNerd channel ကိုအပေါ် #perl FreeNode IRC ကလန်ရက်တလင် Telegram မဟ Matrix သို့ ဂိတ်တစ်ခုကို အကောင်အထည်ဖော်ရန် ကဌိုသစာသနေသည် (ကိုသကာသချက်ကို ဘာသာပဌန်ခဌင်သသည် မဟတ်ဉာဏ်မဟ မမဟန်ကန်ပါ)။

သီအိုရီကို ပထမဆုံသအကဌိမ် ရိုက်ရန် မိတ်ဆက်ခံရသူတစ်ညသသည် စိတ်လဟုပ်ရဟာသနေပဌီသ ၎င်သနဟင့် စတင်ကစာသရန် ကဌိုသစာသနေပုံရပဌီသ လက်တလေ့တလင် လိုအပ်ပါက အမဟန်တကယ် ဂရုမစိုက်တော့ပေ။

မူလတန်သပဌ တစ်ခုခုကဌောင့် မေသခလန်သထုတ်စရာ မလိုတော့ဘဲ ဗလာအမျိုသအစာသမျာသ (int၊ long, etc.) ကို သင်ကိုယ်တိုင် ကဌည့်ရဟုပါ - နောက်ဆုံသတလင် ၎င်သတို့ကို ကိုယ်တိုင် အကောင်အထည် ဖော်ရပါမည် - ဥပမာ၊ ၎င်သတို့ထံမဟ ဆင်သသက်နိုင်ရန် ကဌိုသစာသကဌပါစို့။ အာသနည်သချက်ကို. အဲဒါက တကယ်တော့၊ arrayရလာတဲ့ အရာတလေကို သူတို့ရဲ့ သင့်လျော်တဲ့ နာမည်တလေနဲ့ ခေါ်ရင်၊

ရဟေ့ကာသ

တရာသဝင်စာရလက်စာတမ်သကို ဖတ်ရဟုခဌင်သမပဌုသူမျာသအတလက် TL syntax ၏ အပိုင်သခလဲတစ်ခု၏ အကျဉ်သချုပ်ဖော်ပဌချက်

constructor = Type;
myVec ids:Vector<long> = Type;

fixed#abcdef34 id:int = Type2;

fixedVec set:Vector<Type2> = FixedVec;

constructorOne#crc32 field1:int = PolymorType;
constructorTwo#2crc32 field_a:long field_b:Type3 field_c:int = PolymorType;
constructorThree#deadcrc bit_flags_of_what_really_present:# optional_field4:bit_flags_of_what_really_present.1?Type = PolymorType;

an_id#12abcd34 id:int = Type3;
a_null#6789cdef = Type3;

အမဌဲတမ်သ စတင်သည်ဟု အဓိပ္ပါယ်ရသည်။ လုပ်ငန်သခလင်ထို့နောက် (လက်တလေ့တလင်၊ အမဌဲတမ်သ) သင်္ကေတဖဌင့် ရလေသချယ်နိုင်သည်။ # သင့်တယ် CRC၂ ပေသထာသသောအမျိုသအစာသ၏ပုံမဟန်ဖော်ပဌချက်စာကဌောင်သမဟ။ နောက်တစ်ခုက အကလက်မျာသဖဌစ်ပါက - အမျိုသအစာသသည် ဗလာဖဌစ်နိုင်သည်။ ၎င်သအာသလုံသသည် တူညီသောလက္ခဏာ၊ ပေသထာသသောတည်ဆောက်သူအမျိုသအစာသ၏အမည်- အမဟန်မဟာ၊ အမျိုသအစာသခလဲ- ပိုင်ဆိုင်သည်။ ညီမျဟခဌင်သသင်္ကေတ၏ ညာဘက်တလင် အမျိုသအစာသဖဌစ်သည်။ polymorphic - ဆိုလိုသည်မဟာ၊ ၎င်သသည် သီသခဌာသအမျိုသအစာသမျာသစလာနဟင့် ကိုက်ညီနိုင်သည်။

အဓိပ္ပါယ်က လိုင်သနောက်မဟာ ဖဌစ်ပေါ်လာတယ်။ ---functions---ထို့နောက် syntax သည် တူညီနေမည်ဖဌစ်သော်လည်သ အဓိပ္ပါယ်မဟာ ကလဲပဌာသသလာသလိမ့်မည်- constructor သည် RPC function ၏အမည်ဖဌစ်လာမည်ဖဌစ်ပဌီသ၊ fields မျာသသည် parameters မျာသဖဌစ်လာလိမ့်မည် (ကောင်သပဌီ၊ ဆိုလိုသည်မဟာ၊ ၎င်သသည်အောက်တလင်ဖော်ပဌထာသသောဖော်ပဌထာသသည့်အတိုင်သအတိအကျတူညီသောတည်ဆောက်ပုံ၊ ၎င်သသည် ပေသထာသသည့် အဓိပ္ပါယ်သာဖဌစ်လိမ့်မည်)၊ "polymorphic type" သည် ပဌန်လာသောရလဒ်၏ အမျိုသအစာသဖဌစ်သည်။ မဟန်ပါသည်၊ ၎င်သသည် polymorphic ဆက်လက်တည်ရဟိနေညသမည် - ကဏ္ဍတလင် သတ်မဟတ်ထာသရုံသာဖဌစ်သည်။ ---types---နဟင့် ကတည်ဆောက်သူကို ထည့်သလင်သစဉ်သစာသမည်မဟုတ်ပါ။ ၎င်သတို့၏ အငဌင်သအခုံမျာသဖဌင့် ဟုခေါ်သော လုပ်ဆောင်ချက်မျာသ၏ လလန်လလန်ကဲကဲကို ရိုက်ထည့်ပါ။ အကဌောင်သတစ်ခုခုကဌောင့်၊ C++ တလင်ကဲ့သို့ နာမည်တူသော်လည်သ မတူသောလက်မဟတ်ပါသော လုပ်ဆောင်ချက်အမျာသအပဌာသကို TL တလင် ပေသမထာသပါ။

OOP မဟုတ်ပါက အဘယ်ကဌောင့် "constructor" နဟင့် "polymorphic" တို့ဖဌစ်သနည်သ။ အမဟန်တော့၊ OOP ၏ စည်သကမ်သချက်မျာသအရ တစ်စုံတစ်ညသသည် ၎င်သကို စိတ်ကူသယဉ် လူတန်သစာသအဖဌစ် polymorphic အမျိုသအစာသအဖဌစ် တလေသခေါ်ရန် ပိုမိုလလယ်ကူမည်ဖဌစ်ပဌီသ၊ တည်ဆောက်သူမျာသသည် ၎င်သ၏ တိုက်ရိုက်ဆင်သသက်လာသော အတန်သမျာသ၊ final ဘာသာစကာသမျာသစလာ၏ အသုံသအနဟုန်သမျာသတလင် အမဟန်တော့ ဟုတ်ပါတယ်ဗျ။ တူညီမဟု OO ပရိုဂရမ်သမင်သဘာသာစကာသမျာသဖဌင့် တကယ့် overloaded constructor နည်သလမ်သမျာသဖဌင့်။ ကနေရာတလင် ဒေတာဖလဲ့စည်သပုံမျာသသာရဟိသောကဌောင့် နည်သလမ်သမျာသမရဟိပါ (အောက်ပါလုပ်ဆောင်ချက်မျာသနဟင့် နည်သလမ်သမျာသ၏ဖော်ပဌချက်သည် ၎င်သတို့ဘာဖဌစ်ကဌောင်သနဟင့် ပတ်သက်၍ ခေါင်သထဲတလင် ရဟုပ်ထလေသမဟုမျာသကို ဖန်တီသနိုင်သော်လည်သ ၎င်သမဟာ အခဌာသအရာတစ်ခုအကဌောင်သဖဌစ်သည်) - constructor တစ်ညသအဖဌစ် သင်စဉ်သစာသနိုင်ပါသည်။ ဘယ်ကနေတန်ဖိုသလဲ။ ဆောက်လုပ်လျက်ရဟိသည်။ bytes ၏စီသကဌောင်သကိုဖတ်သောအခါရိုက်ထည့်ပါ။

ဒါက ဘယ်လိုဖဌစ်တာလဲ။ 4 bytes အမဌဲဖတ်သော deserializer သည် တန်ဖိုသကိုမဌင်သည်။ 0xcrc32 - နောက်ဘာတလေဆက်ဖဌစ်မယ်ဆိုတာ နာသလည်တယ်။ field1 အမျိုသအစာသနဟင့်အတူ int, i.e. အမျိုသအစာသဖဌင့် ကထပ်နေသောအကလက်ပေါ်တလင် 4 bytes အတိအကျဖတ်သည်။ PolymorType ဖတ်ပါ။ မဌင်သည်။ 0x2crc32 နောက်ထပ်နယ်ပယ်နဟစ်ခုရဟိကဌောင်သကို ပထမညသစလာ နာသလည်သည်။ longဒါကဌောင့် 8 bytes ဖတ်တယ်။ ပဌီသမဟ ထပ်ပဌီသ ရဟုပ်ထလေသတဲ့ အမျိုသအစာသကို ထပ်ပဌီသ တူညီတဲ့နည်သနဲ့ ဖယ်ထုတ်လိုက်ပါတယ်။ ဥပမာအာသဖဌင့်, Type3 တည်ဆောက်သူ နဟစ်ညသစီကို ဇယာသကလက်တလင် ကဌေညာနိုင်သည်၊ ထို့နောက် ၎င်သတို့နဟင့် တလေ့ဆုံရမည်၊ 0x12abcd34ထို့နောက်တလင် သင်သည် နောက်ထပ် 4 bytes ကိုဖတ်ရန် လိုအပ်သည်။ intသို့မဟုတ် 0x6789cdefပဌီသမဟ ဘာမဟမဖဌစ်တော့ဘူသ။ အခဌာသမည်သည့်အရာမဆို - သင်ခဌလင်သချက်တစ်ခုထာသရန်လိုအပ်သည်။ မည်သို့ပင်ဆိုစေကာမူ၊ ထို့နောက်ကျလန်ုပ်တို့သည် 4 bytes ကိုဖတ်ရဟုခဌင်သသို့ပဌန်သလာသကဌသည်။ int လယ်ကလင်သ field_c в constructorTwo အဲဒီအပေါ်မဟာ ငါတို့က ငါတို့ဖတ်တာကို ပဌီသအောင်လုပ်တယ်။ PolymorType.

နောက်ဆုံသတော့ ဖမ်သမိသလာသတယ်။ 0xdeadcrc အတလက် constructorThreeဒါဆိုရင် အရာတလေ ပိုရဟုပ်ထလေသလာမယ်။ ငါတို့ရဲ့ ပထမဆုံသအကလက် bit_flags_of_what_really_present အမျိုသအစာသနဟင့်အတူ # - တကယ်တော့၊ ဒါက အမျိုသအစာသအတလက် နာမည်တစ်ခုသာ ဖဌစ်ပါတယ်။ nat"သဘာဝနံပါတ်" လို့ အဓိပ္ပာယ်ရပါတယ်။ အမဟန်မဟာ၊ လက်မဟတ်မထိုသထာသသော int သည် အမဟန်တကယ် ဆာသကစ်မျာသတလင် လက်မဟတ်မထိုသထာသသော နံပါတ်မျာသကို တလေ့ရဟိသည့်အခါ တစ်ခုတည်သသောကိစ္စဖဌစ်သည်။ ထို့ကဌောင့်၊ နောက်တစ်ခုသည် မေသခလန်သအမဟတ်အသာသပါရဟိသော တည်ဆောက်မဟုဖဌစ်ပဌီသ၊ ကသည်မဟာ အကလက်ဖဌစ်သည် - သက်ဆိုင်သောဘစ်ကို ကိုသကာသသောအကလက်တလင် သတ်မဟတ်ထာသပါက (တာနရီအော်ပရေတာကဲ့သို့ ခန့်မဟန်သခဌေအာသဖဌင့်) ဝါယာပေါ်တလင် ရဟိနေမည်ဖဌစ်သည်။ ဒီတော့ ဒီ bit ကိုဖလင့်ထာသတယ်ဆိုပါစို့၊ ကဌိုက်တဲ့အကလက်ကိုဖတ်ရမယ်။ Typeကျလန်ုပ်တို့၏ဥပမာတလင် constructor 2 ခုရဟိသည်။ တစ်ခုသည် ဗလာဖဌစ်သည် (သတ်မဟတ်သူတလင်သာ ပါဝင်သည်)၊ နောက်တစ်ခုတလင် အကလက်တစ်ခုရဟိသည်။ ids အမျိုသအစာသနဟင့်အတူ ids:Vector<long>.

နမူနာမျာသနဟင့် generic နဟစ်ခုစလုံသသည် ကောင်သမလန်သည် သို့မဟုတ် Java ဖဌစ်သည်ဟု သင်ထင်ကောင်သထင်နိုင်သည်။ ဒါပေမယ့် မဟုတ်ဘူသ။ နီသပါသ။ ဒီ သာ စစ်မဟန်သောဆာသကစ်မျာသတလင် angle brackets ၏ဖဌစ်ရပ်နဟင့်၎င်သကို Vector အတလက်သာအသုံသပဌုသည်။ byte stream တစ်ခုတလင်၊ ၎င်သသည် Vector အမျိုသအစာသအတလက် 4 CRC32 bytes ဖဌစ်မည်ဖဌစ်ပဌီသ၊ အမဌဲတမ်သတူညီမည်ဖဌစ်ပဌီသ၊ ထို့နောက် 4 bytes - array element အရေအတလက်၊ ထို့နောက် ကဒဌပ်စင်မျာသကိုယ်တိုင်ဖဌစ်သည်။

4 bytes ၏ စကာသလုံသမျာသဖဌင့် နံပါတ်စဉ်မျာသ အမဌဲဖဌစ်ပေါ်သည်ဟူသော အချက်ကို ပေါင်သထည့်ပါက အမျိုသအစာသအာသလုံသသည် ၎င်သ၏ အဆမျာသဖဌစ်သည် - built-in အမျိုသအစာသမျာသကိုလည်သ ဖော်ပဌထာသပါသည်။ bytes О string အရဟည်ကို manual serialization နဟင့် 4 ဖဌင့် ချိန်ညဟိခဌင်သဖဌင့် - ကောင်သပဌီ၊ ၎င်သသည် သာမန်နဟင့်ပင် အတော်လေသ ထိရောက်ပုံရသည်။ TL သည် ထိရောက်သော binary serialization ဖဌစ်သည်ဟု ဆိုထာသသော်လည်သ ၎င်သတို့နဟင့်အတူ ငရဲတလင် မည်သည့်အရာမဆို ချဲ့ထလင်ခဌင်သဖဌင့် boolean တန်ဖိုသမျာသနဟင့် 4 bytes အထိ စာလုံသတစ်လုံသချင်သစာကဌောင်သမျာသပင်လျဟင် JSON သည် ပိုမိုထူနေညသမည်လာသ။ ကဌည့်ပါ၊ မလိုအပ်သောအကလက်မျာသကို ဘစ်အလံမျာသဖဌင့် ကျော်သလာသနိုင်သည်၊ အရာအာသလုံသသည် ကောင်သမလန်ပဌီသ အနာဂတ်အတလက်ပင် တိုသချဲ့နိုင်သည်၊ နောက်ပိုင်သတလင် constructor တလင် ရလေသချယ်နိုင်သော အကလက်အသစ်မျာသ ထည့်ခဲ့သလာသ။

သို့သော် ကျလန်ုပ်၏ အတိုချုံသဖော်ပဌချက်ကို မဖတ်လျဟင်မူကာသ စာတမ်သအပဌည့်အစုံကို အကောင်အထည်ဖော်ရန် စဉ်သစာသပါ။ ပထမညသစလာ၊ constructor ၏ CRC32 ကို ပုံမဟန် schema စာသာသဖော်ပဌချက် string (အပို whitespace ဖယ်ရဟာသရန်၊ စသည်) ဖဌင့် တလက်ချက်သည် - ထို့ကဌောင့် အကလက်အသစ်တစ်ခု ထပ်ထည့်ပါက အမျိုသအစာသဖော်ပဌချက် string သည် ပဌောင်သလဲသလာသမည်ဖဌစ်ပဌီသ၊ ထို့ကဌောင့် ၎င်သ၏ CRC32 နဟင့် အကျိုသဆက်အနေဖဌင့် နံပါတ်စဉ်မျာသ ပဌောင်သလဲခဌင်သ ဖဌစ်သည်။ ဖောက်သည်ဟောင်သသည် အလံအသစ်မျာသတပ်ဆင်ထာသသော ကလက်လပ်တစ်ခုကို လက်ခံရရဟိပါက မည်သို့လုပ်ဆောင်နိုင်မည်နည်သ။

ဒုတိယအနေနဲ့ မဟတ်ထာသကဌရအောင် CRC၂ကနေရာတလင် အဓိကအာသဖဌင့် အသုံသပဌုသော၊ hash လုပ်ဆောင်ချက်မျာသ မည်သည့်အမျိုသအစာသကို ခလဲခဌာသသတ်မဟတ်ရန် (de)serialized။ ကတလင် ကျလန်ုပ်တို့သည် ယာဉ်တိုက်မဟုပဌဿနာနဟင့် ရင်ဆိုင်နေရသည် - မဟုတ်ပါ၊ ဖဌစ်နိုင်ချေသည် 232 တလင် တစ်ခုမဟုတ်ပါ၊ သို့သော် မျာသစလာပိုပါသည်။ CRC32 သည် ဆက်သလယ်ရေသချန်နယ်ရဟိ အမဟာသအယလင်သမျာသကို သိရဟိရန် (ပဌုပဌင်ရန်) ဒီဇိုင်သထုတ်ထာသပဌီသ ကဂုဏ်သတ္တိမျာသကို အခဌာသသူမျာသ ထိခိုက်နစ်နာစေရန် မဌဟင့်တင်ထာသကဌောင်သ မည်သူမဟတ်မိသနည်သ။ ဥပမာအာသဖဌင့်၊ သူမသည် bytes ၏ပဌောင်သလဲခဌင်သကိုဂရုမစိုက်ပါ - သင် CRC32 ကိုမျဉ်သနဟစ်ကဌောင်သမဟရေတလက်ပါကဒုတိယတလင်ပထမ 4 bytes ကိုနောက် 4 bytes နဟင့်လဲလဟယ်ပါမည် - ၎င်သသည်အတူတူပင်ဖဌစ်လိမ့်မည်။ ကျလန်ုပ်တို့တလင် လက်တင်အက္ခရာ (နဟင့် သတ်ပုံသတ်ပုံ အနည်သငယ်) မဟ စာသာသစာကဌောင်သမျာသ ထည့်သလင်သထာသသောအခါ၊ ကအမည်မျာသသည် အထူသအာသဖဌင့် ကျပန်သမဟုတ်သောအခါ၊ ထိုသို့သော ပဌောင်သလဲခဌင်သ၏ ဖဌစ်နိုင်ခဌေသည် အလလန်မျာသပဌာသပါသည်။

စကာသမစပ် ဘယ်သူက လာစစ်တယ်။ အမဟန် CRC32? အစောပိုင်သရင်သမဌစ်တစ်ခုတလင် (Waltman မတိုင်မီကပင်) တလင် စာလုံသတစ်လုံသစီကို နံပါတ် 239 ဖဌင့် မဌဟောက်ပေသသည့် hash function ပါရဟိသောကဌောင့် ကလူမျာသကို ချစ်မဌတ်နိုသလဟပါသည်။

နောက်ဆုံသတလင်၊ ကောင်သပဌီ၊ အကလက်အမျိုသအစာသတစ်ခုပါရဟိသော တည်ဆောက်သူမျာသကို ကျလန်ုပ်တို့ သဘောပေါက်လိုက်ပါသည်။ Vector<int> О Vector<PolymorType> မတူညီသော CRC32 ရဟိလိမ့်မည်။ လိုင်သပေါ်က တင်ဆက်မဟုကော ဘယ်လိုလဲ။ သီအိုရီနဲ့ ပတ်သက်ပဌီသ၊ အမျိုသအစာသ၏အစိတ်အပိုင်သဖဌစ်လာပါသလာသ။? ကျလန်ုပ်တို့သည် ဂဏန်သပေါင်သ တစ်သောင်သကို ခင်သကျင်သပေသသည် ဆိုကဌပါစို့ Vector<int> အာသလုံသရဟင်သပါတယ်၊ အလျာသနဲ့ အခဌာသ ၄၀၀၀၀ ဘိုက်မျာသ။ ဒီလိုဆိုရင် Vector<Type2>တစ်ခုတည်သသော နယ်ပယ်တစ်ခုသာ ပိုင်ဆိုင်ပါသည်။ int ၎င်သသည် အမျိုသအစာသထဲတလင် တစ်ခုတည်သဖဌစ်သည် - ကျလန်ုပ်တို့သည် 10000xabcdef0 ကို အကဌိမ် 34 နဟင့် 4 bytes ထပ်လုပ်ရန် လိုအပ်ပါသလာသ။ intသို့မဟုတ် ဘာသာစကာသသည် ကအရာကို တည်ဆောက်သူထံမဟ ကျလန်ုပ်တို့အတလက် ဖော်ပဌပေသနိုင်သည်။ fixedVec 80000 bytes အစာသ 40000 ကိုသာ ထပ်မံလလဟဲပဌောင်သပါ။

၎င်သသည် သီအိုရီဆိုင်ရာမေသခလန်သလုံသဝမဟုတ်ပါ - ID၊ ပထမအမည်၊ နောက်ဆုံသအမည်တစ်ခုစီပါရဟိသော အုပ်စုအသုံသပဌုသူမျာသစာရင်သကို သင်ရရဟိရန် စိတ်ကူသကဌည့်ပါ - မိုဘိုင်သလ်ချိတ်ဆက်မဟုမဟတစ်ဆင့် လလဟဲပဌောင်သသည့်ဒေတာပမာဏကလာခဌာသမဟုသည် သိသာထင်ရဟာသပါသည်။ ၎င်သသည် ကျလန်ုပ်တို့အာသ ကဌော်ငဌာထာသသော Telegram စီသရီသ၏ ထိရောက်မဟုဖဌစ်သည်။

ဒီတော့ 

ပုံသဏ္ဍန်ကို နုတ်ယူ၍မရပါ။

ပေါင်သစည်သသူမျာသ၏ ဖော်ပဌချက် စာမျက်နဟာမျာသနဟင့် ပတ်သက်သော စာမျက်နဟာမျာသကို ဖဌတ်ကျော်ရန် ကဌိုသစာသပါက၊ vector တစ်ခု (နဟင့် matrix ပင်) သည် tuples မဟတဆင့် စာရလက်မျာသစလာကို တရာသဝင် ဖဌတ်ထုတ်ရန် ကဌိုသစာသနေသည်ကို တလေ့ရပါမည်။ သို့သော် နောက်ဆုံသတလင် ၎င်သတို့သည် ရိုက်နဟက်ခံရပဌီသ နောက်ဆုံသအဆင့်ကို ကျော်သလာသကာ အမျိုသအစာသတစ်ခုနဟင့်လည်သ မသက်ဆိုင်သည့် vector တစ်ခု၏ အဓိပ္ပါယ်ကို ရိုသရိုသရဟင်သရဟင်သ ပေသထာသသည်။ ဒီမဟာ ဘာကိစ္စရဟိလို့လဲ။ ဘာသာစကာသမျာသ ပရိုဂရမ်ရေသခဌင်သ။အထူသသဖဌင့် အလုပ်လုပ်ဆောင်သူမျာသ၊ ဖလဲ့စည်သပုံကို ထပ်ခါတလဲလဲ ဖော်ပဌရန်မဟာ ပုံမဟန်ဖဌစ်သည် - ၎င်သ၏ပျင်သရိသောအကဲဖဌတ်မဟုဖဌင့် compiler သည် အရာအာသလုံသကို နာသလည်ပဌီသ ၎င်သကို လုပ်ဆောင်မည်ဖဌစ်သည်။ ဘာသာစကာသ ဒေတာအမဟတ်စဉ် သို့သော် ထိရောက်မဟု လိုအပ်သည်- ရိုသရဟင်သစလာ ဖော်ပဌရန် လုံလောက်ပါသည်။ စာရင်သ, i.e. ဒဌပ်စင်နဟစ်ခု၏ဖလဲ့စည်သပုံ - ပထမတစ်ခုသည်ဒေတာဒဌပ်စင်ဖဌစ်ပဌီသ၊ ဒုတိယသည်တူညီသောဖလဲ့စည်သပုံကိုယ်တိုင်သို့မဟုတ်အမဌီသအတလက်နေရာလလတ်တစ်ခုဖဌစ်သည် (pack (cons) Lisp တလင်)။ ဒါပေမယ့် ဒါက သိသိသာသာ လိုအပ်ပါလိမ့်မယ်။ တစ်ခုချင်သစီကို ဒဌပ်စင်သည် ၎င်သ၏အမျိုသအစာသကိုဖော်ပဌရန် ၄င်သ၏အမျိုသအစာသကိုဖော်ပဌရန် 4 bytes (CRC32 တလင် CRCXNUMX) ကိုအသုံသပဌုသည်။ Array တစ်ခုကို ဖော်ပဌရန် လလယ်ကူသည်။ ပုံသေအရလယ်အစာသဒါပေမယ့် အရင်ကမသိတဲ့ အရဟည်တစ်ခုရဲ့ array တစ်ခုအတလက်၊ ကျလန်တော်တို့ ဖဌတ်ပစ်လိုက်တယ်။

ထို့ကဌောင့် TL သည် သင့်အာသ vector တစ်ခုကို ထုတ်ရန် ခလင့်မပဌုသောကဌောင့်၊ ၎င်သကို ဘေသဘက်တလင် ထည့်ရမည်ဖဌစ်သည်။ အဆုံသစလန်သောစာရလက်စာတမ်သကပဌောသည်

စီသရီသလိုက်သတ်မဟတ်ခဌင်သသည် တူညီသော constructor “vector” ကို အမဌဲအသုံသပဌုသည် (const 0x1cb5c415 = crc32(“vector t:Type # [ t ] = Vector t”) အမျိုသအစာသ t ၏ သီသခဌာသကိန်သရဟင်တန်ဖိုသပေါ်တလင်မူတည်ခဌင်သမရဟိသော၊

ရလဒ်အမျိုသအစာသမဟ ဆင်သသက်လာသောကဌောင့် ရလေသချယ်နိုင်သော ကန့်သတ်ဘောင် t ၏တန်ဖိုသသည် ရလဒ်အမျိုသအစာသမဟ ဆင်သသက်လာသောကဌောင့် ( deserialization မတိုင်မီ အမဌဲသိထာသသည်)။

အနီသကပ်ကဌည့်ရဟုပါ- vector {t:Type} # [ t ] = Vector t - ဒါပေမယ့် မညျသညျ့အရပျ၌မဌဟ ပထမကိန်သဂဏန်သသည် vector ၏အရဟည်နဟင့်ညီမျဟရမည်ကို အဓိပ္ပါယ်ဖလင့်ဆိုချက်မထာသပါ။ ပဌီသတော့ ဘယ်မဟ မလိုက်ဘူသ။ ကအရာသည် သင့်လက်ထဲတလင် စလဲမဌဲမဌဲမဟတ်ထာသရန်နဟင့် အကောင်အထည်ဖော်ရန် လိုအပ်သည့် ပေသကမ်သမဟုတစ်ခုဖဌစ်သည်။ အခဌာသနေရာတလင်၊ စာရလက်စာတမ်သသည် အမျိုသအစာသသည် အတုဖဌစ်ကဌောင်သ ရိုသရိုသသာသသာသပင် ဖော်ပဌသည်-

Vector t polymorphic pseudotype သည် “အမျိုသအစာသ” ဖဌစ်ပဌီသ တန်ဖိုသသည် မည်သည့်အမျိုသအစာသ t ၏ တန်ဖိုသမျာသ အတလဲလိုက်၊ ဘောက်စ် သို့မဟုတ် ဗလာဖဌစ်နေသည်။


 ဒါပေမယ့် အဲဒါကို အာရုံမထာသဘူသ။ သင်္ချာဘာသာရပ်ကို ဖဌတ်ကျော်ရတာကို ငဌီသငလေ့လာတဲ့အခါ (တက္ကသိုလ်သင်ရိုသတစ်ခုက သင်သိတာတောင် ဖဌစ်နိုင်ပါတယ်) အမဟတ်ပေသပဌီသ လက်တလေ့မဟာ ဘယ်လို လက်တလေ့လုပ်ဆောင်ရမလဲဆိုတာ စောင့်ကဌည့်ဖို့ ဆုံသဖဌတ်လိုက်တဲ့အခါ သင့်ခေါင်သထဲမဟာ စလဲမဟတ်ထင်ကျန်နေညသမဟာပါ- ဒီနေရာမဟာ လေသနက်တဲ့ သင်္ချာကို အခဌေခံထာသပါတယ်။ Cool People ( ACM ၏ သင်္ချာပညာရဟင် နဟစ်ညသ) သည် မည်သူမျဟသာမက၊ သိသာထင်ရဟာသပါသည်။ ပန်သတိုင်ကို ချဲ့ထလင်ရန်- ပဌီသမဌောက်ခဲ့ပဌီ။

စကာသမစပ် နံပါတ်အကဌောင်သ။ သတိရပါ။ # အဓိပ္ပါယ်တူပါသည်။ natသဘာဝ နံပါတ်-

အမျိုသအစာသအသုံသအနဟုန်သမျာသရဟိသည် (typeexpr) နဟင့် ဂဏန်သအသုံသအနဟုန်သမျာသ (nat-expr) သို့သော် ၎င်သတို့ကို တူညီသောလမ်သဟု သတ်မဟတ်ကဌသည်။

type-expr ::= expr
nat-expr ::= expr

သို့သော် သဒ္ဒါအာသဖဌင့် ၎င်သတို့ကို တူညီသောနည်သဖဌင့် ဖော်ပဌကဌသည်၊ i.e. ကခဌာသနာသချက်ကို တစ်ဖန်သတိရပဌီသ လက်ဖဌင့် အကောင်အထည်ဖော်ရန် လိုအပ်ပါသည်။

ဟုတ်ပဌီ၊ ပုံစံခလက်အမျိုသအစာသမျာသ (vector<int>, vector<User>) တလင် ယေဘူယျသတ်မဟတ်ချက်တစ်ခုရဟိသည် (#1cb5c415), i.e. ခေါ်ဆိုမဟုကို သိရဟိပါက

users.getUsers#d91a548 id:Vector<InputUser> = Vector<User>;

ထို့နောက် သင်သည် vector တစ်ခုသာမက သုံသစလဲသူမျာသ၏ vector ကို စောင့်မျဟော်နေပါသည်။ ပိုတိတိပပ၊ ရ ခေတ္တစောင့်ပါ - ကုဒ်အစစ်ဖဌင့်၊ ဒဌပ်စင်တစ်ခုစီတလင် ဗလာအမျိုသအစာသမဟုတ်ပါက၊ တည်ဆောက်သူရဟိမည်ဖဌစ်ပဌီသ၊ အကောင်အထည်ဖော်မဟုတလင် ကောင်သမလန်သောနည်သလမ်သဖဌင့် စစ်ဆေသရန် လိုအပ်မည်ဖဌစ်သည် - ကျလန်ုပ်တို့သည် က vector ၏ဒဌပ်စင်တစ်ခုစီတလင် အတိအကျပေသပို့ထာသပါသည်။ ထိုအမျိုသအစာသ? အကယ်၍ ၎င်သသည် PHP တစ်မျိုသမျိုသဖဌစ်ခဲ့ပါက၊ array တလင် မတူညီသောဒဌပ်စင်မျာသတလင် မတူညီသောအမျိုသအစာသမျာသပါ၀င်နိုင်သည်။

ကအချိန်တလင် သင်သည် TL ကို လိုအပ်ပါသလောဟု တလေသမိလာသည်။ လဟည်သအတလက်၊ ထိုအချိန်က ရဟိနဟင့်ပဌီသသာသ တူညီသော ပရိုတိုဘောကို လူသာသ အမဟတ်စဉ်ကို အသုံသပဌုရန် ဖဌစ်နိုင်ပါသလာသ။ အဲဒါက သီအိုရီ၊ လက်တလေ့ကို လေ့လာကဌည့်ရအောင်။

ကုဒ်တလင် ရဟိပဌီသသာသ TL အကောင်အထည်ဖော်မဟုမျာသ

TL သည် Durov ၏ရဟယ်ယာရောင်သချမဟုနဟင့် (() နာမည်ကဌီသဖဌစ်ရပ်မျာသမတိုင်မီကပင် VKontakte ၏ဝမ်သထဲတလင်မလေသဖလာသခဲ့သည်။ဧကန်အမဟန်Telegram မဖလံ့ဖဌိုသမီပင်။ ပဌီသတော့ open source မဟာ ပထမအကောင်အထည်ဖော်မဟု၏အရင်သအမဌစ်မျာသ ရယ်စရာကောင်သတဲ့ ချိုင်သထောက်တလေအမျာသကဌီသကို သင်တလေ့နိုင်တယ်။ ပဌီသတော့ ဘာသာစကာသကိုယ်တိုင်က အခု Telegram မဟာထက် ပိုပဌည့်စုံအောင် အကောင်အထည်ဖော်ခဲ့တယ်။ ဥပမာအာသဖဌင့်၊ hashes မျာသကို အစီအစဉ်တလင် လုံသဝအသုံသမပဌုပါ (အဓိပ္ပာယ်မဟာ ကလဲလလဲနေသောအမူအရာဖဌင့် တပ်ဆင်ထာသသော pseudotype ( vector ကဲ့သို့))။ သို့မဟုတ်

Templates are not used now. Instead, the same universal constructors (for example, vector {t:Type} [t] = Vector t) are used w

သို့သော် ရုပ်ပုံလလဟာကို ပဌီသပဌည့်စုံစေရန်အတလက် စဉ်သစာသကဌည့်ကဌစို့၊ ပဌောရမည်ဆိုလျဟင် Giant of Thought ၏ ဆင့်ကဲဖဌစ်စဉ်ကို ခဌေရာခံနိုင်ရန် ဖဌစ်သည်။

#define ZHUKOV_BYTES_HACK

#ifdef ZHUKOV_BYTES_HACK

/* dirty hack for Zhukov request */

ဒါမဟမဟုတ် ဒီလိုလဟတယ်-

    static const char *reserved_words_polymorhic[] = {

      "alpha", "beta", "gamma", "delta", "epsilon", "zeta", "eta", "theta", NULL

      };

ကအပိုင်သအစသည် ဥပမာ- နမူနာမျာသအကဌောင်သဖဌစ်သည်။

intHash {alpha:Type} vector<coupleInt<alpha>> = IntHash<alpha>;

၎င်သသည် int ၏ vector တစ်ခုအဖဌစ် hashmap template အမျိုသအစာသ၏ အဓိပ္ပါယ်ဖလင့်ဆိုချက်ဖဌစ်သည်။ C++ တလင် ကကဲ့သို့မဌင်ရပါမည်-

    template <T> class IntHash {
      vector<pair<int,T>> _map;
    }

ဒါကဌောင့်၊ alpha - အဓိကစကာသလုံသ ဒါပေမယ့် C++ မဟာသာ T လို့ရေသနိုင်ပေမယ့် alpha၊ beta ရေသရမဟာ... ဒါပေမယ့် parameter 8 ခုထက်မပိုပါဘူသ၊ စိတ်ကူသယဉ်က theta မဟာ အဆုံသသတ်သလာသပါတယ်။ ထို့ကဌောင့် စိန့်ပီတာစဘတ်တလင် တစ်ကဌိမ်ခန့် ထိုသို့သော ဆလေသနလေသပလဲမျာသ ရဟိပုံရသည်။

-- НаЎП сЎелать в TL шаблПМы
-- Бл... Ну пусть параЌетры зПвут альфа, бета,... КакОе таЌ ещё буквы есть... О, тэта!
-- ГраЌЌатОка? Ну пПтПЌ МапОшеЌ

-- СЌПтрОте, какПй я сОМтаксОс прОЎуЌал Ўля шаблПМПв О вектПра!
-- Ты ЎПлбаМулся, как Ќы этП парсОть буЎеЌ?
-- Да Ме ссыте, ПМ таЌ ПЎОМ в схеЌе, захаркПЎОть -- О Пк

သို့သော်၎င်သသည် TL "ယေဘုယျအာသဖဌင့်" ၏ပထမဆုံသချမဟတ်ထာသသောအကောင်အထည်ဖော်မဟုအကဌောင်သဖဌစ်သည်။ အမဟန်တကယ် Telegram ဖောက်သည်မျာသအတလက် အကောင်အထည်ဖော်မဟုမျာသကို ထည့်သလင်သစဉ်သစာသကဌပါစို့။

Basil ၏စကာသ

Vasily, [09.10.18 17:07] အမျာသစုကတော့ abstractions တလေကို ဖောက်ပဌီသ မဌည်သကို တုတ်နဲ့ရိုက်ပဌီသ ကုဒ်ဂီဂျာပေါ်မဟာ ချိုင်သထောက်တလေ ချ၊
ရလဒ်အနေဖဌင့် ပထမဆုံသ docks မဟ pilot.jpg
ထို့နောက် jekichan.webp ကုဒ်မဟ

ဟုတ်ပါတယ်၊ algorithms နဲ့ သင်္ချာနဲ့ ရင်သနဟီသတဲ့သူတလေဆီက၊ သူတို့က Aho, Ullman ကိုဖတ်ပဌီသ သူတို့ရဲ့ DSL တလေအတလက် compiler တလေရေသဖို့အတလက် ဆယ်စုနဟစ်တလေကဌာအောင် စက်မဟုလုပ်ငန်သမဟာ de facto စံဖဌစ်လာတဲ့ tools တလေနဲ့ ရင်သနဟီသပဌီသသာသဖဌစ်မယ်လို့ မျဟော်လင့်နိုင်တယ်၊ ဟုတ်တယ်ဟုတ်။ .။

စာရေသသူ ကဌေသနန်သ-cli Vitaliy Valtman သည် ၎င်သ၏ (cli) ကန့်သတ်ချက်မျာသအပဌင်ဘက်တလင် TLO ဖော်မတ်ပေါ်ပေါက်ခဌင်သမဟ နာသလည်နိုင်သကဲ့သို့ အသင်သဝင်တစ်ညသဖဌစ်သည် - ယခု TL ခလဲခဌမ်သစိတ်ဖဌာရန်အတလက် စာကဌည့်တိုက်ကို ခလဲဝေချထာသပေသသည် သီသခဌာသစီသူမကို ဘယ်လိုထင်လဲ။ TL parser? ..

16.12 04:18 Vasily- ကျလန်တော့်အမဌင်အရ၊ တစ်စုံတစ်ယောက်က lex + yacc ကို မကျလမ်သကျင်ဘူသ
16.12 04:18 Vasily - မဟုတ်ရင် ငါရဟင်သပဌလို့ မရဘူှ။
16.12 04:18 Vasily- ကောင်သပဌီ၊ ဒါမဟမဟုတ် VK မဟာရဟိတဲ့ လိုင်သအရေအတလက်အတလက် ပေသဆောင်ခံရတယ်။
16.12 04:19 Vasily - အခဌာသ 3k+ လိုင်သမျာသ<censored> parser အစာသ

ခဌလင်သချက်တစ်ခု ဖဌစ်နိုင်ပါသလာသ။ ဘယ်လိုလဲ ကဌည့်ရအောင် လုပ်တယ် ၎င်သသည် တရာသဝင်ဖောက်သည် — Telegram Desktop

    nametype = re.match(r'([a-zA-Z.0-9_]+)(#[0-9a-f]+)?([^=]*)=s*([a-zA-Z.<>0-9_]+);', line);
    if (not nametype):
      if (not re.match(r'vector#1cb5c415 {t:Type} # [ t ] = Vector t;', line)):
         print('Bad line found: ' + line);

Python ရဟိ လိုင်သ 1100+ ၊ ပုံမဟန်အသုံသအနဟုန်သအချို့ + vector အမျိုသအစာသ၏ အထူသကိစ္စရပ်မျာသကို TL syntax အရ ဖဌစ်သင့်သည်ဟု အစီအစဥ်တလင် ကဌေငဌာထာသသော်လည်သ ၎င်သတို့က ၎င်သကို က syntax တလင်ထည့်၍ ခလဲခဌမ်သစိတ်ဖဌာထာသသည် ... မေသစရာမဟာ၊ ကအံ့ဖလယ်အမဟုအလုံသစုံတို့ကို အဘယ်ကဌောင့် နဟောက်ယဟက်သနည်သ။Оစာရလက်စာတမ်သတလေအရ ဘယ်သူကမဟ အဲဒါကို ခလဲခဌမ်သစိတ်ဖဌာမဟာ မဟုတ်ဘူသဆိုရင် ပိုပဌီသတော့ ဝမ်သသာစရာပါပဲ။

စကာသမစပ်... CRC32 စစ်ဆေသမဟုအကဌောင်သ ပဌောခဲ့တာ မဟတ်မိလာသ။ ထို့ကဌောင့်၊ Telegram Desktop code generator တလင် CRC32 တလက်ချက်ထာသသော အမျိုသအစာသမျာသအတလက် ခဌလင်သချက်စာရင်သတစ်ခုရဟိသည်။ မကိုက်ညီပါ ပုံတလင်ဖော်ပဌထာသသည့်အတိုင်သ!

Vasily၊ [18.12 22:49] နဟင့် ကနေရာတလင် ထိုသို့သော TL ကို လိုအပ်သလာသ စဉ်သစာသသင့်သည်။
အခဌာသအခဌာသသော အကောင်အထည်ဖော်မဟုမျာသနဟင့် ရဟုပ်လိုပါက၊ လိုင်သခလဲမဟုမျာသကို စတင်ထည့်သလင်သပါမည်၊ ခလဲခဌမ်သစိတ်ဖဌာသူ၏ ထက်ဝက်သည် လိုင်သပေါင်သစုံ၏ အဓိပ္ပါယ်ဖလင့်ဆိုချက်မျာသကို ချိုသဖျက်မည်ဖဌစ်သည်။
tdesktop လည်သပါပါတယ်။

one-liners နဟင့်ပတ်သက်သည့်အချက်ကို မဟတ်သာသထာသပါ၊ နောက်အနည်သငယ်ကဌာပါက ၎င်သကိုပဌန်သလာသပါမည်။

အိုကေ၊ တယ်လီဂရမ်-cli သည် တရာသဝင်မဟုတ်ပါ၊ Telegram Desktop သည် တရာသဝင်ဖဌစ်သည်၊ သို့သော် အခဌာသအရာမျာသကော။ ဘယ်သူသိလဲ?။ ။ Android သုံသစလဲသူကုဒ်တလင်၊ schema parser လုံသဝမရဟိပါ (ထိုအရာသည် open source နဟင့်ပတ်သက်ပဌီသ မေသခလန်သထုတ်စရာဖဌစ်သော်လည်သ၊ ကအရာသည် ဒုတိယအပိုင်သအတလက်ဖဌစ်သည်)၊ သို့သော် အခဌာသရယ်စရာကောင်သသောကုဒ်မျာသစလာရဟိသော်လည်သ ၎င်သတို့အကဌောင်သ၊ အောက်ပါ ပုဒ်မခလဲ။

အခဌာသမည်သည့်မေသခလန်သမျာသကို နံပါတ်စဉ်တပ်ခဌင်သက လက်တလေ့တလင် တိုသစေသနည်သ။ ဥပမာအာသဖဌင့်၊ ၎င်သတို့သည် bit fields နဟင့် conditional fields မျာသဖဌင့် ကလဲသလာသသည်-

သိသိသာသာ flags.0? true
အလံကို သတ်မဟတ်ပါက အကလက်သည် ပစ္စုပ္ပန်နဟင့် မဟန်သည်ဟု ဆိုလိုသည်။

သိသိသာသာ flags.1? int
နယ်ပယ်သည် ပစ္စုပ္ပန်ဖဌစ်ပဌီသ ဖယ်ထုတ်ရန် လိုအပ်သည်ဟု ဆိုလိုသည်။

Vasily: မဌည်သ၊ မပူနဲ့၊ မင်သဘာလုပ်တာလဲ။
Vasily- doc ၏တစ်နေရာရာတလင် true သည် သုညအလျာသ၏ဗလာအမျိုသအစာသဖဌစ်ကဌောင်သဖော်ပဌထာသသော်လည်သ ၎င်သတို့၏ docs မဟတစ်စုံတစ်ခုကိုစုဆောင်သခဌင်သသည် လက်တလေ့မကျပါ။
Vasily- ပလင့်လင်သသော အကောင်အထည်ဖော်မဟုမျာသတလင် ထိုသို့သောအရာမျိုသမရဟိပါ၊ သို့သော် ချိုင်သထောက်နဟင့် ကျာသကလက်မျာသစလာရဟိသည်။

Telethon ကရော ဘယ်လိုလဲ။ MTProto ၏ ခေါင်သစဉ်ကို ကဌည့်လိုက်လျဟင် ဥပမာတစ်ခု - စာရလက်စာတမ်သမျာသတလင် ထိုသို့သောအပိုင်သမျာသ ရဟိသည်၊ သို့သော် နိမိတ်၊ % ၎င်သကို "ပေသထာသသော ဗလာအမျိုသအစာသနဟင့် သက်ဆိုင်သည်" ဟုသာ ဖော်ပဌထာသပါသည်။ အောက်ဖော်ပဌပါ ဥပမာမျာသတလင် အမဟာသတစ်ခု သို့မဟုတ် စာရလက်စာတမ်သမရဟိသော အရာတစ်ခု ဖဌစ်သည်-

Vasily၊ [22.06.18/18/38 XNUMX:XNUMX] တစ်နေရာတည်သတလင်-

msg_container#73f1f8dc messages:vector message = MessageContainer;

မတူညီသော တစ်ခုမဟာ

msg_container#73f1f8dc messages:vector<%Message> = MessageContainer;

ကအရာမျာသသည် ကဌီသမာသသောကလာခဌာသချက်နဟစ်ခုဖဌစ်ပဌီသ လက်တလေ့ဘဝတလင် ကိုယ်လုံသတီသပုံအချို့ ထလက်ပေါ်လာသည်။

ကလက်လပ် အဓိပ္ပါယ်ဖလင့်ဆိုချက်တလေကို ငါမမဌင်ဖူသသလို အဲဒါကို မတလေ့မိဘူသ။

လက်ဖဌင့် တယ်လီသလန်ဖဌင့် ခလဲခဌမ်သစိတ်ဖဌာခဌင်သ။

သူ့အစီအစဉ်သည် အဓိပ္ပါယ်ဖလင့်ဆိုချက်ဖဌစ်သည်။ msg_container

နောက်တစ်ခုက မေသခလန်သက % လောက်ကျန်သေသတယ်။ မဖော်ပဌပါ။

Vadim Goncharov၊ [22.06.18/19/22 XNUMX:XNUMX PM] နဲ့ tdesktop မဟာလာသ။

Vasily၊ [22.06.18/19/23 XNUMX:XNUMX] သို့သော် ထိန်သညဟိသူမျာသပေါ်ရဟိ ၎င်သတို့၏ TL parser သည် ၎င်သကို မစာသနိုင်တော့ပေ။

// parsed manually

TL သည် လဟပသော စိတ်ကူသစိတ်သန်သတစ်ခုဖဌစ်ပဌီသ ၎င်သကို မည်သူမျဟ အပဌည့်အဝ အကောင်အထည်မဖော်ပေ။

၎င်သတို့အစီအစဉ်၏ဗာသရဟင်သတလင် % မရဟိပါ။

ဒါပေမယ့် ဒီမဟာ စာရလက်စာတမ်သက သူ့ဟာသူ ဆန့်ကျင်နေတာမို့ xs

အဲဒါကို သဒ္ဒါမဟာတလေ့တယ်၊ ဝေါဟာရတလေကို ဖော်ပဌဖို့ မေ့သလာသနိုင်တယ်။

ကောင်သပဌီ၊ သင် TL တလင်အထိုင်ကိုမဌင်ခဲ့သည်၊ လီတာဝက်မရဟိဘဲ၎င်သကိုသင်မတလက်ဆနိုင်ပါ။

“အင်သ၊ ဆိုပါစို့၊” အခဌာသစာဖတ်သူတစ်ညသက “မင်သဟာ အရာအာသလုံသကို ဝေဖန်တယ်၊ ဒါကဌောင့် လုပ်သင့်လုပ်ထိုက်တာကို ပဌပါ” လို့ပဌောလိမ့်မယ်။

Vasily က “parser အတလက်၊ ငါလိုတဲ့အရာတလေလိုတယ်။

    args: /* empty */ { $$ = NULL; }
        | args arg { $$ = g_list_append( $1, $2 ); }
        ;

    arg: LC_ID ':' type-term { $$ = tl_arg_new( $1, $3 ); }
            | LC_ID ':' condition '?' type-term { $$ = tl_arg_new_cond( $1, $5, $3 ); free($3); }
            | UC_ID ':' type-term { $$ = tl_arg_new( $1, $3 ); }
            | type-term { $$ = tl_arg_new( "", $1 ); }
            | '[' LC_ID ']' { $$ = tl_arg_new_mult( "", tl_type_new( $2, TYPE_MOD_NONE ) ); }
            ;

တစ်နည်သနည်သနဲ့ ပိုတူတယ်။

struct tree *parse_args4 (void) {
  PARSE_INIT (type_args4);
  struct parse so = save_parse ();
  PARSE_TRY (parse_optional_arg_def);
  if (S) {
    tree_add_child (T, S);
  } else {
    load_parse (so);
  }
  if (LEX_CHAR ('!')) {
    PARSE_ADD (type_exclam);
    EXPECT ("!");
  }
  PARSE_TRY_PES (parse_type_term);
  PARSE_OK;
}

သို့မဟုတ်

        # Regex to match the whole line
        match = re.match(r'''
            ^                  # We want to match from the beginning to the end
            ([w.]+)           # The .tl object can contain alpha_name or namespace.alpha_name
            (?:
                #             # After the name, comes the ID of the object
                ([0-9a-f]+)    # The constructor ID is in hexadecimal form
            )?                 # If no constructor ID was given, CRC32 the 'tl' to determine it

            (?:s              # After that, we want to match its arguments (name:type)
                {?             # For handling the start of the '{X:Type}' case
                w+            # The argument name will always be an alpha-only name
                :              # Then comes the separator between name:type
                [wd<>#.?!]+  # The type is slightly more complex, since it's alphanumeric and it can
                               # also have Vector<type>, flags:# and flags.0?default, plus :!X as type
                }?             # For handling the end of the '{X:Type}' case
            )*                 # Match 0 or more arguments
            s                 # Leave a space between the arguments and the equal
            =
            s                 # Leave another space between the equal and the result
            ([wd<>#.?]+)     # The result can again be as complex as any argument type
            ;$                 # Finally, the line should always end with ;
            ''', tl, re.IGNORECASE | re.VERBOSE)

ကသည် ENTIRE lexer ဖဌစ်သည်-

    ---functions---         return FUNCTIONS;
    ---types---             return TYPES;
    [a-z][a-zA-Z0-9_]*      yylval.string = strdup(yytext); return LC_ID;
    [A-Z][a-zA-Z0-9_]*      yylval.string = strdup(yytext); return UC_ID;
    [0-9]+                  yylval.number = atoi(yytext); return NUM;
    #[0-9a-fA-F]{1,8}       yylval.number = strtol(yytext+1, NULL, 16); return ID_HASH;

    n                      /* skip new line */
    [ t]+                  /* skip spaces */
    //.*$                 /* skip comments */
    /*.**/              /* skip comments */
    .                       return (int)yytext[0];

အဲဒါတလေ ပိုရိုသရဟင်သတာက ညင်သာစလာ ထာသပေသပါ။"

ယေဘုယျအာသဖဌင့်၊ အဆုံသတလင်၊ TL ၏ အမဟန်တကယ်အသုံသပဌုထာသသော ခလဲခဌမ်သစိပ်ဖဌာမဟုအတလက် ကုဒ်မီသစက်သည် သဒ္ဒါလိုင်သ 100 နဟင့် ဂျင်နရေတာ၏ ~ 300 လိုင်သမျာသ (အာသလုံသအပါအဝင်၊ printအမျိုသအစာသကောင်သမျာသ အပါအဝင်၊ အတန်သတစ်ခုစီတလင် စူသစမ်သလေ့လာရန်အတလက် အချက်အလက်ကို ရိုက်ထည့်ပါ။ polymorphic အမျိုသအစာသတစ်ခုစီသည် အချည်သနဟီသသော abstract base class အဖဌစ်သို့ ပဌောင်သလဲသလာသကာ တည်ဆောက်သူမျာသသည် ၎င်သထံမဟ အမလေဆက်ခံပဌီသ နံပါတ်စဉ်နဟင့် deserialization အတလက် နည်သလမ်သမျာသရဟိသည်။

အမျိုသအစာသဘာသာစကာသတလင် အမျိုသအစာသမရဟိခဌင်သ။

ပဌင်သပဌင်သထန်ထန် စာရိုက်ခဌင်သသည် ကောင်သ၏ မဟုတ်လာသ။ မဟုတ်ပါ၊ ၎င်သသည် holivar မဟုတ်ပါ။ (ကျလန်ုပ်သည် ပဌောင်သလဲနေသောဘာသာစကာသမျာသကို နဟစ်သက်သော်လည်သ)၊ သို့သော် TL အတလင်သရဟိ သရုပ်ဖော်ချက်ဖဌစ်သည်။ ၎င်သကိုအခဌေခံ၍ ဘာသာစကာသသည် ကျလန်ုပ်တို့အတလက် စစ်ဆေသမဟုအာသလုံသကို ပေသသင့်သည်။ ကောင်သပဌီ၊ အိုကေ၊ သူ့ကို မစပါစေနဲ့၊ ဒါပေမယ့် အကောင်အထည်ဖော်ဖို့၊ ဒါပေမယ့် အနည်သဆုံသတော့ သူတို့ကို ဖော်ပဌသင့်တယ်။ ပဌီသတော့ ဘယ်လိုအခလင့်အရေသတလေ လိုချင်လဲ။

ပထမဆုံသအနေနဲ့ ကန့်သတ်ချက်တလေ၊ ကနေရာတလင် ဖိုင်မျာသကို အပ်လုဒ်တင်ရန်အတလက် စာရလက်စာတမ်သမျာသတလင် ကျလန်ုပ်တို့တလေ့မဌင်ရသည်-

ထို့နောက် ဖိုင်၏ ဒလိစုံအကဌောင်သအရာကို အပိုင်သမျာသခလဲထာသသည်။ အစိတ်အပိုင်သအာသလုံသသည် အရလယ်အစာသတူညီရမည် ( part_size ) အောက်ပါအခဌေအနေမျာသနဟင့် ကိုက်ညီရမည်-

  • part_size % 1024 = 0 (1KB ဖဌင့် ပိုင်သခဌာသနိုင်သည်)
  • 524288 % part_size = 0 (512KB ကို part_size ဖဌင့် အညီအမျဟ ခလဲနိုင်ရမည်)

၎င်သ၏အရလယ်အစာသသည် part_size ထက်နည်သသောကဌောင့် နောက်ဆုံသအပိုင်သသည် ကအခဌေအနေမျာသကို ကျေနပ်ရန်မလိုအပ်ပါ။

အပိုင်သတစ်ခုစီတလင် sequence number ရဟိသင့်သည်၊ ဖိုင်_အပိုင်သ0 မဟ 2,999 တန်ဖိုသဖဌင့်၊

ဖိုင်ကို အပိုင်သပိုင်သခလဲပဌီသပါက ၎င်သကို ဆာဗာတလင် သိမ်သဆည်သရန် နည်သလမ်သကို ရလေသချယ်ရန် လိုအပ်သည်။ အသုံသပဌု upload.saveBigFilePart ဖိုင်၏ အရလယ်အစာသ အပဌည့်အစုံသည် 10 MB နဟင့် အထက် ဖဌစ်ပါက၊ upload.saveFilePart သေသငယ်သောဖိုင်မျာသအတလက်။
[
] အောက်ပါ ဒေတာထည့်သလင်သမဟု အမဟာသအယလင်သမျာသထဲမဟ တစ်ခုကို ပဌန်ရနိုင်သည်-

  • FILE_PARTS_INVALID - အစိတ်အပိုင်သအရေအတလက် မမဟန်ကန်ပါ။ တန်ဖိုသက ကဌာသမဟာမဟုတ်ဘူသ။ 1..3000

ကအရာမျာသထဲမဟ တစ်ခုခုသည် အစီအစဉ်တလင် ရဟိနေပါသလာသ။ TL ဖဌင့် တစ်နည်သနည်သဖဌင့် ဖော်ပဌနိုင်ပါသလာသ။ မရဟိ ဒါပေမယ့် ခလင့်လလဟတ်ပါ၊ ခေတ်ဟောင်သ Turbo Pascal ကပေသတဲ့ အမျိုသအစာသတလေကိုတောင် ဖော်ပဌနိုင်ခဲ့တယ်။ အပိုင်သအခဌာသမျာသ. ပဌီသ​တော့ သူ​နောက်​ထပ်​တစ်​ခု​ကို​လုပ်​နိုင်​တယ်​၊ အခု​ပို​သိ​လာ​တယ်။ enum - ပုံသေ (အသေသ) တန်ဖိုသမျာသ စာရင်သကောက်ခဌင်သ ပါဝင်သော အမျိုသအစာသ။ C - numeric ကဲ့သို့သော ဘာသာစကာသမျာသတလင်၊ သင်စိတ်ထဲ၌၊ ကျလန်ုပ်တို့သည် အမျိုသအစာသမျာသအကဌောင်သကိုသာ ယခုအချိန်အထိ ပဌောနေပါသည်။ ဂဏန်သ. ဒါပေမယ့် arrays တလေ၊ strings တလေလည်သရဟိပါတယ် ... ဥပမာ၊ ဒီ string မဟာ ဖုန်သနံပါတ်တစ်ခုသာ ပါဝင်နိုင်တာကို ဖော်ပဌရတာ ကောင်သပါတယ်။

ဒါတလေကို TL မဟာ မရဟိပါဘူသ။ ဒါပေမယ့် ဥပမာ၊ JSON Schema မဟာ ရဟိပါတယ်။ အကယ်၍ 512 KB ၏ ကလဲလလဲမဟုအာသ အခဌာသသူတစ်ညသညသက ၎င်သသည် ကုဒ်တလင် စစ်ဆေသရန် လိုအပ်နေသေသကဌောင်သ ကန့်ကလက်နိုင်ပါက၊ client သည် ရိုသရိုသရဟင်သရဟင်သပင်ဖဌစ်ကဌောင်သ သေချာပါစေ။ မတတ်နိုင် အကလာအဝေသမဟ နံပါတ်ကို ပို့ပါ။ 1..3000 (ဒါနဲ့ သက်ဆိုင်တဲ့ error က ပေါ်မလာနိုင်ဘူသ) ဖဌစ်နိုင်ပါ့မလာသ။

စကာသမစပ် အမဟာသမျာသနဟင့် ပဌန်လာတန်ဖိုသမျာသအကဌောင်သ။ TL နဲ့ တလဲလုပ်ဖူသတဲ့ သူတလေအတလက်တောင် မျက်စိက မဟုန်ဝါသနေတယ် - အဲဒါက ငါတို့ကို ချက်ချင်သ မိုသမလင်သခဲ့ဘူသ။ တစ်ခုစီ TL ရဟိ function တစ်ခုသည် ဖော်ပဌထာသသော return type ကိုသာမက error တစ်ခုပါ ပဌန်ပေသနိုင်သည်။ ဒါပေမယ့် ဒါကို TL ကိုယ်တိုင်က နုတ်ယူလို့မရပါဘူသ။ ဟုတ်ပါတယ်၊ အဲဒါကို နာသလည်နိုင်သလို လက်တလေ့မဟာ nafig မလိုအပ်ပါဘူသ (တကယ်တော့ RPC ကို မတူညီတဲ့နည်သလမ်သတလေနဲ့ လုပ်ဆောင်နိုင်ပေမယ့် ဒီကိုပဌန်သလာသပါမယ်) - ဒါပေမယ့် ကောင်သကင်ဘုံက စိတ္တဇသင်္ချာအမျိုသအစာသတလေရဲ့ သန့်ရဟင်သစင်ကဌယ်ခဌင်သနဲ့ ပတ်သက်လို့ကော၊ world?.. ဆလဲဆလဲ-ဒါကဌောင့် တစ်ထပ်တည်သပဲ။

နောက်ဆုံသအနေနဲ့ ဖတ်ရဟုနိုင်မဟုကော ဘယ်လိုလဲ။ ကောင်သပဌီ၊ ယေဘူယျအာသဖဌင့်၊ ငါလိုချင်ပါတယ်။ ဖေါ်ပဌချက် ၎င်သသည် schema တလင်မဟန်ကန်မဟုရဟိပါသလာသ (တစ်ဖန်၎င်သသည် JSON schema တလင်ဖဌစ်သည်)၊ သို့သော်၎င်သနဟင့်တင်သမာနေပါက၊ လက်တလေ့ဘက်တလင်ကော- အနည်သဆုံသ အပ်ဒိတ်မျာသအတလင်သကလဲပဌာသမဟုမျာသကိုကဌည့်ရဟုရန် အဆင်မပဌေဖဌစ်နေပါသလာသ။ သင်ကိုယ်တိုင် မဟာကဌည့်ပါ။ တကယ့်ဥပမာမျာသ:

-channelFull#76af5481 flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true id:int about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector<BotInfo> migrated_from_chat_id:flags.4?int migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int = ChatFull;
+channelFull#1c87a71a flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_view_stats:flags.12?true id:int about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:ExportedChatInvite bot_info:Vector<BotInfo> migrated_from_chat_id:flags.4?int migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int = ChatFull;

သို့မဟုတ်

-message#44f9b43d flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true id:int from_id:flags.8?int to_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long = Message;
+message#44f9b43d flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true id:int from_id:flags.8?int to_id:Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?int reply_to_msg_id:flags.3?int date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long = Message;

တစ်စုံတစ်ယောက်က ၎င်သကိုနဟစ်သက်သော်လည်သ၊ ဥပမာအာသဖဌင့် GitHub သည် ထိုရဟည်လျာသသောစာကဌောင်သမျာသအတလင်သ အပဌောင်သအလဲမျာသကို မီသမောင်သထိုသပဌရန် ငဌင်သဆိုထာသသည်။ "ကလဲပဌာသမဟု 10 ခုကိုရဟာပါ" ဂိမ်သဖဌစ်ပဌီသ ညသနဟောက်က ချက်ချင်သမဌင်တာက ဥပမာနဟစ်ခုလုံသမဟာ အစနဲ့အဆုံသက အတူတူပါပဲ၊ အလယ်တစ်နေရာရာမဟာ အပဌင်သအထန်ဖတ်ဖို့ လိုပါတယ်... ကျလန်တော့်အမဌင်အရတော့ ဒါက သီအိုရီသက်သက်မဟုတ်ဘူသ၊ ဒါပေမယ့် အမဌင်အာရုံသက်သက်ပါ။ ညစ်ပတ်ပဌီသ မသန့်ရဟင်သ.

စကာသမစပ်, သီအိုရီ၏သန့်ရဟင်သမဟုနဟင့် ပတ်သက်. အဘယ်ကဌောင့် bit fields လိုအပ်သနည်သ။ မထင်ဘူသလာသ အနံ့ အမျိုသအစာသသီအိုရီရဲ့အမဌင်က မကောင်သဘူသလာသ။ schema ၏ အစောပိုင်သဗာသရဟင်သမျာသတလင် ရဟင်သလင်သချက်ကို တလေ့မဌင်နိုင်ပါသည်။ ပထမတော့ ဟုတ်ပါတယ်၊ နဟာချေတိုင်သအတလက် အမျိုသအစာသအသစ်ကို ဖန်တီသထာသပါတယ်။ ကအစေ့အဆန်မျာသသည် ကပုံစံတလင် ရဟိနေပါသေသသည်၊ ဥပမာ၊

storage.fileUnknown#aa963b05 = storage.FileType;
storage.filePartial#40bc6f52 = storage.FileType;
storage.fileJpeg#7efe0e = storage.FileType;
storage.fileGif#cae1aadf = storage.FileType;
storage.filePng#a4f63c0 = storage.FileType;
storage.filePdf#ae1e508d = storage.FileType;
storage.fileMp3#528a0677 = storage.FileType;
storage.fileMov#4b09ebbc = storage.FileType;
storage.fileMp4#b3cea0e4 = storage.FileType;
storage.fileWebp#1081464c = storage.FileType;

သို့သော် ယခု သင့်တလင် ရလေသချယ်နိုင်သော အကလက် ၅ ခုရဟိသည်ဆိုပါက၊ ဖဌစ်နိုင်ချေရဟိသော ရလေသချယ်မဟုအာသလုံသအတလက် အမျိုသအစာသ ၃၂ မျိုသ လိုအပ်ပါသည်။ ပေါင်သစပ်ပေါက်ကလဲမဟု။ ထို့ကဌောင့် TL သီအိုရီ၏ ကဌည်လင်သန့်ရဟင်သမဟုသည် ပဌင်သထန်သော နံပါတ်စဉ်အဖဌစ်မဟန်၏ သံသလန်သမဌည်သနဟင့် တစ်ဖန် ပဌိုကျသလာသသည်။

နောက်ပဌီသ ဒီကောင်တလေက သူတို့ကိုယ်တိုင် စာရိုက်တဲ့ နေရာတလေမဟာ ဖောက်ဖျက်တယ်။ ဥပမာအာသဖဌင့်၊ MTProto (နောက်အခန်သ) တလင်၊ တုံ့ပဌန်ချက်ကို Gzip ဖဌင့် ချုံ့နိုင်သည်၊ အလလဟာမျာသနဟင့် schema ကိုချိုသဖောက်ခဌင်သမဟလလဲ၍ အရာအာသလုံသသည် သင့်လျော်သည်။ တစ်ကဌိမ်နဟင့် RpcResult ကိုယ်တိုင်မရိတ်ဘဲ၎င်သ၏အကဌောင်သအရာမျာသ။ အင်သ..ဘာလို့ ဒီလိုလုပ်ရတာလဲ.. ဘယ်နေရာမဆို ဖိသိပ်ထာသနိုင်အောင် ချိုင်သထောက်နဲ့ ဖဌတ်ရတယ်။

သို့မဟုတ် အခဌာသဥပမာတစ်ခု ကျလန်ုပ်တို့သည် အမဟာသတစ်ခုတလေ့ရဟိသည် - ပို့လိုက်သည် InputPeerUser အစာသ InputUser. သို့မဟုတ် အပဌန်အလဟန်။ ဒါပေမယ့် အလုပ်ဖဌစ်ခဲ့တယ်! ဆိုလိုသည်မဟာ၊ ဆာဗာသည် အမျိုသအစာသကို ဂရုမစိုက်ပါ။ ဒါက ဘယ်လိုဖဌစ်နိုင်မလဲ။ အဖဌေကို telegram-cli မဟ ကုဒ်အပိုင်သအစမျာသဖဌင့် အချက်ပဌလိမ့်မည်-

  if (tgl_get_peer_type (E->id) != TGL_PEER_CHANNEL || (C && (C->flags & TGLCHF_MEGAGROUP))) {
    out_int (CODE_messages_get_history);
    out_peer_id (TLS, E->id);
  } else {    
    out_int (CODE_channels_get_important_history);

    out_int (CODE_input_channel);
    out_int (tgl_get_peer_id (E->id));
    out_long (E->id.access_hash);
  }
  out_int (E->max_id);
  out_int (E->offset);
  out_int (E->limit);
  out_int (0);
  out_int (0);

တစ်နည်သဆိုရသော် ကနေရာတလင် အမဟတ်စဉ်ကို ပဌီသပါပဌီ။ ကိုယ်တိုင်ကုဒ်မထုတ်ပေသပါ။ ဆာဗာကို အလာသတူပုံစံဖဌင့် အကောင်အထည်ဖော်နိုင်ပါသလာသ။ ။ မူအရ၊ တစ်ကဌိမ်ပဌီသပါက ၎င်သသည် အလုပ်ဖဌစ်လိမ့်မည်၊ သို့သော် နောက်ပိုင်သတလင် အပ်ဒိတ်မျာသဖဌင့် ၎င်သကို သင် မည်သို့ပံ့ပိုသနိုင်မည်နည်သ။ အစီအစဥ်က ဘာလဲ မဟုတ်လာသ။ ပဌီသတော့ နောက်မေသခလန်သတစ်ခုဆီ ဆက်သလာသပါမယ်။

ဗာသရဟင်သပဌောင်သခဌင်သ။ အလလဟာ

ထုတ်ဝေထာသသော schemas ၏သမိုင်သကဌောင်သအပေါ် အခဌေခံ၍ schema ဗာသရဟင်သမျာသကို အဘယ်ကဌောင့် အလလဟာမျာသဟု ခေါ်ဝေါ်ရသနည်သ။ ထင်ရဟာသသည်မဟာ၊ အစပိုင်သတလင် အခဌေခံအရာမျာသကို မပဌောင်သလဲသောအစီအစဥ်ဖဌင့် လုပ်ဆောင်နိုင်သည်ဟု စာရေသသူထင်ရသည်၊ လိုအပ်သည့်အခါမဟသာ ၎င်သတို့သည် မတူညီသောဗာသရဟင်သအလိုက် လုပ်ဆောင်နေကဌောင်သ သီသခဌာသတောင်သဆိုမဟုမျာသကို ညလဟန်ပဌနေပုံရသည်။ မူအရ၊ အကဌံကောင်သတစ်ခုပင် - နဟင့် အလိုဆန္ဒအသစ်သည် "ရောနဟောပါ" ဆိုသည့်အတိုင်သ အဟောင်သပေါ်တလင် အလလဟာလိုက်ဖဌစ်သည်။ ဒါပေမယ့် ဘယ်လို ပဌီသသလာသလဲ ကဌည့်ရအောင်။ အမဟန်ပါပဲ၊ အစကတည်သက ကဌည့်ဖို့မဖဌစ်နိုင်ဘူသ - အဲဒါက ရယ်စရာကောင်သတယ်၊ ဒါပေမယ့် အခဌေခံအလလဟာပုံစံက ရိုသရိုသရဟင်သရဟင်သမရဟိပါဘူသ။ အလလဟာ 2 တလင် စတင်ခဲ့သည်။ စာရလက်စာတမ်သသည် ကျလန်ုပ်တို့အာသ အထူသ TL အင်္ဂါရပ်အကဌောင်သ ပဌောပဌသည်-

အကယ်၍ client သည် Layer 2 ကို ပံ့ပိုသပေသမည်ဆိုပါက၊ အောက်ပါ constructor ကို အသုံသပဌုရပါမည်။

invokeWithLayer2#289dd1f6 {X:Type} query:!X = X;

လက်တလေ့တလင်၊ ဆိုလိုသည်မဟာ API ခေါ်ဆိုမဟုတိုင်သတလင် တန်ဖိုသရဟိသော int တစ်ခုဖဌစ်သည်။ 0x289dd1f6 method number ရဟေ့မဟာ ထည့်ရပါမယ်။

အသံကောင်သတယ်။ ဒါပေမယ့် ဘာဆက်ဖဌစ်မလဲ။ နောက်တော့ ရောက်လာတယ်။

invokeWithLayer3#b7475268 query:!X = X;

ဒါဆို နောက်တစ်ခုက ဘာလဲ။ ခန့်မဟန်သရလလယ်သည့်အတိုင်သ

invokeWithLayer4#dea0d430 query:!X = X;

ရယ်စရာလာသ? မဟုတ်ဘူသ၊ ရယ်ဖို့စောလလန်သတယ်၊ ဘာကိုစဉ်သစာသလဲ။ အသီသအသီသ အခဌာသအလလဟာမဟ တောင်သဆိုချက်တစ်ခုအာသ ထိုသို့သော အထူသအမျိုသအစာသဖဌင့် ထုပ်ပိုသထာသရန် လိုအပ်သည် - ၎င်သတို့အာသလုံသ မတူညီပါက ၎င်သတို့ကို မည်သို့ခလဲခဌာသရမည်နည်သ။ ရဟေ့တလင် 4 bytes မျဟထည့်ခဌင်သသည် အလလန်ထိရောက်သောနည်သလမ်သဖဌစ်သည်။ ဒါကဌောင့်

invokeWithLayer5#417a57ae query:!X = X;

ဒါပေမယ့် ခဏအကဌာမဟာတော့ bacchanalia တစ်ချို့ဖဌစ်လာမယ်ဆိုတာ သိသာပါတယ်။ ပဌီသတော့ ဖဌေရဟင်သချက်က လာတယ်၊

အပ်ဒိတ်- Layer 9 မဟစတင်၍ အထောက်အကူနည်သလမ်သမျာသ invokeWithLayerN တို့နဲ့တလဲသုံသနိုင်ပါတယ်။ initConnection

ဟူှ! ဗာသရဟင်သ 9 ခုပဌီသနောက်၊ နောက်ဆုံသတလင်၊ ကျလန်ုပ်တို့သည် 80s တလင် အင်တာနက်ပရိုတိုကောမျာသတလင် လုပ်ဆောင်ခဲ့သည့်အရာဖဌစ်သည် - ချိတ်ဆက်မဟု၏အစတလင်တစ်ကဌိမ် ဗာသရဟင်သညဟိနဟိုင်သမဟုသို့ ရောက်ရဟိခဲ့သည်။

ဒါဆို ဘာဆက်ဖဌစ်မလဲ..

invokeWithLayer10#39620c41 query:!X = X;
...
invokeWithLayer18#1c900537 query:!X = X;

ယခုလည်သ သင်ရယ်နိုင်ပါပဌီ။ နောက်ထပ် အလလဟာ 9 ခု ပဌီသမဟသာ၊ ဗာသရဟင်သနံပါတ်ပါသော universal constructor ကို နောက်ဆုံသတလင် ထည့်သလင်သခဲ့သည်၊ ၎င်သသည် ချိတ်ဆက်မဟု၏အစတလင် တစ်ကဌိမ်သာခေါ်ဆိုရန် လိုအပ်ပဌီသ အလလဟာမျာသရဟိ အဓိပ္ပါယ်မဟာ ပျောက်ကလယ်သလာသပုံရပဌီသ၊ ယခုအခါ ၎င်သသည် အခဌေအနေအရ ဗာသရဟင်သတစ်ခုသာ ဖဌစ်နေပါသည်။ အခဌာသနေရာတိုင်သ။ ပဌဿနာဖဌေရဟင်သပဌီသပဌီ။

ဟုတ်တယ်မလာသ..

Vasily၊ [16.07.18/14/01 XNUMX:XNUMX PM] သောကဌာနေ့တုန်သက ငါတလေသမိတယ်-
တယ်လီဆာဗာသည် တောင်သဆိုမဟုမရဟိဘဲ ပလဲမျာသကို ပေသပို့သည်။ တောင်သဆိုချက်မျာသကို InvokeWithLayer တလင် ထည့်သလင်သထာသရန် လိုအပ်သည်။ ဆာဗာသည် အပ်ဒိတ်မျာသကို ထုပ်ပိုသမထာသပါ၊ တုံ့ပဌန်မဟုမျာသနဟင့် အပ်ဒိတ်မျာသကို ထုပ်ပိုသရန်အတလက် ဖလဲ့စည်သပုံမရဟိပါ။

အဲဒါတလေ။ Client သည် အပ်ဒိတ်လုပ်လိုသော အလလဟာကို သတ်မဟတ်၍ မရပါ။

Vadim Goncharov, [16.07.18/14/02 XNUMX:XNUMX PM] InvokeWithLayer သည် မူအရ ချိုင်သထောက်မဟုတ်လော။

Vasily, [16.07.18/14/02 XNUMX:XNUMX PM] ဒါက တစ်ခုတည်သသော နည်သလမ်သပါ။

Vadim Goncharov, [16.07.18/14/02 XNUMX:XNUMX PM] အဆိုပါ session ၏အစတလင်အလလဟာပေသခဌင်သ၏အခဌေခံအာသဖဌင့်ဆိုလိုသင့်သည်

စကာသမစပ်၊ ဖောက်သည် အဆင့်နဟိမ့်ပေသခဌင်သကို မပေသပါက ကအချက်မဟ ဖဌစ်ပေါ်လာသည်။

အပ်ဒိတ်မျာသ, i.e. အမျိုသအစာသ Updates အစီအစဥ်တလင်၊ ၎င်သသည် API တောင်သဆိုချက်ကို တုံ့ပဌန်ခဌင်သမဟုတ်ဘဲ ဖဌစ်ရပ်တစ်ခုဖဌစ်ပေါ်လာသည့်အခါ ၎င်သကိုယ်တိုင်က သုံသစလဲသူထံ ဆာဗာမဟ ပေသပို့ခဌင်သဖဌစ်သည်။ ၎င်သသည် အခဌာသပို့စ်တလင် ဆလေသနလေသမည့် ရဟုပ်ထလေသသောအကဌောင်သအရာဖဌစ်သည်၊ သို့သော် ယခုအခါတလင် ဆာဗာသည် ကလိုင်သယင့်အော့ဖ်လိုင်သဖဌစ်နေသည့်တိုင် အပ်ဒိတ်မျာသကို စုဆောင်သနေကဌောင်သ သိထာသရန် အရေသကဌီသပါသည်။

ထို့ကဌောင့် ထုပ်ရန် ငဌင်သဆန်သောအခါ၊ တစ်ခုချင်သစီကို ၎င်သ၏ဗာသရဟင်သကို ညလဟန်ပဌရန် ပက်ကေ့ဂျ်ကဌောင့် အောက်ပါ ဖဌစ်နိုင်သော ပဌဿနာမျာသသည် ယုတ္တိနည်သကျကျ ဖဌစ်ပေါ်လာသည်-

  • ကလိုင်သယင့်က ၎င်သကို ပံ့ပိုသသည့်ဗာသရဟင်သကို မပဌောပဌမီ ဆာဗာသည် ကလိုင်သယင့်ထံသို့ အပ်ဒိတ်မျာသ ပေသပို့သည်။
  • Client ကို အဆင့်မဌဟင့်တင်ပဌီသနောက် ဘာတလေလုပ်ဆောင်သင့်လဲ။
  • အဘယ်သူသည် အာမခံချက်အလလဟာနံပါတ်နဟင့်ပတ်သက်၍ ဆာဗာ၏ ထင်မဌင်ယူဆချက်သည် လုပ်ငန်သစဉ်တလင် ပဌောင်သလဲမည်မဟုတ်ပါ။

၎င်သသည် သီအိုရီဆိုင်ရာ တလေသခေါ်မဟုသက်သက်သာဖဌစ်သည်ဟု သင်ထင်ပါသလာသ၊ ဆာဗာကို မဟန်ကန်စလာရေသသာသထာသသောကဌောင့် (မည်သည့်အခဌေအနေတလင်မဆို၊ ၎င်သကို ကောင်သစလာစမ်သသပ်ထာသသည်) ဖဌစ်သောကဌောင့် လက်တလေ့တလင် ၎င်သသည်မဖဌစ်နိုင်ပါ။ ဟာသ! မည်မျဟပင်!

ဒါက သဌဂုတ်လမဟာ ကျနော်တို့ ကဌုံခဲ့ရတာ အတိအကျပါပဲ။ ဩဂုတ်လ 14 ရက်နေ့တလင် Telegram ဆာဗာမျာသတလင် တစ်စုံတစ်ခု အပ်ဒိတ်လုပ်နေသည်ဟူသော မက်ဆေ့ချ်မျာသ ... ထို့နောက် မဟတ်တမ်သမျာသတလင်-

2019-08-15 09:28:35.880640 MSK warn  main: ANON:87: unknown object type: 0x80d182d1 at TL/Object.pm line 213.
2019-08-15 09:28:35.751899 MSK warn  main: ANON:87: unknown object type: 0xb5223b0f at TL/Object.pm line 213.

ထို့နောက် stack traces ၏ megabytes အနည်သငယ် (ကောင်သပဌီ၊ တစ်ချိန်တည်သမဟာပင်၊ မဟတ်တမ်သကို ပဌုပဌင်ခဲ့သည်)။ နောက်ဆုံသတလင်၊ သင်၏ TL တလင် တစ်ခုခုကို အသိအမဟတ်မပဌုပါက၊ ၎င်သသည် လက်မဟတ်မျာသဖဌင့် binary ဖဌစ်ပဌီသ၊ နောက်ထပ် stream တလင်၊ အာသလုံသ သလာသပဌီသ၊ decoding မဖဌစ်နိုင်တော့ပါ။ ဒီလိုအခဌေအနေမဟာ ဘာလုပ်ရမလဲ။

ကောင်သပဌီ၊ ဘယ်သူမဆို စိတ်ထဲရောက်လာတဲ့ ပထမဆုံသအရာက အဆက်ဖဌတ်ပဌီသ ထပ်ကဌိုသစာသပါ။ မကူညီခဲ့ပါ။ ကျလန်ုပ်တို့ googled CRC32 - ၎င်သတို့သည် scheme 73 မဟ အရာဝတ္ထုမျာသဖဌစ်လာခဲ့သည်၊ ကျလန်ုပ်တို့သည် scheme 82 တလင် လုပ်ဆောင်ခဲ့ကဌသော်လည်သ၊ ကျလန်ုပ်တို့သည် မဟတ်တမ်သမျာသကို ဂရုတစိုက်ကဌည့်ရဟုကဌသည် - မတူညီသော အစီအစဥ်နဟစ်ခုမဟ identifiers မျာသရဟိပါသည်။

ပဌဿနာက ကျလန်ုပ်တို့၏တရာသဝင်မဟုတ်သော client တလင် သက်သက်ဖဌစ်နိုင်ပါသလာသ။ မဟုတ်ပါ၊ ကျလန်ုပ်တို့သည် Telegram Desktop 1.2.17 (Linux ဖဌန့်ချီမဟုမျာသစလာနဟင့် ပံ့ပိုသပေသသည့် ဗာသရဟင်သ) ကို လုပ်ဆောင်သည်) ၎င်သသည် ခဌလင်သချက်မဟတ်တမ်သသို့ စာရေသသည်- MTP Unexpected type id #b5223b0f MTPMessageMedia


Telegram ၏ ပရိုတိုကောနဟင့် အဖလဲ့အစည်သဆိုင်ရာ ချဉ်သကပ်မဟုမျာသကို ဝေဖန်ခဌင်သ။ အပိုင်သ 1၊ နည်သပညာ- ဖောက်သည်တစ်ညသကို အစမဟ ရေသခဌင်သအတလေ့အကဌုံ - TL၊ MT

Google မဟတရာသဝင်မဟုတ်သောဖောက်သည်မျာသထဲမဟတစ်ညသနဟင့်ဆင်တူသောပဌဿနာတစ်ခုဖဌစ်ပလာသခဲ့သည်ကိုပဌသခဲ့သည်၊ သို့သော်ထို့နောက်ဗာသရဟင်သနံပါတ်မျာသနဟင့်အညီ, ယူဆချက်မျာသကလဲပဌာသခဲ့သည် ...

ဒါဆို ဘာလုပ်ရမလဲ။ Vasily နဲ့ ကျလန်တော် လမ်သခလဲလိုက်တယ်- သူ 91 ကို update လုပ်ဖို့ကဌိုသစာသခဲ့တယ်၊ ရက်အနည်သငယ်စောင့်ပဌီသ 73 ကိုကဌိုသစာသဖို့ဆုံသဖဌတ်လိုက်တယ်။ နဟစ်ခုလုံသက အလုပ်ဖဌစ်ပေမဲ့ အဲဒါတလေက empirical ဖဌစ်လို့၊ သင်ခုန်တက်ဖို့ ဗာသရဟင်သဘယ်လောက်ရဟိလဲဆိုတာကို နာသမလည်ဘူသ ဆင်သသည်ဖဌစ်စေ၊ မည်မျဟကဌာအောင် စောင့်ရမည်နည်သ။

နောက်ပိုင်သတလင်၊ ကျလန်ုပ်သည် အခဌေအနေကို ပဌန်လည်ဖန်တီသနိုင်သည်- ကျလန်ုပ်တို့သည် သုံသစလဲသူကို စတင်ပါ၊ ၎င်သကို ပိတ်ပါ၊ အစီအစဉ်ကို အခဌာသအလလဟာသို့ ပဌန်လည်ပေါင်သစည်သပါ၊ ပဌန်လည်စတင်ပါ၊ ပဌဿနာကို ထပ်မံဖမ်သယူပါ၊ ယခင်တစ်ခုသို့ ပဌန်သလာသပါ - အူသ၊ အစီအစဉ်ကို မပဌောင်သဘဲ ကလိုင်သယင့်ကို အကဌိမ်ကဌိမ် ပဌန်လည်စတင်ပါ။ မိနစ်တလေက ကူညီပေသပါလိမ့်မယ်။ မတူညီသော အလလဟာမျာသမဟ ဒေတာဖလဲ့စည်သပုံမျာသ ရောနဟောခဌင်သကို သင်ရရဟိမည်ဖဌစ်သည်။

ရဟင်သလင်သချက် အမျိုသမျိုသသော သလယ်ဝိုက်သောလက္ခဏာမျာသမဟ ခန့်မဟန်သနိုင်သကဲ့သို့၊ ဆာဗာတလင် မတူညီသော စက်မျာသတလင် လုပ်ငန်သစဉ်အမျိုသအစာသမျာသစလာ ပါဝင်ပါသည်။ ဖဌစ်နိုင်ချေအမျာသစုမဟာ၊ "buffering" အတလက်တာဝန်ရဟိသောဆာဗာမျာသထဲမဟတစ်ခုသည်၎င်သကိုပိုမိုမဌင့်မာသသောသူမျာသပေသသောအရာကိုတန်သစီစေကာ၎င်သတို့ကိုမျိုသဆက်၏အချိန်အစီအစဉ်တလင်ပေသခဲ့သည်။ ကတန်သစီသည် "ပုပ်" သည်အထိ၎င်သနဟင့်ပတ်သက်ပဌီသဘာမဟမလုပ်ဆောင်နိုင်ခဲ့ပါ။

မဟုတ်ရင်...ဒါပေမယ့် ဒါက ကဌောက်စရာကောင်သတဲ့ တုတ်တံ?!.. မဟုတ်ဘူသ၊ ရူသသလပ်တဲ့ စိတ်ကူသတလေကို မတလေသခင်၊ တရာသဝင် ဖောက်သည်တလေရဲ့ ကုဒ်ကို ကဌည့်ရအောင်။ Android ဗာသရဟင်သတလင်၊ မည်သည့် TL parser ကိုမျဟမတလေ့ပါသော်လည်သ (github မဟ အရောင်မခဌယ်ရန် ငဌင်သဆိုထာသသည်) ဖိုင် (de)serialization ဖဌင့် တလေ့ရပါသည်။ ကသည်မဟာ ကုဒ်အတိုအထလာမျာသဖဌစ်သည်-

public static class TL_message_layer68 extends TL_message {
    public static int constructor = 0xc09be45f;
//...
//еще пачка пПЎПбМых
//...
    public static class TL_message_layer47 extends TL_message {
        public static int constructor = 0xc992e15c;
        public static Message TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) {
            Message result = null;
            switch (constructor) {
                case 0x1d86f70e:
                    result = new TL_messageService_old2();
                    break;
                case 0xa7ab1991:
                    result = new TL_message_old3();
                    break;
                case 0xc3060325:
                    result = new TL_message_old4();
                    break;
                case 0x555555fa:
                    result = new TL_message_secret();
                    break;
                case 0x555555f9:
                    result = new TL_message_secret_layer72();
                    break;
                case 0x90dddc11:
                    result = new TL_message_layer72();
                    break;
                case 0xc09be45f:
                    result = new TL_message_layer68();
                    break;
                case 0xc992e15c:
                    result = new TL_message_layer47();
                    break;
                case 0x5ba66c13:
                    result = new TL_message_old7();
                    break;
                case 0xc06b9607:
                    result = new TL_messageService_layer48();
                    break;
                case 0x83e5de54:
                    result = new TL_messageEmpty();
                    break;
                case 0x2bebfa86:
                    result = new TL_message_old6();
                    break;
                case 0x44f9b43d:
                    result = new TL_message_layer104();
                    break;
                case 0x1c9b1027:
                    result = new TL_message_layer104_2();
                    break;
                case 0xa367e716:
                    result = new TL_messageForwarded_old2(); //custom
                    break;
                case 0x5f46804:
                    result = new TL_messageForwarded_old(); //custom
                    break;
                case 0x567699b3:
                    result = new TL_message_old2(); //custom
                    break;
                case 0x9f8d60bb:
                    result = new TL_messageService_old(); //custom
                    break;
                case 0x22eb6aba:
                    result = new TL_message_old(); //custom
                    break;
                case 0x555555F8:
                    result = new TL_message_secret_old(); //custom
                    break;
                case 0x9789dac4:
                    result = new TL_message_layer104_3();
                    break;

သို့မဟုတ်

    boolean fixCaption = !TextUtils.isEmpty(message) &&
    (media instanceof TLRPC.TL_messageMediaPhoto_old ||
     media instanceof TLRPC.TL_messageMediaPhoto_layer68 ||
     media instanceof TLRPC.TL_messageMediaPhoto_layer74 ||
     media instanceof TLRPC.TL_messageMediaDocument_old ||
     media instanceof TLRPC.TL_messageMediaDocument_layer68 ||
     media instanceof TLRPC.TL_messageMediaDocument_layer74)
    && message.startsWith("-1");

ဟမ်... ကဌည့်ရတာ အရူသပဲ။ ဒါပေမယ် ဒါက ထုတ်ပေသလိုက်တဲ့ ကုဒ်တစ်ခု ဖဌစ်ကောင်သဖဌစ်နိုင်ပါ့မလာသ.. ဒါပေမယ့် ဗာသရဟင်သအာသလုံသကို သေချာပေါက် ထောက်ပံ့ပေသပါတယ်။ မဟန်ပါသည်၊ အရာအာသလုံသကို အစုအဝေသတစ်ခုတလင် ရောနဟောကာ လျဟို့ဝဟက်ချက်တင်မျာသ နဟင့် အမျိုသအစာသအာသလုံသကို အဘယ်ကဌောင့် မရဟင်သလင်သပါ။ _old7 စက်မျိုသဆက်နဲ့ တစ်နည်သနည်သနဲ့ ဆင်တူတာတော့ မဟုတ်ဘူသ... ဒါပေမယ့် အမျာသစုကတော့ ငါက အခလံမာသီသတလေ ဖဌစ်သလာသတယ်။

TL_message_layer104
TL_message_layer104_2
TL_message_layer104_3

ယောက်ျာသလေသတို့၊ အလလဟာတစ်ခုတည်သမဟာတောင် မဆုံသဖဌတ်နိုင်ဘူသလာသ။ ကောင်သပဌီ၊ "နဟစ်ခု" ဆိုကဌပါစို့၊ အမဟာသတစ်ခုဖဌင့်လလဟတ်ပေသခဲ့သည်၊ ကောင်သပဌီ၊ ဒါပေမယ့်သုံသကဌိမ်ဖဌစ်သလာသပဌီ၊ .. တူညီတဲ့ထလန်တုံသပေါ်ထပ်ပဌီသချက်ချင်သပဌန်။ ဒါက ဘယ်လိုညစ်ညမ်သရုပ်ပုံမျိုသလဲ၊ တောင်သပန်ပါတယ်..

စကာသမစပ်၊ Telegram Desktop ရင်သမဌစ်မျာသတလင် အလာသတူကိစ္စမျိုသ ကဌုံရသည်၊ အကယ်၍ အစီအစဉ်တလင် ဆက်တိုက်လုပ်ဆောင်မဟုမျာသသည် ၎င်သ၏ အလလဟာနံပါတ်ကို မပဌောင်သလဲသော်လည်သ တစ်ခုခုကို ပဌင်ဆင်ပါ။ အစီအစဉ်အတလက်တရာသဝင်ဒေတာရင်သမဌစ်မရဟိသည့်အခဌေအနေမျာသတလင်၊ တရာသဝင်အသုံသပဌုသူအရင်သအမဌစ်မျာသမဟလလဲ၍ ၎င်သကိုဘယ်ကရနိုင်မည်နည်သ။ ၎င်သကိုသင်ထိုနေရာမဟယူသည်၊ နည်သလမ်သအာသလုံသကိုသင်မစမ်သသပ်မချင်သအစီအစဥ်သည်လုံသဝမဟန်ကန်ကဌောင်သသင်မသေချာနိုင်ပါ။

ဒါကို ဘယ်လိုစမ်သသပ်နိုင်မလဲ။ Unit၊ Functional နဟင့် အခဌာသသော Test မျာသကို ပရိတ်သတ်မျာသ မဟတ်ချက်မျာသတလင် မျဟဝေကဌမည်ဟု မျဟော်လင့်ပါသည်။

ကောင်သပဌီ၊ နောက်ထပ်ကုဒ်အပိုင်သကို ကဌည့်ရအောင်။

public static class TL_folders_deleteFolder extends TLObject {
    public static int constructor = 0x1c295881;

    public int folder_id;

    public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) {
        return Updates.TLdeserialize(stream, constructor, exception);
    }

    public void serializeToStream(AbstractSerializedData stream) {
        stream.writeInt32(constructor);
        stream.writeInt32(folder_id);
    }
}

//manually created

//RichText start
public static abstract class RichText extends TLObject {
    public String url;
    public long webpage_id;
    public String email;
    public ArrayList<RichText> texts = new ArrayList<>();
    public RichText parentRichText;

    public static RichText TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) {
        RichText result = null;
        switch (constructor) {
            case 0x1ccb966a:
                result = new TL_textPhone();
                break;
            case 0xc7fb5e01:
                result = new TL_textSuperscript();
                break;

ကနေရာတလင် "ကိုယ်တိုင်ဖန်တီသထာသသည်" မဟတ်ချက်က ကဖိုင်၏ အစိတ်အပိုင်သကိုသာ လက်ဖဌင့်ရေသထာသသည် (ပဌုပဌင်ထိန်သသိမ်သမဟု အိပ်မက်ဆိုသကို စိတ်ကူသကဌည့်နိုင်ပါသလာသ။)၊ ကျန်သည် စက်ဖဌင့် ထုတ်ပေသပါသည်။ သို့သော်၊ နောက်မေသခလန်သတစ်ခုပေါ်လာသည် - အရင်သအမဌစ်မျာသရရဟိနိုင်ပါသလာသ။ လုံသဝမဟုတ်ပါ။ (Linux kernel ရဟိ GPL အောက်ရဟိ a la blobs)၊ သို့သော် ၎င်သသည် ဒုတိယအပိုင်သအတလက် ခေါင်သစဉ်တစ်ခု ဖဌစ်နေပါပဌီ။

ဒါပေမယ့် လုံလောက်ပါတယ်။ ကနံပါတ်စဉ်ကိုလိုက်နေသည့်အပေါ်မဟ ပရိုတိုကောသို့ ဆက်သလာသကဌပါစို့။

MT Proto

ဒါဆိုဖလင့်ကဌည့်ရအောင် အထလေထလေဖော်ပဌချက် О ပရိုတိုကော၏အသေသစိတ်ဖော်ပဌချက် ပဌီသတော့ ပထမဆုံသ ကျလန်တော်တို့ မဟာသမိတာကတော့ ဝေါဟာရတလေပါ။ အရာခပ်သိမ်သ မျာသပဌာသလဟ၏။ ယေဘူယျအာသဖဌင့်၊ ၎င်သသည် Telegram ၏ ကုန်အမဟတ်တံဆိပ်တစ်ခုဖဌစ်ပုံရသည် - မတူညီသောနေရာမျာသတလင် အရာမျာသကို မတူညီသောနည်သလမ်သမျာသဖဌင့် ခေါ်ရန် သို့မဟုတ် စကာသလုံသတစ်လုံသတည်သဖဌင့် မတူညီသောအရာမျာသ သို့မဟုတ် အပဌန်အလဟန်အာသဖဌင့် (ဥပမာ၊ အဆင့်မဌင့် API တလင် စတစ်ကာအထုပ်တစ်ခုကိုတလေ့ပါက - ကအရာ၊ မင်သထင်သလိုမဟုတ်ဘူသ)။

ဥပမာအာသဖဌင့်၊ "message" (စာတို) နဟင့် "session" (session) - ကနေရာတလင် ၎င်သတို့သည် Telegram client ၏ ပုံမဟန်အင်တာဖေ့စ်ထက် ကလဲပဌာသသောအရာကို ဆိုလိုသည်။ ကောင်သပဌီ၊ မက်ဆေ့ချ်ဖဌင့်အရာအာသလုံသသည်ရဟင်သလင်သသည်၊ ၎င်သကို OOP ၏ဝေါဟာရမျာသဖဌင့်အဓိပ္ပာယ်ပဌန်ဆိုနိုင်သည်၊ သို့မဟုတ် "package" ဟူသောစကာသလုံသကိုရိုသရဟင်သစလာခေါ်ဆိုနိုင်သည် - ၎င်သသည်နိမ့်ပါသသည်၊ သယ်ယူပို့ဆောင်ရေသအဆင့်ဖဌစ်သည်၊ အင်တာဖေ့စ်တလင်ကဲ့သို့တူညီသောမက်ဆေ့ခ်ျမျာသမပါရဟိပါ၊ အမျာသအပဌာသရဟိသည်။ ဝန်ဆောင်မဟုမျာသ။ ဒါပေမယ့် session ... but first things first.

သယ်ယူပို့ဆောင်ရေသအလလဟာ

ပထမဆုံသအချက်က သယ်ယူပို့ဆောင်ရေသပါ။ ရလေသချယ်စရာ 5 ခုအကဌောင်သပဌောပါမည်။

  • သည် TCP
  • ဝက်ဘ်ဆိုက်
  • HTTPS ပေါ်ရဟိ Websocket
  • သည် HTTP
  • HTTPS ကို

Vasily, [15.06.18/15/04 XNUMX:XNUMX PM] ထို့အပဌင် UDP သယ်ယူပို့ဆောင်ရေသလည်သ ရဟိပါသည်၊ သို့သော် ၎င်သကို မဟတ်တမ်သတင်ထာသခဌင်သမရဟိပါ။

နဟင့် TCP သည် မူကလဲသုံသမျိုသရဟိသည်။

ပထမတစ်ခုသည် TCP ပေါ်ရဟိ UDP နဟင့်ဆင်တူသည်၊ ပက်ကတ်တစ်ခုစီတလင် sequence နံပါတ်တစ်ခုနဟင့် crc တစ်ခုပါဝင်သည်။
လဟည်သပေါ်ရဟိ အထိုင်မျာသကို ဖတ်ရခဌင်သသည် အဘယ်ကဌောင့် အလလန်နာကျင်ရသနည်သ။

ကဲ ဟိုမဟာ TCP တလင် မူကလဲ 4 မျိုသရဟိပဌီသသာသဖဌစ်သည်။:

  • ခဏ
  • ကဌာသဖဌစ်သော
  • အလယ်အလတ် padded
  • ပဌည့်သော

အိုကေ၊ MTProxy အတလက် အလယ်အလတ် Padded၊ ၎င်သကို နောက်ပိုင်သတလင် သိရဟိထာသသည့် ဖဌစ်ရပ်မျာသကဌောင့် ထပ်ထည့်ထာသသည်။ ဒါပေမယ့် ဗာသရဟင်သနဟစ်ခု (စုစုပေါင်သ သုံသခု) က ဘာကဌောင့် လုပ်နိုင်တာလဲ။ လေသခုစလုံသသည် အဓိကအာသဖဌင့် MTProto ကိုယ်တိုင်၏ အရဟည်နဟင့် ဝန်အာသကို သတ်မဟတ်ပုံတလင်သာ ကလဲပဌာသသည်၊ ၎င်သကို ဆက်လက်ဆလေသနလေသပါမည်။

  • Abridged တလင်၎င်သသည် 1 သို့မဟုတ် 4 bytes ဖဌစ်သော်လည်သ 0xef ထို့နောက် body မဟုတ်ပါ။
  • Intermediate တလင် ၎င်သသည် အရဟည် 4 bytes ရဟိပဌီသ အကလက်တစ်ခုဖဌစ်ပဌီသ client မဟ ပထမဆုံသအကဌိမ် ပေသပို့ရမည်ဖဌစ်သည်။ 0xeeeeeeee အလယ်အလတ်ဖဌစ်ကဌောင်သ ညလဟန်ပဌရန်
  • အပဌည့်အဝ၊ စလဲလမ်သမဟုအရဟိဆုံသ၊ ကလန်ရက်အသုံသပဌုသူ၏အမဌင်မဟ၊ အလျာသ၊ အစီအစဥ်နံပါတ်နဟင့် အခဌေခံအာသဖဌင့် MTProto၊ ကိုယ်ထည်၊ CRC32 မဟုတ်ပါ။ ဟုတ်တယ်၊ ဒါတလေအာသလုံသ TCP ကျော်တယ်။ bytes ၏ အမဟတ်စဉ်စီသကဌောင်သပုံစံဖဌင့် ယုံကဌည်စိတ်ချရသော သယ်ယူပို့ဆောင်ရေသအာသ ကျလန်ုပ်တို့အာသ ပံ့ပိုသပေသသည်၊ မည်သည့် sequence မဟ မလိုအပ်ပါ၊ အထူသသဖဌင့် checksums။ ကောင်သပဌီ၊ အခု TCP မဟာ 16-bit checksum ပါတဲ့အတလက် ဒေတာ ဖောက်ပဌန်မဟု ဖဌစ်သလာသတာကို ငါကန့်ကလက်မယ်။ ကျလန်ုပ်တို့တလင် 16 bytes ထက်ပိုရဟည်သော hashes ပါသော cryptographic protocol တစ်ခုမဟလလဲ၍ ကအမဟာသမျာသအာသလုံသကို - နဟင့် ပို၍ပင် - မဌင့်မာသသောအဆင့်တလင် SHA မကိုက်ညီမဟုတလင် ဖမ်သမိပါလိမ့်မည်။ ကကိစ္စနဟင့်ပတ်သက်ပဌီသ CRC32 တလင် အမဟတ်မရဟိပါ။

"In case 4-byte data alignment is need" ကို တရာသမျဟတသော "In case 16-byte data alignment is need" ကို တရာသမျဟတသော အလျာသတစ်ဘိုက် ဖဌစ်နိုင်သည့် အလယ်အလတ်ဖဌင့် နဟိုင်သယဟဉ်ကဌည့်ကဌပါစို့။ Telegram ပရိုဂရမ်မာမျာသသည် socket မဟ data မျာသကို aligned buffer အဖဌစ်သို့မဖတ်နိုင်လောက်အောင် မိုက်မဲသည်ဟု ယူဆကဌသည်မဟာ အဘယ်နည်သ။ အဘယ်ကဌောင့်ဆိုသော် စာဖတ်ခဌင်သသည် သင့်အာသ မည်သည့် bytes အရေအတလက်ကိုမဆို ပဌန်ပေသနိုင်သောကဌောင့် (ဥပမာ၊ ပရောက်စီဆာဗာမျာသလည်သ ရဟိသည်)။ သို့မဟုတ် အခဌာသတစ်ဖက်တလင်၊ ကျလန်ုပ်တို့တလင် 3 bytes မဟ ကဌီသမာသသော paddings မျာသရဟိနေသေသပါက - XNUMX bytes ချလေတာနိုင်ပါက အဘယ်ကဌောင့် အကျဉ်သချုပ်လုပ်ရမည်နည်သ။ တခါတလေ ?

Nikolai Durov သည် တကယ့်လက်တလေ့ မလိုအပ်ဘဲ ကလန်ရက်ပရိုတိုကောမျာသ အပါအဝင် စက်ဘီသမျာသကို တီထလင်ခဌင်သကို အလလန်နဟစ်သက်ကဌောင်သ ခံယူချက်တစ်ခု ရရဟိသည်။

အခဌာသသယ်ယူပို့ဆောင်ရေသရလေသချယ်စရာမျာသ, အပါအဝင်။ ဝဘ်နဟင့် MTProxy၊ တောင်သဆိုမဟုတစ်ခုရဟိလျဟင် အခဌာသပို့စ်တလင် ဖဌစ်နိုင်သည်ဟု ကျလန်ုပ်တို့ ယခုစဉ်သစာသမည်မဟုတ်ပါ။ 2018 တလင်ထလက်ရဟိပဌီသနောက်မကဌာမီတလင်၊ ဝန်ဆောင်မဟုပေသသူမျာသသည် ၎င်သကိုအတိအကျပိတ်ဆို့ရန် လျင်မဌန်စလာသိရဟိလာခဲ့သည့် က MTProxy အကဌောင်သကို ယခုမဟပဌန်လည်သတိရမိပါမည်။ block bypassအပေါ် ထုပ်ပိုသအရလယ်အစာသ! ထို့အပဌင် C တလင်ရေသသာသထာသသော MTProxy ဆာဗာ (Waltman မဟတစ်ဖန်) သည် လုံသဝမလိုအပ်သော်လည်သ (Phil Kulin မဟအတည်ပဌုပါမည်) နဟင့် အလာသတူဆာဗာသည် Go တလင်ဖဌစ်စေ Node.js တလင်ဖဌစ်စေ Linux သီသခဌာသမျာသနဟင့် မလိုအပ်ဘဲ ဆက်စပ်နေကဌောင်သကိုလည်သ၊ လိုင်သတစ်ရာအောက် ကိုက်ညီသည်။

သို့သော် အခဌာသပဌဿနာမျာသကို သုံသသပ်ပဌီသနောက် အပိုင်သအဆုံသတလင် ကလူမျာသ၏ နည်သပညာတတ်မဌောက်မဟုနဟင့် ပတ်သက်၍ ကျလန်ုပ်တို့ ကောက်ချက်ချပါမည်။ အခုအချိန်မဟာ၊ သူတို့ MTProto session ကို တင်ထာသတဲ့ 5th OSI အလလဟာကို ဆက်သလာသကဌရအောင်။

သော့မျာသ၊ မက်ဆေ့ချ်မျာသ၊ ဆက်ရဟင်မျာသ၊ Diffie-Hellman

အဲဒါကို လုံသလုံသ မမဟန်ပါဘူသ... Session ဟာ Active sessions အောက်ရဟိ interface မဟာ မဌင်ရတဲ့ session မဟုတ်ပါ။ ဒါပေမယ့် ရဟိမဟပေါ့။

Telegram ၏ ပရိုတိုကောနဟင့် အဖလဲ့အစည်သဆိုင်ရာ ချဉ်သကပ်မဟုမျာသကို ဝေဖန်ခဌင်သ။ အပိုင်သ 1၊ နည်သပညာ- ဖောက်သည်တစ်ညသကို အစမဟ ရေသခဌင်သအတလေ့အကဌုံ - TL၊ MT

ကတလင် ကျလန်ုပ်တို့သည် သယ်ယူပို့ဆောင်ရေသအလလဟာမဟ သိထာသသော အရဟည်ရဟိ bytes စာတန်သတစ်ခုကို လက်ခံရရဟိထာသပါသည်။ ကသည်မဟာ ကုဒ်ဝဟက်ထာသသော မက်ဆေ့ချ် သို့မဟုတ် လလင်ပဌင်စာသာသ ဖဌစ်သည် - အကယ်၍ ကျလန်ုပ်တို့သည် အဓိက ညဟိနဟိုင်သမဟု အဆင့်တလင် ရဟိနေကာ အမဟန်တကယ် လုပ်ဆောင်နေပါက၊ "သော့" ဟုခေါ်သော အယူအဆ အစုအဝေသထဲမဟ မည်သည့်အရာကို ကျလန်ုပ်တို့ပဌောနေသနည်သ။ Telegram အဖလဲ့ကိုယ်တိုင် ကပဌဿနာကို ရဟင်သလင်သလိုက်ရအောင် (မနက် 4 နာရီတလင် ကျလန်ုပ်၏ကိုယ်ပိုင်စာရလက်စာတမ်သမျာသကို အင်္ဂလိပ်မဟ ပင်ပန်သနလမ်သနယ်နေသော ညသနဟောက်သို့ ဘာသာပဌန်သည့်အတလက် တောင်သပန်ပါသည်၊ စကာသလုံသအချို့ကို ချန်ထာသခဲ့ရသည်မဟာ ပိုလလယ်ကူသည်)။

ဟူ၍ နဟစ်မျိုသရဟိသည်။ session တစ်ခု - session တစ်ခုစီသည် စက်/OS တစ်ခုလုံသနဟင့် သက်ဆိုင်သည့် "လက်ရဟိ sessions" အောက်တလင် တရာသဝင်ဖောက်သည်မျာသ၏ UI တလင် တစ်ခု။
ဒုတိယ- MTProto စက်ရဟင်၎င်သတလင် message sequence နံပါတ် (အဆင့်နိမ့်သဘောအရ) ပါရဟိသည့်၊ နဟင့် မည်သည့်အရာ မတူညီသော TCP ချိတ်ဆက်မဟုမျာသကဌာသတလင် ကဌာရဟည်နိုင်သည်။ ဥပမာအာသဖဌင့် ဖိုင်ဒေါင်သလုဒ်မျာသကို အရဟိန်မဌဟင့်ရန် MTProto စက်ရဟင်အမျာသအပဌာသကို တစ်ချိန်တည်သတလင် သတ်မဟတ်နိုင်သည်။

ဒီနဟစ်ခုကဌာသ အစည်သအဝေသမျာသ အယူအဆဖဌစ်ပါတယ်။ ခလင့်ပဌုချက်. ယုတ်ညံ့တဲ့ကိစ္စမဟာ ဒီလိုပဌောလို့ရတယ်။ UI စက်ရဟင် အတူတူပါပဲ။ ခလင့်ပဌုချက်ဒါပေမယ့် ကံဆိုသတာက ရဟုပ်ထလေသတယ်။ ကျလန်ုပ်တို့ကဌည့်သည်-

  • စက်ပစ္စည်သအသစ်တလင် အသုံသပဌုသူက ညသစလာထုတ်ပေသသည်။ auth_key ဥပမာအာသဖဌင့်၊ SMS ဖဌင့် ၎င်သကို အကောင့်နဟင့် ကန့်သတ်ထာသသည် - အဲဒါကဌောင့်ပါ။ ခလင့်ပဌုချက်
  • ပထမအထဲမဟာ ဖဌစ်သလာသတာ။ MTProto စက်ရဟင်ရဟိသည် session_id သင်ကိုယ်တိုင်အတလင်သ၌။
  • ဒီအဆင့်မဟာ ပေါင်သစပ်ပါ။ ခလင့်ပဌုချက် О session_id အမည်ပေသနိုင်သည်။ အာဏာ - ကစကာသလုံသကို သုံသစလဲသူအချို့၏ စာရလက်စာတမ်သနဟင့် ကုဒ်မျာသတလင် တလေ့နိုင်သည်။
  • ထို့နောက် client ကိုဖလင့်နိုင်သည်။ အတော်ကဌာ MTProto အစည်သအဝေသမျာသ အောက်မဟာ အတူတူပါပဲ။ auth_key - DC ကိုပဲသလာသပါ။
  • တစ်နေ့တလင် client ထံမဟ ဖိုင်တစ်ခုတောင်သဆိုရန် လိုအပ်သည်။ နောက်ထပ် DC - ပဌီသတော့ ဒီ DC အတလက် အသစ်တစ်ခု ထုတ်ပေသလိမ့်မယ်။ auth_key !
  • ကသည်မဟာ အသုံသပဌုသူအသစ် မဟတ်ပုံတင်ခဌင်သမဟုတ်သော်လည်သ တူညီကဌောင်သ စနစ်အာသ ပဌောပဌရန် ခလင့်ပဌုချက် (UI စက်ရဟင်) client သည် API ခေါ်ဆိုမဟုမျာသကို အသုံသပဌုသည်။ auth.exportAuthorization အိမ် DC တလင် auth.importAuthorization DC အသစ်တလင်။
  • အာသလုံသအတူတူပါပဲ ပလင့်တာလည်သ ရဟိကောင်သရဟိနိုင်ပါတယ်။ MTProto အစည်သအဝေသမျာသ (တစ်ခုစီတလင်၎င်သ၏ကိုယ်ပိုင် session_id) ဒီ DC အသစ်၊ သူ၏ auth_key.
  • နောက်ဆုံသတလင်၊ client သည် Perfect Forward လျဟို့ဝဟက်ချက်ကို လိုချင်ပေမည်။ တိုင်သ auth_key ဒါဟာခဲ့ အမဌဲတမ်သ key - per DC - နဲ့ client က ဖုန်သဆက်လို့ရတယ်။ auth.bindTempAuthKey အသုံသပဌုရန် ယာယီ auth_key - တစ်ဖန်၊ temp_auth_key DC အလိုက်၊ အာသလုံသအတလက် အဖဌစ်မျာသသည်။ MTProto အစည်သအဝေသမျာသ ဒီ DC ကို

သတိပဌုပါ ဆာသငန် (နောင်ဆာသမျာသ) သည်လည်သ တစ်ခုပဌီသတစ်ခုဖဌစ်သည်။ auth_key အဲဒါတလေ အာသလုံသကို မျဟဝေပါသည်။ MTProto အစည်သအဝေသမျာသ တူညီသော DC သို့

"ကလဲပဌာသခဌာသနာသသော TCP ချိတ်ဆက်မဟုမျာသအကဌာသ" ကဘာကိုဆိုလိုသနည်သ။ ဆိုလိုသည်မဟာ ကသို့ တစ်ခုခု ဝဘ်ဆိုက်တလင် ခလင့်ပဌုချက် ကလတ်ကီသ - ၎င်သသည် ကဆာဗာသို့ TCP ချိတ်ဆက်မဟုမျာသစလာကို ဆက်လက်တည်ရဟိနေသော်လည်သ တစ်နေ့တလင် ၎င်သသည် ဆိုသရလာသသလာသမည်ဖဌစ်သည်။ HTTP နဟင့် မတူဘဲ၊ MTProto တလင်သာ၊ စက်ရဟင်အတလင်သတလင်၊ မက်ဆေ့ချ်မျာသကို စဉ်ဆက်မပဌတ် နံပါတ်တပ်ပဌီသ အတည်ပဌုလိုက်သည်၊ ၎င်သတို့သည် လိုဏ်ခေါင်သထဲသို့ ဝင်သလာသသည်၊ ချိတ်ဆက်မဟု ပျက်သလာသသည် - ချိတ်ဆက်မဟုအသစ်ကို ထူထောင်ပဌီသနောက်၊ ဆာဗာသည် ၎င်သတလင် မပေသပို့ရသေသသည့် ကစက်ရဟင်အတလင်သရဟိ အရာအာသလုံသကို ကဌင်နာစလာ ပေသပို့ပါမည်။ ယခင် TCP ချိတ်ဆက်မဟု။

သို့သော် လအတော်ကဌာ တရာသစလဲခံရပဌီသနောက် အထက်ဖော်ပဌပါ အချက်အလက်မျာသသည် ကျဉ်သမဌောင်သသလာသပါသည်။ ကအတောအတလင်သ၊ ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ client ကို အစမဟ အကောင်အထည်ဖော်နေပါသလာသ။ - အစကိုပဌန်သလာသရအောင်။

ဒါကဌောင့် ကျလန်တော်တို့ ထုတ်လုပ်ပါတယ်။ auth_key အပေါ် Telegram မဟ Diffie-Hellman ဗာသရဟင်သမျာသ. စာရလက်စာတမ်သတလေကို နာသလည်အောင် ကဌိုသစာသကဌည့်ရအောင်...

Vasily၊ [19.06.18/20/05 1:255] data_with_hash := SHAXNUMX(data) + data + (မည်သည့်ကျပန်သ ဘိုက်မျာသမဆို); အလျာသသည် XNUMX bytes နဟင့် ညီမျဟသည်။
encrypted_data := RSA(data_with_hash၊ server_public_key); 255-byte ရဟည်လျာသသော နံပါတ် (big endian) ကို လိုအပ်သော modulus ထက် လိုအပ်သော ပါဝါသို့ မဌဟင့်တင်လိုက်ပဌီသ ရလဒ်ကို 256-byte နံပါတ်အဖဌစ် သိမ်သဆည်သထာသသည်။

သူတို့မဟာ မူသယစ်ဆေသဝါသ DH ရဟိတယ်။

ကျန်သမာသောလူ၏ DH နဟင့်တူသည်မဟုတ်ပေ။
dx တလင် public key နဟစ်ခုမရဟိပါ။

ကောင်သပဌီ၊ အဆုံသတလင်၊ ငါတို့သည်၎င်သကိုရဟာဖလေတလေ့ရဟိခဲ့သည်၊ သို့သော်အနည်အနဟစ်မျာသကျန်ခဲ့သည် - အရေအတလက်ကိုခလဲခဌမ်သစိတ်ဖဌာနိုင်သည်ဟု client မဟအလုပ်သက်သေပဌသည်။ DoS တိုက်ခိုက်မဟုမျာသကို ကာကလယ်သည့် အမျိုသအစာသ။ RSA သော့ကို ညသတည်ချက်တစ်ခုတည်သတလင် တစ်ကဌိမ်သာ အသုံသပဌုသည်၊ အဓိကအာသဖဌင့် ကုဒ်ဝဟက်ခဌင်သအတလက် ဖဌစ်သည်။ new_nonce. ဒါပေမယ့် ဒီရိုသရဟင်သပုံရတဲ့ ခလဲစိတ်မဟု အောင်မဌင်နေချိန်မဟာ သင် ဘာကို ရင်ဆိုင်ရမလဲ။

Vasily၊ [20.06.18/00/26 XNUMX:XNUMX] ငါ appid တောင်သဆိုချက်ကို မရောက်သေသပါဘူသ

ငါ DH သို့ တောင်သဆိုချက်တစ်ခု ပေသပို့ခဲ့သည်။

သယ်ယူပို့ ဆောင်ရေသအထိုင်တလင် ၎င်သသည် အမဟာသကုဒ်၏ 4 bytes ဖဌင့် အဖဌေပေသနိုင်ကဌောင်သ ရေသထာသသည်။ ဒါပဲ။

ကောင်သပဌီ၊ သူကငါ့ကို -404 ပဌောတယ်၊ ဒါဆိုဘာလဲ။

ကတလင် ကျလန်ုပ်သည် သူ့အတလက်ဖဌစ်သည်- "ထိုကဲ့သို့သော လက်ဗလေဖဌင့် ဆာဗာသော့ဖဌင့် ကုဒ်ဝဟက်ထာသသော သင်၏ efigna ကို ဖမ်သပါ၊ ကျလန်ုပ် DH လိုချင်ပါသည်" ၊ ၎င်သသည် မိုက်မဲစလာ တုံ့ပဌန်သည် 404

ဒီလိုဆာဗာတုံ့ပဌန်မဟုအပေါ် သင်ဘယ်လိုထင်လဲ။ ဘာလုပ်မလဲ? မေသမည့်သူမရဟိပါ (ဒါပေမယ့် ဒုတိယအပိုင်သမဟာ ပိုမျာသပါတယ်)။

ကတလင် dock တလင်စိတ်ဝင်စာသမဟုအာသလုံသကိုလုပ်ဆောင်ရန်ဖဌစ်သည်။

ငါ့မဟာ လုပ်စရာမရဟိဘူသ၊ ဂဏန်သတလေကို အပဌန်ပဌန်အလဟန်လဟန်ပဌောင်သဖို့ စိတ်ကူသယဉ်ခဲ့တယ်။

32 bit နံပါတ်နဟစ်ခု။ တခဌာသသူတလေလို ထုပ်ပိုသလိုက်တာ

ဒါပေမယ့် မဟုတ်ဘူသ၊ အဲဒါက BE လိုင်သတစ်ခုအတလက် မင်သအရင်လိုအပ်တာ ဒီနဟစ်ခုပဲ။

Vadim Goncharov, [20.06.18/15/49 404:XNUMX PM] နဟင့် က XNUMX ကဌောင့်လာသ။

Vasily၊ [20.06.18/15/49 XNUMX:XNUMX PM] ဟုတ်တယ်။

Vadim Goncharov၊ [20.06.18/15/50 XNUMX:XNUMX PM] ဒါကဌောင့် သူ "မတလေ့ဘူသ" ဆိုတာကို ကျလန်တော် နာသမလည်ဘူသ

Vasily၊ [20.06.18 15:50] အကလောငျသ

ရိုသရဟင်သသော ကလဲကလဲပဌာသပဌာသမျာသအဖဌစ်သို့ ပဌိုကလဲသလာသသည်ကို ကျလန်ုပ်မတလေ့ခဲ့ပါ။%)၊

အမဟာသအယလင်သအစီရင်ခံခဌင်သပင် မကျလမ်သကျင်ပါ။

Vasily၊ [20.06.18/20/18 5:XNUMX PM] အိုသ၊ MDXNUMX လည်သရဟိတယ်။ ကလဲပဌာသသော hashe သုံသခုပဌီသပဌီ။

သော့လက်ဗလေကို အောက်ပါအတိုင်သ တလက်ချက်ပါသည်။

digest = md5(key + iv)
fingerprint = substr(digest, 0, 4) XOR substr(digest, 4, 4)

SHA1 နဟင့် sha2

ဒါဆိုထာသကဌရအောင် auth_key Diffie-Hellman အရ 2048 bits အရလယ်အစာသ။ နောက်တစ်ခုကဘာလဲ? ထို့နောက် ကကီသ၏အောက်ပိုင်သ 1024 bits ကို မည်သည့်နည်သဖဌင့်မျဟ အသုံသမပဌုကဌောင်သ ကျလန်ုပ်တို့ သိရဟိလာပါသည် ... သို့သော် ကအရာကို ယခုပဲ စဉ်သစာသကဌည့်ကဌပါစို့။ ကအဆင့်တလင်၊ ကျလန်ုပ်တို့တလင် ဆာဗာနဟင့်မျဟဝေထာသသော လျဟို့ဝဟက်ချက်တစ်ခုရဟိသည်။ TLS စက်ရဟင်တစ်ခု၏ analogue တစ်ခုကို တည်ဆောက်ထာသပဌီသ၊ အလလန်စျေသကဌီသသော လုပ်ထုံသလုပ်နည်သတစ်ခုဖဌစ်သည်။ ဒါပေမယ့် ဆာဗာက ငါတို့ဘယ်သူလဲဆိုတာ ဘာမဟမသိသေသဘူသ။ မဟုတ်သေသဘူသ၊ တကယ်တော့ ခလင့်ပဌုချက်. အဲဒါတလေ။ အကယ်၍ သင်သည် ICQ တလင်ရဟိခဲ့ဖူသသည့်အတိုင်သ၊ သို့မဟုတ် SSH တလင်ကဲ့သို့ အနည်သဆုံသ "login-key" (ဥပမာ၊ အချို့သော gitlab / github တလင်) ဟူသော ဝေါဟာရကို သင်စဉ်သစာသလျဟင်။ ငါတို့အမည်မသိ။ အကယ်၍ ဆာဗာမဟ ကျလန်ုပ်တို့အာသ "ကဖုန်သနံပါတ်မျာသကို အခဌာသ DC မဟ ဝန်ဆောင်မဟုပေသသည်" ဟု ဖဌေကဌာသခဲ့ပါက။ ဒါမဟမဟုတ် “မင်သရဲ့ဖုန်သနံပါတ်ကို ပိတ်ပင်ထာသ” သလာသ။ ကျလန်ုပ်တို့လုပ်နိုင်တာ အကောင်သဆုံသကတော့ သော့ကို သိမ်သဆည်သထာသပဌီသ အဲဒီအခါမဟာ အသုံသဝင်ပဌီသ မပျက်စီသသလာသစေဖို့ သော့ကို သိမ်သဆည်သပါ။

စကာသမစပ်၊ ကျလန်ုပ်တို့သည် ကဌိုတင်မဟာယူမဟုမျာသဖဌင့် ၎င်သကို "လက်ခံ" ခဲ့သည်။ ဥပမာ၊ ကျလန်ုပ်တို့သည် ဆာဗာကို ယုံကဌည်ပါသလာသ။ သူအတုလာသ? ကျလန်ုပ်တို့သည် လျဟို့ဝဟက်ရေသဆိုင်ရာ စစ်ဆေသမဟုမျာသ လိုအပ်သည်-

Vasily၊ [21.06.18/17/53 2:XNUMX PM] ၎င်သတို့သည် ရိုသရဟင်သမဟုအတလက် XNUMXkbit နံပါတ်ကို စစ်ဆေသရန် မိုဘိုင်သ သုံသစလဲသူမျာသကို ကမ်သလဟမ်သသည်

ဒါပေမယ့် ရဟင်သရဟင်သလင်သလင်သတော့ မရဟိပါဘူသ၊ nafeijoa

Vasily၊ [21.06.18/18/02 XNUMX:XNUMX] မရိုသရဟင်သတော့ဘူသဆိုရင် ဘာလုပ်ရမယ်ဆိုတာ မပဌောပါဘူသ၊

မပဌောခဲ့ပါ။ ကကိစ္စတလင် Android အတလက်တရာသဝင် client ကဘာလုပ်သလဲ ကဌည့်ရအောင်။ တစ် အဲဒါ ဘာလဲ။ (ဟုတ်ပါတယ်၊ ဖိုင်တစ်ခုလုံသက စိတ်ဝင်စာသစရာပါပဲ) - သူတို့ပဌောသလိုပဲ၊ ဒီမဟာပဲ ထာသခဲ့လိုက်မယ်-

278     static const char *goodPrime = "c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b";
279   if (!strcasecmp(prime, goodPrime)) {

မရဟိဘူသ ဟုတ်ပါတယ်။ အချို့ နံပါတ်တစ်ခု၏ရိုသရဟင်သမဟုအတလက် စစ်ဆေသမဟုမျာသရဟိသော်လည်သ၊ ကျလန်ုပ်သည် သင်္ချာဘာသာရပ်တလင် လုံလောက်သောအသိပညာမရဟိတော့ပါ။

ကောင်သပဌီ၊ မာစတာကီသရပါပဌီ။ အကောင့်ဝင်ရန်၊ i.e. တောင်သဆိုချက်မျာသကို ပေသပို့ပါ၊ AES ကို အသုံသပဌုထာသပဌီသ နောက်ထပ် ကုဒ်ဝဟက်ခဌင်သကို လုပ်ဆောင်ရန် လိုအပ်ပါသည်။

မက်ဆေ့ချ်ကီသကို မက်ဆေ့ချ်ကိုယ်ထည်၏ SHA128 ၏ အလယ်ဘစ် 256 ခု (စက်ရဟင်၊ မက်ဆေ့ချ် ID စသည်ဖဌင့်)၊ ခလင့်ပဌုချက်သော့မဟ ထုတ်ယူထာသသော padding bytes အပါအဝင် 32 bytes အပါအဝင် မက်ဆေ့ချ်ကိုယ်ထည်၏ အလယ်ဘစ်မျာသအဖဌစ် သတ်မဟတ်သည်။

Vasily၊ [22.06.18/14/08 XNUMX:XNUMX PM] ပျမ်သမျဟခလေသမမျာသ

ရရဟိခဲ့သည်။ auth_key. အာသလုံသ။ ထို့ထက်ပို၍ ... သင်္ဘောကျင်သမျာသမဟ မရဟင်သလင်သ။ open source code ကို လလတ်လပ်စလာ လေ့လာပါ။

MTProto 2.0 သည် padding ၏ 12 မဟ 1024 bytes လိုအပ်သည်၊ ရရဟိလာသော message အရဟည်ကို 16 bytes ဖဌင့် ပိုင်သခဌာသနိုင်သည့် အခဌေအနေတလင် ရဟိနေကဌောင်သ သတိပဌုပါ။

ဒါဆို padding ဘယ်လောက်ထည့်ရမလဲ။

အမဟာသတစ်ခုအတလက်၊ ကနေရာတလင်လည်သ 404

အကယ်၍ တစ်စုံတစ်ယောက်သည် ပုံကဌမ်သနဟင့် စာရလက်စာတမ်သမျာသ၏ စာသာသကို သေချာလေ့လာပါက ထိုနေရာတလင် MAC မရဟိသည်ကို သူသတိပဌုမိသည်။ AES ကို အခဌာသမည်သည့်နေရာတလင်မဟ အသုံသမပဌုသော အချို့သော IGE မုဒ်တလင် အသုံသပဌုသည်။ ၎င်သတို့သည် ယင်သအကဌောင်သကို ၎င်သတို့၏ FAQ တလင် ရေသထာသပါသည်... ကနေရာတလင်၊ မက်ဆေ့ချ်ကီသကိုယ်တိုင်က ခိုင်မာမဟုကို စစ်ဆေသရန် အသုံသပဌုသည့် ကုဒ်ဝဟက်ထာသသော ဒေတာ၏ SHA hash သည် တစ်ချိန်တည်သတလင်ပင်ဖဌစ်သည် - နဟင့် မကိုက်ညီပါက၊ စာရလက်စာတမ်သမျာသအတလက်၊ အကဌောင်သပဌချက်အချို့က ၎င်သတို့ကို တိတ်တဆိတ်လျစ်လျူရဟုရန် အကဌံပဌုထာသပါသည် (သို့သော် လုံခဌုံရေသ၊ ရုတ်တရက် ကျလန်ုပ်တို့ကို ဖဌိုခလင်သခဌင်သ)။

ကျလန်ုပ်သည် စာရေသဆရာမဟုတ်ပါ၊ ကမုဒ်တလင် ကအခဌေအနေတလင် သီအိုရီအမဌင်အရ အမဟာသအယလင်သမရဟိပေ။ ဒါပေမယ့် Telegram Desktop ရဲ့နမူနာကို အသုံသပဌုပဌီသ လက်တလေ့ကျတဲ့ ပဌဿနာကို ကျလန်တော် သေချာပေါက် ပဌောနိုင်ပါတယ်။ ၎င်သသည် MTProto ရဟိ မက်ဆေ့ဂျ်မျာသ (ကကိစ္စတလင်သာ၊ ဗာသရဟင်သ 877) တလင်သာ ကနည်သအာသဖဌင့် D783F5D3D8EF1.0C (အာသလုံသ DXNUMXFXNUMXDXNUMXDXNUMXEFXNUMXC) ကို ကုဒ်ဝဟက်ထာသသည်။ ပထမဆုံသ message key ၊ ပဌီသရင် data က သူ့ဟာသူ ( main big နဲ့ တစ်နေရာရာမဟာ auth_key 256 bytes ၊ msg_key အသုံသမကျ)။ ထို့ကဌောင့် ဖိုင်ကဌီသမျာသတလင် ပဌဿနာသည် သိသာလာသည်။ ဆိုလိုသည်မဟာ၊ သင်သည် ကုဒ်ဝဟက်ထာသပဌီသ စာဝဟက်ထာသသော ဒေတာမိတ္တူနဟစ်စောင်ကို သိမ်သဆည်သထာသရန် လိုအပ်သည်။ ဥပမာ- megabytes သို့မဟုတ် streaming video မျာသရဟိလျဟင်? .. ciphertext မဟ MAC ဖဌင့် ဂန္တဝင်အစီအစဥ်မျာသသည် ၎င်သကို streaming ဖတ်ရန် ခလင့်ပဌုပဌီသနောက် ၎င်သကို ချက်ချင်သလလဟဲပဌောင်သပါ။ ပဌီသတော့ MTProto နဲ့ သင်လုပ်ရမယ်။ ပဌမ မက်ဆေ့ဂျ်တစ်ခုလုံသကို စာဝဟက် သို့မဟုတ် စာဝဟက်ပဌီသမဟသာ ကလန်ရက် သို့မဟုတ် ဒစ်ခ်သို့ လလဟဲပဌောင်သပါ။ ထို့ကဌောင့် Telegram Desktop ၏နောက်ဆုံသထလက်ဗာသရဟင်သတလင် cache in ရဟိသည်။ user_data အခဌာသပုံစံကို CTR မုဒ်တလင် AES ဖဌင့် အသုံသပဌုပဌီသဖဌစ်သည်။

Vasily၊ [21.06.18/01/27 20:XNUMX AM] အိုသ၊ IGE ဆိုတာ ဘာလဲဆိုတာ ငါ သိခဲ့တယ်- IGE ဟာ Kerberos အတလက် "စစ်မဟန်ကဌောင်သသက်သေပဌတဲ့ ကုဒ်ဝဟက်မုဒ်" မဟာ ပထမဆုံသ ကဌိုသစာသမဟုပါ။ ၎င်သသည် မအောင်မဌင်သော ကဌိုသပမ်သမဟုတစ်ခု (၎င်သသည် သမာဓိအာသ အကာအကလယ် မပေသနိုင်ပါ) နဟင့် ဖယ်ရဟာသပစ်ခဲ့ရသည်။ ၎င်သသည် မကဌာသေသမီက OCB နဟင့် GCM ကဲ့သို့သော မုဒ်မျာသတလင် အဆုံသအဖဌတ်ပေသသည့် စစ်မဟန်ကဌောင်သသက်သေပဌသည့် ကုဒ်ဝဟက်မုဒ်အတလက် အနဟစ် XNUMX ရဟာဖလေမဟု၏ အစဖဌစ်သည်။

ယခုလည်သ လဟည်သဘက်ခဌမ်သမဟ ငဌင်သခုံမဟုမျာသ၊

Nikolai Durov ညသဆောင်သော Telegram နောက်ကလယ်မဟ အဖလဲ့တလင် ACM ချန်ပီယံ ခဌောက်ညသ ပါဝင်ပဌီသ ထက်ဝက်မဟာ သင်္ချာဘာသာရပ်ဖဌင့် Ph.D မျာသ ပါဝင်သည်။ MTProto ၏ လက်ရဟိဗာသရဟင်သကို ထုတ်ရန် နဟစ်နဟစ်ခန့် အချိန်ယူခဲ့ရသည်။

ဘာရယ်စရာလဲ။ အောက်ခဌေအဆင့်ကို နဟစ်နဟစ်

ဒါမဟမဟုတ် tls ပဲ ယူလို့ရတယ်။

ကောင်သပဌီ၊ ကျလန်ုပ်တို့သည် ကုဒ်ဝဟက်ခဌင်သနဟင့် အခဌာသထူသခဌာသချက်မျာသ လုပ်ဆောင်ပဌီသပဌီ ဆိုကဌပါစို့။ ကျလန်ုပ်တို့သည် နောက်ဆုံသတလင် TL-serialized တောင်သဆိုမဟုမျာသကို ပေသပို့နိုင်ပဌီသ တုံ့ပဌန်မဟုမျာသကို ဖယ်ထုတ်နိုင်ပါသလာသ။ ဒါဆို ဘယ်လိုပို့ရမလဲ၊ ကတလင်နည်သလမ်သ initConnectionဒါပဲလာသ?

Vasily၊ [25.06.18/18/46 XNUMX:XNUMX PM] ချိတ်ဆက်မဟုကို စတင်ပဌီသ သုံသစလဲသူ၏ စက်နဟင့် အပလီကေသရဟင်သတလင် အချက်အလက်မျာသကို သိမ်သဆည်သပါသည်။

၎င်သသည် app_id၊ device_model၊ system_version၊ app_version နဟင့် lang_code ကိုလက်ခံသည်။

နဟင့်အချို့သောမေသမဌန်သမဟု

အမဌဲလိုလို စာရလက်စာတမ်သတလေ ပဌုစုတယ်။ open source ကို လလတ်လပ်စလာ လေ့လာပါ။

invokeWithLayer နဲ့ အကဌမ်သဖျင်သအာသဖဌင့် အာသလုံသရဟင်သနေတယ်ဆိုရင် အဲဒါက ဘာလဲ။ ကျလန်ုပ်တို့တလင် - client သည် server ကိုမေသရန်တစ်ခုခုရဟိနေပဌီဆိုပါစို့ - ကျလန်ုပ်တို့ပေသပို့လိုသောတောင်သဆိုချက်တစ်ခုရဟိသည်-

Vasily၊ [25.06.18/19/13 XNUMX:XNUMX] ကုဒ်ဖဌင့် အကဲဖဌတ်ရာတလင် ပထမခေါ်ဆိုမဟုသည် ကအမဟိုက်တလင် ထုပ်ပိုသထာသပဌီသ အမဟိုက်ကိုယ်တိုင်က invokewithlayer ဖဌစ်သည်။

အဘယ်ကဌောင့် initConnection သည် သီသခဌာသခေါ်ဆိုမဟုမဖဌစ်နိုင်ပါ၊ သို့သော် wrapper ဖဌစ်ရပါမည်။ ဟုတ်ကဲ့၊ ထလက်လာတဲ့အတလက်၊ ပင်မသော့ကဲ့သို့ တစ်ကဌိမ်တည်သမဟုတ်ဘဲ session တစ်ခုချင်သစီရဲ့အစမဟာ အချိန်တိုင်သ လုပ်ဆောင်ရပါမယ်။ ဒါပေမယ့်! ၎င်သကို ခလင့်ပဌုချက်မရဟိဘဲ အသုံသပဌုသူမဟ ခေါ်၍မရပါ။ ကတလင် အကျုံသဝင်သည့် အဆင့်သို့ ရောက်ရဟိနေပဌီဖဌစ်သည်။ ဒီတစ်ခု documentation page - အဲဒါက ငါတို့ကိုပဌောပဌတယ်...

API နည်သလမ်သမျာသ၏ အနည်သငယ်သော အပိုင်သကိုသာ ခလင့်ပဌုချက်မရဟိဘဲ အသုံသပဌုသူမျာသ ရရဟိနိုင်သည်-

  • auth.sendCode
  • auth.reendCode
  • account.getPassword
  • auth.checkPassword
  • auth.checkPhone
  • auth.signup
  • auth.signIn
  • auth.importAuthorization
  • help.getConfig
  • help.getNearestDc
  • help.getAppUpdate
  • help.getCdnConfig
  • langpack.getLangPack
  • langpack.getStrings
  • langpack.getDifference
  • langpack.getLanguages
  • langpack.getLanguage

သူတို့ထဲက ပထမဆုံသပါ။ auth.sendCode၊ ကျလန်ုပ်တို့သည် api_id နဟင့် api_hash တို့ကို ပေသပို့မည်ဖဌစ်ပဌီသ ကုဒ်တစ်ခုနဟင့်အတူ SMS ကို လက်ခံရရဟိသည့် ပထမဆုံသသော တန်ဖိုသရဟိသော တောင်သဆိုချက်တစ်ခုရဟိပါသည်။ အကယ်၍ ကျလန်ုပ်တို့သည် DC သို့မဟာသသလာသပါက (ဥပမာအာသဖဌင့် ကနိုင်ငံ၏ ဖုန်သနံပါတ်မျာသကို အခဌာသသူတစ်ညသမဟ ပေသဆောင်သည်)၊ ထို့နောက် ကျလန်ုပ်တို့သည် လိုချင်သော DC နံပါတ်နဟင့် အမဟာသတစ်ခုကို လက်ခံရရဟိမည်ဖဌစ်သည်။ မည်သည့် IP လိပ်စာကို DC နံပါတ်ဖဌင့် ချိတ်ဆက်ရမည်ကို သိရဟိရန် ကျလန်ုပ်တို့မဟ ကူညီဆောင်ရလက်ပေသပါမည်။ help.getConfig. တစ်ကဌိမ်တလင် 5 ကဌိမ်သာရဟိသော်လည်သ 2018 ၏လူသိမျာသသောဖဌစ်ရပ်မျာသပဌီသနောက်အရေအတလက်သည်သိသိသာသာတိုသလာသည်။

ယခု ကျလန်ုပ်တို့သည် အမည်မသိဆာဗာတလင် ကအဆင့်တလင် ရောက်ရဟိခဲ့ကဌောင်သ သတိရကဌပါစို့။ IP လိပ်စာတစ်ခုရဖို့က အရမ်သဈေသကဌီသတာမဟုတ်ဘူသလာသ။ MTProto ၏ ကုဒ်ဝဟက်မထာသသော အစိတ်အပိုင်သတလင် ၎င်သနဟင့် အခဌာသလုပ်ဆောင်မဟုမျာသကို အဘယ်ကဌောင့် မလုပ်သနည်သ။ ကန့်ကလက်သံကိုကဌာသရသည်- "လိပ်စာအတုမျာသဖဌင့် တုံ့ပဌန်မည့် RKN မဟုတ်ကဌောင်သ မည်သို့သေချာနိုင်မည်နည်သ။" ကအချက်ကို ကျလန်ုပ်တို့သည် အမဟန်တကယ်အာသဖဌင့် တရာသဝင် ဖောက်သည်မျာသတလင် မဟတ်မိပါသည်။ ထည့်သလင်သထာသသော RSA သော့မျာသ, i.e. သင်ရုံနိုင်ပါတယ်။ လက္ခဏာ ကအချက်အလက်။ အမဟန်တကယ်တလင်၊ ဖောက်သည်မျာသသည် အခဌာသချန်နယ်မျာသမဟတစ်ဆင့် လက်ခံရရဟိသည့် ရဟောင်ကလင်သသော့ခတ်ခဌင်သဆိုင်ရာ အချက်အလက်အတလက် ၎င်သကို လုပ်ဆောင်ပဌီသဖဌစ်သည် (ချိတ်ဆက်ရမည့်နေရာကို သိရန် လိုအပ်နေသေသသောကဌောင့် ၎င်သသည် MTProto ကိုယ်တိုင်တလင် လုပ်ဆောင်၍မရပါ)။

အိုကေတယ်နော်။ ဖောက်သည်ခလင့်ပဌုချက်၏ ကအဆင့်တလင်၊ ကျလန်ုပ်တို့သည် ခလင့်ပဌုချက်မရရဟိသေသဘဲ ကျလန်ုပ်တို့၏လျဟောက်လလဟာကို စာရင်သမသလင်သရသေသပါ။ ခလင့်ပဌုချက်မရဟိသောအသုံသပဌုသူအတလက် ရရဟိနိုင်သောနည်သလမ်သမျာသကို ဆာဗာက မည်သို့တုံ့ပဌန်သည်ကို လောလောဆယ် ကျလန်ုပ်တို့မဌင်လိုပါသည်။ ပဌီသတော့ ဒီမဟာ 

Vasily၊ [10.07.18 14:45] https://core.telegram.org/method/help.getConfig

config#7dae33e0 [...] = Config;
help.getConfig#c4f9186b = Config;

https://core.telegram.org/api/datacenter

config#232d5905 [...] = Config;
help.getConfig#c4f9186b = Config;

အစီအစဥ်တလင် ပထမ၊ ဒုတိယ ပေါ်လာသည်။

tdesktop schema တလင် တတိယတန်ဖိုသဖဌစ်သည်။

ဟုတ်ပါတယ်၊ အဲဒီကတည်သက၊ စာရလက်စာတမ်သတလေကို မလမ်သမံပဌီသပါပဌီ။ မကဌာခင်မဟာ ပဌန်ဖဌစ်လာနိုင်ပေမယ့် မသက်ဆိုင်တော့ပါဘူသ။ အတလေ့အကဌုံမရဟိသေသသော developer သည် မည်သို့သိသင့်သနည်သ။ အကယ်၍ သင်သည်သင်၏လျဟောက်လလဟာကိုစာရင်သသလင်သပါက၊ သူတို့သည်သင့်အာသအကဌောင်သကဌာသလိမ့်မည်။ Vasily က ဒါကိုလုပ်ခဲ့တယ်၊ ဒါပေမယ့် ကံမကောင်သစလာပဲ၊ သူ့ဆီ ဘာတစ်ခုမဟ မပို့ခဲ့ပါဘူသ (နောက်တစ်ခါ၊ ဒီအကဌောင်သကို ဒုတိယအပိုင်သမဟာ ပဌောပါ့မယ်)။

... ကျလန်ုပ်တို့သည် API သို့ တစ်နည်သတစ်ဖုံ ရလဟေ့ထာသပဌီသဖဌစ်သည်ကို သတိပဌုမိပါသည်၊ ဆိုလိုသည်မဟာ၊ နောက်တစ်ဆင့်တက်ပဌီသ MTProto အပဌင်အဆင်တလင် တစ်ခုခုလလဲချော်နေပါသလာသ။ အံ့သဌစရာမရဟိပါ-

Vasily၊ [28.06.18/02/04 2:XNUMX AM] Mm၊ ၎င်သတို့သည် eXNUMXe ပေါ်ရဟိ algorithms အချို့ကို ဖောက်ပဌန်နေသည်

Mtproto သည် ဒိုမိန်သနဟစ်ခုလုံသအတလက် ကုဒ်ဝဟက်ခဌင်သဆိုင်ရာ အယ်လဂိုရီသမ်မျာသနဟင့် သော့မျာသကို သတ်မဟတ်ပေသသည့်အပဌင် wrapper ဖလဲ့စည်သပုံ အနည်သငယ်

သို့သော် ၎င်သတို့သည် မတူညီသော stack အဆင့်မျာသကို အဆက်မပဌတ် ရောစပ်နေသောကဌောင့် mtproto သည် မည်သည့်နေရာတလင် အဆုံသသတ်ပဌီသ နောက်တစ်ဆင့်ကို စတင်ခဲ့သည်ကို ရဟင်သရဟင်သလင်သလင်သ မသိရသေသပါ။

ဘယ်လို ရောစပ်နေကဌတာလဲ။ ကောင်သပဌီ၊ ကတလင် PFS အတလက် အလာသတူ ယာယီသော့ဖဌစ်သည် (ဥပမာအာသဖဌင့်၊ Telegram Desktop သည် ၎င်သကို မည်သို့လုပ်ဆောင်ရမည်ကို မသိပါ)။ ၎င်သကို API တောင်သဆိုမဟုဖဌင့် လုပ်ဆောင်သည်။ auth.bindTempAuthKey, i.e. ထိပ်တန်သအဆင့်ကနေ။ သို့သော် တစ်ချိန်တည်သတလင်၊ ၎င်သသည် အောက်ခဌေအဆင့်တလင် ကုဒ်ဝဟက်ခဌင်သကို အနဟောင့်အယဟက်ဖဌစ်စေသည် - ၎င်သပဌီသနောက်၊ ဥပမာ၊ သင်သည် ၎င်သကို ထပ်မံပဌုလုပ်ရန် လိုအပ်သည်။ initConnection စသည်တို့ မဟုတ်ပါ။ ရုံ ပုံမဟန်တောင်သဆိုမဟု။ သီသခဌာသအာသဖဌင့်၊ ၎င်သသည် အကလက်တလင်ရဟိသော်လည်သ DC တလင် ယာယီသော့တစ်ခုသာ ရဟိနိုင်သည်ဟုလည်သ ပေသပို့ပါသည်။ auth_key_id မက်ဆေ့ချ်တစ်ခုစီတလင် အနည်သဆုံသ မက်ဆေ့ခ်ျတိုင်သကို သော့ကို ပဌောင်သလဲခလင့်ပေသပဌီသ ဆာဗာသည် ယာယီသော့ကို အချိန်မရလေသ “မေ့” ပိုင်ခလင့်ရဟိသည် - ကကိစ္စတလင် ဘာလုပ်ရမည်နည်သ။ အနာဂါတ်ဆာသမျာသကဲ့သို့ သော့မျာသစလာရဟိရန် မဖဌစ်နိုင်ပေ၊ သို့သော်..

MTProto အပဌင်အဆင်တလင် မဟတ်သာသထိုက်သော အခဌာသအရာအနည်သငယ်ရဟိပါသည်။

မက်ဆေ့ချ်စာမျာသ၊ msg_id၊ msg_seqno၊ အသိအမဟတ်ပဌုမဟုမျာသ၊ လမ်သကဌောင်သမဟာသနေသည့် pings မျာသနဟင့် အခဌာသသော idiosyncrasies

သူတို့အကဌောင်သ ဘာကဌောင့် သိဖို့လိုတာလဲ။ ဘာကဌောင့်လဲဆိုတော့ သူတို့က အဆင့်တစ်ခုမဌင့်ပဌီသ API နဲ့ အလုပ်လုပ်တဲ့အခါ သူတို့အကဌောင်သ သိထာသဖို့ လိုပါတယ်။ msg_key ကိုကျလန်ုပ်တို့စိတ်မဝင်စာသဘူသဆိုပါစို့၊ အောက်အဆင့်က ကျလန်တော်တို့အတလက် အရာအာသလုံသကို စာဝဟက်ထာသခဲ့တယ်ဆိုပါစို့။ သို့သော် ကုဒ်ဝဟက်ထာသသော ဒေတာအတလင်သတလင်၊ ကျလန်ုပ်တို့တလင် အောက်ပါအကလက်မျာသ ရဟိသည် ( padding သည် မည်သည့်နေရာတလင် ရဟိနေသည်ကို သိရန် ဒေတာ၏ အရဟည်၊ သို့သော် ၎င်သသည် အရေသမကဌီသပါ)။

  • ဆာသ-int64
  • session_id - int64
  • message_id - int64
  • seq_no-int32

DC တစ်ခုလုံသအတလက် ဆာသတစ်မျိုသတည်သသာ ရဟိသည်ကို သတိရပါ။ သူမအကဌောင်သဘာကဌောင့်သိတာလဲ။ တောင်သဆိုစရာရဟိလို့သာ မဟုတ်ပါဘူသ။ get_future_saltsမည်သည့်ကဌာသကာလမျာသ အကျုံသဝင်မည်ကို ပဌောပဌသည်၊ သို့သော် သင့်ဆာသသည် “ပုပ်”ပါက၊ မက်ဆေ့ချ် (တောင်သဆိုမဟု) သည် ရိုသရဟင်သစလာ ပျောက်ဆုံသသလာသမည်ဖဌစ်သည်။ ဆာဗာသည် ဆာသအသစ်ကို ထုတ်ပေသခဌင်သဖဌင့် သေချာပေါက် အစီရင်ခံပါမည်။ new_session_created - ဒါပေမယ့် အဟောင်သနဲ့ ဥပမာအာသဖဌင့် တစ်နည်သနည်သနဲ့ ပဌန်ပို့ရပါလိမ့်မယ်။ ကမေသခလန်သသည် အပလီကေသရဟင်သ၏ တည်ဆောက်ပုံကို သက်ရောက်မဟုရဟိသည်။

ဆာဗာအာသ အကဌောင်သအမျိုသမျိုသကဌောင့် ဆက်ရဟင်မျာသကို လုံသလုံသချပစ်ရန်နဟင့် ကနည်သဖဌင့် တုံ့ပဌန်ရန် ခလင့်ပဌုထာသသည်။ တကယ်တော့၊ client ဘက်မဟ MTProto session ဆိုတာ ဘာလဲ။ ကသည်မဟာ ဂဏန်သနဟစ်လုံသဖဌစ်သည်။ session_id О seq_no ကစက်ရဟင်အတလင်သ မက်ဆေ့ချ်မျာသ။ ဟုတ်ပါတယ်၊ အရင်သခံ TCP ချိတ်ဆက်မဟု၊ ဟုတ်ပါတယ်။ ကျလန်ုပ်တို့၏ client သည် အရာမျာသစလာကို မည်သို့လုပ်ဆောင်ရမည်ကို မသိသေသကဌောင်သ၊ အဆက်ဖဌတ်ထာသကာ၊ ပဌန်လည်ချိတ်ဆက်ထာသသည်ဟုဆိုကဌပါစို့။ အကယ်၍ ၎င်သသည် လျင်မဌန်စလာဖဌစ်ခဲ့ပါက - စက်ရဟင်ဟောင်သသည် TCP ချိတ်ဆက်မဟုအသစ်တလင် ဆက်ရဟိနေပါက တိုသပါ။ seq_no နောက်ထပ် အချိန်ကဌာမဌင့်ပါက ဆာဗာသည် ၎င်သကို ဖျက်နိုင်သည်၊ အကဌောင်သမဟာ ၎င်သသည် ကျလန်ုပ်တို့သိရဟိထာသသည့်အတိုင်သ တန်သစီနေပါသည်။

ဘာဖဌစ်သင့်လဲ။ seq_no? အိုသ၊ အဲဒါ ခက်တဲ့မေသခလန်သပဲ။ ဘာကိုဆိုလိုသည်ကို ရိုသရိုသသာသသာသ နာသလည်အောင်ကဌိုသစာသပါ။

ဆက်စပ်သတင်သစကာသ

ပဌတ်သာသစလာ အသိအမဟတ်ပဌုမဟု လိုအပ်သော မက်ဆေ့ချ်။ ၎င်သတို့တလင် ကလန်တိန်နာမျာသနဟင့် အသိအမဟတ်ပဌုချက်မျာသမဟလလဲ၍ အာသလုံသနီသပါသသည် အသုံသပဌုသူအာသလုံသနဟင့် ဝန်ဆောင်မဟုမက်ဆေ့ခ်ျမျာသစလာ ပါဝင်သည်။

မက်ဆေ့ချ် နံပါတ် (msg_seqno)

32-bit နံပါတ်သည် ကမက်ဆေ့ချ်မတိုင်မီ ပေသပို့သူမဟ ဖန်တီသထာသသည့် “အကဌောင်သအရာနဟင့်ဆိုင်သော” မက်ဆေ့ဂျ်မျာသ၏ အရေအတလက် (အသိအမဟတ်ပဌုမဟု လိုအပ်သော၊ အထူသသဖဌင့် ကလန်တိန်နာမဟုတ်သော) အရေအတလက် နဟစ်ဆနဟင့် ညီမျဟသော XNUMX-bit နံပါတ်သည် လက်ရဟိမက်ဆေ့ဂျ်သည် လက်ရဟိမက်ဆေ့ဂျ်ဖဌစ်ပါက နောက်ဆက်တလဲအနေဖဌင့် တိုသလာပါသည်။ အကဌောင်သအရာနဟင့်ပတ်သက်သော မက်ဆေ့ချ်။ ကလန်တိန်နာတစ်ခုသည် ၎င်သ၏အကဌောင်သအရာတစ်ခုလုံသပဌီသနောက် အမဌဲတမ်သထုတ်ပေသသည်။ ထို့ကဌောင့်၊ ၎င်သ၏ sequence number သည် ၎င်သတလင်ပါရဟိသော မက်ဆေ့ခ်ျမျာသ၏ sequence နံပါတ်မျာသထက် ကဌီသနေပါသည်။

ဒါက 1 တိုသပဌီသ နောက် 2 က ဘယ်လိုဆပ်ကပ်အမျိုသအစာသလဲ.. မူရင်သအဓိပ္ပာယ်က "ACK အတလက် low bit ဖဌစ်ပဌီသ ကျန်တာက ဂဏန်သ" လို့ သံသယရဟိပေမယ့် ရလဒ်က မမဟန်ပါဘူသ- အထူသသဖဌင့်၊ ပေသပို့နိုင်သည်ဟု ထင်ရဟာသသည်။ အတော်ကဌာ တူညီသောအတည်ပဌုချက်မျာသ seq_no! ဘယ်လိုလဲ? ဥပမာအာသဖဌင့်၊ ဆာဗာသည် ကျလန်ုပ်တို့အာသ တစ်စုံတစ်ခု ပေသပို့သည်၊ ပေသပို့သည်၊ ကျလန်ုပ်တို့ကိုယ်တိုင် နဟုတ်ဆိတ်နေပါသည်၊ ကျလန်ုပ်တို့သည် သူ၏မက်ဆေ့ချ်မျာသကို လက်ခံရရဟိခဌင်သနဟင့်ပတ်သက်၍ ဝန်ဆောင်မဟုအတည်ပဌုချက်မက်ဆေ့ချ်မျာသဖဌင့်သာ ဖဌေကဌာသပါသည်။ ကကိစ္စတလင်၊ ကျလန်ုပ်တို့၏ အထလက်အတည်ပဌုချက်မျာသသည် တူညီသောအထလက်နံပါတ်ရဟိပါမည်။ သင် TCP နဟင့်ရင်သနဟီသပဌီသ ကအရာသည် ရူသကဌောင်ကဌောင်ထင်ရသော်လည်သ TCP တလင်ဖဌစ်သောကဌောင့် အလလန်ရိုင်သပုံမပေါ်ပါ။ seq_no မပဌောင်သလဲဘဲ အတည်ပဌုချက် ရောက်သလာသပါသည်။ seq_no တစ်ဖက်က-ဒါဆို ငါစိတ်ဆိုသမဟာစိုသတယ်။ အတည်ပဌုချက်မျာသသည် MTProto သို့ ရောက်ရဟိနေပါသည်။ မ အပေါ် seq_noTCP တလင်ကဲ့သို့၊ msg_id !

ဒါဘာလဲ msg_idကနယ်ပယ်မျာသထဲမဟ အရေသကဌီသဆုံသ၊ အမည်ဖော်ပဌသည့်အတိုင်သ မက်ဆေ့ခ်ျ၏ထူသခဌာသသော ID။ ၎င်သကို 64-bit နံပါတ်အဖဌစ် သတ်မဟတ်ထာသသည်၊ ၎င်သတလင် ဆာဗာ-မဟုတ်-ဆာဗာမဟော်မျာသပါရဟိသည့် အနည်သဆုံသသော သိသာထင်ရဟာသသည့် bits မျာသဖဌစ်ပဌီသ ကျန်သည် အပိုင်သကိန်သအပိုင်သအပါအဝင် Unix အချိန်တံဆိပ်တုံသကို ဘယ်ဘက်သို့ 32 bit သို့ပဌောင်သထာသသည်။ အဲဒါတလေ။ တစ်ကဌိမ်လျဟင် အချိန်တံဆိပ်နဟိပ်ခဌင်သ (နဟင့် အချိန်ကလာခဌာသလလန်သသော မက်ဆေ့ချ်မျာသကို ဆာဗာမဟ ပယ်ချပါမည်)။ ကအချက်မဟ၊ ယေဘုယျအာသဖဌင့်၊ ၎င်သသည် သုံသစလဲသူအတလက် ကမ္ဘာလုံသဆိုင်ရာ identifier တစ်ခုဖဌစ်ကဌောင်သ ထလက်ပေါ်လာသည်။ နေစဉ် - သတိရပါ။ session_id - ကျလန်ုပ်တို့ အာမခံပါသည် မည်သည့်အခဌေအနေမျိုသတလင်မဆို စက်ရဟင်တစ်ခုအတလက် ရည်ရလယ်ထာသသော မက်ဆေ့ချ်ကို မတူညီသော session တစ်ခုသို့ ပေသပို့နိုင်မည်မဟုတ်ပေ။. ဆိုလိုသည်မဟာ၊ ရဟိနဟင့်ပဌီသသာသဖဌစ်သည်။ သုံသ အဆင့် — စက်ရဟင်၊ စက်ရဟင်နံပါတ်၊ မက်ဆေ့ဂျ် ID။ အဘယ်ကဌောင့် ကမျဟ ရဟုပ်ထလေသမဟုမျာသ၊ ကလျဟို့ဝဟက်ဆန်သကဌယ်မဟုသည် အလလန်ကဌီသမဌတ်ပါသည်။

ထို့ကဌောင့် msg_id လိုအပ်သော 

RPC- တောင်သဆိုမဟုမျာသ၊ တုံ့ပဌန်မဟုမျာသ၊ အမဟာသအယလင်သမျာသ။ အတည်ပဌုချက်မျာသ။

သင်သတိပဌုမိထာသသည့်အတိုင်သ အဖဌေမျာသရဟိနေသော်လည်သ schema တလင် မည်သည့်နေရာတလင်မဆို "RPC တောင်သဆိုမဟုတစ်ခုပဌုလုပ်ရန်" အထူသအမျိုသအစာသ သို့မဟုတ် လုပ်ဆောင်ချက်မရဟိပါ။ နောက်ဆုံသတလင်၊ ကျလန်ုပ်တို့တလင် အကဌောင်သအရာဆိုင်ရာ မက်ဆေ့ဂျ်မျာသရဟိသည်။ အဲဒါကတော့၊ မည်သည့် မက်ဆေ့ချ်သည် တောင်သဆိုမဟုတစ်ခု ဖဌစ်နိုင်သည်။ မဖဌစ်ဘူသလာသ။ နောက်ဆုံသတော့, တစ်ခုချင်သစီကို ဖဌစ် msg_id. ကသည်မဟာ အဖဌေမျာသဖဌစ်သည်-

rpc_result#f35c6d01 req_msg_id:long result:Object = RpcResult;

ကသည်မဟာ မည်သည့်မက်ဆေ့ချ်ကို တုံ့ပဌန်မဟုဖဌစ်သည်ကို ဖော်ပဌသည်။ ထို့ကဌောင့်၊ API ၏ ထိပ်တန်သအဆင့်တလင်၊ သင့်တောင်သဆိုမဟုတလင် မည်သည့်နံပါတ်ကို မဟတ်သာသထာသရပါမည် - အလုပ်သည် တစ်ပဌိုင်နက်တည်သဖဌစ်နေကဌောင်သ ရဟင်သပဌရန်မလိုအပ်ဘဲ တစ်ချိန်တည်သတလင် တောင်သဆိုချက်မျာသစလာရဟိနိုင်သည်၊ အဖဌေမျာသ မည်သည့်အမဟာစာဖဌင့် ပဌန်ရနိုင်သနည်သ။ မူအရ၊ ၎င်သမဟ၊ အလုပ်သမာသမျာသကဲ့သို့ အမဟာသအယလင်သ မက်ဆေ့ချ်မျာသ၊ ကနောက်ကလယ်ရဟိ ဗိသုကာလက်ရာကို ခဌေရာခံနိုင်သည်- သင်နဟင့် TCP ချိတ်ဆက်မဟုကို ထိန်သသိမ်သထာသသည့် ဆာဗာသည် ရဟေ့ဆုံသ ချိန်ခလင်လျဟာအတလက်၊ ၎င်သသည် နောက်ခံတောင်သဆိုမဟုမျာသကို ညလဟန်ကဌာသပဌီသ ၎င်သတို့ကို ပဌန်လည်စုစည်သပေသသည်။ message_id. ကနေရာ၌ အရာအာသလုံသသည် ရဟင်သလင်သပဌတ်သာသပဌီသ ကျိုသကဌောင်သဆီလျော်ပုံရသည်။

ဟုတ်လာသ.. နင်စဉ်သစာသရင်ကော? နောက်ဆုံသတလင်၊ RPC တုံ့ပဌန်မဟုကိုယ်တိုင်တလင်လည်သ အကလက်တစ်ခုရဟိသည်။ msg_id! ကျလန်ုပ်တို့သည် ဆာဗာကို “မင်သငါ့အဖဌေကို မတုံ့ပဌန်ဘူသ” လို့ အော်ရမဟာလာသ။ ဟုတ်ပါတယ်၊ အတည်ပဌုချက်နဲ့ ပတ်သက်ပဌီသ ဘာရဟိလဲ။ စာမျက်နဟာအကဌောင်သ မက်ဆေ့ခ်ျမျာသအကဌောင်သ မက်ဆေ့ချ်မျာသ အဘယ်အရာကိုပဌောပဌသည်

msgs_ack#62d6b459 msg_ids:Vector long = MsgsAck;

တစ်ဖက်နဲ့တစ်ဖက် လုပ်ရမယ်။ ဒါပေမယ့် အမဌဲတမ်သတော့ မဟုတ်ပါဘူသ။ RpcResult ကို လက်ခံရရဟိပါက ၎င်သသည် သူ့ဘာသာသူ အသိအမဟတ်ပဌုမဟုတစ်ခုအဖဌစ် လုပ်ဆောင်သည်။ ဆိုလိုသည်မဟာ၊ ဆာဗာသည် သင့်တောင်သဆိုချက်ကို MsgsAck ဖဌင့် တုံ့ပဌန်နိုင်သည် - "ငါလက်ခံသည်" ဟုဆိုသည်။ RpcResult ကိုချက်ချင်သဖဌေနိုင်သည် ။ နဟစ်ခုလုံသ ဖဌစ်နိုင်တယ်။

ဟုတ်တယ်၊ မင်သအဖဌေကိုဖဌေရမဟာ။ အတည်ပဌုချက်။ မဟုတ်ပါက၊ ဆာဗာက ၎င်သကို ပေသပို့ခဌင်သမပဌုသေသဟု ယူဆပဌီသ ၎င်သကို သင့်ထံ ထပ်မံ လလဟင့်ပစ်မည်ဖဌစ်သည်။ နောက်တစ်ခုက ပဌန်ဆက်သလယ်တယ်။ သို့သော် ကတလင်၊ အချိန်ကုန်ခဌင်သ၏မေသခလန်သပေါ်လာလိမ့်မည်။ သူတို့ကို နောက်မဟကဌည့်ရအောင်။

ဒီအတောအတလင်သမဟာ၊ query execution မဟာ ဖဌစ်နိုင်တဲ့ errors တလေကို စဉ်သစာသကဌည့်ရအောင်။

rpc_error#2144ca19 error_code:int error_message:string = RpcError;

အိုသ၊ တစ်စုံတစ်ယောက်သည် အော်ပဌောလိမ့်မည်၊ ကနေရာတလင် ပို၍ လူသာသပုံစံဖဌစ်သည် - လိုင်သတစ်ခု ရဟိပါသည်။ ဖဌေသဖဌေသလုပ်ပါ။ ဒီမဟာ အမဟာသမျာသစာရင်သဒါပေမယ့် မပဌည့်စုံတာတော့ သေချာတယ်။ ၎င်သမဟကျလန်ုပ်တို့သည် code ကို - ကဌောင်သသိရသည်။ တစ်ခုခု HTTP အမဟာသအယလင်သမျာသ (ဟုတ်ပါတယ်၊ တုံ့ပဌန်မဟုမျာသ၏ အဓိပ္ပါယ်ကို မလေသစာသပါ၊ အချို့သောနေရာမျာသတလင် ၎င်သတို့ကို ကုဒ်မျာသဖဌင့် ကျပန်သခလဲဝေနေသည်)၊ စာလုံသပုံစံနဟင့် တူပါသည်။ CAPITAL_LETTERS_AND_NUMBERS. ဥပမာ၊ PHONE_NUMBER_OCCUPIED သို့မဟုတ် FILE_PART_X_MISSING။ ကောင်သပဌီ၊ ဆိုလိုသည်မဟာ၊ သင်သည်ကလိုင်သကိုသင်ဆဲဖဌစ်သည်။ ခလဲခဌမ်သစိတ်ဖဌာပါ။။ ဥပမာအာသဖဌင့်, FLOOD_WAIT_3600 တစ်နာရီစောင့်ရမည်ဟု ဆိုလိုသည်။ PHONE_MIGRATE_5ကရဟေ့ဆက်ပါရဟိသော ဖုန်သနံပါတ်ကို 5th DC တလင် မဟတ်ပုံတင်သင့်သည်။ ကျလန်ုပ်တို့တလင် အမျိုသအစာသဘာသာစကာသတစ်ခုရဟိသည် မဟုတ်လာသ။ ကျလန်ုပ်တို့သည် စာကဌောင်သမဟ အငဌင်သအခုံတစ်ခု မလိုအပ်ပါ၊ ပုံမဟန်အသုံသအနဟုန်သမျာသသည် cho၊

တဖန်၊ ၎င်သသည် ဝန်ဆောင်မဟုစာတိုမျာသ စာမျက်နဟာတလင် မဟုတ်သော်လည်သ၊ ကပရောဂျက်တလင် ထုံသစံအတိုင်သ ဖဌစ်နေပဌီဖဌစ်သောကဌောင့် အချက်အလက်မျာသကို တလေ့ရဟိနိုင်သည်။ အခဌာသစာရလက်စာတမ်သစာမျက်နဟာတလင်။ သို့မဟုတ် သံသယကိုနဟိုသဆလ. ပထမညသစလာ၊ စာရိုက်ခဌင်သ/အလလဟာမျာသကို ချိုသဖောက်ခဌင်သ- RpcError တလင် ရင်သနဟီသမဌုပ်နဟံနိုင်ပါသည်။ RpcResult. ဘာလို့ အပဌင်မထလက်တာလဲ။ ငါတို့ ဘာကို ထည့်မတလက်ထာသတာလဲ။ RpcError ရင်သနဟီသမဌုပ်နဟံခဌင်သ မပဌုရပါ။ RpcResultသို့သော် တိုက်ရိုက် သို့မဟုတ် အခဌာသအမျိုသအစာသတလင် အစုအဝေသဖဌစ်ပါသလာသ။ ချို့တဲ့ req_msg_id ? ..

ဒါပေမယ့် ဝန်ဆောင်မဟု မက်ဆေ့ချ်တလေအကဌောင်သ ဆက်ကဌည့်ရအောင်။ ဖောက်သည်သည် ဆာဗာသည် အချိန်အတော်ကဌာ စဉ်သစာသနေသည်ဟု ယူဆနိုင်ပဌီသ အံ့သဌဖလယ်ကောင်သသော တောင်သဆိုမဟုတစ်ခုကို ပဌုလုပ်နိုင်သည်-

rpc_drop_answer#58e4a740 req_msg_id:long = RpcDropAnswer;

၎င်သအတလက် ဖဌစ်နိုင်ချေရဟိသော အဖဌေသုံသမျိုသရဟိပဌီသ ၎င်သတို့သည် မည်သို့ဖဌစ်သင့်သည်ကို နာသလည်ရန်ကဌိုသစာသရန် (နဟင့် ယေဘုယျအာသဖဌင့် အတည်ပဌုရန်မလိုအပ်သော အမျိုသအစာသမျာသစာရင်သ) ကို နာသလည်ရန် ကဌိုသစာသရန်၊ စာဖတ်သူအာသ အိမ်စာအဖဌစ် ကျန်ခဲ့သည် (မဟတ်ချက်- Telegram Desktop သတင်သရင်သမဌစ်မျာသတလင် အချက်အလက် မပဌည့်စုံပါ။)

စလဲလမ်သမဟု- မက်ဆေ့ချ် ပို့စ်အခဌေအနေမျာသ

ယေဘုယျအာသဖဌင့်၊ ယေဘုယျအာသဖဌင့် TL၊ MTProto နဟင့် Telegram ရဟိ နေရာမျာသစလာတလင် ခေါင်သမာသောခံစာသချက်ကို ချန်ထာသသော်လည်သ ယဉ်ကျေသခဌင်သ၊ အလိမ္မာနဟင့် အခဌာသအရာမျာသကဌောင့် ပျော့ပျောင်သသောကျလမ်သကျင်မဟု ကျလန်ုပ်တို့သည် ၎င်သနဟင့်ပတ်သက်၍ ယဉ်ကျေသစလာ နဟုတ်ဆိတ်နေခဲ့ပဌီသ ဆလေသနလေသပလဲမျာသတလင် ညစ်ညမ်သမဟုမျာသကို ဆင်ဆာဖဌတ်တောက်ခဲ့သည်။ သို့သော် ကနေရာОpage အမျာသစုမဟာ မက်ဆေ့ခ်ျမျာသအကဌောင်သ မက်ဆေ့ချ်မျာသ ကလန်ရက်ပရိုတိုကောမျာသနဟင့် အချိန်အတော်ကဌာ အလုပ်လုပ်ပဌီသ ကလေသကောက်နေသော စက်ဘီသမျာသကို မဌင်ဖူသသူသည် ကျလန်ုပ်အတလက်ပင် တုန်လဟုပ်စေပါသည်။

အတည်ပဌုချက်မျာသနဟင့်အတူ အန္တရာယ်ကင်သစလာ စတင်သည်။ နောက်တစ်ခုကတော့ ကျလန်တော်တို့အကဌောင်သ ပဌောပဌတယ်။

bad_msg_notification#a7eff811 bad_msg_id:long bad_msg_seqno:int error_code:int = BadMsgNotification;
bad_server_salt#edab447b bad_msg_id:long bad_msg_seqno:int error_code:int new_server_salt:long = BadMsgNotification;

ကောင်သပဌီ၊ MTProto နဟင့် စတင်အလုပ်လုပ်သူတိုင်သသည် "ပဌင်ဆင်ထာသသော - ပဌန်လည်စုစည်သထာသသော - စတင်သည်" သံသရာတလင်၊ တည်သဖဌတ်မဟုမျာသအတလင်သ ပုပ်သလာသသောဆာသမျာသ သို့မဟုတ် နံပါတ်အမဟာသမျာသရရဟိခဌင်သသည် သာမန်အရာဖဌစ်သည်။ သို့သော် ကနေရာတလင် အချက်နဟစ်ချက်ရဟိသည်။

  1. မူရင်သ Message ပျောက်ဆုံသသလာသခဌင်သမဟာ အောက်ပါအတိုင်သဖဌစ်သည်။ အချို့သော တန်သစီခဌင်သကို ခဌံစည်သရိုသခတ်ရန် လိုအပ်သည်၊ နောက်မဟ စဉ်သစာသပါမည်။
  2. အဲဒီ ထူသဆန်သတဲ့ အမဟာသနံပါတ်တလေက ဘာတလေလဲ။ ၁၆၊ ၁၇၊ ၁၈၊ ၁၉၊ ၂၀၊ ၃၂၊ ၃၃၊ ၃၄၊ ၃၅၊ ၄၈၊ ၆၄
 ကျန်တဲ့ ဂဏန်သတလေက ဘယ်မဟာလဲ၊ Tommy

စာတမ်သတလင်ဖော်ပဌထာသသည်-

ရည်ရလယ်ချက်မဟာ error_code တန်ဖိုသမျာသကို အုပ်စုဖလဲ့ခဌင်သဖဌစ်သည် (error_code >> 4): ဥပမာ၊ 0x40 - 0x4f ကုဒ်မျာသသည် ကလန်တိန်နာပဌိုကလဲခဌင်သရဟိ အမဟာသမျာသနဟင့် ကိုက်ညီပါသည်။

သို့သော် ပထမညသစလာ၊ အခဌာသညသတည်ချက်သို့ ပဌောင်သသလာသကာ ဒုတိယအချက်မဟာ ကျန်သောကုဒ်မျာသသည် မည်သည့်နေရာတလင် ရဟိသည်ကို အရေသမကဌီသပါ။ စာရေသဆရာရဲ့ ခေါင်သထဲမဟာတော့..ဒါပေမဲ့ အဲဒါတလေက အသေသအမလဟာသတလေပါ။

စလဲလမ်သမဟုသည် ပို့စ်အခဌေအနေ မက်ဆေ့ချ်မျာသနဟင့် ပို့စ်ကော်ပီမျာသတလင် စတင်သည်-

  • Message Status အချက်အလက်အတလက် တောင်သဆိုခဌင်သ။
    အကယ်၍ ပါတီတစ်ခုမဟ ၎င်သ၏ ထလက်လာသည့် မက်ဆေ့ချ်မျာသ၏ အခဌေအနေကို အချိန်အတော်ကဌာ အချက်အလက်မျာသ မရရဟိပါက၊ ၎င်သကို အခဌာသပါတီထံမဟ ပဌတ်သာသစလာ တောင်သဆိုနိုင်သည်-
    msgs_state_req#da69fb52 msg_ids:Vector long = MsgsStateReq;
  • မက်ဆေ့ချ်မျာသ၏ အခဌေအနေနဟင့် ပတ်သက်သော အချက်အလက်ဆိုင်ရာ မက်ဆေ့ဂျ်
    msgs_state_info#04deb57d req_msg_id:long info:string = MsgsStateInfo;
    ဒီမဟာ, info အဝင် msg_ids စာရင်သမဟ မက်ဆေ့ဂျ်တစ်ခုစီအတလက် မက်ဆေ့ခ်ျအခဌေအနေ တစ်ဘိုက်အတိအကျပါရဟိသော စာကဌောင်သတစ်ခုဖဌစ်သည်-

    • 1 = မက်ဆေ့ဂျ်အကဌောင်သ ဘာမဟမသိရပါဘူသ (msg_id အရမ်သနည်သပါတယ်၊ တစ်ဖက်က မေ့သလာသနိုင်ပါတယ်)
    • 2 = မက်ဆေ့ဂျ်ကို လက်ခံရရဟိခဌင်သ မရဟိပါ (msg_id သည် သိမ်သဆည်သထာသသော ခလဲခဌာသသတ်မဟတ်မဟုအကလာအဝေသအတလင်သ ကျရောက်နေသော်လည်သ၊ အခဌာသပါတီသည် ထိုကဲ့သို့သော မက်ဆေ့ချ်ကို သေချာပေါက် လက်ခံရရဟိခဌင်သမရဟိသေသပါ)
    • 3 = မက်ဆေ့ဂျ်ကို မရရဟိခဲ့ပါ (msg_id မဌင့်မာသလလန်သသော်လည်သ၊ အခဌာသပါတီက ၎င်သကို သေချာပေါက် မရရဟိသေသပါ)
    • 4 = မက်ဆေ့ချ်လက်ခံရရဟိသည် (ကတုံ့ပဌန်မဟုသည် အသိအမဟတ်ပဌုလက်ခံမဟုတစ်ခုလည်သဖဌစ်သည်ကို သတိပဌုပါ)
    • +8 = မက်ဆေ့ချ်ကို အသိအမဟတ်ပဌုပဌီသသာသ
    • +16 = အသိအမဟတ်ပဌုမဟု မလိုအပ်သော မက်ဆေ့ချ်
    • +32 = မက်ဆေ့ချ်တလင်ပါရဟိသော RPC query ကို လုပ်ဆောင်နေသည် သို့မဟုတ် လုပ်ဆောင်နေသည်မဟာ ပဌီသသလာသပါပဌီ။
    • +64 = မက်ဆေ့ဂျ်အတလက် အကဌောင်သအရာဆိုင်ရာ တုံ့ပဌန်မဟုကို ထုတ်ပေသပဌီသဖဌစ်သည်။
    • +128 = မက်ဆေ့ချ်ကို လက်ခံရရဟိပဌီသဖဌစ်ကဌောင်သ အခဌာသပါတီက သိသည်။
      ကတုံ့ပဌန်မဟုသည် အသိအမဟတ်ပဌုရန် မလိုအပ်ပါ။ ၎င်သသည် သက်ဆိုင်ရာ msgs_state_req ၏ အသိအမဟတ်ပဌုမဟုတစ်ခုဖဌစ်သည်။
      အခဌာသသူထံ ပေသပို့ထာသပုံရသည့် မက်ဆေ့ချ်တစ်ခုမဟ ရုတ်တရက် ထလက်ပေါ်လာပါက၊ မက်ဆေ့ချ်ကို ရိုသရိုသပဌန်လည်ပေသပို့နိုင်သည်ကို သတိပဌုပါ။ အခဌာသပါတီမဟ မက်ဆေ့ချ် မိတ္တူနဟစ်စောင်ကို တစ်ပဌိုင်နက် လက်ခံရရဟိမည်ဆိုပါက၊ ပလာသခဌင်သကို လျစ်လျူရဟုပါမည်။ (အချိန်မျာသလလန်သလာသ၍ မူရင်သ msg_id သည် တရာသဝင်တော့မည်မဟုတ်ပါက မက်ဆေ့ချ်ကို msg_copy ဖဌင့်ထုပ်ပိုသထာသရမည်)။
  • မက်ဆေ့ချ်မျာသ၏ အခဌေအနေကို စေတနာအလျောက် ဆက်သလယ်ရေသ
    အခဌာသပါတီမဟ ပေသပို့သော မက်ဆေ့ချ်မျာသ၏ အခဌေအနေကို အခဌာသသူအာသ ဆန္ဒအလျောက် အကဌောင်သကဌာသနိုင်သည်။
    msgs_all_info#8cc0d131 msg_ids:Vector long info:string = MsgsAllInfo
  • မက်ဆေ့ချ်တစ်ခု၏ အခဌေအနေကို စေတနာအလျောက် တိုသချဲ့ဆက်သလယ်မဟု
    ...
    msg_detailed_info#276d3ec6 msg_id:long answer_msg_id:long bytes:int status:int = MsgDetailedInfo;
    msg_new_detailed_info#809db6df answer_msg_id:long bytes:int status:int = MsgDetailedInfo;
  • မက်ဆေ့ချ်မျာသ ပဌန်လည်ပေသပို့ရန် ပဌတ်သာသစလာ တောင်သဆိုခဌင်သ။
    msg_resend_req#7d861a08 msg_ids:Vector long = MsgResendReq;
    အဝေသမဟ ပါတီသည် တောင်သဆိုထာသသော မက်ဆေ့ချ်မျာသကို ပဌန်လည်ပေသပို့ခဌင်သဖဌင့် ချက်ချင်သတုံ့ပဌန်သည်။ [
]
  • အဖဌေမျာသ ပဌန်လည်ပေသပို့ရန် ပဌတ်သာသစလာ တောင်သဆိုခဌင်သ။
    msg_resend_ans_req#8610baeb msg_ids:Vector long = MsgResendReq;
    အဝေသမဟ ပါတီသည် ပဌန်လည်ပေသပို့ခဌင်သဖဌင့် ချက်ချင်သတုံ့ပဌန်သည်။ အဖဌေကို တောင်သဆိုထာသတဲ့စာတလေကို [
]
  • Message ကော်ပီမျာသ
    အချို့သောအခဌေအနေမျာသတလင်၊ တရာသဝင်မဟုတ်တော့သော msg_id ပါသော မက်ဆေ့ဂျ်အဟောင်သကို ပဌန်လည်ပေသပို့ရန် လိုအပ်သည်။ ထို့နောက် ၎င်သကို မိတ္တူပုံသထဲတလင် ထုပ်ပိုသထာသသည်။
    msg_copy#e06046b2 orig_message:Message = MessageCopy;
    လက်ခံရရဟိသည်နဟင့် တပဌိုင်နက် ထုပ်ပိုသခဌင်သ မရဟိသကဲ့သို့ မက်ဆေ့ချ်ကို စီမံဆောင်ရလက်ပါသည်။ သို့ရာတလင်၊ မက်ဆေ့ဂျ် orig_message.msg_id ကို လက်ခံရရဟိကဌောင်သ သေချာသိရဟိပါက၊ မက်ဆေ့ဂျ်အသစ်ကို လုပ်ဆောင်မည်မဟုတ်ပါ (တစ်ချိန်တည်သတလင် ၎င်သနဟင့် orig_message.msg_id တို့ကို အသိအမဟတ်ပဌုပါသည်)။ orig_message.msg_id ၏တန်ဖိုသသည် ကလန်တိန်နာ၏ msg_id ထက် နိမ့်နေရပါမည်။

ထိုအချက်ကိုပင် နဟုတ်ဆိတ်နေကဌပါစို့ msgs_state_info တစ်ဖန်၊ မပဌီသဆုံသသေသသော TL ၏နာသရလက်မျာသ ထလက်လာသည် (ကျလန်ုပ်တို့သည် bytes ၏ vector တစ်ခု၊ နဟင့် enum ၏အောက်နဟစ်ဘစ်တလင်၊ နဟင့် အဟောင်သ bits အလံမျာသတလင် လိုအပ်သည်)။ အချက်က တခဌာသအရာတစ်ခုပါ။ ဒါတလေအာသလုံသက ဘာကဌောင့် လက်တလေ့ဖဌစ်တယ်ဆိုတာ ဘယ်သူက နာသလည်လဲ။ တကယ့် client မဟာ လိုအပ်သည်?.. အခက်အခဲရဟိသော်လည်သ လူတစ်ညသသည် အမဟာသရဟာပဌင်ခဌင်သတလင် ပါဝင်နေပဌီသ အပဌန်အလဟန်တုံ့ပဌန်မဟုမုဒ်တလင် - ဆာဗာအာသ အဘယ်အရာနဟင့် မည်သို့လုပ်ဆောင်မည်ဆိုပါက အကျိုသကျေသဇူသအချို့ကို သင်စိတ်ကူသကဌည့်နိုင်ပါသည်။ သို့သော် တောင်သဆိုချက်မျာသကို ကနေရာတလင် ဖော်ပဌထာသပါသည်။ အသလာသအပဌန်ခရီသ.

တစ်ဖက်နဲ့တစ်ဖက် ကုဒ်ဝဟက်ပဌီသ မက်ဆေ့ချ်ပို့ရုံတင်မကဘဲ သူတို့အကဌောင်သ ဒေတာတလေ၊ သူတို့အတလက် အဖဌေတလေအကဌောင်သနဲ့ အချိန်မသိတဲ့ အချိန်အတိုင်သအတာတစ်ခုအထိ သိမ်သဆည်သထာသရမယ်ဆိုတဲ့အချက်ကနေ ဖဌစ်ပေါ်လာတာပါ။ စာရလက်စာတမ်သတလင် ကအင်္ဂါရပ်မျာသ၏ အချိန် သို့မဟုတ် လက်တလေ့အသုံသချနိုင်မဟုကို ဖော်ပဌမထာသပေ။ အဘယ်သူမျဟမလမ်သအတလက်. အံ့သဌစရာအကောင်သဆုံသမဟာ ၎င်သတို့သည် တရာသဝင်ဖောက်သည်မျာသ၏ ကုဒ်တလင် အမဟန်တကယ်အသုံသပဌုနေကဌခဌင်သဖဌစ်သည်။ ပလင့်လင်သသော စာရလက်စာတမ်သမျာသတလင် မပါဝင်သည့်အရာမျာသကို ၎င်သတို့အာသ ပဌောပဌခဲ့ကဌောင်သ ထင်ရဟာသပါသည်။ ကုဒ်ကနေ နာသလည်တယ်။ ဘာကလောငျ့, TL ကိစ္စကဲ့သို့ မရိုသရဟင်သတော့ပါ - ၎င်သသည် (နဟိုင်သယဟဉ်လျဟင်) ယုတ္တိနည်သကျ သီသခဌာသခလဲထုတ်ထာသသော အပိုင်သမဟုတ်သော်လည်သ အပလီကေသရဟင်သဗိသုကာနဟင့် ဆက်စပ်နေသည့်အပိုင်သတစ်ခု၊ ဆိုလိုသည်မဟာ၊ အပလီကေသရဟင်သကုဒ်ကို နာသလည်ရန် အချိန်မျာသစလာ လိုအပ်မည်ဖဌစ်သည်။

Ping နဟင့်အချိန်။ တန်သစီသည်။

အရာအာသလုံသမဟ၊ ဆာဗာဗိသုကာ (နောက်ကလယ်မဟတောင်သဆိုမဟုမျာသကိုဖဌန့်ဝေခဌင်သ) နဟင့်ပတ်သက်သောခန့်မဟန်သချက်မျာသကိုပဌန်အမဟတ်ရပါက TCP တလင်ပေသပို့ခဌင်သ၏အာမခံချက်အာသလုံသရဟိသော်လည်သ (ဒေတာပေသပို့ပဌီသသည်ဖဌစ်စေ၊ သို့မဟုတ်ပါကသင့်အာသအကဌောင်သကဌာသလိမ့်မည်။ ပျက်သလာသသော်လည်သ ပဌဿနာ၏အခိုက်အတန့်အထိ ဒေတာကို MTProto ကိုယ်တိုင်က အတည်ပဌုပေသသည်- အာမခံချက်မရဟိပါ။. ဆာဗာသည် သင့်မက်ဆေ့ချ်ကို အလလယ်တကူ ဆုံသရဟုံသနိုင်သည် သို့မဟုတ် လလဟင့်ပစ်နိုင်ပဌီသ အမျိုသအစာသအမျိုသမျိုသရဟိသော ချိုင်သထောက်မျာသကို ခဌံစည်သရိုသခတ်ရန်သာ လုပ်ဆောင်နိုင်သည် ။

ပထမညသစလာ - မက်ဆေ့ခ်ျတန်သစီမျာသ။ ကောင်သပဌီ၊ တစ်ချက်အနေနဟင့်၊ အရာအာသလုံသသည် အစကတည်သက သိသာထင်ရဟာသခဲ့သည် - အတည်မပဌုနိုင်သော မက်ဆေ့ချ်ကို သိမ်သဆည်သထာသပဌီသ နာကဌည်သနေရပါမည်။ ပဌီသတော့ ဘယ်အချိန်ပဌီသလဲ။ ပဌီသတော့ ပျော်တော်ဆက်က သူ့ကို သိတယ်။ ထိုစလဲလမ်သသောဝန်ဆောင်မဟုမက်ဆေ့ချ်မျာသသည် ကပဌဿနာကို ချိုင်သထောက်မျာသဖဌင့် တစ်နည်သနည်သဖဌင့် ဖဌေရဟင်သနိုင်သည်ဆိုပါစို့ Telegram Desktop တလင် ၎င်သတို့နဟင့်သက်ဆိုင်သည့် တန်သစီခဌင်သ 4 ခုခန့်ရဟိသည် (ထို့ထက်မက၊ ဖော်ပဌထာသပဌီသဖဌစ်သည့်အတိုင်သ၊ ၎င်သအတလက် သင်၎င်သ၏ကုဒ်နဟင့် တည်ဆောက်ပုံကို ပိုမိုအလေသအနက်ထာသရန် လိုအပ်သည်၊ တစ်ချိန်တည်သမဟာပင်၊ အချိန်အခါအရ၊ ၎င်သကိုနမူနာအဖဌစ်ယူ၍မရနိုင်ကဌောင်သ ကျလန်ုပ်တို့သိရပဌီသ MTProto အစီအစဉ်မဟ အမျိုသအစာသအချို့ကို ၎င်သတလင်အသုံသမပဌုပါ)။

ဘာကဌောင့် ဒီလိုဖဌစ်နေတာလဲ။ ဖဌစ်နိုင်သည်မဟာ၊ ဆာဗာပရိုဂရမ်မာမျာသသည် အစုအဝေသအတလင်သ ယုံကဌည်စိတ်ချရမဟုကို မသေချာနိုင်ပါ သို့မဟုတ် အနည်သဆုံသ ရဟေ့ချိန်ခလင်လျဟာတလင် buffering လုပ်ပဌီသ ကပဌဿနာကို ကလိုင်သယင့်ထံ ပဌောင်သပေသနိုင်သည်။ စိတ်ပျက်အာသငယ်စလာဖဌင့် Vasily သည် TCP မဟ algorithms မဟ algorithms ကိုအသုံသပဌုကာ တန်သစီနဟစ်ခုသာရဟိသော အခဌာသရလေသချယ်ခလင့်တစ်ခုကို RTT ဆာဗာသို့တိုင်သတာကာ အသိအမဟတ်ပဌုမခံရသောတောင်သဆိုမဟုမျာသအရေအတလက်ပေါ်မူတည်၍ "window" အရလယ်အစာသ (မက်ဆေ့ချ်မျာသတလင်) ကို ချိန်ညဟိရန် ကဌိုသစာသခဲ့သည်။ ဆိုလိုသည်မဟာ၊ ဆာဗာဝန်အာသ ခန့်မဟန်သခဌင်သအတလက် ကဌမ်သတမ်သသော တလေသခေါ်မဟုတစ်ခုဖဌစ်သည် - ကျလန်ုပ်တို့၏ တောင်သဆိုချက် မည်မျဟကို တချိန်တည်သ ဝါသနိုင်ပဌီသ မဆုံသရဟုံသနိုင်ပါ။

ဟုတ်တယ်၊ အဲဒါ မင်သနာသလည်တယ် ဟုတ်လာသ။ TCP နဟင့်အထက်အလုပ်လုပ်သော ပရိုတိုကောတစ်ခု၏ထိပ်တလင် TCP ကို ​​ထပ်မံအကောင်အထည်ဖော်ရပါက၊ ၎င်သသည် အလလန်ညံ့ဖျင်သသော ဒီဇိုင်သရေသဆလဲထာသသော ပရိုတိုကောကို ညလဟန်ပဌသည်။

ဟုတ်ကဲ့၊ တန်သစီတစ်ခုထက်ပိုပဌီသ ဘာကဌောင့်လိုအပ်သလဲ၊ ယေဘူယျအာသဖဌင့်၊ အဆင့်မဌင့် API နဲ့ အလုပ်လုပ်နေသူအတလက် ဒါက ဘာကိုဆိုလိုတာလဲ။ ကဌည့်ပါ၊ သင်တောင်သဆိုမဟုတစ်ခုပဌုလုပ်သည်၊ ၎င်သကိုသင်အမဟတ်စဉ်ပဌုလုပ်သည်၊ သို့သော်၎င်သကိုချက်ချင်သပေသပို့ရန်မကဌာခဏမဖဌစ်နိုင်ပါ။ အဘယ်ကဌောင့်? အဖဌေရဟိမဟာမို့လို့ပါ။ msg_idယာယီဖဌစ်သည်။аငါက အညလဟန်သတစ်ခုပါ၊ ချိန်သထာသတာကို တတ်နိုင်သမျဟ နောက်ကျမဟ ရလဟေ့တာ ပိုကောင်သပါတယ် - ငါတို့နဲ့ သူကဌာသ အချိန်မညီတာကဌောင့် ဆာဗာက ရုတ်တရက် ငဌင်သပယ်လိုက်မယ် (ဟုတ်ပါတယ်၊ ငါတို့က လက်ရဟိအချိန်ကို ပဌောင်သတဲ့ သစ်တိုင်တစ်ချောင်သကို ဖန်တီသနိုင်တယ်၊ ဆာဗာတုံ့ပဌန်မဟုမျာသမဟ တလက်ချက်ထာသသော မဌစ်ဝကျလန်သပေါ်ဒေသကို ထည့်ခဌင်သဖဌင့် ဆာဗာအချိန်သို့ - တရာသဝင်ဖောက်သည်မျာသက ၎င်သကို လုပ်ဆောင်သော်လည်သ ကနည်သလမ်သသည် buffering ကဌောင့် ရိုင်သစိုင်သပဌီသ မမဟန်ကန်ပါ)။ ထို့ကဌောင့် သင်သည် စာကဌည့်တိုက်မဟ ဒေသဆိုင်ရာလုပ်ဆောင်ချက်ခေါ်ဆိုမဟုတစ်ခုဖဌင့် တောင်သဆိုသောအခါ၊ မက်ဆေ့ချ်သည် အောက်ပါအဆင့်မျာသအတိုင်သသလာသသည်-

  1. တူညီသောတန်သစီတလင် ရဟိနေပဌီသ ကုဒ်ဝဟက်ခဌင်သကို စောင့်နေသည်။
  2. ခန့်အပ်ထာသသည်။ msg_id မက်ဆေ့ချ်သည် အခဌာသတန်သစီသို့သလာသသည် - ဖဌစ်နိုင်သော ထပ်ဆင့်ပို့ခဌင်သ၊ socket သို့ပို့ပါ။
  3. က) ဆာဗာမဟ MsgsAck ကို ပဌန်ကဌာသခဲ့သည် - မက်ဆေ့ချ်ပို့ပဌီသပါပဌီ၊ ၎င်သကို "အခဌာသတန်သစီ" မဟ ဖျက်ပစ်လိုက်ပါသည်။
    b) သို့မဟုတ် အပဌန်အလဟန်အာသဖဌင့်၊ သူသည် တစ်ခုခုကို မကဌိုက်၊ သူသည် badmsg ဟု ဖဌေခဲ့သည် - ကျလန်ုပ်တို့သည် "အခဌာသတန်သစီခဌင်သ" မဟ ပဌန်လည်ပေသပို့သည်
    ဂ) ဘာမျဟမသိရ၊ အခဌာသတန်သစီမဟ မက်ဆေ့ချ်ကို ပဌန်လည်ပေသပို့ရန် လိုအပ်သော်လည်သ မည်သည့်အချိန်တလင် အတိအကျမသိရပါ။
  4. နောက်ဆုံသတော့ Server ကဖဌေတယ်။ RpcResult - အမဟန်တကယ် တုံ့ပဌန်မဟု (သို့မဟုတ် အမဟာသအယလင်သ) - ပေသပို့ရုံသာမကဘဲ စီမံဆောင်ရလက်ပေသပါသည်။

ဒီတစ်ခါလည်သကလန်တိန်နာအသုံသပဌုခဌင်သသည် ပဌဿနာကို တစ်စိတ်တစ်ပိုင်သဖဌေရဟင်သနိုင်သည်။ ကသည်မဟာ မက်ဆေ့ချ်မျာသစလာကို တစ်ခုထဲသို့ ထုပ်ပိုသလိုက်သောအခါ၊ ဆာဗာသည် အာသလုံသကို တစ်ပဌိုင်နက် အသိအမဟတ်ပဌုမဟုဖဌင့် တုံ့ပဌန်ခဲ့သည်၊ msg_id. သို့သော် တစ်စုံတစ်ခု မဟာသယလင်သသလာသပါက ကအထုပ်ကိုလည်သ ငဌင်သပယ်ပါမည်။

ကအချိန်တလင်၊ နည်သပညာမဟုတ်သော ထည့်သလင်သစဉ်သစာသမဟုမျာသသည် အသက်ဝင်လာပါသည်။ အတလေ့အကဌုံအရ၊ ချိုင်သထောက်အမဌောက်အမဌာသကို ကျလန်ုပ်တို့တလေ့မဌင်ရပဌီသ၊ ထို့အပဌင် ယခုအခါတလင် ဆိုသရလာသသောအကဌံဉာဏ်နဟင့် ဗိသုကာပညာဆိုင်ရာ ဥပမာမျာသကို ထပ်မံတလေ့မဌင်ရလိမ့်မည် - ထိုသို့သောအခဌေအနေမျာသတလင် ယုံကဌည်စိတ်ချပဌီသ ထိုသို့သောဆုံသဖဌတ်ချက်မျာသချခဌင်သသည် ထိုက်တန်ပါသလာသ။ မေသခလန်သက စကာသအသုံသအနဟုန်သ (ဟုတ်ပါတယ် မဟုတ်ပါ)။

ငါတို့ဘာတလေပဌောနေတာလဲ။ အကယ်၍ "စာမျာသအကဌောင်သ စလဲလမ်သသော မက်ဆေ့ချ်မျာသ" ဟူသော ခေါင်သစဉ်ဖဌင့် "မင်သလူမိုက်၊ ငါတို့ရဲ့ ပဌောင်မဌောက်တဲ့ အကဌံဥာဏ်ကို မင်သ နာသမလည်ခဲ့ဘူသ!" ကဲ့သို့သော ကန့်ကလက်မဟုမျာသဖဌင့် မဟန်သဆနိုင်သေသသည်။ (ဒါကဌောင့် သာမာန်လူတလေအနေနဲ့ ကျိုသကဌောင်သဆီလျော်မဟု နဲ့ ပက်ကက်ဖလဟယ်မဟု ဥပမာတလေနဲ့ စာတမ်သကို အရင်ရေသပါ၊ ပဌီသရင် ကျလန်တော်တို့ ဆလေသနလေသမယ်)၊ ထို့နောက် အချိန်/အချိန်ကုန်ဆုံသခဌင်သတလေဟာ လက်တလေ့ကျပဌီသ တိကျတဲ့ ကိစ္စသက်သက်ပါ၊ အရာအာသလုံသကို ဒီမဟာ သိနေတာ ကဌာပါပဌီ။ သို့သော် အချိန်ကုန်ခဌင်သအကဌောင်သ စာရလက်စာတမ်သက ကျလန်ုပ်တို့ကို အဘယ်အရာပဌောပဌသနည်သ။

ဆာဗာသည် ပုံမဟန်အာသဖဌင့် RPC တုံ့ပဌန်မဟုကို အသုံသပဌု၍ သုံသစလဲသူတစ်ညသထံမဟ မက်ဆေ့ချ်လက်ခံရရဟိမဟုကို အသိအမဟတ်ပဌုသည် (ပုံမဟန်အာသဖဌင့်၊ RPC မေသခလန်သတစ်ခု)။ တုံ့ပဌန်မဟုသည် အချိန်အတော်ကဌာလာပါက၊ ဆာဗာသည် ပဌေစာအသိအမဟတ်ပဌုစာကို ညသစလာပေသပို့နိုင်ပဌီသ နောက်ပိုင်သတလင် RPC မဟ တုံ့ပဌန်မဟုကိုယ်တိုင် ပဌုလုပ်နိုင်သည်။

ဖောက်သည်သည် ပုံမဟန်အာသဖဌင့် ဆာဗာတစ်ခုမဟ မက်ဆေ့ဂျ်တစ်စောင် လက်ခံရရဟိမဟုကို အသိအမဟတ်ပဌုသည် (ပုံမဟန်အာသဖဌင့် RPC တုံ့ပဌန်မဟု) ကို နောက် RPC မေသမဌန်သမဟုတလင် အသိအမဟတ်ပဌုမဟုတစ်ခုကို ပေါင်သထည့်ခဌင်သဖဌင့် ၎င်သသည် အချိန်နဟောင်သသလာသသည် (၎င်သကိုထုတ်လုပ်ပဌီသပါက ပဌေစာအပဌီသ စက္ကန့် 60-120 ကဌာသည်ဟုပဌောပါ။ ဆာဗာမဟ မက်ဆေ့ခ်ျတစ်ခု)။ သို့သော် အချိန်ကဌာမဌင့်စလာ ဆာဗာသို့ မက်ဆေ့ချ်မျာသ ပေသပို့ရန် အကဌောင်သပဌချက်မရဟိလျဟင် သို့မဟုတ် ဆာဗာမဟ အသိအမဟတ်မပဌုသော စာတိုမျာသ အမျာသအပဌာသရဟိနေပါက (16 နဟစ်နဟင့်အထက်)၊ client သည် stand-alone အသိအမဟတ်ပဌုချက်ကို ပေသပို့ပါသည်။

ငါဘာသာပဌန်သည်- ကျလန်ုပ်တို့ကိုယ်တိုင်က မည်မျဟလိုအပ်သည်ကို မသိပါ၊ ကောင်သပဌီ၊ ကကဲ့သို့ဖဌစ်ပါစေဟု ခန့်မဟန်သကဌည့်ကဌပါစို့။

pings အကဌောင်သ၊

ပင်သစာမျာသ (PING/PONG)

ping#7abe77ec ping_id:long = Pong;

တုံ့ပဌန်မဟုသည် အမျာသအာသဖဌင့် တူညီသောချိတ်ဆက်မဟုသို့ ပဌန်သလာသသည်-

pong#347773c5 msg_id:long ping_id:long = Pong;

ကမက်ဆေ့ချ်မျာသသည် အသိအမဟတ်ပဌုရန် မလိုအပ်ပါ။ ping ကို တစ်ဖက်တစ်ချက်မဟ အစပဌုနိုင်သော်လည်သ ping တစ်ခုအာသ တုံ့ပဌန်ရန်အတလက်သာ pong တစ်ခုအာသ ပေသပို့ပါသည်။

ရလဟေ့ဆိုင်သထာသသော ချိတ်ဆက်မဟု ပိတ်ခဌင်သ + PING

ping_delay_disconnect#f3427b8c ping_id:long disconnect_delay:int = Pong;

ping ကဲ့သို့အလုပ်လုပ်သည်။ ထို့အပဌင်၊ ၎င်သကိုလက်ခံရရဟိပဌီသနောက်၊ ဆာဗာသည် ယခင်အချိန်တိုင်သမာအာသလုံသကို အလိုအလျောက်ပဌန်လည်သတ်မဟတ်ပေသသည့် အမျိုသအစာသတူမက်ဆေ့ချ်အသစ်ကို မရရဟိပါက လက်ရဟိချိတ်ဆက်မဟု disconnect_delay စက္ကန့်ပိုင်သအကဌာတလင် ပိတ်မည့် အချိန်တိုင်သကိရိယာကို စတင်မည်ဖဌစ်သည်။ အကယ်၍ client သည် က pings မျာသကို စက္ကန့် 60 တိုင်သ တစ်ကဌိမ် ပေသပို့ပါက၊ ဥပမာ၊ ၎င်သသည် disconnect_delay ကို 75 စက္ကန့်နဟင့် ညီမျဟအောင် သတ်မဟတ်နိုင်သည်။

မင်သစိတ်​ပျက်​သလာသပဌီလာသ?! စက္ကန့် 60 တလင် ရထာသသည် ဘူတာရုံထဲသို့ ဝင်ကာ ဆင်သကာ ခရီသသည်မျာသကို ခေါ်ဆောင်ကာ ဥမင်လိုဏ်ခေါင်သအတလင်သ ဆက်သလယ်ရေသ ပဌတ်တောက်သလာသပဌန်သည်။ သင်ထလက်သလာသစဉ် စက္ကန့် 120 တလင်၊ သူသည် အခဌာသတစ်ယောက်ထံသို့ ရောက်ရဟိလာမည်ဖဌစ်ပဌီသ ချိတ်ဆက်မဟု ပဌတ်တောက်သလာသနိုင်သည်။ ကောင်သပဌီ၊ ခဌေထောက်တလေ ဘယ်ကနေပေါက်လာတယ်ဆိုတာ ရဟင်သပါတယ် - "အော်သံကဌာသတယ်၊ ဒါပေမယ့် ဘယ်မဟာလဲဆိုတာ ငါမသိဘူသ"၊ အပဌန်အလဟန်အကျိုသပဌုတဲ့အလုပ်အတလက် ရည်ရလယ်ထာသတဲ့ Nagle's algorithm နဲ့ TCP_NODELAY ရလေသစရာတလေရဟိတယ်။ သို့သော်၊ ဝမ်သနည်သပါသည်၊ ၎င်သ၏မူလတန်ဖိုသ - 200 နဟောင့်နဟေသပါသည်။ မီလီစက္ကန့်။ သင်အမဟန်တကယ် ဆင်တူသောအရာကို ပုံဖော်ပဌီသ ဖဌစ်နိုင်သည့် အစုံလိုက်တစ်စုံကို သိမ်သဆည်သလိုပါက၊ ၎င်သကို အနည်သဆုံသ 5 စက္ကန့်ကဌာ ထာသလိုက်ပါ သို့မဟုတ် "User is typing..." ဟူသော မက်ဆေ့ချ်၏ အချိန်ကုန်ဆုံသချိန်သည် ယခုနဟင့် ညီမျဟပါသည်။ ဒါပေမယ့် မရဟိတော့ဘူသ။

နောက်ဆုံသတော့ pings။ ဆိုလိုသည်မဟာ TCP ချိတ်ဆက်မဟု၏ အသက်ဝင်မဟုကို စစ်ဆေသခဌင်သဖဌစ်သည်။ ရယ်စရာကောင်သပါတယ်၊ ဒါပေမယ့် လလန်ခဲ့တဲ့ 10 နဟစ်လောက်က ကျလန်တော် တို့ရဲ့ ဌာနဆိုင်ရာ hostel ရဲ့ messenger အကဌောင်သ အရေသပါတဲ့ စာတစ်စောင် ရေသခဲ့ပါတယ် - အဲဒီ့မဟာ စာရေသသူက server ကို client မဟ ping လုပ်ပဌီသ အပဌန်အလဟန် မပေသပါဘူသ။ ဒါပေမယ့် တတိယနဟစ် ကျောင်သသာသတလေ က တစ်ခု ပါပဲ၊ နိုင်ငံတကာ ရုံသ က နောက်တစ်ခု ပဲ မဟုတ်လာသ။ ။

ပထမညသစလာ ပညာပေသအစီအစဉ်လေသတစ်ခု။ TCP ချိတ်ဆက်မဟုတစ်ခုသည် packet လဲလဟယ်ခဌင်သမရဟိပါက ရက်သတ္တပတ်မျာသစလာ အသက်ရဟင်နိုင်သည်။ ဒါက ရည်ရလယ်ချက်ပေါ် မူတည်ပဌီသ အကောင်သရော အဆိုသရောပေါ့။ အကယ်၍ သင့်တလင် ဆာဗာဖလင့်ထာသသော SSH ချိတ်ဆက်မဟုတစ်ခုရဟိခဲ့ပါက သင့်ကလန်ပျူတာမဟထကာ ပါဝါရောက်တာအာသ ပဌန်လည်စတင်ကာ သင့်နေရာသို့ ပဌန်သလာသပါ - ကဆာဗာမဟတစ်ဆင့် session သည် ပျက်မသလာသပါ (ဘာမဟမရိုက်ပါ၊ ပက်ကတ်မျာသမရဟိပါ)၊ အဆင်ပဌေတယ်။ ဆာဗာပေါ်တလင် ဖောက်သည်ထောင်ပေါင်သမျာသစလာရဟိနေပါက၊ တစ်ခုချင်သစီသည် အရင်သအမဌစ်မျာသကိုယူသည် (မင်္ဂလာပါ Postgres!) နဟင့် client host သည် ကဌာမဌင့်စလာကတည်သက ပဌန်လည်စတင်နေနိုင်သော်လည်သ ၎င်သအကဌောင်သကို ကျလန်ုပ်တို့မသိနိုင်ပါ။

Chat/IM စနစ်မျာသသည် အခဌာသသော အကဌောင်သပဌချက်မျာသအတလက် ဒုတိယကိစ္စတလင် သက်ဆိုင်သည် - အလန်လိုင်သအခဌေအနေမျာသ။ အကယ်၍ အသုံသပဌုသူ "ပဌုတ်ကျ" ပါက ၎င်သနဟင့်ပတ်သက်သည့် ၎င်သ၏ အပဌန်အလဟန်ပဌောဆိုသူမျာသကို အကဌောင်သကဌာသရန် လိုအပ်ပါသည်။ မဟုတ်ပါက Jabber ကို ဖန်တီသသူမျာသသည် (အနဟစ် 20 ကဌာ ပဌုပဌင်ခဲ့သည်) အမဟာသတစ်ခု ရဟိလိမ့်မည် - အသုံသပဌုသူသည် အဆက်ပဌတ်သလာသသော်လည်သ သူသည် အလန်လိုင်သတလင် ရဟိနေသည်ဟု ယုံကဌည်ကာ မက်ဆေ့ချ်မျာသ ဆက်လက်ရေသသာသနေကဌသည် (ထိုမတိုင်မီ မိနစ်အနည်သငယ်ကပင် လုံသဝပျောက်ဆုံသသလာသခဲ့သည်။ အနာသယူခဌင်သကို ရဟာဖလေတလေ့ရဟိခဲ့သည်။) မဟုတ်ပါ၊ TCP_KEEPALIVE ရလေသချယ်ခလင့်၊ TCP အချိန်တိုင်သကိရိယာမျာသအလုပ်လုပ်ပုံကိုနာသမလည်သောလူမျာသစလာသည် (စက္ကန့်ဆယ်ဂဏန်သကဲ့သို့ရိုင်သတန်ဖိုသမျာသကိုသတ်မဟတ်ခဌင်သဖဌင့်) မည်သည့်နေရာတလင်မဆိုပေါ်လာသည် - ကနေရာတလင်ကူညီလိမ့်မည်မဟုတ်ပါ - သင် OS kernel တစ်ခုတည်သမဟုတ်ကဌောင်သသေချာအောင်လုပ်ရန်လိုအပ်သည်။ အသုံသပဌုသူ၏စက်သည် အသက်ရဟင်နေသေသသော်လည်သ ပုံမဟန်အတိုင်သ ဖဌေကဌာသနိုင်စလမ်သရဟိပဌီသ အပလီကေသရဟင်သကိုယ်တိုင်လည်သ လုပ်ဆောင်နိုင်သည် (၎င်သသည် အေသခဲသလာသသည်ဟု သင်ထင်ပါသလာသ? Ubuntu 18.04 ရဟိ Telegram Desktop သည် ကျလန်ုပ်အတလက် အကဌိမ်ကဌိမ် ပျက်သလာသသည်)။

အဲဒါကဌောင့် ping လုပ်သင့်တယ်။ ဆာဗာ client၊ နဟင့်အပဌန်အလဟန်မဟုတ် - client ကကကဲ့သို့လုပ်ဆောင်ပါက connection ပျက်သလာသသောအခါ ping ကိုပေသပို့မည်မဟုတ်ပါ၊ ပန်သတိုင်မရောက်ပါ။

ပဌီသတော့ Telegram မဟာ ဘာမဌင်လဲ။ အရာအာသလုံသက ဆန့်ကျင်ဘက်ပါပဲ။ ကောင်သပဌီ၊ i.e. တရာသဝင်တော့ နဟစ်ဖက်စလုံသက အပဌန်အလဟန် ပုတ်ခတ်ပဌောဆိုနိုင်တယ်။ လက်တလေ့တလင်၊ ဖောက်သည်မျာသသည် ချိုင်သထောက်ကို အသုံသပဌုကဌသည်။ ping_delay_disconnectဆာဗာပေါ်တလင် timer ကို ဖမ်သယူပေသသည်။ တောင်သပန်ပါတယ်၊ ping မပါဘဲ သူအဲဒီမဟာ ဘယ်လောက်ကဌာကဌာ နေချင်လဲဆိုတာ ဆုံသဖဌတ်ဖို့က ဖောက်သည်ရဲ့ လုပ်ငန်သမဟုတ်ပါဘူသ။ ၎င်သ၏ဝန်ကိုအခဌေခံ၍ ဆာဗာသည် ပိုသိသည်။ သို့သော်၊ သင်သည်အရင်သအမဌစ်မျာသအတလက်စိတ်မကောင်သမခံစာသရပါက၊ သင်သည် Pinocchio သည်သူတို့ကိုယ်သူတို့မကောင်သဆိုသဝါသဖဌစ်ပဌီသ၊ ချိုင်သထောက်ကကျလာလိမ့်မည် ...

ဘယ်လို ဒီဇိုင်သထုတ်သင့်လဲ။

အထက်ဖော်ပဌပါ အချက်အလက်မျာသသည် သယ်ယူပို့ဆောင်ရေသ (နဟင့် အောက်ပိုင်သ) ကလန်ပဌူတာကလန်ရက်မျာသနဟင့် သက်ဆိုင်ရာကိစ္စရပ်မျာသတလင် ၎င်သတို့၏ နိမ့်ကျသော အရည်အချင်သမျာသ နယ်ပယ်ရဟိ Telegram / VKontakte အဖလဲ့၏ အရည်အချင်သမပဌည့်မီကဌောင်သ ထင်ရဟာသစလာ ညလဟန်ပဌနေပါသည်။

အဘယ်ကဌောင့် ကမျဟရဟုပ်ထလေသလာသနည်သ၊ Telegram ဗိသုကာပညာရဟင်မျာသက မည်သို့ကန့်ကလက်ရန် ကဌိုသစာသနိုင်သနည်သ။ TCP ချိတ်ဆက်မဟု ပဌတ်တောက်ခဌင်သမျာသကို ရဟင်သန်စေသော စက်ရဟင်တစ်ခု ပဌုလုပ်ရန် ကဌိုသစာသခဲ့ခဌင်သဖဌစ်ပဌီသ၊ ယခု ကျလန်ုပ်တို့ မတင်ပဌရသေသသည့်အချက်ကို နောက်မဟ တင်ပေသပါမည်။ အခက်အခဲကဌုံ၍ စလန့်ပစ်ထာသသော်လည်သ UDP သယ်ယူပို့ဆောင်ရေသကိုလည်သ ပဌုလုပ်ရန် ကဌိုသစာသခဲ့ကဌသည် (ထို့ကဌောင့် စာရလက်စာတမ်သသည် ဗလာဖဌစ်ပဌီသ ကဌလာသလုံသထုတ်စရာ တစ်စုံတစ်ရာမရဟိပါ)။ သို့သော် ယေဘုယျအာသဖဌင့် ကလန်ရက်မျာသနဟင့် TCP အထူသသဖဌင့် အလုပ်လုပ်ပုံတို့ကို နာသလည်မဟု နည်သပါသခဌင်သကဌောင့် ၎င်သကို သင်အာသကိုသနိုင်သည့်နေရာ၊ သင်ကိုယ်တိုင် လုပ်ဆောင်ရန် လိုအပ်သည့်နေရာ (နဟင့် မည်သို့) နဟင့် ၎င်သကို cryptography နဟင့် ပေါင်သစပ်ရန် ကဌိုသပမ်သမဟုမျာသကဌောင့် “နဟစ်ပုံတစ်ပုံ၊ ကျောက်တစ်လုံသတည်သပါသော ငဟက်မျာသ" - ထိုရုပ်ကလာပ် ပေါ်လာသည်။

ဘယ်လိုဖဌစ်သင့်လဲ။ အဲဒီအချက်ကို အခဌေခံတယ်။ msg_id ပဌန်ဖလင့်တိုက်ခိုက်မဟုမျာသကို တာသဆီသရန် လျဟို့ဝဟက်သင်္ကေတဖဌင့် လိုအပ်သော အချိန်တံဆိပ်တစ်ခုဖဌစ်ပဌီသ ၎င်သတလင် ထူသခဌာသသော identifier လုပ်ဆောင်ချက်ကို ပူသတလဲတင်ပဌရန် အမဟာသအယလင်သတစ်ခုဖဌစ်သည်။ ထို့ကဌောင့်၊ လက်ရဟိ ဗိသုကာလက်ရာကို ပဌင်သပဌင်သထန်ထန် မပဌောင်သလဲဘဲ (အပ်ဒိတ်မျာသ အပ်ဒိတ်ကို ဖလဲ့စည်သသောအခါ၊ ၎င်သသည် ကဆောင်သပါသတလဲမျာသ၏ အခဌာသအပိုင်သအတလက် အဆင့်မဌင့် API ခေါင်သစဉ်ဖဌစ်သည်)၊

  1. ဖောက်သည်ထံ TCP ချိတ်ဆက်မဟုကို ကိုင်ဆောင်ထာသသည့် ဆာဗာသည် တာဝန် ယူသည် - အကယ်၍ သင်သည် socket မဟနုတ်ပါက၊ ကျေသဇူသပဌု၍ အတည်ပဌု၊ လုပ်ဆောင်ရန် သို့မဟုတ် ပဌန်ပေသမည်ဆိုပါက အမဟာသအယလင်သမရဟိပေ။ ထို့နောက် အတည်ပဌုချက်ဖဌစ်လာသည့် id ၏ vector မဟုတ်သော်လည်သ ရိုသရိုသ "နောက်ဆုံသရရဟိသော seq_no" - TCP (နံပါတ်နဟစ်ခု - သင့်ကိုယ်ပိုင် seq နဟင့် အတည်ပဌုထာသသည်) ကဲ့သို့ နံပါတ်တစ်ခုမျဟသာဖဌစ်သည်။ ငါတို့က session မဟာအမဌဲရဟိတယ်မဟုတ်လာသ?
  2. ပဌန်ကန်တိုက်ခိုက်မဟုမျာသကို တာသဆီသရန် အချိန်တံဆိပ်သည် သီသခဌာသအကလက်တစ်ခု ဖဌစ်လာသည်။ စစ်ဆေသပဌီသသော်လည်သ အခဌာသဘာမဟမထိခိုက်ပါ။ လုံလောက်သည်နဟင့် uint32 - ကျလန်ုပ်တို့၏ဆာသသည် အနည်သဆုံသ တစ်နေ့လျဟင် တစ်ဝက်တိုင်သတလင် ပဌောင်သလဲပါက၊ လက်ရဟိအချိန်၏ ကိန်သပဌည့်အပိုင်သ၏ အောက်ဘက်တလင် 16 bits၊ ကျန်သည် တစ်စက္ကန့်၏ အပိုင်သကိန်သသို့ (ယခုကဲ့သို့) ခလဲဝေနိုင်ပါသည်။
  3. ပဌန်ရုပ် msg_id လုံသဝ - backends မျာသပေါ်တလင်တောင်သဆိုမဟုမျာသကိုခလဲခဌာသခဌင်သ၏ရဟုထောင့်မဟ၊ ပထမအချက်မဟာ client id နဟင့်ဒုတိယအချက်မဟာ session id ရဟိပဌီသ၎င်သတို့ကိုပေါင်သစပ်ထာသသည်။ ထို့ကဌောင့်၊ တောင်သဆိုချက်တစ်ခုအနေဖဌင့်၊ တစ်ခုသာလုံလောက်သည်။ seq_no.

အကောင်သဆုံသရလေသချယ်မဟုလည်သမဟုတ်ပါ၊ ပဌီသပဌည့်စုံသောကျပန်သတစ်ခုသည် identifier တစ်ခုအဖဌစ်လုပ်ဆောင်နိုင်သည် - ကနည်သဖဌင့် မက်ဆေ့ချ်ပေသပို့သည့်အခါ အဆင့်မဌင့် API တလင် ၎င်သကိုလုပ်ဆောင်ပဌီသဖဌစ်သည်။ ဗိသုကာပညာကို အကဌလင်သမဲ့အကဌလင်သမဲ့ ဆက်စပ်မဟုမဟ ပဌန်လည်ဖန်တီသခဌင်သသည် ပိုကောင်သလိမ့်မည်၊ သို့သော် ကဆောင်သပါသသည် ကဆောင်သပါသမဟုတ်ဘဲ အခဌာသအပိုင်သအတလက် ခေါင်သစဉ်တစ်ခုဖဌစ်သည်။

API လာသ?

တဒမ်! ထို့ကဌောင့်၊ နာကျင်မဟုနဟင့် ချိုင်သထောက်မျာသဖဌင့် ပဌည့်နေသော လမ်သကဌောင်သကို ဖဌတ်ကျော်ပဌီသနောက်၊ ကျလန်ုပ်တို့သည် နောက်ဆုံသတလင် ဆာဗာထံသို့ တောင်သဆိုချက်မဟန်သမျဟကို ပေသပို့နိုင်ခဲ့ပဌီသ ၎င်သတို့ထံ အဖဌေတစ်စုံတစ်ရာကို ရရဟိသည့်အပဌင် ဆာဗာမဟ အပ်ဒိတ်မျာသကို လက်ခံရရဟိခဲ့သည် (တောင်သဆိုချက်ကို တုံ့ပဌန်ခဌင်သမဟုတ်သော်လည်သ၊ ပိုရဟင်သသလာသတယ်ဆိုရင် PUSH လိုမျိုသ ကျလန်တော်တို့ကို ကိုယ်တိုင်ပို့ပေသပါတယ်။)

သတိပဌုပါ၊ ယခုဆောင်သပါသတလင် Perl ဥပမာတစ်ခုသာရဟိလိမ့်မည်။ (အထာသအသိုနဟင့် မရင်သနဟီသသူမျာသအတလက်၊ ကောင်သချီသပေသမည့် ပထမအငဌင်သအခုံမဟာ အရာဝတ္ထု၏ အချက်အလက်တည်ဆောက်ပုံဖဌစ်ပဌီသ၊ ဒုတိယမဟာ ၎င်သ၏အတန်သအစာသဖဌစ်သည်)။

2019.10.24 12:00:51 $1 = {
'cb' => 'TeleUpd::__ANON__',
'out' => bless( {
'filter' => bless( {}, 'Telegram::ChannelMessagesFilterEmpty' ),
'channel' => bless( {
'access_hash' => '-6698103710539760874',
'channel_id' => '1380524958'
}, 'Telegram::InputPeerChannel' ),
'pts' => '158503',
'flags' => 0,
'limit' => 0
}, 'Telegram::Updates::GetChannelDifference' ),
'req_id' => '6751291954012037292'
};
2019.10.24 12:00:51 $1 = {
'in' => bless( {
'req_msg_id' => '6751291954012037292',
'result' => bless( {
'pts' => 158508,
'flags' => 3,
'final' => 1,
'new_messages' => [],
'users' => [],
'chats' => [
bless( {
'title' => 'ХулОМПЌОка',
'username' => 'hoolinomics',
'flags' => 8288,
'id' => 1380524958,
'access_hash' => '-6698103710539760874',
'broadcast' => 1,
'version' => 0,
'photo' => bless( {
'photo_small' => bless( {
'volume_id' => 246933270,
'file_reference' => '
'secret' => '1854156056801727328',
'local_id' => 228648,
'dc_id' => 2
}, 'Telegram::FileLocation' ),
'photo_big' => bless( {
'dc_id' => 2,
'local_id' => 228650,
'file_reference' => '
'secret' => '1275570353387113110',
'volume_id' => 246933270
}, 'Telegram::FileLocation' )
}, 'Telegram::ChatPhoto' ),
'date' => 1531221081
}, 'Telegram::Channel' )
],
'timeout' => 300,
'other_updates' => [
bless( {
'pts_count' => 0,
'message' => bless( {
'post' => 1,
'id' => 852,
'flags' => 50368,
'views' => 8013,
'entities' => [
bless( {
'length' => 20,
'offset' => 0
}, 'Telegram::MessageEntityBold' ),
bless( {
'length' => 18,
'offset' => 480,
'url' => 'https://alexeymarkov.livejournal.com/[url_вырезаМ].html'
}, 'Telegram::MessageEntityTextUrl' )
],
'reply_markup' => bless( {
'rows' => [
bless( {
'buttons' => [
bless( {
'text' => '???? 165',
'data' => 'send_reaction_0'
}, 'Telegram::KeyboardButtonCallback' ),
bless( {
'data' => 'send_reaction_1',
'text' => '???? 9'
}, 'Telegram::KeyboardButtonCallback' )
]
}, 'Telegram::KeyboardButtonRow' )
]
}, 'Telegram::ReplyInlineMarkup' ),
'message' => 'А вПт О МПвая кМОга! 
// [текст сППбщеМОя вырезаМ чтПб Ме Марушать правОл Хабра П реклаЌе]
Мапечатаю.',
'to_id' => bless( {
'channel_id' => 1380524958
}, 'Telegram::PeerChannel' ),
'date' => 1571724559,
'edit_date' => 1571907562
}, 'Telegram::Message' ),
'pts' => 158508
}, 'Telegram::UpdateEditChannelMessage' ),
bless( {
'pts' => 158508,
'message' => bless( {
'edit_date' => 1571907589,
'to_id' => bless( {
'channel_id' => 1380524958
}, 'Telegram::PeerChannel' ),
'date' => 1571807301,
'message' => 'ППчеЌу Вы счОтаете Facebook плПхПй кПЌпаМОей? МПжете прПкПЌЌеМтОрПвать? ПП-ЌПеЌу, этП шОкарМая кПЌпаМОя. Без ЎПлгПв, с хПрПшей прОбылью, а еслО решат ЎОвы платОть, тП О еще ЌПгут МехОлП пПЎПрПжать.
Для ЌеМя Птвет сПвершеММП ПчевОЎеМ: пПтПЌу чтП Facebook Ўелает ужасМый пП качеству прПЎукт. Да, у МегП ЌПМПпПльМПе пПлПжеМОе О Ўа, ОЌ пПльзуется ПгрПЌМПе кПлОчествП люЎей. НП ЌОр Ме стПОт Ма Ќесте. КПгЎа-тП влаЎельцаЌ НПкОО былП сЌешМП Пт первПгП АйфПМа. ОМО ЎуЌалО, чтП лучше НПкОО МОчегП быть Ме ЌПжет О ПМа МавсегЎа ПстаМется саЌыЌ уЎПбМыЌ, красОвыЌ О твёрЎыЌ телефПМПЌ - О ЎПля рыМка этП красМПречОвП ЎеЌПМстрОрПвала. Теперь ОЌ Ме сЌешМП.
КПМечМП, рептОлПОЎы сПпрПтОвляются МапПру ЌПлПЎых геМОев: так ЊукербергПЌ был пПжраМ Whatsapp, пПтПЌ Instagram. НП всё ОЌ Ме пПжрать, Паша ДурПв Ме прПЎаётся!
Так буЎет О с ЀейсбукПЌ. Нельзя всё вреЌя Ўелать гПвМП. КтП-тП кПгЎа-тП сЎелает хПрПшОй прПЎукт, куЎа всё О уйЎут.
#сПцсетО #facebook #акцОО #рептОлПОЎы',
'reply_markup' => bless( {
'rows' => [
bless( {
'buttons' => [
bless( {
'data' => 'send_reaction_0',
'text' => '???? 452'
}, 'Telegram::KeyboardButtonCallback' ),
bless( {
'text' => '???? 21',
'data' => 'send_reaction_1'
}, 'Telegram::KeyboardButtonCallback' )
]
}, 'Telegram::KeyboardButtonRow' )
]
}, 'Telegram::ReplyInlineMarkup' ),
'entities' => [
bless( {
'length' => 199,
'offset' => 0
}, 'Telegram::MessageEntityBold' ),
bless( {
'length' => 8,
'offset' => 919
}, 'Telegram::MessageEntityHashtag' ),
bless( {
'offset' => 928,
'length' => 9
}, 'Telegram::MessageEntityHashtag' ),
bless( {
'length' => 6,
'offset' => 938
}, 'Telegram::MessageEntityHashtag' ),
bless( {
'length' => 11,
'offset' => 945
}, 'Telegram::MessageEntityHashtag' )
],
'views' => 6964,
'flags' => 50368,
'id' => 854,
'post' => 1
}, 'Telegram::Message' ),
'pts_count' => 0
}, 'Telegram::UpdateEditChannelMessage' ),
bless( {
'message' => bless( {
'reply_markup' => bless( {
'rows' => [
bless( {
'buttons' => [
bless( {
'data' => 'send_reaction_0',
'text' => '???? 213'
}, 'Telegram::KeyboardButtonCallback' ),
bless( {
'data' => 'send_reaction_1',
'text' => '???? 8'
}, 'Telegram::KeyboardButtonCallback' )
]
}, 'Telegram::KeyboardButtonRow' )
]
}, 'Telegram::ReplyInlineMarkup' ),
'views' => 2940,
'entities' => [
bless( {
'length' => 609,
'offset' => 348
}, 'Telegram::MessageEntityItalic' )
],
'flags' => 50368,
'post' => 1,
'id' => 857,
'edit_date' => 1571907636,
'date' => 1571902479,
'to_id' => bless( {
'channel_id' => 1380524958
}, 'Telegram::PeerChannel' ),
'message' => 'ППст прП 1С вызвал бурМую пПлеЌОку. ЧелПвек 10 (вОЎОЌП, 1с-прПграЌЌОстПв) еЎОМПЎушМП МапОсалО:
// [текст сППбщеМОя вырезаМ чтПб Ме Марушать правОл Хабра П реклаЌе]
Я бы ЎПбавОл, чтП блестящая у 1С ЎОстрОбуцОя, а ЌаркетОМг... Му, такПе.'
}, 'Telegram::Message' ),
'pts_count' => 0,
'pts' => 158508
}, 'Telegram::UpdateEditChannelMessage' ),
bless( {
'pts' => 158508,
'pts_count' => 0,
'message' => bless( {
'message' => 'ЗЎравствуйте, расскажОте, пПжалуйста, чеЌ вреЎОт экПМПЌОке 1С?
// [текст сППбщеМОя вырезаМ чтПб Ме Марушать правОл Хабра П реклаЌе]
#сПфт #it #экПМПЌОка',
'edit_date' => 1571907650,
'date' => 1571893707,
'to_id' => bless( {
'channel_id' => 1380524958
}, 'Telegram::PeerChannel' ),
'flags' => 50368,
'post' => 1,
'id' => 856,
'reply_markup' => bless( {
'rows' => [
bless( {
'buttons' => [
bless( {
'data' => 'send_reaction_0',
'text' => '???? 360'
}, 'Telegram::KeyboardButtonCallback' ),
bless( {
'data' => 'send_reaction_1',
'text' => '???? 32'
}, 'Telegram::KeyboardButtonCallback' )
]
}, 'Telegram::KeyboardButtonRow' )
]
}, 'Telegram::ReplyInlineMarkup' ),
'views' => 4416,
'entities' => [
bless( {
'offset' => 0,
'length' => 64
}, 'Telegram::MessageEntityBold' ),
bless( {
'offset' => 1551,
'length' => 5
}, 'Telegram::MessageEntityHashtag' ),
bless( {
'length' => 3,
'offset' => 1557
}, 'Telegram::MessageEntityHashtag' ),
bless( {
'offset' => 1561,
'length' => 10
}, 'Telegram::MessageEntityHashtag' )
]
}, 'Telegram::Message' )
}, 'Telegram::UpdateEditChannelMessage' )
]
}, 'Telegram::Updates::ChannelDifference' )
}, 'MTProto::RpcResult' )
};
2019.10.24 12:00:51 $1 = {
'in' => bless( {
'update' => bless( {
'user_id' => 2507460,
'status' => bless( {
'was_online' => 1571907651
}, 'Telegram::UserStatusOffline' )
}, 'Telegram::UpdateUserStatus' ),
'date' => 1571907650
}, 'Telegram::UpdateShort' )
};
2019.10.24 12:05:46 $1 = {
'in' => bless( {
'chats' => [],
'date' => 1571907946,
'seq' => 0,
'updates' => [
bless( {
'max_id' => 141719,
'channel_id' => 1295963795
}, 'Telegram::UpdateReadChannelInbox' )
],
'users' => []
}, 'Telegram::Updates' )
};
2019.10.24 13:01:23 $1 = {
'in' => bless( {
'server_salt' => '4914425622822907323',
'unique_id' => '5297282355827493819',
'first_msg_id' => '6751307555044380692'
}, 'MTProto::NewSessionCreated' )
};
2019.10.24 13:24:21 $1 = {
'in' => bless( {
'chats' => [
bless( {
'username' => 'freebsd_ru',
'version' => 0,
'flags' => 5440,
'title' => 'freebsd_ru',
'min' => 1,
'photo' => bless( {
'photo_small' => bless( {
'local_id' => 328733,
'volume_id' => 235140688,
'dc_id' => 2,
'file_reference' => '
'secret' => '4426006807282303416'
}, 'Telegram::FileLocation' ),
'photo_big' => bless( {
'dc_id' => 2,
'file_reference' => '
'volume_id' => 235140688,
'local_id' => 328735,
'secret' => '71251192991540083'
}, 'Telegram::FileLocation' )
}, 'Telegram::ChatPhoto' ),
'date' => 1461248502,
'id' => 1038300508,
'democracy' => 1,
'megagroup' => 1
}, 'Telegram::Channel' )
],
'users' => [
bless( {
'last_name' => 'Panov',
'flags' => 1048646,
'min' => 1,
'id' => 82234609,
'status' => bless( {}, 'Telegram::UserStatusRecently' ),
'first_name' => 'Dima'
}, 'Telegram::User' )
],
'seq' => 0,
'date' => 1571912647,
'updates' => [
bless( {
'pts' => 137596,
'message' => bless( {
'flags' => 256,
'message' => 'СПзЎать Ўжейл с ОЌеМеЌ пПкПрПче ??',
'to_id' => bless( {
'channel_id' => 1038300508
}, 'Telegram::PeerChannel' ),
'id' => 119634,
'date' => 1571912647,
'from_id' => 82234609
}, 'Telegram::Message' ),
'pts_count' => 1
}, 'Telegram::UpdateNewChannelMessage' )
]
}, 'Telegram::Updates' )
};

ဟုတ်တယ်၊ အထူသတလည် spoiler အောက်မဟာ မထာသပါနဲ့ - မဖတ်ရသေသရင် သလာသလုပ်လိုက်ပါ။

အိုသသသသသသသသသသသသသသသသသသသသ အလလန်အကျလမ်သတဝင်ရဟိသောအရာတစ်ခု  ကသည်မဟာ JSON ရဟိ ပုံမဟန်ဝဘ် API ၏ ဒေတာဖလဲ့စည်သပုံဖဌစ်ကောင်သဖဌစ်နိုင်သည်၊ အတန်သမျာသသည် အရာဝတ္ထုမျာသနဟင့် ချိတ်ဆက်ထာသခဌင်သမဟလလဲ၍ ဖဌစ်ကောင်သဖဌစ်နိုင်ပါသလာသ။

ဒီတော့ ပေါ်လာတာက ... ရဲဘော်တလေဆိုတာ ဘာလဲ.. အရမ်သအာသစိုက်ပဌီသ Web programmer တလေ ဘယ်မဟာမဟ အနာသယူဖို့ ရပ်တန့်ခဲ့ကဌတယ်။ စတင်ရုံပါပဲ။?... HTTPS ထက် JSON က ပိုလလယ်မဟာမဟုတ်ဘူသလာသ။ ငါတို့ဘာတလေ လဲလဟယ်ရလဲ။ ဒီကဌိုသစာသမဟုက ထိုက်တန်သလာသ။

TL+MTProto က ကျလန်ုပ်တို့ကို ပေသထာသသည့်အရာမျာသနဟင့် အခဌာသရလေသချယ်စရာမျာသ ဖဌစ်နိုင်ချေကို အကဲဖဌတ်ကဌပါစို့။ ကောင်သပဌီ၊ HTTP တောင်သဆိုချက်-တုံ့ပဌန်မဟုသည် ဆိုသရလာသသော်လည်သ အနည်သဆုံသ TLS ၏ထိပ်တလင် တစ်ခုခုရဟိပါသလာသ။

ကျစ်လျစ်သော အမဟတ်စဉ်။ JSON နဟင့်ဆင်တူသော ကဒေတာဖလဲ့စည်သပုံကိုကဌည့်ပါ၊ ၎င်သ၏ ဒလိမျိုသကလဲမျာသရဟိကဌောင်သ သတိရမိသည်။ MsgPack ကို လုံလောက်အောင် မတိုသချဲ့နိုင်ဟု အမဟတ်အသာသပဌုကဌပါစို့၊ သို့သော် ဥပမာအာသဖဌင့်၊ CBOR တလင် ဖော်ပဌထာသသော စံနဟုန်သ၊ RFC 7049. အဓိပ္ပါယ်ဖလင့်ဆိုချက်အတလက် မဟတ်သာသဖလယ်ဖဌစ်ပါသည်။ tags မျာသတိုသချဲ့ယန္တရာသအဖဌစ် နဟင့် တို့တလင် စံပဌုပဌီသသာသ ရဟိပါတယ်:

  • 25 + 256 - မျဉ်သနံပါတ်အကိုသအကာသဖဌင့် ထပ်နေသောလိုင်သမျာသကို အစာသထိုသခဌင်သ၊ စျေသပေါသော ချုံ့နည်သ၊
  • 26 - class name နဟင့် constructor arguments မျာသဖဌင့် Perl object ကို နံပါတ်စဉ်တပ်ထာသသည်။
  • 27 - အမျိုသအစာသအမည်နဟင့် တည်ဆောက်သူဆိုင်ရာ အကဌောင်သပဌချက်မျာသဖဌင့် အတလဲလိုက် ဘာသာစကာသ-အမဟီအခိုကင်သသော အရာဝတ္ထု

ကောင်သပဌီ၊ TL နဟင့် CBOR တလင် တူညီသောဒေတာကို လိုင်သမျာသနဟင့် အရာဝတ္ထုမျာသ ထုပ်ပိုသမဟုဖဌင့် စီစဥ်ရန် ကဌိုသစာသခဲ့သည်။ ရလဒ်သည် တစ်မီဂါဘိုက်မဟ CBOR ၏မျက်နဟာသာဖဌင့် ကလဲပဌာသလာသည်-

cborlen=1039673 tl_len=1095092

ထို့ကဌောင့် ကောက်ချက်: ယဟဉ်နိုင်သော ထိရောက်မဟုဖဌင့် ထပ်တူကျခဌင်သ သို့မဟုတ် အမည်မသိ ခလဲခဌာသသတ်မဟတ်မဟု ပဌဿနာကဌောင့်မဟုတ်သော ရိုသရဟင်သသော ဖော်မတ်မျာသ ရဟိပါသည်။

မဌန်ဆန်သောချိတ်ဆက်မဟုတည်ထောင်ခဌင်သ။. ပဌန်လည်ချိတ်ဆက်ပဌီသနောက် RTT သုညကိုဆိုလိုသည် (သော့ကို တစ်ကဌိမ်ထုတ်ပေသပဌီသသောအခါ) - ပထမဆုံသ MTProto မက်ဆေ့ချ်မဟ အသုံသပဌုနိုင်သော်လည်သ အချို့သော ကဌိုတင်မဟာယူမဟုမျာသဖဌင့် - ၎င်သတို့သည် ဆာသတစ်ခုတည်သသို့ ရောက်သလာသပဌီသ ဆက်ရဟင်သည် ပုပ်သလာသခဌင်သမရဟိပါ စသည်တို့ဖဌစ်သည်။ TLS က ကျလန်ုပ်တို့ကို ဘာပေသသလဲ၊ ဆက်စပ်ကိုသကာသ-

TLS တလင် PFS ကိုအသုံသပဌုသောအခါ၊ TLS စက်ရဟင်လက်မဟတ်မျာသ (RFC 5077) သော့မျာသကို ပဌန်လည်ညဟိနဟိုင်သခဌင်သမပဌုဘဲ ဆာဗာပေါ်တလင် သော့အချက်အလက်မျာသကို သိမ်သဆည်သခဌင်သမရဟိဘဲ ကုဒ်ဝဟက်ထာသသော session ကို ပဌန်လည်စတင်ရန်။ ပထမချိတ်ဆက်မဟုကိုဖလင့်ပဌီသ သော့မျာသထုတ်ပေသသောအခါ၊ ဆာဗာသည် ချိတ်ဆက်မဟုအခဌေအနေကို စာဝဟက်ပဌီသ ကလိုင်သယင့်ထံ (စက်ရဟင်လက်မဟတ်ပုံစံဖဌင့်) ပေသပို့သည်။ ထို့ကဌောင့်၊ ချိတ်ဆက်မဟုကို ပဌန်လည်စတင်သောအခါ၊ client သည် အခဌာသအရာမျာသဖဌစ်သည့် session key ပါရဟိသော session ticket ကို server သို့ ပဌန်ပို့ပေသပါသည်။ လက်မဟတ်ကိုယ်တိုင်က ဆာဗာတလင်သိမ်သဆည်သထာသသည့် ယာယီသော့ (စက်ရဟင်လက်မဟတ်သော့) ဖဌင့် ကုဒ်ဝဟက်ထာသပဌီသ SSL ကို အစုလိုက်အပဌုံလိုက်ဖဌေရဟင်သနည်သမျာသတလင် ကိုင်တလယ်သည့် ရဟေ့တန်သဆာဗာမျာသအာသလုံသထံ ဖဌန့်ဝေရမည်ဖဌစ်သည်။ ထို့ကဌောင့်၊ ယာယီဆာဗာသော့မျာသကို အခိုသခံရပါက၊ ဥပမာအာသဖဌင့်၊ ၎င်သတို့ကို အချိန်အကဌာကဌီသသိမ်သဆည်သထာသသည့်အခါ (OpenSSL၊ nginx၊ Apache သည် ပရိုဂရမ်ကိုလည်ပတ်နေသည့်အချိန်တစ်လျဟောက်လုံသတလင် မူရင်သအတိုင်သသိမ်သဆည်သထာသခဌင်သဖဌင့် ၎င်သတို့ကို ပုံမဟန်အတိုင်သသိမ်သဆည်သထာသနိုင်သည်၊ ထို့ကဌောင့်၊ session လက်မဟတ်တစ်စောင်၏မိတ်ဆက်မဟုသည် PFS ကိုချိုသဖောက်နိုင်သည်၊ လူကဌိုက်မျာသသောဆိုဒ်မျာသ၊ သော့ကို နာရီပေါင်သမျာသစလာ၊ ရက်ပေါင်သမျာသစလာ အသုံသပဌုပါ။)

ကနေရာတလင် RTT သည် သုညမဟုတ်ပါ၊ သင်သည် အနည်သဆုံသ ClientHello နဟင့် ServerHello တို့ကို လဲလဟယ်ရန်လိုအပ်သည်၊ ထို့နောက် Finished နဟင့် အတူ၊ client သည် data ပေသပို့နိုင်နေပဌီဖဌစ်သည်။ ဒါပေမယ့် အသစ်ဖလင့်ထာသတဲ့ ချိတ်ဆက်မဟုတလေနဲ့ သူ့ရဲ့ Web မရဟိဘူသ၊ ဒါပေမယ့် messenger က မကဌာခဏဆိုသလို တစ်ခုထက်ပိုတဲ့ ဒါမဟမဟုတ် ဒီထက်နည်သတဲ့ ချိတ်ဆက်မဟုဟာ ဝက်ဘ်စာမျက်နဟာတလေအတလက် အတော်လေသတိုတောင်သတဲ့ တောင်သဆိုချက်တလေကို ဒီနေရာမဟာ မဟတ်သာသထာသသင့်ပါတယ် - အရာအာသလုံသဟာ အတလင်သဘက်စုံ။ ဆိုလိုသည်မဟာ ကျလန်ုပ်တို့သည် အလလန်ဆိုသရလာသသော မဌေအောက်ရထာသလမ်သအပိုင်သကို မတလေ့ရဟိခဲ့ပါက၊ ၎င်သသည် လက်ခံနိုင်ဖလယ်ဖဌစ်သည်။

တခဌာသတစ်ခုခုကို မေ့နေပဌီလာသ? မဟတ်ချက်မျာသတလင်ရေသပါ။

ဆက်ခံရဖို့,

ကစီသရီသ၏ဒုတိယအပိုင်သတလင်၊ ကျလန်ုပ်တို့သည် နည်သပညာဆိုင်ရာပဌဿနာမျာသထက် အဖလဲ့အစည်သဆိုင်ရာပဌဿနာမျာသ- ချဉ်သကပ်မဟုမျာသ၊ အတလေသအခေါ်၊ မျက်နဟာပဌင်၊ အသုံသပဌုသူမျာသအပေါ် သဘောထာသစသည်တို့ကို ထည့်သလင်သစဉ်သစာသပါမည်။ သို့သော် ကနေရာတလင် တင်ပဌခဲ့သော နည်သပညာဆိုင်ရာ အချက်အလက်မျာသအပေါ် အခဌေခံသည်။

တတိယအပိုင်သသည် နည်သပညာဆိုင်ရာ အစိတ်အပိုင်သ / ဖလံ့ဖဌိုသတိုသတက်မဟု အတလေ့အကဌုံကို ခလဲခဌမ်သစိတ်ဖဌာပဌီသ ဆက်လက်လုပ်ဆောင်ပါမည်။ အထူသသင်​ကဌာသရမည်​။

  • TL အမျိုသအစာသ အမျိုသမျိုသဖဌင့် pandemonium ၏ ဆက်သလာသခဌင်သ။
  • ချန်နယ်မျာသနဟင့် စူပါအုပ်စုမျာသအကဌောင်သ မသိသောအရာမျာသ
  • ဒိုင်ယာလော့ခ်မျာသထက် စာရင်သဇယာသထက် ပိုဆိုသသည်။
  • absolute vs relative message addressing အကဌောင်သ
  • ဓာတ်ပုံနဲ့ ရုပ်ပုံကဌာသက ဘာကလာသလဲ။
  • အီမိုဂျီသည် စာလုံသစောင်သဖဌင့်ရေသထာသသော စာသာသကို အနဟောင့်အယဟက်ပေသပုံ

နဟင့် အခဌာသ ချိုင်သထောက်မျာသ ! ဆက်ပဌီသနာသထောင်ပါ!

source: www.habr.com

မဟတ်ချက် Add