ʻO ka hoʻohewa ʻana i ka protocol a me nā ala hoʻonohonoho o Telegram. Mahele 1, ʻenehana: ʻike i ke kākau ʻana i kahi mea kūʻai mai ka wā ʻōpala - TL, MT

I kēia mau lā, ua hoʻomaka pinepine ʻia nā pou e pili ana i ka maikaʻi o Telegram, pehea ka nani a me ka ʻike o nā kaikunāne Durov i ke kūkulu ʻana i nā ʻōnaehana pūnaewele, etc. I ka manawa like, liʻiliʻi loa ka poʻe i hoʻokomo iā lākou iho i ka ʻenehana loea - ʻo ka hapa nui ke hoʻohana nei lākou i kahi maʻalahi maʻalahi (a ʻokoʻa loa mai MTProto) JSON-based Bot API, a ʻae wale lākou. ma ka manaoio ʻO kēlā mau hoʻomaikaʻi a me PR e pili ana i ka ʻelele. Ma kahi kokoke i hoʻokahi makahiki a me ka hapa i hala aku nei, ua hoʻomaka koʻu hoa hana ma NPO Echelon Vasily (ʻo ka mea pōʻino, ua holoi ʻia kāna moʻokāki ma Habré me ke kiʻi kiʻi) i hoʻomaka e kākau i kāna mea kūʻai Telegram mai ka wā ʻōpala ma Perl, a ma hope ua hui pū ka mea kākau o kēia mau laina. No ke aha ʻo Perl, e nīnau koke kekahi? No ka mea, aia kekahi mau papahana ma nā ʻōlelo ʻē aʻe hale waihona puke, a no ia mea, pono ka mea kākau e hele i ke ala a pau mai ʻōpala. Eia kekahi, ʻo ka cryptography kahi mea - hilinaʻi, akā hōʻoia. Me kahi huahana e pili ana i ka palekana, ʻaʻole hiki iā ʻoe ke hilinaʻi wale i ka hale waihona puke i hana ʻia e ka mea kūʻai aku a manaʻoʻiʻo makapō (akā naʻe, he kumuhana kēia no nā mea hou aku ma ka ʻāpana ʻelua). I kēia manawa, hana maikaʻi ka waihona ma ka pae "waena" (ʻae iā ʻoe e hana i nā noi API).

Akā naʻe, ʻaʻole nui ka cryptography a me ka makemakika ma kēia pūʻulu o nā pou. Akā, e nui nā kikoʻī ʻenehana a me nā koʻokoʻo kūkulu hale (e pono no ka poʻe e kākau ʻole mai ka wā ʻōpala, akā e hoʻohana i ka waihona ma kekahi ʻōlelo). No laila, ʻo ka pahuhopu nui ka hoʻāʻo e hoʻokō i ka mea kūʻai mai ka wā ʻōpala e like me ka palapala oihana. ʻO ia hoʻi, inā ua pani ʻia ke kumu kumu o nā mea kūʻai aku maʻamau (eia hou, ma ka ʻāpana ʻelua, e hōʻike hou mākou i ke kumuhana o kēia mea maoli. hiki mai no laila), akā, e like me ka wā kahiko, no ka laʻana, aia kahi maʻamau e like me RFC - hiki anei ke kākau i kahi mea kūʻai aku e like me ka kikoʻī wale nō, "me ka ʻole o ka nānā ʻana" i ke kumu kumu, ʻoiai ke kūlana (Telegram Desktop, mobile. ), ʻoiai ʻo Telethon kūlana ʻole?

Papa o ka waihona:

Palapala ... aia ma laila? He oiaio anei?..

Ua hoʻomaka ʻia nā ʻāpana o nā memo no kēia ʻatikala i ke kauwela i hala. ʻO kēia manawa a pau ma ka pūnaewele official https://core.telegram.org ua like ka palapala i ka Layer 23, i.e. paʻa i kahi ma 2014 (e hoʻomanaʻo, ʻaʻole i loaʻa nā kahawai?). ʻOiaʻiʻo, ma ke kumumanaʻo, pono kēia i hiki ke hoʻokō i kahi mea kūʻai aku me ka hana i kēlā manawa ma 2014. Akā i loko o kēia moku'āina, ʻo ka mua, ʻaʻole i piha ka palapala, a ʻo ka lua, ma nā wahi i kūʻē ʻia ai. Ma kahi o hoʻokahi mahina i hala aku nei, i Kepakemapa 2019, ʻo ia na ka hope ua ʻike ʻia ua loaʻa i ka pūnaewele kahi hōʻano hou o ka palapala, no ka Layer 105 hou loa, me kahi leka i kēia manawa pono e heluhelu hou ʻia nā mea āpau. ʻOiaʻiʻo, nui nā ʻatikala i hoʻoponopono hou ʻia, akā nui nā mea i hoʻololi ʻole ʻia. No laila, i ka heluhelu ʻana i ka ʻōlelo hoʻohewa ma lalo nei e pili ana i ka palapala, pono ʻoe e hoʻomanaʻo ʻaʻole pili hou kekahi o kēia mau mea, akā aia kekahi. Ma hope o nā mea a pau, ʻaʻole nui wale nā ​​makahiki 5 i ka honua hou, akā nui nui ʻino. Mai ia manawa (ʻoiai inā ʻaʻole ʻoe e noʻonoʻo i nā geochats i hoʻolei ʻia a hoʻāla hou ʻia mai ia manawa), ua piʻi ka helu o nā ʻano API i ka hoʻolālā mai kahi haneli a ʻoi aku ma mua o ʻelua haneli a me kanalima!

Ma hea ʻoe e hoʻomaka ai ma ke ʻano he mea kākau ʻōpio?

ʻAʻole pili inā kākau ʻoe mai ka ʻōpala a hoʻohana paha, no ka laʻana, nā hale waihona puke i hana ʻia e like me Telethon no Python ai ole ia, Madeline no PHP, i kēlā me kēia hihia, pono mua ʻoe hoʻopaʻa inoa i kāu noi - loaʻa nā ʻāpana api_id и api_hash (ʻo ka poʻe i hana pū me ka VKontakte API e hoʻomaopopo koke) kahi e ʻike ai ke kikowaena i ka noi. ʻO kēia i no nā kumu kānāwai, akā e kamaʻilio hou mākou no ke kumu ʻaʻole hiki i nā mea kākau waihona ke hoʻopuka iā ia ma ka ʻāpana ʻelua. Malia paha e ʻoluʻolu ʻoe i nā helu hoʻāʻo, ʻoiai ua palena loa lākou - ʻo ka ʻoiaʻiʻo i kēia manawa hiki iā ʻoe ke hoʻopaʻa inoa ma kāu helu. hoʻokahi wale nō noi, no laila, mai wikiwiki koke.

I kēia manawa, mai kahi ʻike loea, pono mākou e makemake i ka ʻoiaʻiʻo ma hope o ke kau inoa ʻana e loaʻa iā mākou nā leka mai Telegram e pili ana i nā mea hou i ka palapala, protocol, etc. ʻO ia hoʻi, hiki i kekahi ke manaʻo ua "kiʻi" wale ʻia ka pūnaewele me nā docks a hoʻomau i ka hana kūikawā me ka poʻe i hoʻomaka e hana i nā mea kūʻai aku, no ka mea. ʻoi aku ka maʻalahi. Akā ʻaʻole, ʻaʻohe mea like i nānā ʻia, ʻaʻohe ʻike i hiki mai.

A inā kākau ʻoe mai ka ʻōpala, a laila mamao loa ka hoʻohana ʻana i nā ʻāpana i loaʻa. ʻOiai https://core.telegram.org/ a kamaʻilio e pili ana iā lākou ma ka Hoʻomaka, ʻoiaʻiʻo, pono ʻoe e hoʻokō ʻO ka protocol MTProto - akā inā manaʻoʻiʻo ʻoe hoʻolālā e like me ke kumu hoʻohālike OSI ma ka hope o ka ʻaoʻao o ka wehewehe nui o ka protocol, a laila makehewa loa.

I ka ʻoiaʻiʻo, ma mua o MTProto a ma hope, ma nā pae he nui i ka manawa hoʻokahi (e like me ka ʻōlelo ʻana o nā mea ʻenehana ʻē aʻe e hana ana i ka kernel OS, ka hoʻopaʻa ʻana i ka papa), e loaʻa kahi kumuhana nui, ʻeha a weliweli i ke ala ...

ʻO ka serialization binary: TL (Type Language) a me kāna papahana, a me nā papa, a me nā huaʻōlelo weliweli ʻē aʻe.

ʻO kēia kumuhana, ʻo ia ke kī i nā pilikia o Telegram. A nui nā ʻōlelo weliweli ke hoʻāʻo ʻoe e ʻimi i loko.

No laila, hoʻolālā. Inā hoʻomanaʻo ʻoe i kēia ʻōlelo, e ʻōlelo ʻoe, Hoʻolālā JSONUa pololei kou manao. Hoʻokahi ka pahuhopu: kekahi ʻōlelo e wehewehe i kahi pūʻulu o nā ʻikepili i hoʻouna ʻia. ʻO kēia, ʻoiaʻiʻo, kahi e pau ai ka like. Inā mai ka ʻaoʻao ʻO ka protocol MTProto, a i ʻole mai ke kumu kumu o ka mea kūʻai kūhelu, e hoʻāʻo mākou e wehe i kekahi papahana, e ʻike mākou i kekahi mea e like me:

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;

ʻO ka mea nāna e ʻike i kēia no ka manawa mua e ʻike ʻo ia i kahi hapa wale nō o ka mea i kākau ʻia - pono, he mau hale kēia (ʻoiai ʻo hea ka inoa, ma ka hema a ma ka ʻākau?), Aia nā māla i loko o lākou, a laila hele ke ʻano ma ke kolonā ... paha. Ma ʻaneʻi, ma nā ʻāpana kihi, aia paha nā hiʻohiʻona e like me C ++ (ʻoiaʻiʻo, aʻole naʻe). A he aha ka manaʻo o nā hōʻailona ʻē aʻe a pau, nā kaha nīnau, nā manaʻo hoʻokalakupua, nā pākēneka, nā lattices (a maopopo ke ʻano o nā mea like ʻole ma nā wahi like ʻole), e hōʻike nei ma kahi, akā ʻaʻole ma kahi, nā helu hexadecimal - a ʻo ka mea nui loa, pehea e loaʻa ai mai kēia ia maʻamau (ʻaʻole e hōʻole ʻia e ke kikowaena) byte stream? Pono ʻoe e heluhelu i ka palapala (ʻAe, aia nā loulou i ka schema i ka mana JSON kokoke - akā ʻaʻole maopopo kēia).

Ke wehe nei i ka ʻaoʻao Hoʻopili ʻikepili binary a lele i loko o ka honua kupua o nā halo a me ka makemakika discrete, he mea like me ka matan i ka makahiki 4. Alphabet, type, value, combinator, functional combinator, ano maʻamau, composite type, polymorphic type... a ʻo ia wale nō ka ʻaoʻao mua! Ke kali nei aʻe iā ʻoe ʻŌlelo TL, ʻoiai ua loaʻa iā ia kahi laʻana o kahi noi liʻiliʻi a pane ʻole, ʻaʻole ia e hāʻawi i kahi pane i nā hihia maʻamau ʻē aʻe, ʻo ia hoʻi, pono ʻoe e hele i ka haʻi hou ʻana o ka makemakika i unuhi ʻia mai ka Lūkini i ka ʻōlelo Pelekania ma nā pūnana ʻewalu. ʻaoʻao!

ʻO ka poʻe heluhelu i kamaʻāina i nā ʻōlelo hana a me nā ʻano ʻano inference, ʻoiaʻiʻo, ʻike i kēia wehewehe ʻōlelo, ʻoiai mai kahi hiʻohiʻona, ʻoi aku ka kamaʻāina, a hiki ke ʻōlelo ʻaʻole hewa kēia ma ke kumu. ʻO nā mea kū'ē i kēia.

  • ʻAe, ke kumu maikaʻi ke kani, akā auwe ʻaʻole i hoʻokō ʻia
  • ʻokoʻa ka hoʻonaʻauao ma nā kula ʻo Rūsia ma waena o nā loea IT - ʻaʻole heluhelu nā mea a pau i ka papa e pili ana
  • ʻO ka hope, e like me kā mākou e ʻike ai, ma ka hoʻomaʻamaʻa ʻaʻole i koiʻia, no ka mea, hoʻohana wale ʻia kahi ʻāpana liʻiliʻi o ka TL i wehewehe ʻia

E like me ka mea i ʻōlelo ʻia LeoNerd ma ke kahawai #perl ma ka pūnaewele FreeNode IRC, e ho'āʻo ana e hoʻokō i kahi puka mai Telegram a Matrix (ʻaʻole pololei ka unuhi ʻana o ka ʻōlelo mai ka hoʻomanaʻo ʻana):

Me he mea lā ua hauʻoli kekahi i hoʻokomo ʻia i ka manaʻo type no ka manawa mua a hoʻomaka e hoʻāʻo e pāʻani me ia, ʻaʻole mālama pono inā pono ia i ka hoʻomaʻamaʻa.

E ʻike iā ʻoe iho inā ʻaʻole pono nā ʻano ʻokoʻa (int, lōʻihi, a me nā mea ʻē aʻe) ma ke ʻano he mea haʻahaʻa ʻaʻole e hoʻāla i nā nīnau - i ka hopena pono e hoʻokō ʻia me ka lima - no ka laʻana, e hoʻāʻo kākou e loaʻa mai iā lākou. vepona. ʻO ia, ʻoiaʻiʻo, lālani, ina oe e kapa i na mea i loaa mai ma ko lakou mau inoa ponoi.

Akā ma mua

ʻO ka wehewehe pōkole o kahi ʻāpana o ka syntax TL no ka poʻe ʻaʻole… heluhelu i ka palapala kūhelu

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;

Hoʻomaka mau ka wehewehe ʻana paʻa, ma hope o ia, koho (ma ka hana, mau) ma o ka hōʻailona # pono e CRC32 mai ke kaula wehewehe maʻamau o ke ʻano i hāʻawi ʻia. Ma hope mai ka wehewehe ʻana o nā māla, inā ʻo ia - hiki ke ʻano ʻole ke ʻano. Hoʻopau ia me ka hōʻailona like, ka inoa o ke ʻano i hāʻawi ʻia i ka mea kūkulu hale - ʻo ia hoʻi, ka subtype - nona. ʻO ke ʻano ma ka ʻākau o ka hōʻailona like polymorphic - 'o ia ho'i, hiki ke pili i kekahi mau 'ano kiko'ī.

Inā loaʻa ka wehewehe ma hope o ka laina ---functions---, a laila e mau ka syntax, akā ʻokoʻa ka manaʻo: e lilo ka mea kūkulu i ka inoa o ka hana RPC, e lilo nā māla i mau ʻāpana (pono, ʻo ia hoʻi, e hoʻomau ʻia ka ʻano like me ka mea i wehewehe ʻia ma lalo nei, ʻo ia ka manaʻo i hāʻawi ʻia), a ʻo "ʻano polymorphic" ke ʻano o ka hopena i hoʻihoʻi ʻia. ʻOiaʻiʻo, e mau nō ka polymorphic - i wehewehe ʻia ma ka ʻāpana ---types---, a ʻaʻole e noʻonoʻo ʻia kēia mea hana. E hoʻokomo i ka nui o nā hana i kapa ʻia e kā lākou mau manaʻo, ʻo ia hoʻi. no kekahi kumu, ʻaʻole i hāʻawi ʻia kekahi mau hana me ka inoa hoʻokahi akā he pūlima ʻokoʻa, e like me C++, ʻaʻole i hāʻawi ʻia ma TL.

No ke aha "mea hana" a me "polymorphic" inā ʻaʻole ʻo OOP? ʻAe, ʻoiaʻiʻo, e maʻalahi ka noʻonoʻo ʻana e pili ana iā ia ma ke ʻano o OOP - he ʻano polymorphic ma ke ʻano he papa abstract, a ʻo nā mea kūkulu hale kāna mau papa mamo, ʻoi aku. final ma ka huaolelo o kekahi mau olelo. ʻOiaʻiʻo, ʻoiaʻiʻo, ma ʻaneʻi like like me nā ʻano hana kūkulu ʻoi loa i ka OO. No ka mea aia wale nō nā hoʻonohonoho ʻikepili ma aneʻi, ʻaʻohe ʻano hana (ʻoiai ʻo ka wehewehe ʻana i nā hana a me nā ʻano hana ma lalo nei hiki ke hoʻokumu i ka huikau ma ke poʻo e pili ana i ke ʻano o ia mau mea, akā e pili ana i kahi mea ʻē aʻe) - hiki iā ʻoe ke noʻonoʻo i kahi mea kūkulu hale. waiwai mai ia mea ke kūkulu ʻia nei ʻano i ka heluhelu ʻana i kahi kahe o nā paita.

Pehea e hana ai kēia? ʻO ka deserializer, e heluhelu mau ana i 4 bytes, ʻike i ka waiwai 0xcrc32 - a maopopo i ka mea e hiki mai ana field1 me ke ano int, i.e. Heluhelu pololei ʻo 4 bytes, ma kēia kahua ma luna me ke ʻano PolymorType heluhelu. ʻIke 0x2crc32 a hoʻomaopopo he ʻelua mau kahua ʻē aʻe, ʻo ka mua long, no laila heluhelu mākou i 8 bytes. A laila hou kahi ʻano paʻakikī, i deserialized ma ke ʻano like. ʻo kahi laʻana, Type3 hiki ke haʻi ʻia i loko o ka schema i ka wā e hui ai nā mea hana ʻelua, kēlā me kēia 0x12abcd34, a laila pono ʻoe e heluhelu hou i 4 bytes int, aiʻole 0x6789cdef, ma hope o laila ʻaʻohe mea. ʻO nā mea ʻē aʻe - pono ʻoe e hoʻolei i kahi ʻokoʻa. Ma hope o kēlā, hoʻi mākou i ka heluhelu ʻana i 4 bytes int mahina ʻai field_c в constructorTwo a ma ia mea e pau ai ko makou heluhelu ana PolymorType.

ʻO ka hope, inā hopu ʻia 0xdeadcrc no ka mea, constructorThree, a laila paʻakikī loa nā mea. ʻO kā mākou kahua mua bit_flags_of_what_really_present me ke ano # - ʻoiaʻiʻo, he inoa inoa wale nō kēia no ke ʻano natʻo ia hoʻi "helu maoli". ʻO ia, ʻoiaʻiʻo, ʻo unsigned int wale nō ka hihia, ma ke ala, i ka wā i loaʻa ai nā helu i ʻike ʻole ʻia ma nā ʻano maoli. No laila, ʻo ke kūkulu ʻana me kahi māka nīnau, ʻo ia hoʻi ʻo ia ke kahua - aia ia ma ka uea wale nō inā hoʻonohonoho ʻia ka bit pili i ke kahua i kuhikuhi ʻia (e like me ka mea hoʻohana ternary). No laila, e noʻonoʻo paha ua kau ʻia kēia bit, a laila pono ʻoe e heluhelu i kahi kahua like Type, i loko o kā mākou hiʻohiʻona he 2 mea kūkulu. Ua nele kekahi (he mea hōʻike wale nō), he kahua ko kekahi ids me ke ano ids:Vector<long>.

Manaʻo paha ʻoe he maikaʻi nā mamana a me nā generics a i ʻole Java. Akā ʻaʻole. Kokoke. ʻO kēia ka wale ka hihia o nā pale kihi ma nā kaapuni maoli, a hoʻohana WALE no Vector. I loko o kahi kahawai byte, he 4 CRC32 bytes kēia no ka ʻano Vector pono'ī, e like mau, a laila 4 bytes - ka helu o nā mea hoʻonohonoho, a laila kēia mau mea ponoʻī.

Hoʻohui i kēia i ka ʻoiaʻiʻo e kū mau ana ka serialization i nā huaʻōlelo o 4 bytes, ʻo nā ʻano āpau he lehulehu o ia - ua wehewehe ʻia nā ʻano i kūkulu ʻia. bytes и string me ka manual serialization o ka lōʻihi a me kēia alignment e 4 - maikaʻi, me he mea lā ke kani maʻamau a hiki i ka maikaʻi? ʻOiai ua ʻōlelo ʻia ʻo TL he serialization binary maikaʻi, akā i Gehena me lākou, me ka hoʻonui ʻana i kekahi mea, ʻo nā waiwai boolean a me nā kaula hoʻokahi a hiki i 4 bytes, e ʻoi aku ka mānoanoa o JSON? E nānā, hiki ke hoʻokuʻu ʻia nā māla pono ʻole e nā hae liʻiliʻi, maikaʻi nā mea a pau, a hiki ke hoʻonui ʻia no ka wā e hiki mai ana, ua hoʻohui ʻoe i nā kahua koho hou i ka mea hana ma hope?..

Akā ʻaʻole, inā ʻaʻole ʻoe e heluhelu i kaʻu wehewehe pōkole, akā i ka palapala piha, a noʻonoʻo e pili ana i ka hoʻokō. ʻO ka mea mua, helu ʻia ka CRC32 o ka mea hana e ke kaula wehewehe kikokikona maʻamau (e wehe i ke keʻokeʻo keʻokeʻo, a me nā mea ʻē aʻe) - no laila inā hoʻohui ʻia kahi kahua hou, e hoʻololi ʻia ke kaula wehewehe ʻano, a no laila kāna CRC32 a, no laila, serialization. A he aha ka mea e hana ai ka mea kūʻai kahiko inā loaʻa iā ia kahi māla me nā hae hou i hoʻonohonoho ʻia, akā ʻaʻole ʻo ia i ʻike i ka mea e hana ai me lākou? ..

ʻO ka lua, e hoʻomanaʻo kākou CRC32, i hoʻohana ʻia ma ʻaneʻi e like me hana hash e hoʻoholo kūʻokoʻa i ke ʻano o ka (de)serialized. Eia mākou ke alo nei i ka pilikia o ka hui ʻana - a ʻaʻole, ʻaʻole hoʻokahi ka probability i 232, akā ʻoi aku ka nui. ʻO wai ka mea i hoʻomanaʻo ua hoʻolālā ʻia ʻo CRC32 e ʻike (a hoʻoponopono) i nā hewa i ke ala kamaʻilio, a no laila e hoʻomaikaʻi i kēia mau waiwai i ka pōʻino o nā poʻe ʻē aʻe? No ka laʻana, ʻaʻole mālama ʻo ia i ka hoʻololi ʻana o nā bytes: inā ʻoe e helu i ka CRC32 mai nā laina ʻelua, i ka lua e hoʻololi ʻoe i nā 4 bytes mua me nā 4 bytes e hiki mai ana - e like ia. Ke loaʻa iā mākou nā kaula kikokikona mai ka pīpaʻa Latin (a me kahi kikoʻī liʻiliʻi) ma ke ʻano he hoʻokomo, a ʻaʻole kēia mau inoa maʻamau, ua hoʻonui nui ʻia ka manaʻo o kēlā permutation.

Ma ke ala, nāna i nānā i ka mea i laila ʻoiaʻiʻo CRC32? I loko o kekahi o nā kumu mua (ma mua o Waltman) aia kahi hana hash i hoʻonui i kēlā me kēia ʻano me ka helu 239, i aloha nui ʻia e kēia poʻe, ha ha!

ʻO ka hope, ʻae, ʻike mākou i nā mea kūkulu hale me kahi ʻano kahua Vector<int> и Vector<PolymorType> e loaʻa iā CRC32 ʻokoʻa. A pehea e pili ana i ka hōʻike ma ka laina? A ma ke ʻano o ke kumumanaʻo, lilo ia i ʻāpana o ke ʻano? E ʻōlelo kākou e hāʻawi i kahi ʻano o nā helu ʻumi tausani, maikaʻi, me Vector<int> ua maopopo nā mea a pau, ka lōʻihi a me kekahi 40000 bytes. A ina keia Vector<Type2>, he hoʻokahi wale nō kahua int a ʻo ia wale nō ma ke ʻano - pono mākou e hana hou i 10000xabcdef0 34 mau manawa a laila 4 bytes int, a i ʻole hiki i ka ʻōlelo ke hōʻike i kēia no mākou mai ka mea hana fixedVec a ma kahi o 80000 bytes, e hoʻoili hou i 40000 wale nō?

ʻAʻole kēia he nīnau noʻonoʻo ʻole - e noʻonoʻo ʻoe e loaʻa iā ʻoe kahi papa inoa o nā mea hoʻohana pūʻulu, aia kēlā me kēia i ka id, inoa mua, inoa hope - ʻo ka ʻokoʻa o ka nui o ka ʻikepili i hoʻoili ʻia ma luna o kahi pili kelepona hiki ke koʻikoʻi. ʻO ia ka hopena o Telegram serialization i hoʻolaha ʻia iā mākou.

No laila…

Vector, ʻaʻole hiki ke unuhi ʻia

Inā ʻoe e hoʻāʻo e hele i nā ʻaoʻao wehewehe o nā hui hui a e pili ana, e ʻike ʻoe i kahi vector (a me kahi matrix) ke hoʻāʻo nei e unuhi i kekahi mau pepa ma o nā tuples. Akā, i ka hopena, ua hāmama lākou, ua hoʻokuʻu ʻia ka hana hope, a hāʻawi wale ʻia ka wehewehe ʻana o kahi vector, ʻaʻole ia i hoʻopaʻa ʻia i kahi ʻano. He aha ka mea ma ʻaneʻi? Ma nā ʻōlelo hoʻolālā, ʻoi aku ka hana, he mea maʻamau ia e wehewehe i ke ʻano me ka recursively - ʻo ka mea hōʻuluʻulu me kāna loiloi palaualelo e hoʻomaopopo i nā mea āpau a hana. Ma ka ʻōlelo hoʻopili ʻikepili akā, pono ka EFFICIENCY: ua lawa ka wehewehe wale ʻana papa inoa, i.e. he ʻano o nā mea ʻelua - ʻo ka mua he mea ʻikepili, ʻo ka lua ka hale like ʻole a i ʻole he wahi hakahaka no ka huelo (pack (cons) ma Lisp). Akā, e koi ʻia kēia pakahi E hoʻohana ka element i 4 bytes (CRC32 i ka hihia o TL) e wehewehe i kona ʻano. He maʻalahi ka wehewehe ʻana i kahi laha nui paʻa, akā i ka hihia o kahi ʻano o ka lōʻihi i ʻike ʻole ʻia ma mua, e uhaʻi mākou.

No laila ʻaʻole ʻae ʻo TL iā ʻoe e hoʻopuka i kahi vector, pono e hoʻohui ʻia ma ka ʻaoʻao. ʻO ka hope, ʻōlelo ka palapala:

Hoʻohana mau ʻia ka Serialization i ka mea kūkulu like “vector” (const 0x1cb5c415 = crc32(“vector t: Type # [t] = Vector t”) ʻaʻole i hilinaʻi ʻia i ka waiwai kikoʻī o ka hoʻololi o ke ʻano t.

ʻAʻole i komo ka waiwai o ka koho koho t i ka serialization mai ka mea i loaʻa mai ke ʻano hopena (ʻike mau ʻia ma mua o ka deserialization).

E nānā pono: vector {t:Type} # [ t ] = Vector t - aka ʻaʻohe wahi ʻAʻole ʻōlelo ka wehewehe ponoʻī e like ka helu mua me ka lōʻihi o ka vector! A ʻaʻole hahai mai kēlā me kēia wahi. Hāʻawi ʻia kēia e pono ʻoe e hoʻomanaʻo a hoʻokō me kou mau lima. Ma nā wahi ʻē aʻe, ʻōlelo maoli ka palapala i ka hoʻopunipuni ke ʻano:

ʻO ka Vector t polymorphic pseudotype he "ʻano" nona ka waiwai he kaʻina o nā waiwai o kēlā me kēia ʻano t, i ka pahu pahu a i ʻole.

… akā, ʻaʻole ia e nānā. Ke luhi ʻoe i ka hele ʻana o ka makemakika (ʻike paha ʻoe mai ke kula kulanui), e hoʻoholo i ka helu a nānā i ke ʻano o ka hana maoli ʻana me ia i ka hoʻomaʻamaʻa ʻana, e mau ana ka manaʻo i kou poʻo: eia Serious Mathematics i hoʻokumu ʻia ma , maopopo loa ʻo Cool People (ʻelua mau mea makemakika - lanakila o ka ACM), a ʻaʻole kekahi. Ua hoʻokō ʻia ka pahuhopu - e splurge.

Ma ke ala, e pili ana i ka helu. Hoʻomanaʻo # he mea like nat, helu maoli:

Aia nā ʻano hōʻike (typeexpr) a me nā hōʻike helu (nat-expr). Eia naʻe, ua wehewehe like lākou.

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

akā ma ka grammar ua wehewehe ʻia lākou ma ke ʻano like, ʻo ia hoʻi. pono e hoʻomanaʻo hou ʻia kēia ʻokoʻa a hoʻokomo i ka hoʻokō ma ka lima.

ʻAe, ʻae, nā ʻano template (vector<int>, vector<User>) loaʻa kahi mea hōʻike maʻamau (#1cb5c415), ʻo ia hoʻi. inā ʻike ʻoe ua haʻi ʻia ke kelepona

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

a laila ke kali nei ʻoe no kahi vector wale nō, akā he vector o nā mea hoʻohana. ʻOi aku ka pololei, e pono e kali - ma ke code maoli, kēlā me kēia mea, inā ʻaʻole he ʻano ʻano, e loaʻa i kahi mea kūkulu, a ma ke ala maikaʻi i ka hoʻokō pono e nānā - a ua hoʻouna pololei ʻia mākou i kēlā me kēia mea o kēia vector. kēlā ʻano? A inā he ʻano PHP, kahi e hiki ai i ka array ke loaʻa nā ʻano like ʻole i nā mea like ʻole?

I kēia manawa, hoʻomaka ʻoe e noʻonoʻo - pono anei kahi TL? Malia paha no ke kaʻa e hiki ke hoʻohana i ka serializer kanaka, ka protobuf like i loaʻa i kēlā manawa? He kumumanaʻo, e nānā kākou i ka hoʻomaʻamaʻa.

Nā hoʻokō TL i kēia manawa ma ke code

Ua hānau ʻia ʻo TL i loko o ka ʻōpū o VKontakte ma mua o nā hanana kaulana me ke kūʻai ʻana o ka ʻāpana a Durov a (oiaio no, e), ʻoiai ma mua o ka hoʻomohala ʻana o Telegram. A ma ke kumu hamama nā kumu o ka hoʻokō mua hiki iā ʻoe ke ʻike i nā koʻokoʻo ʻakaʻaka he nui. A ua hoʻokō piha ʻia ka ʻōlelo ma laila ma mua o ka Telegram i kēia manawa. No ka laʻana, ʻaʻole i hoʻohana ʻia nā hashes i loko o ke kumumanaʻo (ʻo ia hoʻi ka pseudotype i kūkulu ʻia (e like me kahi vector) me ka ʻano deviant). A i ʻole

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

akā, e noʻonoʻo kākou no ka hoʻopiha piha ʻana i ke kiʻi, i mea e ʻimi ai, pēlā e ʻōlelo ai, ka ulu ʻana o ka Giant of Thought.

#define ZHUKOV_BYTES_HACK

#ifdef ZHUKOV_BYTES_HACK

/* dirty hack for Zhukov request */

A i ʻole kēia mea nani:

    static const char *reserved_words_polymorhic[] = {

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

      };

ʻO kēia ʻāpana e pili ana i nā templates, e like me:

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

ʻO kēia ka wehewehe ʻana o ke ʻano template hashmap, ma ke ʻano he vector o int - Type pairs. Ma C++ e like me kēia:

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

no laila, alpha - hua'ōlelo! Akā ma C++ wale nō hiki iā ʻoe ke kākau iā T, akā pono ʻoe e kākau i ka alpha, beta... Akā ʻaʻole i ʻoi aku ma mua o 8 mau palena, ua pau ka manaʻo i ka theta. No laila, me he mea lā i kekahi manawa ma St. Petersburg, aia nā kūkākūkā like ʻole:

-- Надо сделать в TL шаблоны
-- Бл... Ну пусть параметры зовут альфа, бета,... Какие там ещё буквы есть... О, тэта!
-- Грамматика? Ну потом напишем

-- Смотрите, какой я синтаксис придумал для шаблонов и вектора!
-- Ты долбанулся, как мы это парсить будем?
-- Да не ссыте, он там один в схеме, захаркодить -- и ок

Akā e pili ana i ka hoʻokō mua ʻana o TL "ma ka laulā". E neʻe kākou i ka noʻonoʻo ʻana i nā hoʻokō i nā mea kūʻai aku Telegram maoli.

ʻO ka ʻōlelo a Basil:

ʻO Vasily, [09.10.18 17:07] ʻO ka hapa nui o nā mea a pau, ua wela ka hoki i ka ʻoiaʻiʻo ua wili lākou i kahi puʻupuʻu o nā abstractions, a laila hoʻopaʻa lākou i kahi wili ma luna o lākou, a uhi i ka codegegerator me nā koʻi.
ʻO ka hopena, ma mua mai nā docks ka pilot.jpg
A laila mai ka helu jekichan.webp

ʻOiaʻiʻo, mai ka poʻe kamaʻāina i ka algorithm a me ka makemakika, hiki iā mākou ke manaʻo ua heluhelu lākou iā Aho, Ullman, a kamaʻāina i nā mea hana maʻamau de facto no ke kākau ʻana i kā lākou DSL compilers i nā makahiki he mau makahiki, ʻaʻole? ..

Mea kākau telegram-cli ʻO Vitaliy Valtman, e like me ka hiki ke hoʻomaopopo ʻia mai ka hiki ʻana mai o ke ʻano TLO ma waho o kona mau palena (cli), he lālā o ka hui - i kēia manawa ua hoʻokaʻawale ʻia ka waihona no ka parsing TL. kaʻawalehe aha kona manaʻo TL parser? ..

16.12 04:18 ʻO Vasily: i koʻu manaʻo, ʻaʻole i haku kekahi i ka lex + yacc.
16.12 04:18 ʻO Vasily: inā ʻaʻole hiki iaʻu ke wehewehe
16.12 04:18 ʻO Vasily: maikaʻi, a i ʻole ua uku ʻia lākou no ka helu o nā laina ma VK.
16.12 04:19 Vasily: 3k+ laina o nā mea ʻē aʻe<censored> ma kahi o ka parser

He ʻokoʻa paha? E nana kakou pehea hana ʻO kēia ka mea kūʻai aku OFFICIAL - 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);

1100+ mau laina ma Python, ʻelua mau ʻōlelo maʻamau + nā hihia kūikawā o ke ʻano vector, ʻoiaʻiʻo, ua haʻi ʻia i ka hoʻolālā e like me ka mea e like me ka TL syntax, akā kau lākou ma kēia syntax, paʻi hou aku. ... ʻO ka nīnau, no ke aha e pilikia ai kēia hana manaиʻoi aʻe ka puff, inā ʻaʻohe mea e hoʻokaʻawale iā ia e like me ka palapala ?!

Ma ke ala ... E hoʻomanaʻo i kā mākou kamaʻilio e pili ana i ka nānā CRC32? No laila, ma ka Telegram Desktop code generator aia kahi papa inoa o nā ʻokoʻa no kēlā mau ʻano i helu ʻia ai ka CRC32. ʻaʻohe kūlike e like me ka mea i hoikeia ma ke kii!

ʻO Vasily, [18.12 22:49] a ma ʻaneʻi e noʻonoʻo ai ʻoe inā pono ia TL.
inā makemake wau e hana ʻino me nā hoʻokō ʻē aʻe, e hoʻomaka wau e hoʻokomo i nā laina laina, e uhaʻi ka hapalua o nā parsers i nā wehewehe ʻano laina.
tdesktop, nae

E hoʻomanaʻo i ka manaʻo e pili ana i ka one-liners, e hoʻi hou mākou i ia ma hope.

ʻAe, telegram-cli ʻaʻole i mana, Telegram Desktop ka mana, akā pehea nā mea ʻē aʻe? A ʻo wai ka mea ʻike?.. Ma ka code client Android, ʻaʻohe schema parser i nā mea āpau (e hāpai ana i nā nīnau e pili ana i ka open source, akā ʻo kēia no ka ʻāpana ʻelua), akā aia kekahi mau ʻāpana ʻakaʻaka ʻē aʻe, akā e pili ana iā lākou i loko. ka pauku malalo.

He aha nā nīnau ʻē aʻe e hāpai ʻia ai ka serialization i ka hoʻomaʻamaʻa? No ka laʻana, ua kāʻei lākou, ʻoiaʻiʻo, me nā māla bit a me nā māla kūlana:

vasilily: flags.0? true
'o ia ho'i, aia ke kahua a 'oia'i'o inā ho'onoho 'ia ka hae

vasilily: flags.1? int
'o ia ho'i aia ke kahua a pono e deserialized

Vasily: Ass, mai puhi, he aha kāu e hana nei!
Vasily: Aia ma kahi o ka doc i ʻōlelo ʻia ʻo ka ʻoiaʻiʻo he ʻano ʻokoʻa o ka lōʻihi ʻole, akā ʻaʻole kūpono ke ʻohi i kekahi mea mai kā lākou docs.
ʻO Vasily: ʻAʻohe mea like i ka hoʻokō ākea, akā nui nā koʻokoʻo a me nā props

Pehea e pili ana i kahi Telethon? Ke nānā nei i mua i ke kumuhana o MTProto, he laʻana - aia nā ʻāpana i ka palapala, akā ʻo ka hōʻailona % ʻo ia wale nō ka mea i wehewehe ʻia ma ke ʻano he "kūlike me ke ʻano ʻano ʻole i hāʻawi ʻia", i.e. i nā laʻana ma lalo nei, he hewa paha, a i ʻole kekahi mea i palapala ʻole ʻia:

Vasily, [22.06.18/18/38 XNUMX:XNUMX] Ma kahi hoʻokahi:

msg_container#73f1f8dc messages:vector message = MessageContainer;

Ma kahi ʻokoʻa:

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

A ʻelua mau ʻokoʻa nui kēia, ma ke ola maoli ke hele mai nei kekahi ʻano vector ʻōlohelohe

ʻAʻole au i ʻike i nā wehewehe kikoʻī vector a ʻaʻole au i ʻike

Kākau ʻia ma ka telethon ma ka lima

Ua wehewehe kāna schema i ka wehewehe msg_container

Eia hou, noho ka nīnau e pili ana i ka%. ʻAʻole i wehewehe ʻia.

ʻO Vadim Goncharov, [22.06.18/19/22 XNUMX:XNUMX PM] a i ka tdesktop?

ʻO Vasily, [22.06.18/19/23 XNUMX:XNUMX] ʻAʻole paha e ʻai kā lākou TL parser ma nā regulators.

// parsed manually

He abstraction nani ʻo TL, ʻaʻohe mea e hoʻokō piha

A ʻaʻohe % i kā lākou mana o ka papahana

Eia naʻe, kūʻē ka palapala iā ia iho, no laila xs

Loaʻa ia ma ka grammar, hiki iā lākou ke poina e wehewehe i ka semantics

ʻAe, ua ʻike ʻoe i ka dock ma TL, ʻaʻole hiki iā ʻoe ke noʻonoʻo me ka ʻole o ka hapalua lita

"ʻAe, e ʻōlelo kākou," e ʻōlelo ai kekahi mea heluhelu, "ua hoʻohewa ʻoe i nā mea āpau, no laila e hōʻike e like me ka mea e pono ai."

Pane ʻo Vasily: "ʻO ka parser, makemake wau i nā mea like

    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 ) ); }
            ;

ʻoi aku paha ma mua o

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;
}

ai ole ia,

        # 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)

ʻO kēia ka lexer a pau:

    ---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];

ka poe. ʻO ka maʻalahi ka hoʻohaʻahaʻa ʻana."

Ma keʻano laulā, i ka hopena, ua kūpono ka parser a me ka code generator no ka subset i hoʻohana maoli ʻia o TL ma kahi o 100 mau laina o ka grammar a ~ 300 mau laina o ka generator (me nā mea āpau. print's generated code), me ke 'ano o ka maika'i a me ka 'ike 'ike no ka 'ike 'ana i kēlā me kēia papa. Hoʻololi ʻia kēlā me kēia ʻano polymorphic i kahi papa kumu abstract ʻole, a ua hoʻoili ʻia nā mea kūkulu hale a loaʻa iā lākou nā ala no ka serialization a me ka deserialization.

Ka nele o nā ʻano ma ke ʻano ʻōlelo

Maikaʻi ka paʻi ʻana, ʻeā? ʻAʻole, ʻaʻole kēia he holivar (ʻoiai makemake wau i nā ʻōlelo ikaika), akā he postulate i loko o TL. Ma muli o ia mea, pono e hāʻawi ka ʻōlelo i nā ʻano loiloi āpau no mākou. ʻAe, ʻae, ʻaʻole e ʻae iā ia, akā i ka hoʻokō ʻana, akā pono ʻo ia e wehewehe iā lākou. A he aha nā manawa kūpono a mākou e makemake ai?

ʻO ka mea mua, nā kaohi. Eia mākou e ʻike ai i ka palapala no ka hoʻouka ʻana i nā faila:

Hoʻokaʻawale ʻia ka maʻiʻo binary o ka faila i mau ʻāpana. Pono like ka nui o nā ʻāpana āpau ( hapa_nui ) a pono e hoʻokō ʻia kēia mau kūlana:

  • part_size % 1024 = 0 (mahele ʻia e 1KB)
  • 524288 % part_size = 0 (Pono e puunaue like 512KB e ka hapa_nui)

ʻAʻole pono ka ʻāpana hope e hoʻokō i kēia mau kūlana, inā ʻoi aku kona nui ma mua o ka hapa_size.

Pono e loaʻa i kēlā me kēia ʻāpana kahi helu kaʻina, ʻāpana_faila, me ka waiwai mai 0 a 2,999.

Ma hope o ka hoʻokaʻawale ʻana i ka faila, pono ʻoe e koho i kahi ala no ka mālama ʻana ma ke kikowaena. hoʻohana upload.saveBigFilePart inā ʻoi aku ka nui o ka faila ma mua o 10 MB a upload.saveFilePart no nā faila liʻiliʻi.
[...] hiki ke hoʻihoʻi ʻia kekahi o kēia mau hewa komo ʻikepili:

  • FILE_PARTS_INVALID - Helu kūpono ʻole o nā ʻāpana. ʻAʻole ka waiwai ma waena 1..3000

Aia kekahi o kēia mau mea i ka schema? Hiki ke hōʻike ʻia ma o TL? ʻAʻole. Akā e kala mai iaʻu, hiki i ka Turbo Pascal kahiko ke wehewehe i nā ʻano i hāʻawi ʻia e nā pae. A hiki iā ia ke hana i hoʻokahi mea hou aʻe, i ʻike ʻia i kēia manawa enum - he ʻano i helu ʻia o kahi helu paʻa (liʻiliʻi) o nā waiwai. Ma nā ʻōlelo e like me C - helu, e noʻonoʻo ʻoe, ua kamaʻilio wale mākou e pili ana i nā ʻano i kēia manawa. helu. Aia nō naʻe nā pūʻulu, nā kaula ... no ka laʻana, he mea maikaʻi e wehewehe i kēia kaula hiki ke loaʻa i kahi helu kelepona wale nō, ʻaʻole?

ʻAʻohe o kēia ma TL. Akā aia, no ka laʻana, ma JSON Schema. A inā hiki i kekahi ke kūʻē e pili ana i ka māhele ʻana o 512 KB e pono ke nānā ʻia kēia ma ke code, a laila e hōʻoia i ka mea kūʻai aku maʻalahi. ʻaʻole hiki hoʻouna i ka helu ma waho o ka palena 1..3000 (a ʻaʻole hiki ke ala mai ka hewa e pili ana) hiki nō, ʻaʻole? ..

Ma ke ala, e pili ana i nā hewa a me nā waiwai hoʻihoʻi. Ua pōwehiwehi ka maka no ka poʻe i hana pū me TL - ʻaʻole ia i ʻike koke iā mākou kēlā me kēia Hiki i kahi hana ma TL ke hoʻihoʻi i ka ʻano hoʻihoʻi i wehewehe ʻia, akā he hewa pū kekahi. Akā ʻaʻole hiki ke unuhi ʻia kēia ma o ka TL ponoʻī. ʻOiaʻiʻo, hiki ke hoʻomaopopo a ʻaʻole pono ka nafig i ka hoʻomaʻamaʻa (ʻoiai ʻoiaʻiʻo, hiki ke hana ʻia ʻo RPC ma nā ʻano like ʻole, e hoʻi mākou i kēia) - akā pehea e pili ana i ka Maʻemaʻe o nā manaʻo o ka Makemakika o nā ʻano Abstract mai ka honua lani? .. Hopu i ka huki huki - no laila e like ai.

A ʻo ka hope, pehea ka heluhelu ʻana? ʻAe, ma laila, ma ka laulā, makemake wau hōʻikeʻano Loaʻa iā ia i ka schema (eia hou, aia ia i ka JSON schema), akā inā ua paʻakikī me ia, a laila pehea e pili ana i ka ʻaoʻao kūpono - ma ka liʻiliʻi he trite ke nānā i nā diffs i ka wā hoʻonui? E ʻike iā ʻoe iho ma nā laʻana maoli:

-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;

ai ole ia,

-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;

Makemake kekahi, akā ʻo GitHub, no ka laʻana, hōʻole e hōʻike i nā loli i loko o ia mau laina lōʻihi. ʻO ka pāʻani "loaʻa i nā ʻokoʻa 10", a ʻo ka mea a ka lolo e ʻike koke ai ʻo ka hoʻomaka a me ka hopena e like me nā hiʻohiʻona ʻelua, pono ʻoe e heluhelu me ka luhi ma kahi o ka waena ... aka, ma ka nana aku lepo a me ka maikai ole.

Ma ke ala, e pili ana i ka maʻemaʻe o ke kumumanaʻo. No ke aha e pono ai nā māla bit? ʻAʻole paha lākou honi maikaʻi ʻole mai ka manaʻo o ka manaʻo type? Hiki ke ʻike ʻia kahi wehewehe ma nā mana mua o ka schema. I ka wā mua, ʻae, pēlā, ua hana ʻia kahi ʻano hou no kēlā me kēia sneeze. Aia kēia mau kumu kumu ma kēia ʻano, no ka laʻana:

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;

Akā i kēia manawa e noʻonoʻo ʻoe inā loaʻa iā ʻoe nā kahua koho 5 i kāu hoʻolālā, a laila pono ʻoe i nā ʻano 32 no nā koho āpau. pahū huikau. No laila ua hāʻule hou ka maʻemaʻe aniani o ka manaʻo TL i ka hoki hao o ka ʻoiaʻiʻo paʻakikī o ka serialization.

Eia kekahi, ma nā wahi e hōʻino kēia mau kāne i kā lākou paʻi ʻana. No ka laʻana, ma MTProto (mokuna aʻe) hiki ke hoʻopaʻa ʻia ka pane e Gzip, kūpono nā mea āpau - koe wale no ka uhaki ʻana i nā papa a me ka schema. I kekahi manawa, a ʻaʻole i ʻohi i ka RpcResult ponoʻī, akā ʻo kāna mau mea i loko. ʻAe, no ke aha e hana ai i kēia? .. Ua pono iaʻu e ʻoki i kahi koʻi i hana ʻia ka hoʻoemi ma nā wahi āpau.

A i ʻole kekahi laʻana, ua loaʻa iā mākou kahi hewa - hoʻouna ʻia InputPeerUser ma kahi o InputUser. A i ʻole ʻē aʻe. Akā ua hana! ʻO ia hoʻi, ʻaʻole mālama ke kikowaena i ke ʻano. Pehea e hiki ai kēia? ʻO ka pane, malia paha, e hoʻoulu ʻia e nā ʻāpana code mai 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);

I nā huaʻōlelo ʻē aʻe, eia ka hana serialization MANUAL, ʻaʻole i hana ʻia ke code! Hiki paha ke hoʻokō ʻia ke kikowaena ma ke ʻano like?.. Ma ke kumu, e hana kēia inā hana hoʻokahi, akā pehea ʻoe e kākoʻo ai ma hope me nā mea hou? ʻAʻole anei ʻo ia ke kumu o ka papahana? A laila neʻe mākou i ka nīnau aʻe.

Hoʻololi ʻana. Nā ʻāpana

No ke aha i kapa ʻia ai nā mana hoʻolālā he mau papa e hiki ke koho wale ʻia ma muli o ka mōʻaukala o nā schema i paʻi ʻia. ʻIke ʻia, i ka wā mua, ua manaʻo nā mea kākau e hiki ke hana i nā mea maʻamau ma kahi ʻano hoʻololi ʻole, a inā pono wale nō, e hōʻike i nā noi kikoʻī e hana ʻia ana e like me kahi ʻano ʻokoʻa. Ma ke kumu, he manaʻo maikaʻi hoʻi - a me ka makemake hou, e like me ia, "hui i loko", papa ma luna o ka mea kahiko. Akā, e ʻike kākou pehea i hana ʻia ai. ʻOiaʻiʻo, ʻaʻole hiki ke nānā ʻia mai ka hoʻomaka ʻana - he ʻakaʻaka, akā ʻaʻole i loaʻa ka papa kuhikuhi kumu. Hoʻomaka nā papa ma 2. Hōʻike ka palapala iā mākou e pili ana i kahi hiʻohiʻona TL kūikawā:

Inā kākoʻo ka mea kūʻai aku i ka Layer 2, pono e hoʻohana ʻia kēia mea hana:

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

Ma ka hoʻomaʻamaʻa, ʻo ia hoʻi ma mua o kēlā me kēia kelepona API, kahi int me ka waiwai 0x289dd1f6 pono e hoʻohui ʻia ma mua o ka helu ʻano.

Hiki ke kani. Akā he aha ka mea ma hope? A laila hele mai

invokeWithLayer3#b7475268 query:!X = X;

No laila he aha ka hope? Me he mea maʻalahi ke koho

invokeWithLayer4#dea0d430 query:!X = X;

Hoʻomākeʻaka? ʻAʻole, ua hiki wawe ka ʻakaʻaka, e noʻonoʻo i ka mea kēlā me kēia Pono e hoʻopili ʻia kahi noi mai kahi papa ʻē aʻe i kahi ʻano kūikawā - inā loaʻa iā ʻoe nā ʻokoʻa a pau, pehea lā e ʻike ai iā lākou? A ʻo ka hoʻohui ʻana i 4 bytes i mua he ala maikaʻi loa. No laila

invokeWithLayer5#417a57ae query:!X = X;

Akā, ua maopopo ma hope o kekahi manawa e lilo ia i bacchanalia. A hiki mai ka hopena:

Hoʻohou: Hoʻomaka me ka Layer 9, nā ala kōkua invokeWithLayerN hiki ke hoʻohana pū me initConnection

Hooray! Ma hope o 9 mau mana, ua hōʻea mākou i ka mea i hana ʻia i nā protocol Internet i ka makahiki 80 - ke kūkākūkā ʻana i hoʻokahi manawa i ka hoʻomaka ʻana o ka pilina!

No laila he aha ka hope?..

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

A i kēia manawa hiki iā ʻoe ke ʻakaʻaka. Ma hope wale nō o 9 mau papa, ua hoʻohui hope ʻia kahi mea kūkulu honua me kahi helu helu, pono ke kāhea ʻia i hoʻokahi wale nō i ka hoʻomaka ʻana o ka pilina, a ʻo ka manaʻo o nā papa e like me ka nalowale, i kēia manawa he ʻano kūlana, e like me ma nā wahi ʻē aʻe. Paʻa ka pilikia.

Akau?..

ʻO Vasily, [16.07.18/14/01 XNUMX:XNUMX PM] Ma ka Pōʻalima ua manaʻo wau:
Hoʻouna ka teleserver i nā hanana me ke noi ʻole. Pono e hoʻopili ʻia nā noi ma InvokeWithLayer. ʻAʻole hoʻopili ke kikowaena i nā mea hou, ʻaʻohe ʻano no ka ʻōwili ʻana i nā pane a me nā mea hou.

ʻO kēlā mau. ʻAʻole hiki i ka mea kūʻai ke kuhikuhi i ka papa āna e makemake ai i nā mea hou

Vadim Goncharov, [16.07.18/14/02 XNUMX:XNUMX PM] ʻAʻole anei ʻo InvokeWithLayer kahi koʻokoʻo ma ke kumu?

ʻO Vasily, [16.07.18/14/02 XNUMX:XNUMX PM] ʻO kēia wale nō ke ala

ʻO Vadim Goncharov, [16.07.18/14/02 XNUMX:XNUMX PM] ʻo ia ke ʻano o ka waiho ʻana i ka hoʻomaka ʻana o ke kau.

Ma ke ala, ʻaʻole i hāʻawi ʻia kahi mea kūʻai aku downgrade

Nā mea hou, ʻo ia hoʻi. ʻano ʻano Updates i ka papahana, ʻo ia ka mea e hoʻouna ai ke kikowaena i ka mea kūʻai aku ʻaʻole i ka pane ʻana i kahi noi API, akā ma kāna iho i ka wā i loaʻa ai kahi hanana. He kumuhana paʻakikī kēia e kūkākūkā ʻia ma kahi pou ʻē aʻe, akā i kēia manawa he mea nui e ʻike e hōʻiliʻili ka server i nā mea hou inā ʻo ka mea kūʻai aku ma waho.

No laila, i ka hōʻole ʻana e ʻōwili pakahi pūʻolo e hōʻike i kona mana, no laila ke kū mai nei nā pilikia e hiki mai ana:

  • hoʻouna ke kikowaena i nā mea hou i ka mea kūʻai aku ma mua o ka haʻi ʻana o ka mea kūʻai aku i ka mana e kākoʻo ai
  • he aha ka mea e hana ai ma hope o ka hoʻomaikaʻi ʻana i ka mea kūʻai aku?
  • ai la hoʻohikiʻaʻole e loli ka manaʻo o ke kikowaena e pili ana i ka helu papa i ka hana?

Manaʻo paha ʻoe he noʻonoʻo theoretical wale nō kēia, a ma ka hoʻomaʻamaʻa ʻaʻole hiki ke hana, no ka mea, ua kākau pololei ʻia ke kikowaena (ma kekahi hihia, ua hoʻāʻo maikaʻi ʻia)? Ha! ʻAʻohe mea pehea!

ʻO kēia ka mea a mākou i loaʻa ai i ʻAukake. Ma ʻAukake 14, ua ʻike ʻia nā memo e hoʻonui ʻia ana kekahi mea ma nā kikowaena Telegram ... a laila ma nā lāʻau:

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.

a laila he mau megabytes o nā ʻanuʻu ahu (maikaʻi, i ka manawa like, hoʻopaʻa ʻia ka logging). Ma hope o nā mea a pau, inā ʻaʻole i ʻike ʻia kekahi mea i kāu TL - he binary ia ma nā pūlima, ʻoi aku ma ke kahawai ALL hele, e lilo ka decoding i mea hiki ʻole. He aha ka hana ma ia ʻano?

ʻAe, ʻo ka mea mua i hiki i ka noʻonoʻo o ke kanaka ke kāpae a hoʻāʻo hou. ʻAʻole i kōkua. Ua huli mākou i Google CRC32 - ua lilo kēia mau mea mai ka papahana 73, ʻoiai ua hana mākou ma ka papahana 82. Ke nānā pono nei mākou i nā lāʻau - aia nā mea hōʻike mai ʻelua mau papahana like ʻole!

Aia paha ka pilikia i loko o kā mākou mea kūʻai ʻole? ʻAʻole, holo mākou i Telegram Desktop 1.2.17 (ka mana i hāʻawi ʻia me ka helu o nā māhele Linux), kākau ia i ka log Exception: MTP Unexpected type id #b5223b0f heluhelu ʻia ma MTPMessageMedia…

ʻO ka hoʻohewa ʻana i ka protocol a me nā ala hoʻonohonoho o Telegram. Mahele 1, ʻenehana: ʻike i ke kākau ʻana i kahi mea kūʻai mai ka wā ʻōpala - TL, MT

Ua hōʻike ʻo Google ua loaʻa kahi pilikia like i kekahi o nā mea kūʻai aku ʻole, akā laila nā helu helu a, no laila, ʻokoʻa nā manaʻo ...

No laila he aha ka hana? Ua hoʻokaʻawale wau a me Vasily: ua ho'āʻoʻo ia e hoʻololi i ka papahana i ka 91, ua hoʻoholo wau e kali i kekahi mau lā a ho'āʻo i ka 73. Ua hana nāʻanoʻelua, akā, no ka mea heʻanoʻike lākou,ʻaʻole maopopo i ka nui o nā mana e pono aiʻoe e lele i luna. a i ʻole i lalo, ʻaʻole hoʻi i ka lōʻihi o kou kali ʻana.

Ma hope mai, hiki iaʻu ke hana hou i ke kūlana: hoʻomaka mākou i ka mea kūʻai aku, hoʻopau iā ia, hoʻopili hou i ka papahana i kahi papa ʻē aʻe, hoʻomaka hou, hopu hou i ka pilikia, hoʻi i ka mea ma mua - ʻoops, ʻaʻohe hoʻololi i ka hoʻolālā a hoʻomaka hou i ka mea kūʻai aku no kekahi mau minuke e kōkua. E loaʻa iā ʻoe kahi hui o nā hale ʻikepili mai nā papa like ʻole.

Wehewehe? Hiki iā ʻoe ke koho mai nā ʻano hōʻailona like ʻole, aia ka server i nā ʻano hana like ʻole ma nā mīkini like ʻole. ʻO ka mea nui loa, ʻo kekahi o nā kikowaena i kuleana no ka "buffering" i hoʻokomo i ka pila i ka mea i hāʻawi ʻia e ka poʻe kiʻekiʻe, a hāʻawi lākou iā ia i ka papahana i ka manawa o ka hanauna. A hiki i ka "popopo" o kēia pila, ʻaʻohe mea hiki ke hana.

Inā ʻaʻole ... akā he koʻokoʻo weliweli kēia?!.. ʻAʻole, ma mua o ka noʻonoʻo ʻana i nā manaʻo pupule, e nānā kākou i ke code o nā mea kūʻai kūhelu. Ma ka Android version, ʻaʻole mākou i ʻike i kahi parser TL, akā ʻike mākou i kahi faila hefty (hōʻole ʻo github e kala iā ia) me (de) serialization. Eia nā snippet code:

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;

ai ole ia,

    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");

Hmm... he mea pupule. Akā, malia paha, he code i haku ʻia kēia, a laila ʻae? .. Akā, kākoʻo maoli ia i nā mana āpau! ʻOiaʻiʻo, ʻaʻole maopopo ke kumu i hui pū ʻia ai nā mea a pau i ka puʻu hoʻokahi, a me nā kamaʻilio huna, a me nā ʻano like ʻole _old7 ʻaʻole like me ka hana mīkini ... Eia naʻe, ʻo ka hapa nui o nā mea a pau aʻu i hele ai i nā nati mai

TL_message_layer104
TL_message_layer104_2
TL_message_layer104_3

E nā kāne, ʻaʻole hiki iā ʻoe ke hoʻoholo i loko o hoʻokahi papa?! ʻAe, ʻae, "ʻelua", e ʻōlelo kākou, ua hoʻokuʻu ʻia me kahi hewa, pono, hiki mai, akā ʻekolu? He aha kēia ʻano kiʻi ponoʻī, kala mai? ..

Ma ke ala, loaʻa kahi mea like ma nā kumu Telegram Desktop - inā pēlā, a ʻo kekahi mau hana i ka lālani i ka hoʻolālā ʻaʻole e hoʻololi i kāna helu papa, akā hoʻoponopono i kekahi mea. I nā kūlana inā ʻaʻohe kumu ʻikepili kūhelu no ka hoʻolālā, ma hea e loaʻa ai iaʻu, koe wale nō nā kumu kumu kūʻai kūhelu? A lawe ʻoe iā ia mai laila mai, ʻaʻole hiki iā ʻoe ke hōʻoiaʻiʻo ua pololei ka hoʻolālā a hiki i kou hoʻāʻo ʻana i nā ʻano hana āpau.

Pehea e hoʻāʻo ʻia ai kēia? Manaʻo wau e kaʻana like nā mea pā o ka unit, functional and other tests i nā ʻōlelo.

ʻAe, e nānā kāua i kekahi ʻāpana code:

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;

ʻO kēlā manaʻo "hana lima" ma aneʻi e hōʻike ana he hapa wale nō o kēia faila i kākau ʻia e ka lima (hiki iā ʻoe ke noʻonoʻo i ka moeʻuhane mālama?), A ʻo ke koena i hana ʻia e ka mīkini. Eia nō naʻe, a laila, ala mai kekahi nīnau - aia nā kumu aole loa (a la blobs ma lalo o ka GPL ma ka Linux kernel), akā he kumuhana kēia no ka ʻāpana ʻelua.

Akā lawa. E neʻe kākou i ka protocol ma luna o ka mea e hahai nei kēia serialization.

MT Proto

No laila e wehe kāua wehewehe laulā и wehewehe kikoʻī o ka protocol a ʻo ka mea mua a mākou e hina ai ʻo ka terminology. A me ka nui o na mea a pau. Ma keʻano holoʻokoʻa, ʻike ʻia kēia i kahi hōʻailona o Telegram - e kāhea i nā mea ma nā wahi like ʻole ma nā ʻano like ʻole, a i ʻole nā ​​​​mea like ʻole i ka huaʻōlelo hoʻokahi, a i ʻole ʻē aʻe (no ka laʻana, i kahi API kiʻekiʻe inā ʻike ʻoe i kahi pahu sticker - kēia ʻaʻole ia ka mea āu i manaʻo ai).

No ka laʻana, "message" (message) a me "session" (session) - ma ʻaneʻi ke manaʻo nei lākou i kahi mea ʻokoʻa ma mua o ka maʻamau maʻamau o ka mea kūʻai aku Telegram. ʻAe, ua maopopo nā mea āpau me ka leka, hiki ke unuhi ʻia ma ke ʻano o OOP, a i ʻole i kapa ʻia ʻo ka huaʻōlelo "package" - he haʻahaʻa haʻahaʻa kēia, ʻaʻole like nā memo e like me ka interface, he nui. o na mea lawelawe. Akā ʻo ka hālāwai ... akā ʻo ka mea mua.

papa lawe

ʻO ka mea mua ka halihali. E haʻi ʻia iā mākou e pili ana i nā koho 5:

  • TCP
  • Pūnaewele
  • Websocket ma luna o HTTPS
  • HTTP
  • https

ʻO Vasily, [15.06.18/15/04 XNUMX:XNUMX PM] A aia nō hoʻi ka halihali UDP, akā ʻaʻole i kākau ʻia.

A ʻo TCP i ʻekolu mau ʻano

ʻO ka mea mua e like me ka UDP ma luna o TCP, aia kēlā me kēia ʻeke i kahi helu kaʻina a me kahi crc
No ke aha e ʻeha loa ka heluhelu ʻana i nā pahu ma ke kaʻa?

Ma laila i kēia manawa ʻO TCP i 4 mau ʻano like ʻole:

  • Loohuuia
  • Kuwaena
  • padded intermediate
  • Full

ʻAe, Padded intermediate no MTProxy, ua hoʻohui ʻia kēia ma muli o nā hanana i ʻike ʻia. Akā, no ke aha ʻelua mau mana hou (ʻekolu i ka huina), inā hiki i kekahi ke hana? ʻOkoʻa nā mea ʻehā i ka hoʻonohonoho ʻana i ka lōʻihi a me ka uku o ka MTProto nui ponoʻī, e kūkākūkā hou ʻia:

  • ma Abridged he 1 a i ʻole 4 bytes akā ʻaʻole 0xef a laila kino
  • ma Intermediate he 4 bytes ka lōʻihi a me kahi kahua, a ʻo ka manawa mua e hoʻouna ai ka mea kūʻai aku 0xeeeeeeee e hoike mai he kuwaena
  • i piha, ka loa addictive, mai ka manaʻo o ka networker: lōʻihi, ka helu helu, a 'Aʻole ka mea i basically MTProto, kino, CRC32. ʻAe, ʻo kēia ma luna o TCP. Hāʻawi iā mākou i ka halihali hilinaʻi ma ke ʻano o ke kahawai serial o bytes, ʻaʻohe mea e pono ai, ʻoi aku ka checksums. ʻAe, i kēia manawa, e hōʻole ʻia wau he 16-bit checksum ka TCP, no laila e kū mai ka palaho ʻikepili. Maikaʻi, koe wale nō ka loaʻa ʻana o kahi protocol cryptographic me nā hashes ʻoi aku ka lōʻihi ma mua o 16 bytes, ʻo kēia mau hewa āpau - a ʻoi aku hoʻi - e hopu ʻia ma kahi SHA mismatch ma kahi kiʻekiʻe. ʻAʻohe wahi ma CRC32 ma luna o kēia.

E hoʻohālikelike kākou iā Abridged, kahi e hiki ai i hoʻokahi byte o ka lōʻihi, me Intermediate, e hōʻoiaʻiʻo ana "Inā pono ka alignment data 4-byte", he mea lapuwale loa ia. He aha, manaʻoʻiʻo ʻia nā mea hoʻolālā Telegram i hiki ʻole ke heluhelu i ka ʻikepili mai ke kumu i loko o kahi buffer aligned? Pono ʻoe e hana i kēia, no ka mea hiki i ka heluhelu ke hoʻihoʻi iā ʻoe i kekahi helu o nā bytes (a aia kekahi mau kikowaena proxy, no ka laʻana ...). A i ʻole, ma ka ʻaoʻao ʻē aʻe, no ke aha e pilikia ai me Abridged inā loaʻa iā mākou nā paddings hefty mai 16 bytes ma luna - mālama i 3 bytes kekahi manawa ?

Loaʻa ka manaʻo e makemake nui ʻo Nikolai Durov i ka hana ʻana i nā kaʻa, me nā protocols pūnaewele, me ka ʻole o ka pono maoli.

Nā koho kaʻa ʻē aʻe, incl. Pūnaewele a me MTProxy, ʻaʻole mākou e noʻonoʻo i kēia manawa, aia paha ma kahi pou ʻē aʻe, inā he noi. E hoʻomanaʻo wale mākou i kēia manawa e pili ana i kēia MTProxy ma hope koke o kona hoʻokuʻu ʻia ʻana ma 2018, ua aʻo koke nā mea hoʻolako e kāohi pono iā ia, i manaʻo ʻia no pākaʻi kaʻe, ma nui ʻeke! A ʻo ka ʻoiaʻiʻo hoʻi ʻo ka server MTProxy i kākau ʻia (e Waltman hou) ma C i pili pono ʻole i nā kikoʻī Linux, ʻoiai ʻaʻole i koi ʻia (e hōʻoia ʻo Phil Kulin), a ʻo kahi kikowaena like paha ma Go a ma Node.js kūpono ma lalo o hoʻokahi haneli laina.

Akā, e huki mākou i nā hopena e pili ana i ka ʻike loea o kēia poʻe ma ka hopena o ka pauku, ma hope o ka noʻonoʻo ʻana i nā pilikia ʻē aʻe. I kēia manawa, e neʻe kākou i ka papa 5th OSI, session - kahi i kau ai lākou i ka hālāwai MTProto.

Nā kī, nā memo, nā kau, Diffie-Hellman

Hoʻokomo lākou i laila ʻaʻole pololei loa ... ʻAʻole like ka hālāwai i ʻike ʻia ma ka interface ma lalo o Active sessions. Akā ma ka hoʻonohonoho.

ʻO ka hoʻohewa ʻana i ka protocol a me nā ala hoʻonohonoho o Telegram. Mahele 1, ʻenehana: ʻike i ke kākau ʻana i kahi mea kūʻai mai ka wā ʻōpala - TL, MT

Ma ʻaneʻi ua loaʻa iā mākou kahi kaula paita o ka lōʻihi i ʻike ʻia mai ka papa lawe. He memo i hoʻopili ʻia a i ʻole ka plaintext - inā mākou i ke kahua kūkākūkā koʻikoʻi a ke hana maoli nei mākou. ʻO wai ka pūʻulu manaʻo i kapa ʻia ʻo "kī" a mākou e kamaʻilio nei? E wehewehe kākou i kēia pilikia no ka hui Telegram ponoʻī (E kala mai au no ka unuhi ʻana i kaʻu palapala ponoʻī mai ka ʻōlelo Pelekania i ka lolo luhi ma ka hola 4 o ke kakahiaka, ʻoi aku ka maʻalahi o ka waiho ʻana i kekahi mau huaʻōlelo e like me ia):

ʻElua mau mea i kapa ʻia ahaolelo - hoʻokahi ma ka UI o nā mea kūʻai aku ma lalo o "nā kau o kēia manawa", kahi e pili ai kēlā me kēia kau i kahi hāmeʻa holoʻokoʻa / OS.
Ka lua - Kau MTProto, he helu kaʻina memo (ma ke ʻano haʻahaʻa haʻahaʻa) i loko, a ʻo ia hoʻi hiki ke mau ma waena o nā pilina TCP like ʻole. Hiki ke hoʻonohonoho ʻia kekahi mau kau MTProto i ka manawa like, no ka laʻana, e wikiwiki i ka hoʻoiho ʻana i nā faila.

Ma waena o kēia mau mea ʻelua kau ʻo ia ka manaʻo ka mana. I ka hihia degenerate, hiki i kekahi ke ʻōlelo i kēlā Kau UI ua like me ka manaAkā, he mea paʻakikī. Nānā mākou:

  • Hoʻopuka mua ka mea hoʻohana ma ka mea hou auth_key a hoʻopaʻa iā ia i ka helu, no ka laʻana, ma SMS - ʻo ia ke kumu ka mana
  • Ua hiki i loko o ka mua Kau MTProto, ka mea i loaʻa session_id iloko ou iho.
  • I kēia ʻanuʻu, ka hui ʻana ka mana и session_id hiki ke kapa ʻia mana - loaʻa kēia huaʻōlelo ma ka palapala a me ke code o kekahi mau mea kūʻai aku
  • A laila, hiki i ka mea kūʻai ke wehe nui Nā kau MTProto malalo o ka mea hookahi auth_key - i ka DC like.
  • A laila i kekahi lā pono ka mea kūʻai aku e noi i kahi faila mai kekahi DC - a no kēia DC e hana ʻia kahi mea hou auth_key !
  • E haʻi i ka ʻōnaehana ʻaʻole kēia he mea hoʻohana hou e hoʻopaʻa inoa, akā like ka mana (Kau UI), hoʻohana ka mea kūʻai aku i nā kelepona API auth.exportAuthorization i ka home DC auth.importAuthorization i ka DC hou.
  • ʻO nā mea like a pau, aia kekahi mau mea hāmama Nā kau MTProto (ʻo kēlā me kēia me kāna iho session_id) i keia DC hou, malalo kona auth_key.
  • ʻO ka mea hope loa, makemake paha ka mea kūʻai aku iā Perfect Forward Secrecy. ʻO kēlā me kēia auth_key e paʻa ' kī - no DC - a hiki i ka mea kūʻai ke kelepona auth.bindTempAuthKey no ka hoohana ana ? aiaiiuie auth_key - a eia hou, hoʻokahi wale nō temp_auth_key no DC, maʻamau i nā mea a pau Nā kau MTProto i keia DC.

Hoʻomaopopo paʻakai (a me na paakai e hiki mai ana) hookahi ma auth_key ka poe. kaʻana like i waena o nā mea a pau Nā kau MTProto i ka DC hookahi.

He aha ka manaʻo o "ma waena o nā pilina TCP like ʻole"? ʻO ia hoʻi kēia mea like kuki ʻae ma kahi pūnaewele - hoʻomau ʻia (ola ʻia) nā pilina TCP he nui i kēia kikowaena, akā i kekahi lā e hewa ia. ʻAʻole like me HTTP, ma MTProto, i loko o ka hālāwai, helu ʻia nā memo a hoʻopaʻa ʻia, komo lākou i ka tunnel, ua haki ka pilina - ma hope o ka hoʻokumu ʻana i kahi pilina hou, e hoʻouna ʻoluʻolu ke kikowaena i nā mea āpau i kēia kau ʻaʻole i hāʻawi ʻia i ka pili TCP mua.

Eia nō naʻe, ʻo ka ʻike ma luna nei he ʻokiʻoki ma hope o nā mahina he nui o ka litigation. I kēia manawa, ke hoʻokō nei mākou i kā mākou mea kūʻai mai ka wā kahiko? - e hoʻi kāua i ka hoʻomaka.

No laila, hana mākou auth_key ma nā mana o Diffie-Hellman mai Telegram. E ho'āʻo kākou e hoʻomaopopo i ka palapala...

Vasily, [19.06.18/20/05 1:255] data_with_hash := SHAXNUMX(ʻikepili) + ʻikepili + (kekahi bytes random); i like ka loa me XNUMX bytes;
encrypted_data := RSA(data_with_hash, server_public_key); Hoʻonui ʻia kahi helu 255-byte lōʻihi (nui endian) i ka mana koi ma luna o ka modulus koi, a mālama ʻia ka hopena ma ke ʻano he helu 256-byte.

Ua loaʻa iā lākou kahi DH dope

ʻAʻole like me ka DH o ke kanaka olakino
ʻAʻohe ʻelua kī lehulehu ma dx

ʻAe, i ka hopena, ua manaʻo mākou, akā ua mau ka sediment - kahi hōʻike o ka hana i hana ʻia e ka mea kūʻai aku ua hiki iā ia ke helu i ka helu. Ke ʻano o ka pale ʻana i nā hoʻouka kaua DoS. A hoʻohana wale ʻia ke kī RSA i hoʻokahi ʻaoʻao, no ka hoʻopili ʻana new_nonce. Akā ʻoiai e kūleʻa ana kēia hana maʻalahi, he aha kāu e kū ai?

Vasily, [20.06.18/00/26 XNUMX:XNUMX] ʻAʻole au i hiki i ka noi appid.

Ua hoʻouna au i kahi noi iā DH

A, ma ka dock ma ka lawe ʻana ua kākau ʻia e hiki ke pane me 4 bytes o ke code hewa. A ʻo ia nō

ʻAe, haʻi mai ʻo ia iaʻu -404, pehea?

Eia wau iā ia: "hopu i kāu efigna i hoʻopili ʻia me ke kī kikowaena me kahi manamana lima o kēlā a me kēia, makemake wau iā DH", a pane naʻaupō ia 404

He aha kou manaʻo no ia pane kikowaena? He aha ka hana? ʻAʻohe mea e nīnau (akā ʻoi aku ka nui o kēlā ma ka ʻāpana ʻelua).

Eia ka makemake a pau i ka dock e hana

ʻAʻohe aʻu mea ʻē aʻe e hana ai, moeʻuhane wale wau i ka hoʻohuli ʻana i nā helu i hope a i waho

ʻElua mau helu 32 bit. Hoʻopili wau iā lākou e like me nā mea ʻē aʻe

Akā ʻaʻole, ʻo kēia mau mea ʻelua āu e pono ai ma ka laina e like me BE

Vadim Goncharov, [20.06.18/15/49 404:XNUMX PM] a ma muli o kēia XNUMX?

Vasily, [20.06.18/15/49 XNUMX:XNUMX PM] ʻAe!

Vadim Goncharov, [20.06.18/15/50 XNUMX:XNUMX PM] no laila ʻaʻole maopopo iaʻu ka mea hiki iā ia ke "ʻike ʻole"

Vasily, [20.06.18 15:50] kokoke

ʻAʻole i loaʻa iaʻu kahi decomposition i loko o nā māhele maʻalahi%)

ʻAʻole i mākaukau ka hōʻike hewa

ʻO Vasily, [20.06.18/20/18 5:XNUMX PM] ʻŌ, aia kekahi MDXNUMX. ʻEkolu mau hashes ʻokoʻa

Ua helu ʻia ka manamana lima kī penei:

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

SHA1 a me sha2

No laila e hoʻokomo auth_key 2048 bits i ka nui i loaʻa iā mākou e like me Diffie-Hellman. He aha ka hope? A laila ʻike mākou ʻaʻole hoʻohana ʻia nā ʻāpana haʻahaʻa 1024 o kēia kī ma kekahi ʻano ... akā e noʻonoʻo kākou i kēia no kēia manawa. Ma kēia ʻanuʻu, loaʻa iā mākou kahi huna huna me ke kikowaena. Ua hoʻokumu ʻia kahi analogue o kahi hālāwai TLS, kahi kaʻina hana nui loa. Akā ʻaʻole ʻike ke kikowaena i kekahi mea e pili ana iā mākou i kēia manawa! ʻAʻole i kēia manawa, ʻoiaʻiʻo mana ʻae. ʻO kēlā mau. inā ʻoe i noʻonoʻo ma ke ʻano o ka "login-password", e like me ka mea ma mua ma ICQ, a i ʻole "login-key", e like me SSH (no ka laʻana, ma kekahi gitlab / github). Loaʻa iā mākou ka inoa ʻole. A inā e pane mai ke kikowaena iā mākou "ua lawelawe ʻia kēia mau helu kelepona e kekahi DC"? A i ʻole "ua pāpā ʻia kāu helu kelepona"? ʻO ka mea maikaʻi loa e hiki iā mākou ke hana, ʻo ia ka mālama ʻana i ke kī me ka manaʻolana e hoʻohana mau ʻia a ʻaʻole e popopo ia manawa.

Ma ke ala, ua "loaʻa" iā mākou me ka mālama ʻana. No ka laʻana, ke hilinaʻi nei mākou i ke kikowaena? He hoʻopunipuni ʻo ia? Pono mākou i nā loiloi cryptographic:

Vasily, [21.06.18/17/53 2:XNUMX PM] Hāʻawi lākou i nā mea kūʻai kelepona e nānā i kahi helu XNUMXkbit no ka maʻalahi%)

Aole nae i akaka iki, nafeijoa

Vasily, [21.06.18/18/02 XNUMX:XNUMX] ʻAʻole ʻōlelo ka dock i ka mea e hana ai inā ʻaʻole maʻalahi ia.

ʻAʻole i ʻōlelo ʻia. E ʻike kākou i ka hana a ka mea kūʻai aku no ka Android ma kēia hihia? A ʻo ia ka mea (a ʻae, hoihoi ka faila holoʻokoʻa ma laila) - e like me kā lākou e ʻōlelo nei, e waiho wale wau ma aneʻi:

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

ʻAʻole, ʻoiaʻiʻo ma laila kekahi aia nā mākaʻikaʻi no ka maʻalahi o kahi helu, akā noʻu iho, ʻaʻole lawa ka ʻike ma ka makemakika.

ʻAe, loaʻa iā mākou ke kī nui. To log in, i.e. e hoʻouna i nā noi, pono e hana hou i ka hoʻopili ʻana, me ka hoʻohana ʻana iā AES.

Ua wehewehe ʻia ke kī memo ma ke ʻano he 128 waena waena o ka SHA256 o ke kino memo (me ka session, memo ID, a me nā mea ʻē aʻe), me ka padding bytes, prepended e 32 bytes i lawe ʻia mai ke kī ʻae.

ʻO Vasily, [22.06.18/14/08 XNUMX:XNUMX PM] ʻO nā uʻi maʻamau

Loaʻa auth_key. ʻO nā mea a pau. Ma waho aʻe o lākou ... ʻaʻole maopopo mai nā uapo. E ʻoluʻolu e aʻo i ka code open source.

E hoʻomanaʻo ʻo MTProto 2.0 e koi ana mai 12 a 1024 bytes o ka padding, e pili ana i ke ʻano e puʻunaue ʻia ka lōʻihi o ka memo e 16 bytes.

No laila, ehia ka nui o ka padding e hoʻokomo ai?

A ʻae, eia hoʻi, 404 inā he hewa

Inā nānā pono kekahi i ke kiʻikuhi a me ka kikokikona o ka palapala, ʻike ʻo ia ʻaʻohe MAC ma laila. A hoʻohana ʻia kēlā AES i kekahi ʻano IGE i hoʻohana ʻole ʻia ma kahi ʻē aʻe. ʻO lākou, ʻoiaʻiʻo, kākau e pili ana iā ia i kā lākou FAQ ... Eia, e like me ke kī memo i ka manawa like i ka SHA hash o ka ʻikepili decrypted i hoʻohana ʻia e nānā i ka pono - a i ka hihia o kahi mismatch, nā palapala no Manaʻo kekahi kumu e haʻalele ʻole iā lākou (akā pehea e pili ana i ka palekana, e uhaʻi koke iā mākou?).

ʻAʻole wau he cryptographer, malia paha ma kēia ʻano i kēia hihia ʻaʻohe hewa mai kahi manaʻo theoretical. Akā hiki iaʻu ke inoa i kahi pilikia kūpono, me ka hoʻohana ʻana i ka laʻana o Telegram Desktop. Hoʻopili ia i ka cache kūloko (kēia mau D877F783D5D3EF8C) ma ke ʻano like me nā memo ma MTProto (ma kēia hihia wale nō, version 1.0), ʻo ia hoʻi. mua i ke kī memo, a laila ʻo ka ʻikepili ponoʻī (a ma kahi ʻē aʻe ka nui nui auth_key 256 bytes, me ka ʻole msg_key mea ole). No laila, ʻike ʻia ka pilikia ma nā faila nui. ʻO ia hoʻi, pono ʻoe e mālama i ʻelua kope o ka ʻikepili - hoʻopili ʻia a decrypted. A inā he megabytes, a i ʻole ke kahe wikiō, e laʻa? A me MTProto pono ʻoe ma ka mua hoʻopili a hoʻokaʻawale paha i ka memo holoʻokoʻa, a laila e hoʻoili iā ia i ka pūnaewele a i ʻole ka disk. No laila, i nā mana hou o Telegram Desktop i loko o ka cache user_data ua hoʻohana mua ʻia kekahi ʻano - me AES ma ke ʻano CTR.

ʻO Vasily, [21.06.18/01/27 20:XNUMX AM] ʻAe, ua ʻike au i ke ʻano o ka IGE: ʻo IGE ka hoʻāʻo mua ma kahi "mode hoʻopono hōʻoia," no Kerberos. He hoʻāʻo ʻole ia (ʻaʻole ia e hāʻawi i ka pale pono), a pono e wehe ʻia. ʻO ia ka hoʻomaka ʻana o kahi ʻimi XNUMX makahiki no kahi ʻano hoʻopunipuni hōʻoia e hana ana, i hoʻopau ʻia i nā ʻano like me OCB a me GCM.

A i kēia manawa nā hoʻopaʻapaʻa mai ka ʻaoʻao kaʻa:

ʻO ka hui ma hope o Telegram, alakaʻi ʻia e Nikolai Durov, he ʻeono mau poʻokela ACM, ʻo ka hapalua o lākou Ph.D ma ka makemakika. Ua lawe iā lākou ma kahi o ʻelua makahiki e ʻōwili i ka mana o kēia manawa o MTProto.

He aha ka mea ʻakaʻaka. ʻElua makahiki i ka pae haʻahaʻa

A i ʻole hiki iā mākou ke lawe i nā tls

ʻAe, e ʻōlelo mākou ua hana mākou i ka hoʻopunipuni a me nā nuances ʻē aʻe. Hiki iā mākou ke hoʻouna hope i nā noi TL-serialized a me nā pane deserialize? No laila he aha ka mea e hoʻouna ʻia a pehea? Eia ke ʻano initConnectionʻo ia paha kēia?

Vasily, [25.06.18/18/46 XNUMX:XNUMX PM] Hoʻomaka ka pilina a mālama i ka ʻike ma ka mea hoʻohana a me ka noi.

ʻAe ia i ka app_id, device_model, system_version, app_version a me lang_code.

A me kekahi ninau

Nā palapala e like me nā manawa a pau. E ʻoluʻolu e aʻo i ke kumu hāmama

Inā maopopo loa nā mea āpau me ka invokeWithLayer, a laila he aha ia? ʻIke ʻia inā loaʻa iā mākou - ua loaʻa i ka mea kūʻai aku kahi mea e nīnau ai i ke kikowaena - aia kahi noi a mākou i makemake ai e hoʻouna:

ʻO Vasily, [25.06.18/19/13 XNUMX:XNUMX] Ma ka hoʻoholo ʻana ma ke code, ua uhi ʻia ke kelepona mua i kēia ʻōpala, a ʻo ka ʻōpala ponoʻī i loko o ka invokewithlayer.

No ke aha i hiki ʻole ai i ka initConnection ke kelepona ʻokoʻa, akā pono e hoʻopili? ʻAe, e like me ka mea i ʻike ʻia, pono e hana ʻia i kēlā me kēia manawa i ka hoʻomaka ʻana o kēlā me kēia kau, ʻaʻole hoʻokahi manawa, e like me ke kī nui. Akā! ʻAʻole hiki ke kāhea ʻia e ka mea hoʻohana ʻole! Eia mākou i hōʻea i ke kahua e pili ai ʻO kēia palapala palapala - a ke haʻi mai nei iā mākou ...

Loaʻa kahi ʻāpana liʻiliʻi o nā ala API i nā mea hoʻohana ʻae ʻole:

  • auth.sendCode
  • auth.resendCode
  • account.getPassword
  • auth.checkPassword
  • auth.checkPhone
  • auth.signUp
  • auth.signIn
  • mana.importAuthorization
  • kōkua.getConfig
  • help.getNearestDc
  • help.getAppUpdate
  • kōkua.getCdnConfig
  • langpack.getLangPack
  • langpack.getStrings
  • langpack.getDifference
  • langpack.get Language
  • langpack.getLanguage

ʻO ka mua loa o lākou auth.sendCode, a aia kēlā noi waiwai nui a mākou e hoʻouna aku ai i ka api_id a me api_hash, a ma hope iho e loaʻa iā mākou kahi SMS me kahi code. A inā i loaʻa iā mākou i ka DC hewa (ua lawelawe ʻia nā helu kelepona o kēia ʻāina e kekahi, no ka laʻana), a laila e loaʻa iā mākou kahi hewa me ka helu o ka DC i makemake ʻia. No ka ʻike ʻana i ka leka uila IP e pono ai mākou e hoʻopili i ka helu DC, e kōkua ʻia mākou e help.getConfig. I ka manawa he 5 wale nō nā mea komo, akā ma hope o nā hanana kaulana o 2018, ua piʻi nui ka helu.

I kēia manawa, e hoʻomanaʻo kākou ua loaʻa iā mākou i kēia pae ma ka kikowaena inoa ʻole. ʻAʻole anei he pipiʻi loa ka loaʻa ʻana o kahi helu IP? No ke aha e hana ʻole ai i kēia, a me nā hana ʻē aʻe, ma ka ʻāpana unencrypted o MTProto? Lohe au i kahi kūʻē: "pehea ʻoe e hōʻoia ai ʻaʻole ʻo RKN ka mea e pane me nā ʻōlelo hoʻopunipuni?". Hoʻomanaʻo mākou i kēia, ʻoiaʻiʻo, i nā mea kūʻai aku nā kī RSA i hoʻokomo ʻia, i.e. hiki wale iā ʻoe hōʻailona keia ike. ʻOiaʻiʻo, ua hana ʻia kēia no ka ʻike e pili ana i ka pale ʻana i nā laka i loaʻa i nā mea kūʻai aku ma o nā ala ʻē aʻe (pono ʻaʻole hiki ke hana i kēia ma MTProto ponoʻī, no ka mea pono ʻoe e ʻike i kahi e hoʻopili ai).

OK. I kēia manawa o ka mana o ka mea kūʻai aku, ʻaʻole mākou i ʻae ʻia a ʻaʻole i hoʻopaʻa inoa i kā mākou noi. Makemake mākou e ʻike i kēia manawa i ka pane ʻana o ke kikowaena i nā ala i loaʻa i kahi mea hoʻohana ʻole. A maanei…

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;

Ma ka papahana, hiki mai ka mua, hiki mai ka lua

Ma ka papahana tdesktop, ʻo ke kolu o ka waiwai

ʻAe, mai ia manawa, ʻoiaʻiʻo, ua hōʻano hou ʻia ka palapala. ʻOiai hiki ke lilo i mea pili ʻole. A pehea e ʻike ai ka mea hoʻomohala hou? Malia paha inā hoʻopaʻa inoa ʻoe i kāu noi, e haʻi lākou iā ʻoe? Ua hana ʻo Vasily i kēia, akā naʻe, ʻaʻohe mea i hoʻouna ʻia iā ia (eia hou, e kamaʻilio mākou e pili ana i kēia ma ka ʻāpana ʻelua).

... Ua ʻike ʻoe ua neʻe mua mākou i ka API, ʻo ia hoʻi. i ka pae aʻe a hala kekahi mea ma ke kumuhana MTProto? ʻAʻohe mea kupanaha:

ʻO Vasily, [28.06.18/02/04 2:XNUMX AM] Mm, ke ʻimi nei lākou i kekahi o nā algorithms ma eXNUMXe

Hōʻike ʻo Mtproto i nā algorithm encryption a me nā kī no nā kāʻei kapu ʻelua, a me kahi ʻāpana o kahi ʻano wīwī.

Akā, hoʻohui mau lākou i nā pae hoʻopaʻa like ʻole, no laila ʻaʻole maopopo i ka manawa i pau ai ka mtproto a hoʻomaka ka pae aʻe.

Pehea ko lakou huikau ana? ʻAe, eia ke kī pōkole like no PFS, no ka laʻana (ma ke ala, ʻaʻole ʻike ʻo Telegram Desktop pehea e hana ai). Hoʻokō ʻia e kahi noi API auth.bindTempAuthKey, i.e. mai ka papa luna. Akā i ka manawa like, hoʻopilikia ia i ka hoʻopunipuni ma ka pae haʻahaʻa - ma hope o ia, no ka laʻana, pono ʻoe e hana hou. initConnection etc., aole keia pololei noi maʻamau. Hoʻokaʻawale, hāʻawi pū ia hiki iā ʻoe ke loaʻa hoʻokahi kī pōkole wale nō ma ka DC, ʻoiai ke kahua auth_key_id i kēlā me kēia memo e ʻae iā ʻoe e hoʻololi i ke kī ma ka liʻiliʻi loa i kēlā me kēia memo, a he kuleana ko ke kikowaena e "poina" i ke kī pōkole i kēlā me kēia manawa - he aha ka mea e hana ai i kēia hihia, ʻaʻole ʻōlelo ka palapala ... ʻAʻole hiki ke loaʻa i nā kī he nui, e like me ka hoʻonohonoho o nā paʻakai e hiki mai ana, akā ?..

Aia kekahi mau mea ʻē aʻe e ʻike ʻia ma ke kumuhana MTProto.

Nā memo memo, msg_id, msg_seqno, hōʻoia, pings ma ka ʻaoʻao hewa a me nā ʻano ʻē aʻe.

No ke aha e pono ai ʻoe e ʻike e pili ana iā lākou? No ka mea "leak" lākou i kahi pae kiʻekiʻe, a pono ʻoe e ʻike e pili ana iā lākou i ka wā e hana pū ai me ka API. Inā ʻaʻole mākou makemake i msg_key, ua hoʻokaʻawale ka pae haʻahaʻa i nā mea āpau no mākou. Akā, i loko o ka ʻikepili decrypted, loaʻa iā mākou nā māla aʻe (ʻo ka lōʻihi o ka ʻikepili e ʻike ai i kahi o ka padding, akā ʻaʻole ia he mea nui):

  • paakai-int64
  • session_id - int64
  • message_id - int64
  • seq_no-int32

E hoʻomanaʻo ʻo ia ka paʻakai no ka DC holoʻokoʻa. No ke aha e ʻike ai? ʻAʻole wale no ka mea aia kahi noi get_future_salts, e haʻi ana i nā wā āpau e kūpono, akā no ka mea, inā "popopo" kāu paʻakai, a laila e nalowale ka leka (noi). E hōʻike ana ke kikowaena i ka paʻakai hou ma ka hoʻopuka ʻana new_session_created - akā me ka mea kahiko, pono ʻoe e hoʻouna hou, no ka laʻana. A pili kēia nīnau i ka hoʻolālā o ka noi.

Ua ʻae ʻia ke kikowaena e hoʻokuʻu i nā kau a pane i kēia ala no nā kumu he nui. ʻOiaʻiʻo, he aha kahi hālāwai MTProto mai ka ʻaoʻao o ka mea kūʻai aku? ʻElua kēia mau helu session_id и seq_no nā memo i loko o kēia kau. ʻAe, a me ka pilina TCP lalo, ʻoiaʻiʻo. E ʻōlelo mākou ʻaʻole maopopo i kā mākou mea kūʻai aku pehea e hana ai i nā mea he nui, ʻoki ʻia, pili hou. Inā hiki koke kēia - hoʻomau ka kau kahiko i ka pilina TCP hou, hoʻonui seq_no hou aku. Inā lōʻihi ka manawa, hiki i ke kikowaena ke hoʻopau iā ia, no ka mea ma kona ʻaoʻao he pila pū kekahi, e like me kā mākou i ʻike ai.

He aha ka pono seq_no? ʻŌ, he nīnau paʻakikī kēlā. E ho'āʻo e hoʻomaopopo pono i ka manaʻo:

Memo pili maʻiʻo

He memo e koi ana i ka ʻae ʻike. Hoʻopili kēia i nā mea hoʻohana āpau a me nā memo lawelawe he nui, kokoke i nā mea āpau koe wale nō nā ipu a me nā hoʻomaikaʻi.

Helu kaʻina memo (msg_seqno)

He helu 32-bit e like me ka pālua o ka helu o nā memo "pili i ka maʻiʻo" (ʻo ka poʻe e koi ana i ka hōʻoia ʻana, a me nā mea ʻaʻole nā ​​ipu) i hana ʻia e ka mea hoʻouna ma mua o kēia memo a ma hope e hoʻonui ʻia e hoʻokahi inā he memo kēia. memo pili ma loko. Hoʻokumu mau ʻia kahi pahu ma hope o kāna mau mea āpau; no laila, ua oi aku ka nui o kona kaina ma mua o a i like paha me na huahelu o na memo i loko.

He aha ke ʻano o ka circus me ka piʻi ʻana o 1, a laila 2? ua hiki ke hoouna ia nui nā hōʻoia i loaʻa like seq_no! Pehea? ʻAe, no ka laʻana, hoʻouna ke kikowaena iā mākou i kekahi mea, hoʻouna, a ʻo mākou iho e noho mālie, pane wale mākou me nā leka hōʻoia lawelawe e pili ana i ka loaʻa ʻana o kāna mau leka. I kēia hihia, loaʻa i kā mākou mau hōʻoia puka i ka helu puka like. Inā kamaʻāina ʻoe i ka TCP a manaʻo ʻoe he ʻano pupule kēia, akā ʻaʻole ia he hihiu loa, no ka mea ma TCP seq_no ʻaʻole loli, a hele ka hōʻoia i seq_no ʻo kēlā ʻaoʻao - a laila wikiwiki wau e huhū. Ke hele mai nei nā hōʻoia i MTProto ʻAʻole ma seq_no, e like me ka TCP, akā msg_id !

He aha kēia msg_id, ka mea nui o keia mau kahua? ʻO ka ID kūʻokoʻa o ka memo, e like me ka inoa. Ua wehewehe ʻia he helu 64-bit, ʻo nā ʻāpana liʻiliʻi loa i loaʻa hou i ka server-not-server magic, a ʻo ke koena he timestamp Unix, me ka hapa haʻihaʻi, neʻe i 32 mau bits i ka hema. ʻO kēlā mau. timestamp per se (a e hōʻole ʻia nā memo me nā manawa like ʻole e ke kikowaena). Mai kēia mea i hoʻololiʻia, ma keʻano laulā, he mea hōʻailona kēia no ka mea kūʻai. ʻOiai - e hoʻomanaʻo session_id - ua hōʻoia ʻia mākou: ʻAʻole hiki ke hoʻouna ʻia kahi leka i manaʻo ʻia no hoʻokahi kau i kahi kau ʻokoʻa. ʻO ia hoʻi, ua ʻike ʻia aia nō ekolu pae — session, session number, message id. No ke aha ka hoʻopiʻi nui ʻana, nui loa kēia mea pohihihi.

A pēlā, msg_id pono no…

RPC: noi, pane, hewa. Nā hōʻoia.

E like me kāu i ʻike ai, ʻaʻohe ʻano kūikawā a i ʻole hana "hana i kahi noi RPC" ma nā wahi āpau o ka schema, ʻoiai aia nā pane. Ma hope o nā mea a pau, loaʻa iā mākou nā memo pili i ka ʻike! ʻo ia, kekahi hiki i ka memo ke noi! ʻAʻole paha. Ma hope o nā mea āpau, pakahi ka mea msg_id. A eia nā pane.

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

ʻO kēia kahi i hōʻike ʻia i ka leka hea kēia pane. No laila, ma ka pae kiʻekiʻe o ka API, pono ʻoe e hoʻomanaʻo i ka helu i loaʻa i kāu noi - manaʻo wau ʻaʻole pono e wehewehe i ka hana asynchronous, a hiki i kekahi mau noi i ka manawa like, nā pane i hiki ke hoʻihoʻi ʻia i kekahi kauoha? Ma ke kumu, mai kēia, a me nā memo hewa e like me nā mea hana ʻole, hiki ke ʻike ʻia ka hale hoʻolālā ma hope o kēia: ʻo ke kikowaena e mālama ana i kahi pilina TCP me ʻoe he mea kaulike mua, kuhikuhi ia i nā noi i nā hope a hōʻiliʻili iā lākou ma hope. message_id. Me he mea lā ua maopopo, kūpono a maikaʻi ma ʻaneʻi.

ʻAe?.. A inā ʻoe e noʻonoʻo ai? Ma hope o nā mea a pau, ʻo ka pane RPC ponoʻī he kahua pū kekahi msg_id! Pono mākou e kāhea aku i ke kikowaena "ʻaʻole ʻoe e pane mai i kaʻu pane!"? A ʻae, he aha ka mea e pili ana i ka hōʻoia? E pili ana i ka ʻaoʻao nā memo e pili ana i nā memo haʻi mai iā mākou i ka mea

msgs_ack#62d6b459 msg_ids:Vector long = MsgsAck;

a na kela aoao keia aoao e hana. ʻAʻole naʻe i nā manawa a pau! Inā loaʻa iā ʻoe kahi RpcResult, lilo ia i hōʻoia iā ia iho. ʻO ia, hiki i ke kikowaena ke pane i kāu noi me MsgsAck - e like me, "Ua loaʻa iaʻu." Hiki ke pane koke iā RpcResult. Hiki iā lāua ʻelua.

A ʻae, pono ʻoe e pane i ka pane! Hōʻoiaʻiʻo. A i ʻole, e noʻonoʻo ke kikowaena ʻaʻole i hoʻouna ʻia a hoʻolei hou iā ʻoe. ʻOiai ma hope o ka hoʻohui hou ʻana. Eia naʻe, ʻoiaʻiʻo, e kū mai ka nīnau no ka manawa. E nānā kākou iā lākou ma hope iki.

I kēia manawa, e noʻonoʻo kākou i nā hewa i ka hoʻokō ʻana i ka nīnau.

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

ʻAe, e hoʻōho kekahi, eia kahi ʻano kanaka ʻoi aku - aia kahi laina! Hoʻomanawanui i ka hana. Eia papa inoa o na hewaakā ʻaʻole i pau. Mai ia mea mākou e aʻo ai ʻo ke code ʻo − mea like ʻO nā hewa HTTP (ʻoiaʻiʻo, ʻaʻole i mahalo ʻia nā semantics o nā pane, ma kekahi mau wahi ua puʻunaue ʻia lākou e nā code ma ke ʻano ʻole), a ua like ke kaula. CAPITAL_LETTERS_AND_NUMBERS. No ka laʻana, PHONE_NUMBER_OCCUPIED a i ʻole FILE_PART_X_MISSING. ʻAe, ʻo ia hoʻi, pono ʻoe i kēia laina ʻōlelo ʻōlelo. Eia kekahi laʻana FLOOD_WAIT_3600 ʻo ia hoʻi, pono ʻoe e kali i hoʻokahi hola, a PHONE_MIGRATE_5e hoʻopaʻa inoa ʻia ka helu kelepona me kēia prefix ma ka 5th DC. He ʻano ʻōlelo kā mākou, ʻeā? ʻAʻole pono mākou i ka hoʻopaʻapaʻa mai ke kaula, e hana nā ʻōlelo maʻamau, cho.

Eia hou, ʻaʻole kēia ma ka ʻaoʻao memo lawelawe, akā, e like me ka mea maʻamau me kēia papahana, hiki ke loaʻa ka ʻike. ma kekahi palapala palapala. ʻO hoʻāla i ka kānalua. ʻO ka mea mua, e nānā i ka hewa o ke kikokiko ʻana/nā papa - RpcError hiki ke hoʻokomo i loko RpcResult. No ke aha i waho? He aha kā mākou i noʻonoʻo ʻole ai?.. No laila, aia i hea ka hōʻoia RpcError ʻaʻole hiki ke hoʻokomo i loko RpcResult, akā pololei a pūnana paha i kekahi ʻano ʻē aʻe? nele req_msg_id ? ..

Akā e hoʻomau kākou e pili ana i nā memo lawelawe. Manaʻo paha ka mea kūʻai aku e noʻonoʻo ana ke kikowaena no ka manawa lōʻihi, a hana i kahi noi maikaʻi loa:

rpc_drop_answer#58e4a740 req_msg_id:long = RpcDropAnswer;

ʻEkolu mau pane hiki iā ia, e hui hou me ka mīkini hōʻoia, e hoʻāʻo e hoʻomaopopo i ka mea e pono ai lākou (a he aha ka papa inoa o nā ʻano ʻaʻole pono e hōʻoia i ka laulā), waiho ʻia ka mea heluhelu e like me ka haʻawina home (nota: ka ʻAʻole i pau ka ʻike ma nā kumu Telegram Desktop).

Hoʻohui: Nā kūlana memo

Ma ka laulā, nui nā wahi ma TL, MTProto a me Telegram ma ke ʻano maʻamau e waiho i kahi manaʻo paʻakikī, akā ma waho o ka politeness, tact a me nā mea ʻē aʻe. nā mākaukau loea Ua noho mālie mākou no ia mea, a ua hoʻopaʻa ʻia nā mea ʻino i loko o nā kūkākūkā. Eia naʻe, kēia wahiОka hapa nui o ka ʻaoʻao e pili ana nā memo e pili ana i nā memo ʻO ia ka mea e haʻalulu ai iaʻu, ka mea i hana me nā protocols pūnaewele no ka manawa lōʻihi a ua ʻike i nā kaʻa kaʻa like ʻole o ka curvature.

Hoʻomaka ia me ka ʻole, me nā hōʻoia. A laila, haʻi ʻia mai iā mākou

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;

ʻAe, ʻo ka poʻe a pau e hoʻomaka e hana me MTProto e kū pono iā lākou, i ke kaʻina "hoʻoponopono - hoʻohui hou - hoʻokuʻu ʻia", ʻo ka loaʻa ʻana o nā hewa helu a i ʻole ka paʻakai i pala i ka wā hoʻoponopono he mea maʻamau. Eia naʻe, ʻelua mau wahi ma ʻaneʻi:

  1. Ua nalowale ka memo kumu. Pono mākou e pā i kekahi mau pila, e noʻonoʻo mākou i kēia ma hope.
  2. He aha kēlā mau helu kuhi hewa? 16, 17, 18, 19, 20, 32, 33, 34, 35, 48, 64... auhea ke koena o na helu, e Tommy?

Hōʻike ka palapala:

ʻO ka manaʻo e hui pū ʻia nā helu error_code (error_code >> 4): no ka laʻana, pili nā code 0x40 - 0x4f i nā hewa i ka decomposition ipu.

akā, ʻo ka mea mua, he neʻe i ka ʻaoʻao ʻē aʻe, a ʻo ka lua, ʻaʻole ia he mea nui i hea ke koena o nā code? Ma ke poʻo o ka mea kākau?.. He mau mea liʻiliʻi naʻe kēia.

Hoʻomaka ka addiction i nā memo kūlana post a me nā kope kope:

  • Noi no ka ʻike kūlana memo
    Inā ʻaʻole i loaʻa i kēlā me kēia ʻaoʻao ka ʻike e pili ana i ke kūlana o kāna mau memo i waho no kekahi manawa, hiki iā ia ke noi pololei mai ia ʻaoʻao:
    msgs_state_req#da69fb52 msg_ids:Vector long = MsgsStateReq;
  • ʻŌlelo ʻike e pili ana i ke kūlana o nā memo
    msgs_state_info#04deb57d req_msg_id:long info:string = MsgsStateInfo;
    Eia, info he kaula i loaʻa hoʻokahi paita o ke kūlana memo no kēlā me kēia memo mai ka papa inoa msg_ids e hiki mai ana:

    • 1 = ʻaʻohe mea i ʻike e pili ana i ka memo (msg_id haʻahaʻa loa, poina paha ka ʻaoʻao)
    • 2 = ʻaʻole i loaʻa ka memo (ua hāʻule ʻo msg_id i loko o ka laulā o nā mea hōʻike i mālama ʻia; akā naʻe, ʻaʻole i loaʻa i ka ʻaoʻao kekahi memo e like me ia)
    • 3 = ʻaʻole i loaʻa ka memo (msg_id kiʻekiʻe loa; akā naʻe, ʻaʻole i loaʻa i kekahi ʻaoʻao)
    • 4 = memo i loaʻa (e hoʻomaopopo i kēia pane i ka manawa like me kahi hōʻoia hōʻoia)
    • +8 = ua ʻae ʻia ka memo
    • +16 = memo ʻaʻole koi i ka ʻae
    • +32 = Nīnau RPC i loko o ka memo e hana ʻia a hoʻopau ʻia paha
    • +64 = pane pili i ka ʻike i ka memo i hana mua ʻia
    • +128 = ua ʻike maoli kekahi ʻaoʻao ua loaʻa ka leka
      ʻAʻole pono kēia pane i kahi hōʻoia. He hōʻoia ia o ka msgs_state_req pili, i loko a nona iho.
      E hoʻomaopopo inā ʻike koke ʻia ʻaʻole i loaʻa i ka ʻaoʻao kahi memo e like me ka mea i hoʻouna ʻia iā ia, hiki ke hoʻouna hou ʻia ka leka. ʻOiai inā loaʻa i ka ʻaoʻao ʻelua kope o ka memo i ka manawa like, e nānā ʻole ʻia ke kope. (Inā lōʻihi ka manawa i hala, a ʻaʻole i kūpono ka msg_id kumu, pono e hoʻopili ʻia ka leka me msg_copy).
  • Kūkākūkā manawaleʻa o ke kūlana o nā leka
    Hiki i kēlā me kēia ʻaoʻao ke haʻi manawaleʻa i ka ʻaoʻao ʻē aʻe i ke kūlana o nā leka i hoʻouna ʻia e kēlā ʻaoʻao.
    msgs_all_info#8cc0d131 msg_ids:Vector long info:string = MsgsAllInfo
  • Hoʻonui ʻia ke kamaʻilio manawaleʻa o ke kūlana o hoʻokahi leka
    ...
    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;
  • Noi Akaka e hoʻouna hou i nā memo
    msg_resend_req#7d861a08 msg_ids:Vector long = MsgResendReq;
    Ua pane koke ka ʻaoʻao mamao ma ka hoʻouna hou ʻana i nā leka i noi ʻia […]
  • Noi Akaka e hoʻouna hou i nā pane
    msg_resend_ans_req#8610baeb msg_ids:Vector long = MsgResendReq;
    E pane koke ka ʻaoʻao mamao ma ka hoʻouna hou ʻana pane i nā memo i noi ʻia […]
  • Kope memo
    I kekahi mau kūlana, pono e hoʻouna hou ʻia kahi memo kahiko me ka msg_id ʻaʻole kūpono. A laila, wahī ʻia i loko o kahi pahu kope:
    msg_copy#e06046b2 orig_message:Message = MessageCopy;
    I ka wā i loaʻa mai ai, e hana ʻia ka memo me he mea lā ʻaʻole i laila ka mea wahī. Eia nō naʻe, inā ʻike maopopo ʻia ua loaʻa ka memo orig_message.msg_id, a laila ʻaʻole i hana ʻia ka memo hou (ʻoiai i ka manawa like, ua ʻae ʻia ʻo ia a me orig_message.msg_id). Pono e emi ka waiwai o orig_message.msg_id ma mua o ka msg_id o ka ipu.

E noho hamau kakou no ka mea i loko msgs_state_info hou, na pepeiao o ka TL pau ole i waho (makemake mākou i ka vector o bytes, a ma ka lalo elua bit o enum, a me na kahiko bit hae). He mea ʻē aʻe ka manaʻo. ʻIke paha kekahi i ke kumu o kēia mau mea i ka hana i ka mea kūʻai maoli pono?.. Me ka paʻakikī, akā, hiki iā ʻoe ke noʻonoʻo i kekahi pōmaikaʻi inā hana ke kanaka i ka debugging, a ma ke ʻano interactive - e nīnau i ke kikowaena he aha a pehea. Akā ua wehewehe ʻia nā noi ma aneʻi huakaʻi puni.

Ma muli o kēia ʻaʻole pono i kēlā me kēia ʻaoʻao e hoʻopili wale a hoʻouna i nā leka, akā mālama pū kekahi i nā ʻikepili e pili ana iā lākou, e pili ana i nā pane iā lākou, a no kahi manawa ʻike ʻole. ʻAʻole wehewehe ka palapala i nā manawa a i ʻole ka hoʻohana pono ʻana o kēia mau hiʻohiʻona. ʻaʻohe ala. ʻO ka mea kupanaha loa, ua hoʻohana maoli ʻia lākou i ke code o nā mea kūʻai aku! ʻIke ʻia, ua haʻi ʻia iā lākou kahi mea i hoʻokomo ʻole ʻia i loko o ka palapala wehe. Hoʻomaopopo mai ke code ke kumu, ʻaʻole i maʻalahi e like me ka TL - ʻaʻole kēia he (comparatively) logically isolated part, akā he ʻāpana i hoʻopaʻa ʻia i ka hoʻolālā noi, ʻo ia. e koi nui aku i ka manawa e hoʻomaopopo i ke code noi.

Pings a me nā manawa. Nā lālani.

Mai nā mea a pau, inā e hoʻomanaʻo ʻoe i nā kuhi e pili ana i ka hoʻolālā kikowaena (ka hāʻawi ʻana i nā noi ma nā ʻaoʻao hope), he mea ʻino loa ia - ʻoiai nā hōʻoia āpau o ka lawe ʻana ma TCP (ua hāʻawi ʻia ka ʻikepili, a i ʻole e ʻike ʻia ʻoe e pili ana i ka haʻihaʻi, akā e hāʻawi ʻia ka ʻikepili a hiki i ka manawa o ka pilikia), ʻo nā hōʻoia i MTProto ponoʻī - ʻaʻohe mea hōʻoia. Hiki i ke kikowaena ke nalo a kiola paha i kāu leka, ʻaʻohe mea e hiki ke hana no ia mea, no ka paʻa ʻana i nā koʻokoʻo o nā ʻano like ʻole.

A ʻo ka mea mua - nā queues memo. ʻAe, no ka mea hoʻokahi, ua maopopo nā mea āpau mai ka hoʻomaka ʻana - pono e mālama ʻia kahi leka i hoʻopaʻa ʻole ʻia. A ma hope o ka manawa hea? A ʻike ʻo ia iā ia. Hiki paha i kēlā mau leka lawelawe addict ke hoʻoponopono i kēia pilikia me nā koʻokoʻo, e ʻōlelo, ma Telegram Desktop aia ma kahi o 4 queues e pili ana iā lākou (ʻoi aku paha, e like me ka mea i ʻōlelo ʻia, no kēia mea pono ʻoe e komo i loko o kāna code a me ka hoʻolālā ʻana. manawa, ʻike mākou ʻaʻole hiki ke lawe ʻia ma ke ʻano he laʻana, ʻaʻole hoʻohana ʻia kekahi helu o nā ʻano mai ka papahana MTProto i loko).

No ke aha kēia hana? Malia paha, ʻaʻole hiki i nā polokalamu polokalamu kikowaena ke hōʻoia i ka hilinaʻi i loko o ka pūʻulu, a i ʻole ka liʻiliʻi loa i ka pale ʻana i ka mea kaulike mua, a hoʻololi i kēia pilikia i ka mea kūʻai aku. Ma muli o ke kaumaha, ua ho'āʻo ʻo Vasily e hoʻokō i kahi koho ʻē aʻe, me ʻelua mau queues, me ka hoʻohana ʻana i nā algorithms mai TCP - e ana i ka RTT i ka server a me ka hoʻoponopono ʻana i ka nui o ka "window" (i nā memo) ma muli o ka nui o nā noi i ʻike ʻole ʻia. ʻO ia hoʻi, kahi heuristic koʻikoʻi no ka helu ʻana i ka ukana kikowaena - ʻehia ka nui o kā mākou noi e hiki ke nahu i ka manawa like ʻole a nalowale.

ʻAe, ʻo ia hoʻi, maopopo iā ʻoe, ʻeā? Inā pono ʻoe e hoʻokō hou i ka TCP ma luna o kahi protocol e hana ana ma luna o TCP, hōʻike kēia i kahi protocol maikaʻi ʻole i hoʻolālā ʻia.

ʻAe, no ke aha e ʻoi aku ai ka nui ma mua o hoʻokahi pila, a ma ke ʻano nui, he aha ke ʻano o kēia no ke kanaka e hana ana me kahi API kiʻekiʻe? E nānā, hana ʻoe i kahi noi, hoʻonohonoho ʻoe iā ia, akā hiki ʻole ke hoʻouna koke ʻia. No ke aha mai? No ka mea, ʻo ka pane msg_id, he manawa pōkoleаHe inoa wau, ʻoi aku ka maikaʻi o ka hoʻopanee ʻana i ka wā hiki loa - e hōʻole koke ke kikowaena no ka manawa like ʻole ma waena o mākou a me ia (ʻoiaʻiʻo, hiki iā mākou ke hana i kahi koʻi e hoʻololi i ko mākou manawa mai kēia manawa. i ka manawa kikowaena ma ka hoʻohui ʻana i kahi delta i helu ʻia mai nā pane kikowaena - hana nā mea kūʻai aku i kēia, akā ʻaʻole pololei kēia ʻano ma muli o ka buffering). No laila ke noi ʻoe me kahi kelepona hana kūloko mai ka hale waihona puke, hele ka memo i nā pae aʻe:

  1. Aia ma ka laina like a ke kali nei no ka hoʻopunipuni.
  2. Kohoia msg_id a ua hele ka memo i kahi laina ʻē aʻe - hiki ke hoʻouna ʻia; hoʻouna i ke kumu.
  3. a) Ua pane ke kikowaena iā MsgsAck - ua hāʻawi ʻia ka leka, holoi mākou iā ia mai ka "queue ʻē aʻe".
    b) A i ʻole, ʻaʻole makemake ʻo ia i kekahi mea, pane ʻo ia i ka badmsg - hoʻouna mākou mai ka "queue ʻē aʻe"
    c) ʻAʻohe mea i ʻike ʻia, pono e hoʻouna hou i ka leka mai kahi laina ʻē aʻe - akā ʻaʻole ʻike maopopo ʻia i ka manawa.
  4. Ua pane hope mai ke kikowaena RpcResult - ka pane maoli (a i ʻole ka hewa) - ʻaʻole i hāʻawi wale ʻia, akā ua hana pū ʻia.

Malia paha, hiki i ka hoʻohana ʻana i nā ipu ke hoʻopau i ka pilikia. ʻO kēia ka manawa e hoʻopili ʻia ai kahi pūʻulu o nā memo i hoʻokahi, a pane mai ke kikowaena me ka hōʻoia i nā mea āpau i ka manawa hoʻokahi, me hoʻokahi. msg_id. Akā, e hōʻole ʻo ia i kēia pūʻulu, inā i hewa kekahi mea, a me ka mea holoʻokoʻa.

A i kēia manawa, komo nā noʻonoʻo ʻenehana ʻole. Mai ka ʻike, ua ʻike mākou i nā koʻokoʻo he nui, a i kēia manawa e ʻike mākou i nā hiʻohiʻona hou aʻe o ka ʻōlelo aʻoaʻo maikaʻi ʻole a me ka hoʻolālā - ma ia mau kūlana, pono anei ke hilinaʻi a hana i kēlā mau hoʻoholo? ʻO ka nīnau he rhetorical (ʻoiaʻiʻo ʻaʻole).

He aha kā mākou e kamaʻilio nei? Inā ma ke kumuhana "nā memo addict e pili ana i nā memo" hiki iā ʻoe ke noʻonoʻo me nā mea kūʻē e like me "He naʻaupō ʻoe, ʻaʻole ʻoe i maopopo i kā mākou manaʻo maikaʻi!" (no laila e kākau mua i ka palapala, e like me ka mea e pono ai ka poʻe maʻamau, me nā kumu kumu a me nā hiʻohiʻona hoʻololi packet, a laila e kamaʻilio mākou), a laila ʻo nā manawa / manawa manawa he pilikia kūpono a kikoʻī, ua ʻike lōʻihi nā mea āpau ma aneʻi. Akā he aha ka palapala e haʻi mai ai iā mākou e pili ana i ka manawa manawa?

Hoʻomaopopo pinepine kahi kikowaena i ka loaʻa ʻana o kahi leka mai kahi mea kūʻai aku (maʻamau, he nīnau RPC) me ka hoʻohana ʻana i kahi pane RPC. Inā lōʻihi ka manawa e hiki mai ana ka pane, hiki i kahi kikowaena ke hoʻouna mua i kahi hōʻoia hōʻoia, a ma hope aku, ʻo ka pane RPC ponoʻī.

Hoʻomaopopo maʻamau ka mea kūʻai aku i ka loaʻa ʻana o kahi leka mai kahi kikowaena (maʻa mau, he pane RPC) ma ka hoʻohui ʻana i kahi hōʻoia i ka nīnau RPC aʻe inā ʻaʻole i hoʻouna ʻia i lohi loa (inā i hana ʻia, e ʻōlelo, 60-120 kekona ma hope o ka loaʻa ʻana. o ka memo mai ke kikowaena). Eia naʻe, inā no ka lōʻihi o ka manawa ʻaʻohe kumu e hoʻouna ai i nā leka i ke kikowaena a i ʻole he helu nui o nā memo i ʻike ʻole ʻia mai ka server (e ʻōlelo, ma luna o 16), hoʻouna ka mea kūʻai aku i kahi hōʻoia kū hoʻokahi.

... Unuhi au: ʻaʻole ʻike mākou iā mākou iho i ka nui a me ke ʻano o ka pono, pono, e manaʻo kākou e like me kēia.

A e pili ana i nā ping:

Nā memo Ping (PING/PONG)

ping#7abe77ec ping_id:long = Pong;

Hoʻihoʻi pinepine ʻia kahi pane i ka pilina like:

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

ʻAʻole pono kēia mau memo i ka ʻae. Hoʻouna ʻia ka pong ma ka pane ʻana i kahi ping ʻoiai hiki ke hoʻomaka ʻia kahi ping e kēlā me kēia ʻaoʻao.

Hoʻopaneʻe ʻia ka pani ʻana o ka pilina + PING

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

Hana e like me ka ping. Eia kekahi, ma hope o ka loaʻa ʻana o kēia, hoʻomaka ke kikowaena i kahi manawa e pani ai i ka pilina o kēia manawa disconnect_delay kekona ma hope ke ʻole e loaʻa iā ia kahi leka hou o ke ʻano like e hoʻihoʻi hou i nā manawa āpau o mua. Inā hoʻouna ka mea kūʻai aku i kēia mau pings i kēlā me kēia 60 kekona, no ka laʻana, hiki iā ia ke hoʻonohonoho i ka disconnect_delay e like me 75 kekona.

Ua pau kou manao?! I loko o 60 kekona, e komo ke kaʻaahi i ke kahua, hoʻokuʻu a lawe i nā poʻe holo, a nalowale ke kamaʻilio ʻana ma ke alahele. I loko o 120 kekona, ʻoiai ʻoe i waho, e hele mai ʻo ia i kahi ʻē aʻe, a e haki paha ka pilina. ʻAe, maopopo kahi e ulu ai nā wāwae - "Ua lohe au i ke kani ʻana, akā ʻaʻole wau i ʻike i hea ia", aia kahi algorithm a Nagle a me ka koho TCP_NODELAY, i manaʻo ʻia no ka hana pili. Akā, kala mai, e hoʻopaneʻe i kāna waiwai paʻamau - 200 Millikekona. Inā makemake ʻoe e hōʻike i kahi mea like a mālama i kahi pālua o nā ʻeke - pono, e hoʻokuʻu iā ia, ma ka liʻiliʻi loa no 5 kekona, a i ʻole ka pau ʻana o ka memo "Ke paʻi nei ka mea hoʻohana ..." i kēia manawa like. ʻAʻole naʻe.

A ʻo ka hope, pings. ʻO ia hoʻi, ke nānā ʻana i ke ola o kahi pilina TCP. He mea ʻakaʻaka, akā ma kahi o 10 mau makahiki i hala aku nei ua kākau wau i kahi kikokikona koʻikoʻi e pili ana i ka ʻelele o ka hale hoʻokipa o kā mākou kumu - ma laila nā mea kākau i pinged i ke kikowaena mai ka mea kūʻai aku, ʻaʻole hoʻi. Akā hoʻokahi mea nā haumāna makahiki ʻekolu, a ʻo kahi keʻena honua kekahi mea ʻē aʻe, pololei? ..

ʻO ka mua, he papahana hoʻonaʻauao liʻiliʻi. ʻO kahi pilina TCP, me ka ʻole o ka hoʻololi packet, hiki ke ola no nā pule. He maikaʻi a maikaʻi ʻole kēia, ma muli o ke kumu. ʻAe, inā loaʻa iā ʻoe kahi pili SSH i ke kikowaena wehe, ua ala ʻoe mai kāu kamepiula, hoʻihoʻi hou i ke alalai mana, hoʻi i kou wahi - ʻaʻole i haki ka hālāwai ma kēia kikowaena (ʻaʻole i kākau i kekahi mea, ʻaʻohe paʻi). oluolu. He mea ʻino inā he mau kaukani o nā mea kūʻai aku ma ka kikowaena, lawe kēlā me kēia i nā kumuwaiwai (hello Postgres!), A ua hoʻomaka hou ka mea hoʻokipa i ka wā lōʻihi - akā ʻaʻole mākou e ʻike e pili ana.

Aia nā ʻōnaehana Chat/IM i ka hihia ʻelua no kekahi kumu ʻē aʻe - nā kūlana pūnaewele. Inā "hāʻule ka mea hoʻohana", pono e hoʻomaopopo i kāna mau hoa pili e pili ana. A i ʻole, e hewa paha nā mea hana o Jabber (a hoʻoponopono ʻia no 20 mau makahiki) - ua kāpae ka mea hoʻohana, akā hoʻomau lākou e kākau i nā memo iā ia, me ka manaʻoʻiʻo aia ʻo ia ma ka pūnaewele (i nalowale loa i kēia mau minuke ma mua. ua ʻike ʻia ka haʻihaʻi). ʻAʻole, ʻo ka koho TCP_KEEPALIVE, ka mea i ʻike ʻole ʻia e ka poʻe he nui i ka hana ʻana o ka TCP timers, pops ma nā wahi āpau (ma ka hoʻonohonoho ʻana i nā waiwai hihiu e like me ʻumi mau kekona), ʻaʻole e kōkua ma aneʻi - pono ʻoe e hōʻoia ʻaʻole ʻo ka OS kernel wale nō. ka mea hoʻohana mīkini mea ola, akā, no hoi hana maʻamau, i hiki ke pane, a me ka palapala noi ponoi (manaʻo 'oe hiki ole hoʻokuʻu? Telegram Desktop ma Ubuntu 18.04 ua crashed noʻu pinepine).

No laila pono ʻoe e ping kikowaena mea kūʻai, a ʻaʻole hoʻi - inā hana ka mea kūʻai aku i kēia, ke haki ka pilina, ʻaʻole e hāʻawi ʻia ka ping, ʻaʻole i hoʻokō ʻia ka pahuhopu.

A he aha kā mākou e ʻike ai ma Telegram? ʻO nā mea a pau ke kū'ē loa! ʻAe, ʻo ia hoʻi. ʻoiai, hiki i nā ʻaoʻao ʻelua ke ping kekahi i kekahi. I ka hoʻomaʻamaʻa, hoʻohana nā mea kūʻai aku i ke koʻokoʻo ping_delay_disconnect, ka mea e hoʻomaka ai i ka manawa ma ke kikowaena. ʻAe, kala mai, ʻaʻole na ka mea kūʻai aku e hoʻoholo i ka lōʻihi o kona makemake e noho ma laila me ka ping ʻole. ʻO ke kikowaena, ma muli o kāna ukana, ʻike maikaʻi. Akā, ʻoiaʻiʻo, inā ʻaʻole ʻoe e minamina i nā kumuwaiwai, a laila ʻo Pinocchio ʻino iā lākou iho, a e iho mai ke koʻokoʻo ...

Pehea i hoʻolālā ʻia ai?

Ke manaʻoʻiʻo nei au ua hōʻike maopopo ʻia nā ʻike ma luna aʻe i ka mākaukau kiʻekiʻe ʻole o ka hui Telegram / VKontakte ma ke kahua o ka lawe ʻana (a haʻahaʻa) o nā ʻoihana kamepiula a me kā lākou haʻahaʻa haʻahaʻa i nā mea pili.

No ke aha i paʻakikī loa ai, a pehea e hoʻāʻo ai nā mea kākau Telegram e kūʻē? ʻO ka ʻoiaʻiʻo ua hoʻāʻo lākou e hana i kahi kau e ola ai ka pilina TCP, ʻo ia hoʻi, ka mea a mākou i hāʻawi ʻole ai i kēia manawa, e hāʻawi mākou ma hope. Ua hoʻāʻo paha lākou e hana i ka halihali UDP, ʻoiai ua holo lākou i nā pilikia a haʻalele iā ia (ʻo ia ke kumu i nele ai ka palapala - ʻaʻohe mea e kaena ai). Akā ma muli o ka ʻike ʻole o ka hana ʻana o nā pūnaewele ma ka laulā a me ka TCP, kahi āu e hilinaʻi ai iā ia, a ma hea ʻoe e hana ai iā ʻoe iho (a pehea), a hoʻāʻo e hoʻohui i kēia me ka cryptography "hoʻokahi pana o ʻelua. nā manu me ka pōhaku hoʻokahi" - ua hoʻohuli ʻia kahi cadaver.

Pehea e pono ai? Ma muli o ka ʻoiaʻiʻo msg_id ʻO ia ka timestamp i pono i ka cryptographically e pale aku i ka hoʻouka hou ʻana, he hewa ke hoʻopili ʻana i kahi hana ʻike kūʻokoʻa iā ia. No laila, me ka ʻole o ka hoʻololi nui ʻana i ka hale hoʻolālā o kēia manawa (i ka wā i hoʻokumu ʻia ai ka thread Updates, he kumuhana API kiʻekiʻe kēia no kekahi ʻāpana o kēia pūʻulu pou), pono kekahi e:

  1. Na ke kikowaena e paʻa ana i ka pilina TCP i ka mea kūʻai aku ke kuleana - inā ʻoe e unuhi mai ke kumu, e ʻoluʻolu e ʻae, e hana a hoʻihoʻi paha i kahi hewa, ʻaʻohe poho. A laila ʻaʻole ʻo ka hōʻoia he vector o nā id, akā ʻo "ka hope loa i loaʻa seq_no" - he helu wale nō, e like me TCP (ʻelua helu - kāu seq a hoʻopaʻa ʻia). Aia mākou i ka hālāwai, ʻaʻole anei?
  2. ʻO ka hōʻailona manawa e pale ai i ka hoʻouka hou ʻana e lilo i kahua ʻokoʻa, a la nonce. Hoʻopaʻa ʻia, akā ʻaʻohe mea ʻē aʻe i pili. Ua lawa a uint32 - inā hoʻololi ko mākou paʻakai ma ka liʻiliʻi loa i kēlā me kēia hapalua lā, hiki iā mākou ke hoʻokaʻawale i nā ʻāpana 16 i nā ʻāpana haʻahaʻa o ka ʻāpana integer o kēia manawa, ʻo ke koena - i ka hapa hapa o ke kekona (e like me kēia manawa).
  3. Hoʻihoʻi ʻia msg_id i nā mea a pau - mai ka manaʻo o ka hoʻokaʻawale ʻana i nā noi ma nā backends, aia, ʻo ka mea mua, ka mea kūʻai aku id, a ʻo ka lua, ka id kau, a concatenate iā lākou. No laila, ma ke ʻano he noi noi, hoʻokahi wale nō lawa seq_no.

ʻAʻole nō hoʻi ka koho maikaʻi loa, hiki ke hoʻohana ʻia kahi ʻano holoʻokoʻa ma ke ʻano he mea ʻike - ua hana ʻia kēia ma ka API kiʻekiʻe i ka wā e hoʻouna ai i kahi leka, ma ke ala. ʻOi aku ka maikaʻi o ka hoʻololi ʻana i ka hoʻolālā mai ka pili a i ka piha loa, akā he kumuhana kēia no kekahi ʻāpana, ʻaʻole kēia pou.

API?

Ta-daam! No laila, i ko mākou hele ʻana ma ke ala i piha i ka ʻeha a me nā koʻokoʻo, ua hiki iā mākou ke hoʻouna i nā noi i ke kikowaena a loaʻa nā pane iā lākou, a loaʻa hoʻi nā mea hou mai ka server (ʻaʻole i pane i kahi noi, akā. hoʻouna mai ia iā mākou iho, e like me PUSH, inā ʻoi aku ka maopopo o kekahi).

E noʻonoʻo, i kēia manawa aia wale nō ka laʻana Perl ma ka ʻatikala! (no ka poʻe i kamaʻāina ʻole i ka syntax, ʻo ka hoʻopaʻapaʻa mua e hoʻopōmaikaʻi ʻia ʻo ka hoʻonohonoho ʻikepili o ka mea, ʻo ka lua ka papa):

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' )
};

ʻAe, ʻaʻole ma lalo o ka mea hao wale - inā ʻaʻole ʻoe i heluhelu, e hele a hana!

ʻO, wai~~… he aha kona ʻano? He mea maʻa loa ... ʻo ia paha ke ʻano ʻikepili o kahi API Web maʻamau ma JSON, koe wale nō paha nā papa i hoʻopili ʻia i nā mea?..

No laila ua hoʻololi ʻia ... He aha ia, e nā hoa? e hoomaka ana?.. ʻAʻole anei e maʻalahi wale ʻo JSON ma luna o HTTPS?! A he aha ka mea i loaʻa iā mākou ma ke kūʻai? Ua pono anei keia mau hooikaika ana?

E noʻonoʻo kākou i ka mea a TL+MTProto i hāʻawi mai iā mākou a he aha nā mea e hiki ai. ʻAe, he kūpono maikaʻi ʻole ka pane noi HTTP, akā ma kahi liʻiliʻi ma luna o TLS?

hoʻopili paʻa. Ke ʻike nei i kēia ʻano ʻikepili, e like me JSON, hoʻomanaʻo ʻia aia nā ʻano ʻano binary. E hōʻailona mākou iā MsgPack me he mea hiki ʻole ke hoʻonui ʻia, akā aia, no ka laʻana, CBOR - ma ke ala, ka maʻamau i wehewehe ʻia ma RFC 7049. He mea kaulana ia no ka wehewehe ʻana nā hōʻailona, ma ke ʻano he hana hoʻonui, a ma waena ua hoʻohālikelike ʻia aia:

  • 25 + 256 - ke hoʻololi nei i nā laina pālua me kahi kuhikuhi helu laina, ʻo ia ke ʻano hoʻoemi haʻahaʻa.
  • 26 - serialized Perl mea me ka papa inoa a me ka constructor paio
  • 27 - he mea kūʻokoʻa ʻōlelo serialized me ka inoa ʻano a me nā manaʻo kumu

ʻAe, ua hoʻāʻo wau e hoʻokaʻawale i ka ʻikepili like ma TL a me CBOR me ka hoʻopili ʻana i nā kaula a me nā mea i hiki. Ua hoʻomaka ka hopena e ʻokoʻa i ka makemake o CBOR ma kahi megabyte:

cborlen=1039673 tl_len=1095092

A pēlā, hopena hopena: Aia nā ʻano maʻalahi maʻalahi ʻaʻole i pili i ka hemahema sync a i ʻole pilikia ʻike ʻike ʻole, me ka maikaʻi hoʻohālikelike.

Hoʻokumu pili wikiwiki. ʻO ia ke ʻano o ka zero RTT ma hope o ka hoʻopili hou ʻana (i ka wā i hana ʻia ai ke kī i hoʻokahi manawa) - pili mai ka memo MTProto mua loa, akā me kekahi mau hoʻopaʻa ʻana - ua komo lākou i ka paʻakai like, ʻaʻole i popopo ka hālāwai, etc. He aha kā TLS e hāʻawi mai ai iā mākou? ʻŌlelo pili:

Ke hoʻohana nei i ka PFS ma TLS, nā tiketi hālāwai TLS (RFC 5077) e hoʻomaka hou i ke kau i hoʻopili ʻia me ka ʻole o ka hoʻoponopono hou ʻana i nā kī a me ka mālama ʻole ʻana i ka ʻike kī ma ka kikowaena. I ka wehe ʻana i ka pilina mua a me ka hana ʻana i nā kī, hoʻopili ke kikowaena i ka mokuʻāina o ka pilina a hoʻouna aku i ka mea kūʻai aku (ma ke ʻano o kahi tiketi hālāwai). No laila, i ka wā e hoʻomaka hou ai ka pilina, hoʻouna ka mea kūʻai aku i kahi tiketi hālāwai i loaʻa, ma waena o nā mea ʻē aʻe, ke kī o ka hālāwai hoʻi i ke kikowaena. Hoʻopili ʻia ka tiketi ponoʻī me kahi kī pōkole (sesion ticket key), i mālama ʻia ma ke kikowaena a pono e puʻunaue ʻia i nā kikowaena frontend āpau e lawelawe ana i ka SSL i nā hāʻina hui.[10]. No laila, hiki i ka hoʻokomo ʻana i kahi tiketi hālāwai ke hōʻino i ka PFS inā hoʻopaʻapaʻa ʻia nā kī kikowaena manawaleʻa, no ka laʻana, ke mālama ʻia lākou no ka manawa lōʻihi (OpenSSL, nginx, Apache ma ka paʻamau e mālama iā lākou no ka manawa holoʻokoʻa e holo ana ka papahana; nā pūnaewele kaulana. hoʻohana i ke kī no kekahi mau hola, a hiki i nā lā).

Eia ka RTT ʻaʻole ʻole, pono ʻoe e hoʻololi i ka liʻiliʻi loa ClientHello a me ServerHello, a laila, me ka Finished, hiki i ka mea kūʻai ke hoʻouna i ka ʻikepili. Eia naʻe, e hoʻomanaʻo ʻia ʻaʻole i loaʻa iā mākou ka Pūnaewele, me kāna pūʻulu o nā pili hou i wehe ʻia, akā he ʻelele, ʻo ka pilina o ka mea pinepine i hoʻokahi a ʻoi aku ka lōʻihi a lōʻihi paha, nā noi pōkole no nā ʻaoʻao Pūnaewele - nā mea āpau. multiplexed i loko. ʻO ia, ʻae ʻia, inā ʻaʻole mākou i ʻike i kahi ʻāpana subway maikaʻi loa.

Poina i kekahi mea ʻē aʻe? E kākau i nā manaʻo.

E hoʻomau 'ia!

Ma ka ʻāpana ʻelua o kēia pūʻulu o nā pou, e noʻonoʻo mākou i nā pilikia hoʻonohonoho ma mua o nā ʻenehana - hoʻokokoke, ideology, interface, ʻano i nā mea hoʻohana, etc. Ma muli naʻe o ka ʻike loea i hōʻike ʻia ma aneʻi.

E hoʻomau ka ʻāpana ʻekolu i ka nānā ʻana o ka ʻenehana ʻenehana / ʻike hoʻomohala. E aʻo nui ʻoe:

  • ka hoʻomau o ka pandemonium me nā ʻano TL-types
  • nā mea ʻike ʻole e pili ana i nā kahawai a me nā hui nui
  • ʻoi aku ka maikaʻi o nā kūkākūkā ma mua o ka papa inoa
  • e pili ana i ka hoʻopaʻa ʻana i ka memo pili
  • he aha ka ʻokoʻa ma waena o ke kiʻi a me ke kiʻi
  • pehea ka emoji e hoʻopilikia ai i ka kikokikona italicized

a me nā koʻokoʻo ʻē aʻe! E noho mālie!

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka