Lodi ti ilana ati awọn isunmọ eto ti Telegram. Apá 1, imọ-ẹrọ: iriri ti kikọ alabara lati ibere - TL, MT

Laipe, awọn ifiweranṣẹ nipa bi Telegram ti dara, bawo ni awọn arakunrin Durov ti o wuyi ati ti o ni iriri ni kikọ awọn eto nẹtiwọọki, ati bẹbẹ lọ ti bẹrẹ lati han nigbagbogbo lori Habré. Ni akoko kanna, pupọ diẹ eniyan ti fi ara wọn bọmi ara wọn ni ẹrọ imọ-ẹrọ - pupọ julọ, wọn lo irọrun ti o rọrun (ati pe o yatọ pupọ si MTProto) Bot API ti o da lori JSON, ati nigbagbogbo gba lori igbagbo gbogbo awọn iyin ati PR ti o revolves ni ayika ojiṣẹ. O fẹrẹ to ọdun kan ati idaji sẹhin, ẹlẹgbẹ mi ni Eshelon NGO Vasily (laanu, akọọlẹ rẹ lori Habré ti paarẹ pẹlu iwe kikọ) bẹrẹ kikọ alabara Telegram tirẹ lati ibere ni Perl, ati lẹhinna onkọwe ti awọn ila wọnyi darapọ mọ. Kilode ti Perl, diẹ ninu awọn yoo beere lẹsẹkẹsẹ? Nitoripe iru awọn iṣẹ akanṣe ti wa tẹlẹ ni awọn ede miiran, ni otitọ, eyi kii ṣe aaye, ede miiran le wa nibiti ko si. setan-ṣe ìkàwé, ati ni ibamu si onkọwe gbọdọ lọ ni gbogbo ọna lati ibere pepe. Pẹlupẹlu, cryptography jẹ ọrọ ti igbẹkẹle, ṣugbọn rii daju. Pẹlu ọja ti o ni ifọkansi si aabo, o ko le nirọrun gbarale ile-ikawe ti a ti ṣetan lati ọdọ olupese ati gbekele afọju (sibẹsibẹ, eyi jẹ koko-ọrọ fun apakan keji). Ni akoko yii, ile-ikawe naa ṣiṣẹ daradara ni ipele “apapọ” (gba ọ laaye lati ṣe eyikeyi awọn ibeere API).

Sibẹsibẹ, kii yoo jẹ pupọ cryptography tabi iṣiro ninu jara ti awọn ifiweranṣẹ. Ṣugbọn ọpọlọpọ awọn alaye imọ-ẹrọ miiran yoo wa ati awọn crutches ayaworan (tun wulo fun awọn ti kii yoo kọ lati ibere, ṣugbọn yoo lo ile-ikawe ni eyikeyi ede). Nitorinaa, ibi-afẹde akọkọ ni lati gbiyanju lati ṣe imuse alabara lati ibere gẹgẹ bi osise iwe. Iyẹn ni, jẹ ki a ro pe koodu orisun ti awọn alabara osise ti wa ni pipade (lẹẹkansi, ni apakan keji a yoo bo ni alaye diẹ sii koko-ọrọ ti otitọ pe eyi jẹ otitọ. o n ṣẹlẹ nitorinaa), ṣugbọn, bii ti awọn ọjọ atijọ, fun apẹẹrẹ, boṣewa kan wa bii RFC - ṣe o ṣee ṣe lati kọ alabara ni ibamu si sipesifikesonu nikan, “laisi wiwo” koodu orisun, jẹ osise (Telegram Desktop, alagbeka), tabi Telethon laigba aṣẹ?

Atọka akoonu:

Iwe aṣẹ... o wa, otun? Se ooto ni?..

Awọn ajẹkù ti awọn akọsilẹ fun nkan yii bẹrẹ lati gba ni igba ooru to kọja. Gbogbo akoko yii lori oju opo wẹẹbu osise https://core.telegram.org Awọn iwe jẹ bi ti Layer 23, i.e. di ibikan ni 2014 (ranti, nibẹ wà ko ani awọn ikanni pada ki o si?). Nitoribẹẹ, ni imọran, eyi yẹ ki o ti gba wa laaye lati ṣe imuse alabara kan pẹlu iṣẹ ṣiṣe ni akoko yẹn ni ọdun 2014. Ṣugbọn paapaa ni ipo yii, iwe-ipamọ naa jẹ, akọkọ, ko pari, ati keji, ni awọn aaye ti o tako ararẹ. Ni oṣu kan sẹhin, ni Oṣu Kẹsan ọdun 2019, o jẹ lairotẹlẹ A ṣe awari pe imudojuiwọn nla ti iwe naa wa lori aaye naa, fun Layer 105 to ṣẹṣẹ patapata, pẹlu akiyesi pe ni bayi ohun gbogbo nilo lati ka lẹẹkansi. Ní tòótọ́, ọ̀pọ̀ àpilẹ̀kọ ni a ṣàtúnṣe, ṣùgbọ́n ọ̀pọ̀ kò yí padà. Nitorinaa, nigbati o ba ka atako ti o wa ni isalẹ nipa iwe, o yẹ ki o ranti pe diẹ ninu awọn nkan wọnyi ko ṣe pataki mọ, ṣugbọn diẹ ninu tun jẹ ohun to. Lẹhinna, ọdun 5 ni agbaye ode oni kii ṣe igba pipẹ nikan, ṣugbọn pupọ ọpọlọpọ ti. Lati igba wọnyẹn (paapaa ti o ko ba ṣe akiyesi awọn aaye geochat ti a danu ati sọji lati igba naa), nọmba awọn ọna API ninu ero naa ti dagba lati ọgọrun si diẹ sii ju XNUMX lọ!

Nibo ni lati bẹrẹ bi onkọwe ọdọ?

Ko ṣe pataki boya o kọ lati ibere tabi lo, fun apẹẹrẹ, awọn ile-ikawe ti a ti ṣetan bi Telethon fun Python tabi Madeline fun PHP, ni eyikeyi idiyele, iwọ yoo nilo akọkọ forukọsilẹ rẹ elo - gba sile api_id и api_hash (awọn ti o ti ṣiṣẹ pẹlu VKontakte API lẹsẹkẹsẹ loye) nipasẹ eyiti olupin yoo ṣe idanimọ ohun elo naa. Eyi yoo ni si ṣe fun awọn idi ofin, ṣugbọn a yoo sọrọ diẹ sii nipa idi ti awọn onkọwe ile-ikawe ko le ṣe atẹjade ni apakan keji. O le ni itẹlọrun pẹlu awọn iye idanwo, botilẹjẹpe wọn ni opin pupọ - otitọ ni pe ni bayi o le forukọsilẹ nikan kan app, nitorinaa maṣe yara ni ori gigun sinu rẹ.

Bayi, lati oju-ọna imọ-ẹrọ, o yẹ ki a nifẹ si otitọ pe lẹhin iforukọsilẹ a yẹ ki o gba awọn iwifunni lati Telegram nipa awọn imudojuiwọn si iwe, ilana, ati bẹbẹ lọ. Iyẹn ni, ọkan le ro pe aaye naa pẹlu awọn docks ni a kọ silẹ nirọrun ati tẹsiwaju lati ṣiṣẹ ni pataki pẹlu awọn ti o bẹrẹ lati ṣe awọn alabara, nitori o rọrun. Ṣugbọn rara, ko si nkan bii iyẹn ti a ṣe akiyesi, ko si alaye ti o wa.

Ati pe ti o ba kọ lati ibere, lẹhinna lilo awọn paramita ti o gba jẹ kosi ọna pipẹ. Biotilejepe https://core.telegram.org/ ati sọrọ nipa wọn ni Bibẹrẹ ni akọkọ, ni otitọ, iwọ yoo kọkọ ni lati ṣe Ilana MTProto - ṣugbọn ti o ba gbagbọ ipalemo ni ibamu si awọn OSI awoṣe ni opin oju-iwe naa fun apejuwe gbogbogbo ti ilana naa, lẹhinna o jẹ asan patapata.

Ni otitọ, mejeeji ṣaaju ati lẹhin MTProto, ni awọn ipele pupọ ni ẹẹkan (gẹgẹbi awọn nẹtiwọọki ajeji ti n ṣiṣẹ ni ekuro OS sọ, irufin Layer), koko nla, irora ati ẹru yoo gba ni ọna…

Serialization alakomeji: TL (Ede Iru) ati ero rẹ, ati awọn fẹlẹfẹlẹ, ati ọpọlọpọ awọn ọrọ idẹruba miiran

Koko-ọrọ yii, ni otitọ, jẹ bọtini si awọn iṣoro Telegram. Ati pe ọpọlọpọ awọn ọrọ ẹru yoo wa ti o ba gbiyanju lati ṣawari sinu rẹ.

Nitorina, eyi ni aworan atọka. Bí ọ̀rọ̀ yìí bá wá sí ọ lọ́kàn, sọ pé, Ilana JSON, O ro tọ. Ibi-afẹde naa jẹ kanna: diẹ ninu ede lati ṣapejuwe eto ti o ṣeeṣe ti data gbigbe. Eyi ni ibi ti awọn ibajọra pari. Ti o ba wa lati oju-iwe naa Ilana MTProto, tabi lati igi orisun ti alabara osise, a yoo gbiyanju lati ṣii diẹ ninu eto, a yoo rii nkan bii:

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;

Eniyan ti o rii eyi fun igba akọkọ yoo ni oye ni anfani lati ṣe idanimọ apakan nikan ti ohun ti a kọ - daradara, iwọnyi jẹ awọn ẹya ti o han gbangba (botilẹjẹpe ibo ni orukọ wa, ni apa osi tabi ni apa ọtun?), Awọn aaye wa ninu wọn, lẹhin eyi ti a iru telẹ lẹhin ti a oluṣafihan ... jasi. Nibi ni awọn biraketi igun o ṣee ṣe awọn awoṣe bii C ++ (ni otitọ, kii ṣe rara). Ati pe kini gbogbo awọn aami miiran tumọ si, awọn ami ibeere, awọn ami idalẹnu, awọn ipin ogorun, awọn ami hash (ati pe o han gbangba wọn tumọ si awọn nkan oriṣiriṣi ni awọn aaye oriṣiriṣi), nigbakan wa ati nigbakan kii ṣe, awọn nọmba hexadecimal - ati pataki julọ, bii o ṣe le gba lati eyi otun (eyi ti yoo wa ko le kọ nipa olupin) baiti san? Iwọ yoo ni lati ka iwe naa (bẹẹni, awọn ọna asopọ wa si ero inu ẹya JSON nitosi - ṣugbọn iyẹn ko jẹ ki o ṣe alaye diẹ sii).

Ṣii oju-iwe naa Alakomeji Data Serialization ati besomi sinu awọn ti idan aye ti olu ati ọtọ mathimatiki, nkankan iru si matan ni 4th odun. Alfabeti, oriṣi, iye, olupilẹṣẹ, olupilẹṣẹ iṣẹ, fọọmu deede, iru akojọpọ, oriṣi polymorphic… ati pe gbogbo rẹ ni oju-iwe akọkọ! Nigbamii ti n duro de ọ Ede TL, eyiti, botilẹjẹpe o ti ni apẹẹrẹ ti ibeere bintin ati idahun, ko pese idahun rara si awọn ọran aṣoju diẹ sii, eyiti o tumọ si pe iwọ yoo ni lati ṣatunkun ti mathimatiki ti a tumọ lati Russian si Gẹẹsi lori miiran mẹjọ ti a fi sii. awọn oju-iwe!

Awọn oluka ti o mọ pẹlu awọn ede iṣẹ-ṣiṣe ati awọn itọkasi iru aifọwọyi yoo, dajudaju, wo ede apejuwe ni ede yii, paapaa lati apẹẹrẹ, diẹ sii faramọ, ati pe o le sọ pe eyi kii ṣe buburu ni ipilẹ. Awọn atako si eyi ni:

  • beeni, idi dun ti o dara, ṣugbọn alas, o ko ṣe aṣeyọri
  • Ẹkọ ni awọn ile-ẹkọ giga Ilu Rọsia yatọ paapaa laarin awọn amọja IT - kii ṣe gbogbo eniyan ti gba ẹkọ ti o baamu
  • Nikẹhin, bi a yoo rii, ni iṣe o jẹ ko nilo, niwọn bi ipin ti o lopin ti paapaa TL ti o ṣapejuwe ti lo

Bi o ti sọ LeoNerd lori ikanni #perl ninu nẹtiwọọki FreeNode IRC, ẹniti o gbiyanju lati ṣe ẹnu-ọna lati Telegram si Matrix (itumọ agbasọ naa ko pe lati iranti):

O kan lara bi a ṣe ṣe ẹnikan lati tẹ ero-ọrọ fun igba akọkọ, ni itara, o bẹrẹ si gbiyanju lati ṣere pẹlu rẹ, ko bikita gaan boya o nilo ni iṣe.

Wo fun ara rẹ, ti iwulo fun awọn iru igboro (int, gun, bbl) bi nkan alakọbẹrẹ ko gbe awọn ibeere dide - nikẹhin wọn gbọdọ ṣe imuse pẹlu ọwọ - fun apẹẹrẹ, jẹ ki a gbiyanju lati gba lati ọdọ wọn. fekito. Iyẹn ni, ni otitọ, orun, ti o ba pe awọn Abajade ohun nipa wọn to dara awọn orukọ.

Sugbon ki o to

Apejuwe kukuru ti ipin ti TL sintasi fun awọn ti ko ka iwe aṣẹ osise

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;

Itumọ nigbagbogbo bẹrẹ oluṣe, lẹhin eyi ti iyan (ni iwa - nigbagbogbo) nipasẹ aami # yẹ CRC32 lati okun apejuwe deede ti yi iru. Nigbamii ti o wa apejuwe awọn aaye; ti wọn ba wa, iru le jẹ ofo. Gbogbo eyi dopin pẹlu ami dogba, orukọ iru eyiti olupilẹṣẹ yii - iyẹn ni, ni otitọ, subtype - jẹ ti. Eniyan si ọtun ti aami dogba jẹ polymorphic - iyẹn ni, ọpọlọpọ awọn oriṣi pato le ṣe deede si.

Ti itumọ ba waye lẹhin ila ---functions---, lẹhinna sintasi yoo wa kanna, ṣugbọn itumọ yoo yatọ: olupilẹṣẹ yoo di orukọ iṣẹ RPC, awọn aaye yoo di awọn aye (daradara, iyẹn ni, yoo wa ni deede eto ti a fun, bi a ti ṣalaye ni isalẹ. , eyi yoo jẹ itumọ ti a yàn nirọrun), ati “irufẹ polymorphic” - iru abajade ti o pada. Lootọ, yoo tun wa polymorphic - o kan ni asọye ni apakan ---types---, sugbon yi Constructor yoo "ko wa ni kà". Ikojọpọ awọn iru awọn iṣẹ ti a pe nipasẹ awọn ariyanjiyan wọn, i.e. Fun idi kan, awọn iṣẹ pupọ pẹlu orukọ kanna ṣugbọn awọn ibuwọlu oriṣiriṣi, bi ninu C ++, ko pese fun ni TL.

Kini idi ti "olukole" ati "polymorphic" ti kii ṣe OOP? O dara, ni otitọ, yoo rọrun fun ẹnikan lati ronu nipa eyi ni awọn ofin OOP - iru polymorphic kan gẹgẹbi kilasi áljẹbrà, ati pe awọn oluṣeto jẹ awọn kilasi irandiran taara rẹ, ati final ninu awọn oro ti awọn nọmba ti awọn ede. Ni otitọ, dajudaju, nibi nikan ibajọra pẹlu awọn ọna ikole ti kojọpọ gidi ni awọn ede siseto OO. Niwọn bi o ti jẹ awọn ẹya data nikan, ko si awọn ọna (botilẹjẹpe apejuwe awọn iṣẹ ati awọn ọna siwaju jẹ agbara pupọ lati ṣẹda iporuru ni ori ti wọn wa, ṣugbọn iyẹn jẹ ọrọ ti o yatọ) - o le ronu ti olupilẹṣẹ bi iye kan lati eyi ti ti wa ni itumọ ti tẹ nigba kika a baiti san.

Bawo ni eyi ṣe ṣẹlẹ? Deserializer, eyi ti nigbagbogbo ka 4 baiti, ri iye 0xcrc32 - ati oye ohun ti yoo ṣẹlẹ tókàn field1 pẹlu iru int, i.e. Say gangan 4 baiti, lori yi overlying aaye pẹlu iru PolymorType ka. O rii 0x2crc32 ati oye pe awọn aaye meji wa siwaju, akọkọ long, eyi ti o tumo a ka 8 baiti. Ati ki o si lẹẹkansi a eka iru, eyi ti o ti deserialized ni ni ọna kanna. Fun apere, Type3 le ṣe ikede ni agbegbe ni kete bi awọn oluṣe meji, lẹsẹsẹ, lẹhinna wọn gbọdọ pade boya 0x12abcd34, lẹhin eyi o nilo lati ka awọn baiti 4 diẹ sii int, tabi 0x6789cdef, lẹhin eyi kii yoo si nkankan. Ohunkohun miiran - o nilo lati jabọ ohun sile. Lonakona, lẹhin eyi a pada si kika 4 baiti int awọn aaye field_c в constructorTwo ati pẹlu ti a pari kika tiwa PolymorType.

Nikẹhin, ti o ba ri mu 0xdeadcrc fun constructorThree, lẹhinna ohun gbogbo di idiju diẹ sii. Aaye akọkọ wa ni bit_flags_of_what_really_present pẹlu iru # - ni otitọ, eyi jẹ inagijẹ fun iru nat, itumo "nọmba adayeba". Iyẹn ni, ni otitọ, int ti ko forukọsilẹ ni, nipasẹ ọna, ọran nikan nigbati awọn nọmba ti ko forukọsilẹ waye ni awọn iyika gidi. Nitorinaa, atẹle jẹ ikole pẹlu ami ibeere kan, afipamo pe aaye yii yoo wa lori okun waya nikan ti o ba ṣeto bit ti o baamu ni aaye ti a tọka si (isunmọ bi oniṣẹ ternary). Nitorinaa, jẹ ki a ro pe a ti ṣeto nkan yii, eyiti o tumọ si pe siwaju a nilo lati ka aaye kan bii Type, eyi ti o wa ninu apẹẹrẹ wa ni 2 constructors. Ọkan jẹ ofo (ni ninu nikan ti idamo), awọn miiran ni oko kan ids pẹlu iru ids:Vector<long>.

O le ro pe awọn awoṣe mejeeji ati awọn jeneriki wa ninu awọn anfani tabi Java. Ṣugbọn rara. Fere. Eyi awọn nikan nla ti lilo igun biraketi ni gidi iyika, ati awọn ti o ti lo NIKAN fun Vector. Ninu ṣiṣan baiti, iwọnyi yoo jẹ awọn baiti 4 CRC32 fun iru ara Vector, nigbagbogbo kanna, lẹhinna 4 awọn baiti - nọmba awọn eroja orun, ati lẹhinna awọn eroja wọnyi funrararẹ.

Fikun-un si eyi ni otitọ pe serialization nigbagbogbo waye ni awọn ọrọ ti awọn baiti 4, gbogbo awọn oriṣi jẹ ọpọlọpọ rẹ - awọn oriṣi ti a ṣe sinu rẹ tun ṣe apejuwe bytes и string pẹlu Afowoyi serialization ti awọn ipari ki o si yi titete nipasẹ 4 - daradara, o dabi lati dun deede ati paapa jo munadoko? Botilẹjẹpe a sọ pe TL jẹ serialization alakomeji ti o munadoko, si ọrun apadi pẹlu wọn, pẹlu imugboroosi ti o kan ohunkohun, paapaa awọn iye Boolean ati awọn okun ohun kikọ kan si awọn baiti 4, yoo JSON yoo tun nipon pupọ bi? Wo, paapaa awọn aaye ti ko wulo ni a le fo pẹlu awọn asia bit, ohun gbogbo dara pupọ, ati paapaa extensible fun ọjọ iwaju, nitorinaa kilode ti o ko ṣafikun awọn aaye iyan tuntun si olupilẹṣẹ nigbamii? ..

Ṣugbọn rara, ti o ko ba ka apejuwe kukuru mi, ṣugbọn iwe kikun, ki o ronu nipa imuse naa. Ni akọkọ, CRC32 ti olupilẹṣẹ jẹ iṣiro ni ibamu si laini deede ti ijuwe ọrọ ti ero (yọkuro aaye funfun afikun, ati bẹbẹ lọ) - nitorinaa ti o ba ṣafikun aaye tuntun, laini apejuwe iru yoo yipada, ati nitorinaa rẹ CRC32 ati , Nitoribẹẹ, serialization. Ati pe kini alabara atijọ yoo ṣe ti o ba gba aaye kan pẹlu awọn asia tuntun ti a ṣeto, ati pe ko mọ kini lati ṣe pẹlu wọn nigbamii?…

Ni ẹẹkeji, jẹ ki a ranti CRC32, eyi ti o ti lo nibi pataki bi elile awọn iṣẹ lati mọ pato ohun ti iru ti wa ni (de) serialized. Nibi ti a ti wa ni dojuko pẹlu awọn isoro ti collisions - ko si, awọn iṣeeṣe ni ko ọkan ninu 232, sugbon Elo tobi. Tani o ranti pe CRC32 ti ṣe apẹrẹ lati ṣawari (ati atunṣe) awọn aṣiṣe ninu ikanni ibaraẹnisọrọ, ati pe o ṣe atunṣe awọn ohun-ini wọnyi si ipalara ti awọn miiran? Fun apẹẹrẹ, ko bikita nipa atunto awọn baiti: ti o ba ṣe iṣiro CRC32 lati awọn ila meji, ni iṣẹju keji o paarọ awọn baiti 4 akọkọ pẹlu awọn baiti 4 atẹle - yoo jẹ kanna. Nigbati titẹ sii wa jẹ awọn gbolohun ọrọ lati inu alfabeti Latin (ati aami ifamisi diẹ), ati pe awọn orukọ wọnyi kii ṣe laileto paapaa, o ṣeeṣe ti iru atunto kan pọ si pupọ.

Nipa ọna, tani ṣayẹwo kini o wa nibẹ? gan CRC32? Ọkan ninu awọn koodu orisun akọkọ (paapaa ṣaaju Waltman) ni iṣẹ hash ti o pọ si ohun kikọ kọọkan nipasẹ nọmba 239, nitorinaa olufẹ nipasẹ awọn eniyan wọnyi, ha ha!

Nikẹhin, o dara, a rii pe awọn oluṣeto pẹlu iru aaye kan Vector<int> и Vector<PolymorType> yoo yatọ si CRC32. Kini nipa iṣẹ ori ayelujara? Ati lati oju-ọna imọ-jinlẹ, ṣe eyi di apakan ti iru? Jẹ ká sọ a kọja ohun orun ti mẹwa ẹgbẹrun awọn nọmba, daradara pẹlu Vector<int> ohun gbogbo ni ko o, awọn ipari ati awọn miiran 40000 baiti. Ohun ti o ba ti yi Vector<Type2>, eyi ti oriširiši nikan kan aaye int ati pe o wa nikan ni iru - ṣe a nilo lati tun 10000xabcdef0 ṣe awọn akoko 34 ati lẹhinna 4 baiti int, tabi ede ni anfani lati Ominira o fun wa lati Constructor fixedVec ati dipo 80000 baiti, gbigbe lẹẹkansi nikan 40000?

Eyi kii ṣe ibeere imọ-jinlẹ ti ko ṣiṣẹ rara - fojuinu pe o gba atokọ ti awọn olumulo ẹgbẹ, ọkọọkan wọn ni id, orukọ akọkọ, orukọ idile - iyatọ ninu iye data ti o gbe lori asopọ alagbeka le ṣe pataki. O jẹ deede ni imunadoko ti isọdọtun Telegram ti a kede si wa.

Nitorina…

Vector, eyi ti a ti ko tu

Ti o ba gbiyanju lati lọ kiri nipasẹ awọn oju-iwe ti apejuwe ti awọn akojọpọ ati bẹbẹ lọ, iwọ yoo rii pe fekito kan (ati paapaa matrix kan) n gbiyanju ni deede lati ṣejade nipasẹ awọn tuples ti ọpọlọpọ awọn iwe. Ṣugbọn ni ipari wọn gbagbe, igbesẹ ikẹhin ti fo, ati asọye ti fekito kan ni a fun ni nìkan, eyiti ko ti so mọ iru kan. Kin o nsele? Ni awọn ede siseto, ni pataki awọn iṣẹ ṣiṣe, o jẹ aṣoju pupọ lati ṣapejuwe eto naa ni igbagbogbo - olupilẹṣẹ pẹlu igbelewọn ọlẹ rẹ yoo loye ati ṣe ohun gbogbo funrararẹ. Ni ede data serialization ohun ti o nilo ni AGBARA: o to lati ṣe apejuwe nirọrun atokọ naa, i.e. eto ti awọn eroja meji - akọkọ jẹ ẹya data, keji jẹ eto kanna funrararẹ tabi aaye ṣofo fun iru (pack (cons) ni Lisp). Ṣugbọn eyi yoo han gbangba beere ti kọọkan ano lo afikun 4 baiti (CRC32 ninu ọran ni TL) lati ṣe apejuwe iru rẹ. Ohun orun le tun ti wa ni awọn iṣọrọ se apejuwe ti o wa titi iwọn, ṣugbọn ninu ọran ti opo gigun ti a ko mọ tẹlẹ, a ya kuro.

Nitorinaa, niwọn bi TL ko gba laaye lati gbejade fekito kan, o ni lati ṣafikun ni ẹgbẹ. Ni ipari, iwe-ipamọ naa sọ pe:

Serialization nigbagbogbo nlo olupilẹṣẹ kanna “fekito” (const 0x1cb5c415 = crc32(“vector t:Type # [t] = Vector t”) ti ko dale lori iye kan pato ti oniyipada iru t.

Awọn iye ti awọn iyan paramita t ni ko lowo ninu awọn serialization niwon o ti wa ni yo lati awọn esi iru (nigbagbogbo mọ saju to deserialization).

Wo ni pẹkipẹki: vector {t:Type} # [ t ] = Vector t - ṣugbọn besi Itumọ yii funrararẹ ko sọ pe nọmba akọkọ gbọdọ jẹ dogba si ipari ti fekito! Ati pe ko wa lati ibikibi. Eyi jẹ fifun ti o nilo lati wa ni iranti ati imuse pẹlu ọwọ rẹ. Ni ibomiiran, iwe paapaa sọ ni otitọ pe iru kii ṣe gidi:

Vector t polymorphic pseudotype jẹ “iru” ti iye rẹ jẹ ọkọọkan awọn iye ti eyikeyi iru t, boya apoti tabi igboro.

... sugbon ko idojukọ lori o. Nigbati o ba rẹwẹsi lati lọ kiri nipasẹ nina ti mathimatiki (boya paapaa ti o mọ ọ lati ile-ẹkọ giga ile-ẹkọ giga kan), pinnu lati fi silẹ ki o wo bi o ṣe le ṣiṣẹ pẹlu rẹ ni iṣe, iwunilori ti o wa ni ori rẹ ni pe eyi jẹ Pataki Mathimatiki ni mojuto, o ti wa ni kedere a se nipa Cool People (meji mathimatiki - ACM Winner), ki o si ko o kan ẹnikẹni. Ibi-afẹde - lati ṣafihan - ti ṣaṣeyọri.

Nipa ọna, nipa nọmba naa. Jẹ ki a leti pe # o jẹ a synonym nat, nọmba adayeba:

Awọn ikosile iru wa (iru-expr) ati awọn ikosile nọmba (nat-expr). Sibẹsibẹ, wọn ṣe asọye ni ọna kanna.

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

sugbon ni girama ti won se apejuwe ni ona kanna, i.e. Iyatọ yii gbọdọ tun ranti ati fi si imuse pẹlu ọwọ.

O dara, bẹẹni, awọn oriṣi awoṣe (vector<int>, vector<User>) ni idanimọ ti o wọpọ (#1cb5c415), i.e. ti o ba mọ pe ipe ti wa ni kede bi

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

lẹhinna o ko tun duro de fekito kan, ṣugbọn fekito ti awọn olumulo. Ni deede diẹ sii, yẹ duro - ni koodu gidi, gbogbo nkan, ti kii ṣe iru igboro, yoo ni olupilẹṣẹ, ati ni ọna ti o dara ni imuse yoo jẹ pataki lati ṣayẹwo - ṣugbọn a firanṣẹ ni deede ni gbogbo ipin ti fekito yii. iru naa? Kini ti o ba jẹ diẹ ninu iru PHP, ninu eyiti orun le ni awọn oriṣi oriṣiriṣi ni awọn eroja oriṣiriṣi?

Ni aaye yii o bẹrẹ lati ronu - ṣe iru TL jẹ pataki? Boya fun rira naa yoo ṣee ṣe lati lo serializer eniyan, ilana kanna ti o ti wa tẹlẹ lẹhinna? Ti o wà ni yii, jẹ ki ká wo ni asa.

Awọn imuṣẹ TL ti o wa ni koodu

TL ni a bi ni awọn ijinle VKontakte paapaa ṣaaju awọn iṣẹlẹ olokiki pẹlu tita ipin Durov ati (jasi), paapaa ṣaaju idagbasoke ti Telegram bẹrẹ. Ati ni ìmọ orisun koodu orisun ti akọkọ imuse o ti le ri kan pupo ti funny crutches. Ati pe ede naa funrararẹ ni imuse nibẹ ni kikun ju bi o ti wa ni bayi ni Telegram. Fun apẹẹrẹ, awọn hashes ni a ko lo rara ninu ero naa (itumo pseudotype ti a ṣe sinu rẹ (gẹgẹbi fekito) pẹlu ihuwasi alaiṣedeede). Tabi

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

ṣugbọn jẹ ki a ro, nitori ti pipe, lati wa kakiri, bẹ si sọrọ, awọn itankalẹ ti awọn Giant ti ero.

#define ZHUKOV_BYTES_HACK

#ifdef ZHUKOV_BYTES_HACK

/* dirty hack for Zhukov request */

Tabi eyi ti o lẹwa:

    static const char *reserved_words_polymorhic[] = {

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

      };

Ajeku yii jẹ nipa awọn awoṣe bii:

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

Eyi ni itumọ ti iru awoṣe hashmap gẹgẹbi fekito ti int - Iru orisii. Ni C ++ yoo dabi nkan bayi:

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

nitorina, alpha - koko! Ṣugbọn nikan ni C ++ o le kọ T, ṣugbọn o yẹ ki o kọ alpha, beta ... Ṣugbọn ko ju awọn paramita 8 lọ, ni ibi ti irokuro dopin. O dabi pe ni ẹẹkan ni St.

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

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

Ṣugbọn eyi jẹ nipa imuse atẹjade akọkọ ti TL “ni gbogbogbo”. Jẹ ki a tẹsiwaju lati gbero awọn imuse ninu awọn alabara Telegram funrararẹ.

Ọrọ si Vasily:

Vasily, [09.10.18 17:07] Ju gbogbo rẹ lọ, kẹtẹkẹtẹ gbona nitori pe wọn ṣẹda opo ti awọn ohun elo, lẹhinna wọn lu boluti lori wọn, ti wọn si fi awọn ohun-ọṣọ bò monomono koodu.
Bi abajade, akọkọ lati ibi iduro pilot.jpg
Lẹhinna lati koodu dzhekichan.webp

Nitoribẹẹ, lati ọdọ awọn eniyan ti o faramọ pẹlu awọn algoridimu ati mathimatiki, a le nireti pe wọn ti ka Aho, Ullmann, ati pe wọn faramọ awọn irinṣẹ ti o ti di boṣewa de facto ninu ile-iṣẹ ni awọn ewadun fun kikọ awọn akopọ DSL wọn, otun?...

Nipasẹ telegram-cli jẹ Vitaly Valtman, bi o ṣe le loye lati iṣẹlẹ ti ọna kika TLO ni ita awọn aala rẹ (cli), ọmọ ẹgbẹ kan - ni bayi ile-ikawe kan fun sisọ TL ti pin. lọtọ, kí ni ìrísí rẹ̀ Itupalẹ TL? ..

16.12 04:18 Vasily: Mo ro pe ẹnikan ko ni oye lex+yacc
16.12 04:18 Vasily: Emi ko le ṣe alaye bibẹẹkọ
16.12 04:18 Vasily: daradara, tabi wọn san fun nọmba awọn ila ni VK.
16.12 04:19 Vasily: 3k+ ila ati be be lo.<censored> dipo a parser

Boya ohun sile? Jẹ ká wo bi ṣe Eyi ni alabara osise - Ojú-iṣẹ Telegram:

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

Awọn laini 1100+ ni Python, tọkọtaya ti awọn ikosile deede + awọn ọran pataki bi fekito kan, eyiti, nitorinaa, ti kede ninu ero naa bi o ṣe yẹ ki o wa ni ibamu si sintasi TL, ṣugbọn wọn gbarale sintasi yii lati ṣe itupalẹ rẹ… Ibeere naa waye, kilode ti gbogbo rẹ fi jẹ iyanu?иO jẹ fẹlẹfẹlẹ diẹ sii ti ko ba si ẹnikan ti yoo ṣe itupalẹ rẹ ni ibamu si iwe naa lonakona ?!

Nipa ọna... Ranti a sọrọ nipa CRC32 yiyewo? Nitorinaa, ninu olupilẹṣẹ koodu Ojú-iṣẹ Telegram nibẹ ni atokọ ti awọn imukuro fun awọn iru wọnyẹn ninu eyiti iṣiro CRC32 ko baramu pẹlu ọkan ti a tọka si ninu aworan atọka!

Vasily, [18.12/22 49:XNUMX] ati nibi Emi yoo ronu boya iru TL kan nilo
ti MO ba fẹ idotin pẹlu awọn imuse yiyan, Emi yoo bẹrẹ sii fi awọn fifọ laini sii, idaji awọn parsers yoo fọ lori awọn asọye laini pupọ
tdesktop, sibẹsibẹ, ju

Ranti ojuami nipa ọkan-ila, a yoo pada si o diẹ diẹ nigbamii.

O dara, telegram-cli jẹ laigba aṣẹ, Ojú-iṣẹ Telegram jẹ osise, ṣugbọn kini nipa awọn miiran? Tani o mọ?... Ninu koodu alabara Android ko si parser schema rara (eyiti o fa awọn ibeere nipa orisun ṣiṣi, ṣugbọn eyi jẹ fun apakan keji), ṣugbọn ọpọlọpọ awọn ege funny miiran ti koodu, ṣugbọn diẹ sii lori wọn ni apa isalẹ.

Awọn ibeere miiran wo ni serialization dide ni iṣe? Fun apẹẹrẹ, wọn ṣe ọpọlọpọ awọn nkan, nitorinaa, pẹlu awọn aaye bit ati awọn aaye ipo:

Vasily: flags.0? true
tumo si wipe awọn aaye jẹ bayi ati ki o dogba otitọ ti o ba ti asia ṣeto

Vasily: flags.1? int
tumo si wipe awọn aaye jẹ bayi ati ki o nilo lati wa ni deserialized

Vasily: Ass, maṣe yọ ara rẹ lẹnu nipa kini o n ṣe!
Vasily: mẹnuba kan wa ni ibikan ninu doc ​​pe otitọ jẹ iru gigun-odo, ṣugbọn ko ṣee ṣe lati ṣajọ ohunkohun lati inu iwe aṣẹ wọn
Vasily: Ninu awọn imuse orisun ṣiṣi eyi kii ṣe ọran boya, ṣugbọn opo kan wa ati awọn atilẹyin

Kini nipa Telethon? Wiwa siwaju si koko-ọrọ ti MTProto, apẹẹrẹ - ninu iwe-ipamọ awọn iru awọn ege naa wa, ṣugbọn ami naa % o ti wa ni apejuwe nikan bi "bamu si a fi fun igboro-Iru", i.e. ninu awọn apẹẹrẹ ni isalẹ boya aṣiṣe kan wa tabi nkan ti ko ni iwe-aṣẹ:

Vasily, [22.06.18 18:38] Ni ibi kan:

msg_container#73f1f8dc messages:vector message = MessageContainer;

Ni oriṣiriṣi:

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

Ati pe iwọnyi jẹ awọn iyatọ nla meji, ni igbesi aye gidi diẹ ninu iru fekito ihoho wa

Mo ti ko ri a igboro fekito definition ati ki o ti ko wa kọja ọkan

Onínọmbà ti kọ nipasẹ ọwọ ni telethon

Ninu aworan atọka rẹ asọye asọye msg_container

Lẹẹkansi, ibeere naa wa nipa %. Ko ṣe apejuwe rẹ.

Vadim Goncharov, [22.06.18 19:22] ati ni tdesktop?

Vasily, [22.06.18 19:23] Ṣugbọn parser TL wọn lori awọn ẹrọ deede kii yoo jẹ eyi boya

// parsed manually

TL jẹ abstraction ẹlẹwa, ko si ẹnikan ti o ṣe imuse rẹ patapata

Ati pe% ko si ninu ẹya wọn ti ero naa

Ṣugbọn nibi awọn iwe-ipamọ naa tako ararẹ, nitorina idk

O wa ninu girama, wọn le kan ti gbagbe lati ṣapejuwe awọn itumọ-ọrọ

O rii iwe-ipamọ lori TL, o ko le ro ero rẹ laisi idaji lita kan

“Daradara, jẹ ki a sọ,” oluka miiran yoo sọ, “o ṣofintoto nkan kan, nitorinaa fihan mi bi o ṣe yẹ ki o ṣe.”

Vasily fèsì pé: “Ní ti olùtúmọ̀, mo fẹ́ràn àwọn nǹkan bí

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

bakan fẹ o dara ju

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

tabi

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

eyi ni gbogbo lexer:

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

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

awon. ti o rọrun julọ ni fifi o jẹ pẹlẹbẹ.”

Ni gbogbogbo, bi abajade, parser ati olupilẹṣẹ koodu fun ipin ti TL ti a lo ni deede ni ibamu si awọn laini 100 ti ilo ati ~ 300 awọn laini ti monomono (kika gbogbo rẹ. print's ti ipilẹṣẹ koodu), pẹlu iru alaye buns fun introspection ni kọọkan kilasi. Kọọkan polymorphic iru wa sinu ohun ṣofo áljẹbrà mimọ kilasi, ati constructors jogun lati o ati ki o ni awọn ọna fun serialization ati deserialization.

Aini awọn iru ni iru ede

Titẹ ti o lagbara jẹ ohun ti o dara, otun? Rara, eyi kii ṣe holivar (botilẹjẹpe Mo fẹran awọn ede ti o ni agbara), ṣugbọn ifiweranṣẹ laarin ilana ti TL. Da lori rẹ, ede yẹ ki o pese gbogbo iru awọn sọwedowo fun wa. Daradara, dara, boya kii ṣe on tikararẹ, ṣugbọn imuse, ṣugbọn o yẹ ki o kere ju apejuwe wọn. Ati iru awọn anfani wo ni a fẹ?

Ni akọkọ, awọn ihamọ. Nibi a rii ninu iwe fun ikojọpọ awọn faili:

Akoonu alakomeji faili naa yoo pin si awọn apakan. Gbogbo awọn ẹya gbọdọ ni iwọn kanna ( apakan_iwọn ) ati awọn ipo wọnyi gbọdọ wa ni ibamu:

  • part_size % 1024 = 0 (pin nipasẹ 1KB)
  • 524288 % part_size = 0 (512KB gbọdọ jẹ paapaa pin nipasẹ part_size)

Apa ti o kẹhin ko ni lati ni itẹlọrun awọn ipo wọnyi, ti iwọn rẹ ba kere ju part_size.

Apa kọọkan yẹ ki o ni nọmba ọkọọkan, faili_apakan, pẹlu iye ti o wa lati 0 si 2,999.

Lẹhin ti a ti pin faili naa o nilo lati yan ọna kan fun fifipamọ sori olupin naa. Lo upload.saveBigFilePart ni irú awọn ni kikun iwọn ti awọn faili jẹ diẹ sii ju 10 MB ati upload.saveFilePart fun awọn faili kekere.
Ọkan ninu awọn aṣiṣe titẹ sii data atẹle le jẹ pada:

  • FILE_PARTS_INVALID - Nọmba ti ko tọ ti awọn ẹya. Awọn iye ni ko laarin 1..3000

Ṣe eyikeyi ninu eyi ninu aworan atọka? Ṣe eyi bakan ṣalaye nipa lilo TL? Rara. Ṣugbọn ṣagbe mi, paapaa Turbo Pascal baba-nla ni anfani lati ṣapejuwe awọn oriṣi pato awọn sakani. O si mọ ohun kan diẹ, bayi dara mọ bi enum - iru kan ti o ni iṣiro ti nọmba ti o wa titi (kekere) ti awọn iye. Ni awọn ede bii C - nomba, ṣe akiyesi pe titi di isisiyi a ti sọrọ nikan nipa awọn iru awọn nọmba. Ṣugbọn awọn eto tun wa, awọn okun ... fun apẹẹrẹ, yoo dara lati ṣe apejuwe pe okun yii le ni nọmba foonu nikan ni, otun?

Ko si eyi ti o wa ninu TL. Ṣugbọn o wa, fun apẹẹrẹ, ni JSON Schema. Ati pe ti ẹnikan ba le jiyan nipa pipin ti 512 KB, pe eyi tun nilo lati ṣayẹwo ni koodu, lẹhinna rii daju pe alabara ni irọrun. ko le fi nọmba kan jade ti ibiti o 1..3000 (ati aṣiṣe ti o baamu ko le dide) yoo ti ṣee ṣe, otun? ..

Nipa ọna, nipa awọn aṣiṣe ati awọn iye pada. Paapaa awọn ti o ti ṣiṣẹ pẹlu TL blur oju wọn - o ko lẹsẹkẹsẹ owurọ lori wa pe olukuluku a iṣẹ ni TL le kosi pada ko nikan ni apejuwe pada iru, sugbon tun ẹya aṣiṣe. Ṣugbọn eyi ko le ṣe yọkuro ni eyikeyi ọna nipa lilo TL funrararẹ. Nitoribẹẹ, o ti han tẹlẹ ati pe ko si iwulo fun ohunkohun ni iṣe (botilẹjẹpe ni otitọ, RPC le ṣee ṣe ni awọn ọna oriṣiriṣi, a yoo pada wa si eyi nigbamii) - ṣugbọn kini nipa Iwa-mimọ ti awọn imọran ti Mathematics of Abstract Types lati aye orun?.. Mo ti gbe fami - ki baramu o.

Ati nikẹhin, kini nipa kika? O dara, nibẹ, ni gbogbogbo, Emi yoo fẹ apejuwe ni ẹtọ ni eto (ninu ero JSON, lẹẹkansi, o jẹ), ṣugbọn ti o ba ti ni wahala tẹlẹ pẹlu rẹ, lẹhinna kini nipa ẹgbẹ iṣe - o kere ju ni wiwo awọn iyatọ lakoko awọn imudojuiwọn? Wo fun ara rẹ ni gidi apeere:

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

tabi

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

O da lori gbogbo eniyan, ṣugbọn GitHub, fun apẹẹrẹ, kọ lati ṣe afihan awọn ayipada ninu iru awọn laini gigun. Ere naa “wa awọn iyatọ 10”, ati pe ohun ti ọpọlọ rii lẹsẹkẹsẹ ni pe awọn ibẹrẹ ati ipari ni awọn apẹẹrẹ mejeeji jẹ kanna, o nilo lati ka ni itara ni ibikan ni aarin… Ni ero mi, eyi kii ṣe ni imọran nikan, sugbon odasaka oju idọti ati sloppy.

Nipa ona, nipa awọn ti nw ti yii. Kini idi ti a nilo awọn aaye kekere? Ṣe ko dabi pe wọn orun buburu lati ojuami ti wo ti iru yii? A le rii alaye naa ni awọn ẹya iṣaaju ti aworan atọka. Ni akọkọ, bẹẹni, bi o ṣe jẹ bẹ, fun gbogbo sneiṣi iru tuntun kan ni a ṣẹda. Awọn ilana wọnyi tun wa ni fọọmu yii, fun apẹẹrẹ:

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;

Ṣugbọn ni bayi fojuinu, ti o ba ni awọn aaye iyan 5 ninu eto rẹ, lẹhinna iwọ yoo nilo awọn oriṣi 32 fun gbogbo awọn aṣayan ti o ṣeeṣe. bugbamu Combinatorial. Nitorinaa, mimọ gara ti imọ-jinlẹ TL lekan si fọ lodi si kẹtẹkẹtẹ-irin simẹnti ti otito lile ti serialization.

Ni afikun, ni diẹ ninu awọn eniyan wọnyi tikararẹ rú awọn iwe ti ara wọn. Fun apẹẹrẹ, ni MTProto (ipin ti o tẹle) idahun le jẹ fisinuirindigbindigbin nipasẹ Gzip, ohun gbogbo dara - ayafi ti awọn fẹlẹfẹlẹ ati iyika ti ṣẹ. Lekan si, kii ṣe RpcResult funrararẹ ni a ti kórè, ṣugbọn awọn akoonu inu rẹ. O dara, kilode ti o ṣe eyi?... Mo ni lati ge sinu crutch ki titẹkuro le ṣiṣẹ nibikibi.

Tabi apẹẹrẹ miiran, a ṣe awari aṣiṣe kan - o ti firanṣẹ InputPeerUser dipo InputUser. Tabi idakeji. Ṣugbọn o ṣiṣẹ! Iyẹn ni, olupin naa ko bikita nipa iru. Bawo ni eyi ṣe le jẹ? Idahun si le jẹ fun wa nipasẹ awọn ajẹkù koodu lati 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);

Ni gbolohun miran, eyi ni ibi ti serialization ti wa ni ṣe LỌWỌ, ko ti ipilẹṣẹ koodu! Boya olupin naa ni imuse ni ọna kanna? .. Ni opo, eyi yoo ṣiṣẹ ti o ba ṣe ni ẹẹkan, ṣugbọn bawo ni o ṣe le ṣe atilẹyin nigbamii nigba awọn imudojuiwọn? Eyi ni idi ti eto naa ṣe ṣẹda? Ati pe nibi a tẹsiwaju si ibeere ti o tẹle.

Ti ikede. Fẹlẹfẹlẹ

Kini idi ti awọn ẹya sikematiki ni a pe ni awọn fẹlẹfẹlẹ le jẹ arosọ nikan ti o da lori itan-akọọlẹ ti awọn sikematiki ti a tẹjade. Nkqwe, ni akọkọ awọn onkọwe ro pe awọn ohun ipilẹ le ṣee ṣe ni lilo ilana ti ko yipada, ati pe nibiti o ṣe pataki, fun awọn ibeere kan pato, fihan pe wọn ti ṣe ni lilo ẹya ti o yatọ. Ni opo, paapaa imọran ti o dara - ati pe titun yoo jẹ, bi o ti jẹ pe, "adalu", ti o wa lori oke ti atijọ. Ṣugbọn jẹ ki a wo bi o ti ṣe. Lootọ, Emi ko ni anfani lati wo lati ibẹrẹ - o jẹ ẹrin, ṣugbọn aworan atọka ti Layer mimọ ko si tẹlẹ. Awọn ipele ti bẹrẹ pẹlu 2. Iwe naa sọ fun wa nipa ẹya TL pataki kan:

Ti alabara ba ṣe atilẹyin Layer 2, lẹhinna a gbọdọ lo olupilẹṣẹ atẹle naa:

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

Ni iṣe, eyi tumọ si pe ṣaaju gbogbo ipe API, int pẹlu iye naa 0x289dd1f6 gbọdọ wa ni afikun ṣaaju nọmba ọna.

Ohun deede. Àmọ́ kí ló ṣẹlẹ̀ lẹ́yìn náà? Lẹhinna farahan

invokeWithLayer3#b7475268 query:!X = X;

Nitorina kini atẹle? Bi o ṣe le gboju,

invokeWithLayer4#dea0d430 query:!X = X;

Funny? Rara, o ti ni kutukutu lati rẹrin, ronu nipa otitọ pe ọkọọkan ibeere lati Layer miiran nilo lati wa ni iru iru pataki kan - ti gbogbo wọn ba yatọ fun ọ, bawo ni o ṣe le ṣe iyatọ wọn? Ati fifi o kan 4 baiti ni iwaju jẹ kan lẹwa daradara ọna. Nitorina,

invokeWithLayer5#417a57ae query:!X = X;

Ṣugbọn o han gbangba pe lẹhin igba diẹ eyi yoo di diẹ ninu iru bacchanalia. Ati pe idahun wa:

Imudojuiwọn: Bibẹrẹ pẹlu Layer 9, awọn ọna oluranlọwọ invokeWithLayerN le ṣee lo nikan pọ pẹlu initConnection

Hooray! Lẹhin awọn ẹya 9, a nipari wa si ohun ti a ṣe ni awọn ilana Intanẹẹti pada ni awọn ọdun 80 - gbigba lori ẹya ni ẹẹkan ni ibẹrẹ asopọ!

Nitorina kini atẹle?..

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

Ṣugbọn nisisiyi o tun le rẹrin. Nikan lẹhin awọn ipele 9 miiran, olupilẹṣẹ gbogbo agbaye pẹlu nọmba ẹya kan ni ipari ti a ṣafikun, eyiti o nilo lati pe ni ẹẹkan ni ibẹrẹ asopọ, ati pe itumọ ti awọn fẹlẹfẹlẹ dabi ẹni pe o ti parẹ, ni bayi o jẹ ẹya ni majemu, bii nibi gbogbo miran. Isoro yanju.

Gangan?..

Vasily, [16.07.18 14:01] Paapaa ni ọjọ Jimọ Mo ro pe:
Teleserver firanṣẹ awọn iṣẹlẹ laisi ibeere kan. Awọn ibeere gbọdọ wa ni we sinu InvokeWithLayer. Olupin naa ko fi ipari si awọn imudojuiwọn; ko si eto fun awọn idahun ti n murasilẹ ati awọn imudojuiwọn.

Awon. onibara ko le pato awọn Layer ninu eyi ti o fẹ awọn imudojuiwọn

Vadim Goncharov, [16.07.18 14:02] kii ṣe InvokeWithLayer kan crutch ni opo?

Vasily, [16.07.18 14:02] Eleyi jẹ nikan ni ona

Vadim Goncharov, [16.07.18 14:02] eyi ti o ni pataki yẹ ki o tumo si gbigba lori Layer ni ibẹrẹ ti awọn igba.

Nipa ọna, o tẹle pe ilọkuro alabara ko pese

Awọn imudojuiwọn, i.e. iru Updates ninu ero naa, eyi ni ohun ti olupin n firanṣẹ si alabara kii ṣe ni idahun si ibeere API, ṣugbọn ni ominira nigbati iṣẹlẹ ba waye. Eyi jẹ koko-ọrọ eka kan ti yoo jiroro ni ifiweranṣẹ miiran, ṣugbọn fun bayi o ṣe pataki lati mọ pe olupin n fipamọ Awọn imudojuiwọn paapaa nigbati alabara wa ni aisinipo.

Bayi, ti o ba kọ lati fi ipari si ti kọọkan package lati tọka ẹya rẹ, ọgbọn yii yori si awọn iṣoro ti o ṣeeṣe atẹle wọnyi:

  • olupin naa nfi awọn imudojuiwọn ranṣẹ si alabara paapaa ṣaaju ki alabara ti sọ fun ẹya ti o ṣe atilẹyin
  • Kini MO le ṣe lẹhin igbegasoke alabara?
  • tani awọn onigbọwọpe ero olupin nipa nọmba Layer kii yoo yipada lakoko ilana naa?

Ṣe o ro pe eyi ni odasaka o tumq si akiyesi, ati ni asa eyi ko le ṣẹlẹ, nitori awọn olupin ti wa ni kikọ ti o tọ (o kere, o ti wa ni idanwo daradara)? Ha! Ko si bi o ti jẹ!

Eleyi jẹ gangan ohun ti a sure sinu August. Ni Oṣu Kẹjọ Ọjọ 14, awọn ifiranṣẹ wa pe ohun kan n ṣe imudojuiwọn lori awọn olupin Telegram… ati lẹhinna ninu awọn akọọlẹ:

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.

ati lẹhinna ọpọlọpọ awọn megabytes ti awọn itọpa akopọ (daradara, ni akoko kanna ti gedu ti wa titi). Lẹhinna, ti ohun kan ko ba mọ ni TL rẹ, o jẹ alakomeji nipasẹ ibuwọlu, siwaju si isalẹ ila GBOGBO lọ, iyipada yoo di soro. Kini o yẹ ki o ṣe ni iru ipo bẹẹ?

O dara, ohun akọkọ ti o wa si ọkan ẹnikẹni ni lati ge asopọ ati gbiyanju lẹẹkansi. Ko ṣe iranlọwọ. A google CRC32 - awọn wọnyi wa ni jade lati wa ni ohun lati eni 73, biotilejepe a sise lori 82. A wo fara ni awọn log - nibẹ ni o wa idamo lati meji ti o yatọ Siso!

Boya iṣoro naa jẹ odasaka ninu alabara laigba aṣẹ wa? Rara, a ṣe ifilọlẹ Ojú-iṣẹ Telegram 1.2.17 (ẹya ti a pese ni nọmba awọn pinpin Linux), o kọwe si akọọlẹ Iyatọ: MTP Iru airotẹlẹ id #b5223b0f ka ni MTMessageMedia…

Lodi ti ilana ati awọn isunmọ eto ti Telegram. Apá 1, imọ-ẹrọ: iriri ti kikọ alabara lati ibere - TL, MT

Google fihan pe iru iṣoro kan ti ṣẹlẹ tẹlẹ si ọkan ninu awọn alabara laigba aṣẹ, ṣugbọn lẹhinna awọn nọmba ẹya ati, ni ibamu, awọn arosinu yatọ…

Nitorina kini o yẹ ki a ṣe? Vasily ati Emi pin: o gbiyanju lati ṣe imudojuiwọn Circuit naa si 91, Mo pinnu lati duro fun awọn ọjọ diẹ ki o gbiyanju lori 73. Awọn ọna mejeeji ṣiṣẹ, ṣugbọn nitori wọn jẹ agbara, ko si oye ti iye awọn ẹya si oke tabi isalẹ ti o nilo. lati fo, tabi bi o ṣe gun to o nilo lati duro.

Nigbamii Mo ni anfani lati ṣe ẹda ipo naa: a ṣe ifilọlẹ alabara, pa a, tun ṣe Circuit si ipele miiran, tun bẹrẹ, mu iṣoro naa lẹẹkansi, pada si iṣaaju - oops, ko si iye iyipada Circuit ati alabara tun bẹrẹ fun a iṣẹju diẹ yoo ran. Iwọ yoo gba akojọpọ awọn ẹya data lati awọn ipele oriṣiriṣi.

Alaye bi? Bii o ṣe le gboju lati ọpọlọpọ awọn ami aisan aiṣe-taara, olupin naa ni ọpọlọpọ awọn ilana ti awọn oriṣiriṣi oriṣiriṣi lori awọn ẹrọ oriṣiriṣi. O ṣeese julọ, olupin ti o ni iduro fun “fifipamọ” fi sinu isinyi ohun ti awọn alaṣẹ rẹ fun ni, wọn si fun ni ni ero ti o wa ni aye ni akoko iran. Ati titi ti isinyi yii “bajẹ”, ko si ohun ti a le ṣe nipa rẹ.

Boya ... ṣugbọn eyi jẹ ẹru ẹru?! .. Rara, ṣaaju ki o to ronu nipa awọn ero irikuri, jẹ ki a wo koodu ti awọn onibara osise. Ninu ẹya Android a ko rii parser TL eyikeyi, ṣugbọn a rii faili hefty kan (GitHub kọ lati fi ọwọ kan rẹ) pẹlu (de) serialization. Eyi ni awọn snippets koodu:

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;

tabi

    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... o dabi egan. Ṣugbọn, jasi, eyi jẹ koodu ti ipilẹṣẹ, lẹhinna dara? .. Ṣugbọn o ṣe atilẹyin fun gbogbo awọn ẹya! Otitọ, ko ṣe kedere idi ti ohun gbogbo fi dapọ, awọn ibaraẹnisọrọ asiri, ati gbogbo iru _old7 bakan ko dabi iran ẹrọ ... Sibẹsibẹ, julọ julọ gbogbo mi ni a ti fẹ

TL_message_layer104
TL_message_layer104_2
TL_message_layer104_3

Awọn eniyan, ṣe o ko le pinnu kini inu Layer kan?! O dara, o dara, jẹ ki a sọ pe "meji" ti tu silẹ pẹlu aṣiṣe kan, daradara, o ṣẹlẹ, ṣugbọn KẸTA? ... Lẹsẹkẹsẹ, rake kanna lẹẹkansi? Iru aworan iwokuwo wo ni eyi, ma binu?..

Ninu koodu orisun ti Ojú-iṣẹ Telegram, nipasẹ ọna, iru nkan kan ṣẹlẹ - ti o ba jẹ bẹ, ọpọlọpọ awọn iṣe ni ọna kan si ero naa ko yi nọmba Layer rẹ pada, ṣugbọn ṣatunṣe nkan kan. Ni awọn ipo nibiti ko si orisun data osise fun ero naa, nibo ni o ti le gba lati, ayafi fun koodu orisun ti alabara osise? Ati pe ti o ba mu lati ibẹ, o ko le ni idaniloju pe ero naa jẹ pipe titi ti o fi ṣe idanwo gbogbo awọn ọna.

Bawo ni o ṣe le ṣe idanwo paapaa? Mo nireti pe awọn onijakidijagan ti ẹyọkan, iṣẹ ṣiṣe ati awọn idanwo miiran yoo pin ninu awọn asọye.

O dara, jẹ ki a wo nkan koodu miiran:

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;

Ọrọ asọye yii “ti a ṣẹda pẹlu ọwọ” daba pe apakan nikan ti faili yii ni a kọ pẹlu ọwọ (ṣe o le foju inu wo gbogbo alaburuku itọju naa?), Ati iyokù jẹ ipilẹṣẹ ẹrọ. Sibẹsibẹ, lẹhinna ibeere miiran dide - pe awọn orisun wa kii ṣe patapata (a la GPL blobs ninu ekuro Linux), ṣugbọn eyi jẹ koko-ọrọ tẹlẹ fun apakan keji.

Sugbon to. Jẹ ká gbe lori si awọn bèèrè lori oke ti eyi ti gbogbo yi serialization nṣiṣẹ.

MT Proto

Nitorinaa, jẹ ki a ṣii gbogboogbo apejuwe и alaye apejuwe ti awọn bèèrè ati ohun akọkọ ti a kọsẹ lori ni awọn ọrọ-ọrọ. Ati pẹlu ọpọlọpọ ohun gbogbo. Ni gbogbogbo, eyi dabi pe o jẹ ẹya-ara ti Telegram - pipe awọn nkan ni oriṣiriṣi ni awọn aaye oriṣiriṣi, tabi awọn nkan oriṣiriṣi pẹlu ọrọ kan, tabi ni idakeji (fun apẹẹrẹ, ni API ipele giga, ti o ba rii idii sitika, kii ṣe ohun ti o ro).

Fun apẹẹrẹ, “ifiranṣẹ” ati “igba” tumọ si ohun ti o yatọ nibi ju ni wiwo alabara Telegram deede. O dara, ohun gbogbo han gbangba pẹlu ifiranṣẹ naa, o le tumọ ni awọn ofin OOP, tabi nirọrun pe ọrọ naa “packet” - eyi jẹ kekere, ipele gbigbe, ko si awọn ifiranṣẹ kanna bi ni wiwo, ọpọlọpọ awọn ifiranṣẹ iṣẹ wa. . Ṣugbọn awọn igba ... sugbon akọkọ ohun akọkọ.

gbigbe Layer

Ohun akọkọ ni gbigbe. Wọn yoo sọ fun wa nipa awọn aṣayan 5:

  • TCP
  • Oju opo wẹẹbu
  • Websocket lori HTTPS
  • HTTP
  • HTTPS

Vasily, [15.06.18 15:04] Ọkọ UDP tun wa, ṣugbọn ko ṣe akọsilẹ

Ati TCP ni awọn iyatọ mẹta

Eyi akọkọ jẹ iru si UDP lori TCP, apo-iwe kọọkan pẹlu nọmba ọkọọkan ati crc
Kini idi ti kika awọn iwe aṣẹ lori kẹkẹ kan jẹ irora pupọ?

O dara, nibẹ o wa ni bayi TCP tẹlẹ ninu awọn iyatọ 4:

  • Otọ
  • Atẹle
  • Fifẹ agbedemeji
  • Full

O dara, ok, Agbedemeji fifẹ fun MTProxy, eyi ni a ṣafikun nigbamii nitori awọn iṣẹlẹ olokiki daradara. Ṣugbọn kilode ti awọn ẹya meji diẹ sii (mẹta ni apapọ) nigbati o le gba pẹlu ọkan? Gbogbo awọn mẹrin pataki yatọ nikan ni bi o ṣe le ṣeto gigun ati isanwo ti MTProto akọkọ, eyiti yoo jiroro siwaju:

  • ni Abridged o jẹ 1 tabi 4 baiti, sugbon ko 0xef, ki o si awọn ara
  • ni Intermediate yi ni 4 baiti ipari ati ki o kan aaye, ati awọn igba akọkọ ti ose gbọdọ fi 0xeeeeeeee lati fihan pe o jẹ Intermediate
  • ni Full julọ addictive, lati ojuami ti wo ti a networker: ipari, ọkọọkan nọmba, ati KO THE ONE ti o jẹ o kun MTProto, ara, CRC32. Bẹẹni, gbogbo eyi wa lori oke TCP. Ewo ni o fun wa ni gbigbe gbigbe ti o gbẹkẹle ni irisi ṣiṣan baiti lẹsẹsẹ; ko si awọn ilana ti a nilo, ni pataki awọn sọwedowo. O dara, ni bayi ẹnikan yoo tako si mi pe TCP ni checksum 16-bit, nitorinaa ibajẹ data ṣẹlẹ. Nla, ṣugbọn a ni ilana ilana cryptographic kan pẹlu awọn hashes to gun ju awọn baiti 16 lọ, gbogbo awọn aṣiṣe wọnyi - ati paapaa diẹ sii - yoo mu nipasẹ ibaamu SHA kan ni ipele ti o ga julọ. Ko si aaye ni CRC32 lori eyi.

Jẹ ki a ṣe afiwe Abridged, ninu eyiti ọkan baiti ti ipari jẹ ṣee ṣe, pẹlu Intermediate, eyiti o ṣe idalare “Ni irú titete data 4-baiti jẹ iwulo,” eyiti o jẹ ọrọ isọkusọ. Kini, o gbagbọ pe awọn olupilẹṣẹ Telegram jẹ ailagbara ti wọn ko le ka data lati iho sinu ifipamọ ti o ni ibamu? O tun ni lati ṣe eyi, nitori kika le da ọ pada nọmba eyikeyi ti awọn baiti (ati pe awọn olupin aṣoju tun wa, fun apẹẹrẹ…). Tabi ni apa keji, kilode ti Abridged ti a ba tun ni padding hefty lori oke 16 awọn baiti - fipamọ awọn baiti 3 nigbami ?

Ẹnikan gba iwunilori pe Nikolai Durov fẹran gaan lati tun awọn kẹkẹ pada, pẹlu awọn ilana nẹtiwọọki, laisi iwulo iwulo gidi eyikeyi.

Awọn aṣayan irinna miiran, pẹlu. Oju opo wẹẹbu ati MTProxy, a kii yoo gbero ni bayi, boya ni ifiweranṣẹ miiran, ti ibeere kan ba wa. Nipa MTProxy kanna, jẹ ki a ranti ni bayi pe laipẹ lẹhin itusilẹ rẹ ni ọdun 2018, awọn olupese yara kọ ẹkọ lati dènà rẹ, ti pinnu fun fori ìdènà, nipasẹ package iwọn! Ati pe otitọ pe olupin MTProxy ti a kọ (lẹẹkansi nipasẹ Waltman) ni C ti so pọ si awọn pato Linux, botilẹjẹpe eyi ko nilo rara (Phil Kulin yoo jẹrisi), ati pe olupin ti o jọra boya ni Go tabi Node.js yoo dada ni kere ju ọgọrun ila.

Ṣugbọn a yoo fa awọn ipinnu nipa imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-imọ-ti-ni-ni-ni-ni-ni-ni-apa-apa-apa-apa ti a ti ṣe akiyesi awọn oran miiran. Fun bayi, jẹ ki ká gbe lori OSI Layer 5, igba - lori eyi ti nwọn gbe MTProto igba.

Awọn bọtini, awọn ifiranṣẹ, awọn akoko, Diffie-Hellman

Wọn gbe e sibẹ ko ni pipe… Igba kan kii ṣe igba kanna ti o han ni wiwo labẹ awọn akoko ti nṣiṣe lọwọ. Sugbon ni ibere.

Lodi ti ilana ati awọn isunmọ eto ti Telegram. Apá 1, imọ-ẹrọ: iriri ti kikọ alabara lati ibere - TL, MT

Nitorina a gba okun baiti ti ipari ti a mọ lati Layer irinna. Eyi jẹ boya ifiranṣẹ ti paroko tabi ọrọ asọye - ti a ba tun wa ni ipele adehun bọtini ati pe a n ṣe ni otitọ. Ewo ninu opo awọn ero ti a pe ni “bọtini” ni a n sọrọ nipa? Jẹ ki a ṣalaye ọrọ yii fun ẹgbẹ Telegram funrararẹ (Mo gafara fun itumọ iwe ti ara mi lati Gẹẹsi pẹlu ọpọlọ rẹwẹsi ni 4 owurọ, o rọrun lati fi awọn gbolohun kan silẹ bi wọn ṣe jẹ):

Awon nkan meji lo wa ti a npe ni igba - ọkan ninu UI ti awọn alabara osise labẹ “awọn akoko lọwọlọwọ”, nibiti igba kọọkan ṣe deede si gbogbo ẹrọ / OS kan.
Keji - MTProto igba, eyi ti o ni nọmba ọkọọkan ti ifiranṣẹ (ni ipele kekere) ninu rẹ, ati eyiti le ṣiṣe laarin awọn oriṣiriṣi awọn asopọ TCP. Ọpọlọpọ awọn akoko MTProto ni a le fi sori ẹrọ ni akoko kanna, fun apẹẹrẹ, lati ṣe igbasilẹ faili ni iyara.

Laarin awọn meji wọnyi akoko ero kan wa asẹ. Ninu ọran ibajẹ, a le sọ iyẹn UI igba jẹ kanna bi asẹ, ṣugbọn alas, ohun gbogbo ni idiju. Jẹ ki a wo:

  • Olumulo lori ẹrọ tuntun ni akọkọ ṣe ipilẹṣẹ auth_key ati pe o ṣe adehun si akọọlẹ, fun apẹẹrẹ nipasẹ SMS - idi niyẹn asẹ
  • O ṣẹlẹ ni akọkọ MTProto igba, ti o ni session_id inu ara rẹ.
  • Ni ipele yii, apapo asẹ и session_id le pe apeere - Ọrọ yii han ninu iwe ati koodu ti diẹ ninu awọn alabara
  • Lẹhinna, alabara le ṣii pupọ Awọn akoko MTProto labẹ kanna auth_key - si kanna DC.
  • Lẹhinna, ni ọjọ kan alabara yoo nilo lati beere faili lati DC miiran - ati fun DC yii titun kan yoo ṣe ipilẹṣẹ auth_key !
  • Lati sọ fun eto pe kii ṣe olumulo tuntun ti o forukọsilẹ, ṣugbọn kanna asẹ (UI igba), onibara nlo awọn ipe API auth.exportAuthorization ni ile DC auth.importAuthorization ni titun DC.
  • Ohun gbogbo jẹ kanna, ọpọlọpọ le wa ni sisi Awọn akoko MTProto (kọọkan pẹlu tirẹ session_id) si yi titun DC, labẹ rẹ auth_key.
  • Nikẹhin, alabara le fẹ Aṣiri Iwaju Pipe. Gbogbo auth_keyyẹ bọtini - fun DC - ati awọn ose le pe auth.bindTempAuthKey fun lilo ibùgbé auth_key - ati lẹẹkansi, ọkan nikan temp_auth_bọtini fun DC, wọpọ si gbogbo Awọn akoko MTProto si DC yii.

akiyesi, pe iyo (ati awọn iyọ ojo iwaju) tun jẹ ọkan lori auth_key awon. pín laarin gbogbo eniyan Awọn akoko MTProto si DC kanna.

Kini "laarin awọn asopọ TCP oriṣiriṣi" tumọ si? Nitorina eyi tumọ si nkankan bi kuki aṣẹ-aṣẹ lori oju opo wẹẹbu kan - o tẹsiwaju (walaaye) ọpọlọpọ awọn asopọ TCP si olupin ti a fun, ṣugbọn ni ọjọ kan o buru. Ko dabi HTTP nikan, ninu awọn ifiranṣẹ MTProto laarin igba kan jẹ nọmba lẹsẹsẹ ati timo; ti wọn ba wọ inu oju eefin naa, asopọ naa ti bajẹ - lẹhin ti iṣeto asopọ tuntun kan, olupin naa yoo fi inurere ranṣẹ si ohun gbogbo ni igba yii ti ko firanṣẹ ni iṣaaju. TCP asopọ.

Sibẹsibẹ, alaye ti o wa loke jẹ akopọ lẹhin ọpọlọpọ awọn oṣu ti iwadii. Lakoko, ṣe a n ṣe imuse alabara wa lati ibere? - jẹ ki a pada si ibẹrẹ.

Nitorinaa jẹ ki a ṣe ipilẹṣẹ auth_key on Awọn ẹya Diffie-Hellman lati Telegram. Jẹ ki a gbiyanju lati ni oye awọn iwe aṣẹ ...

Vasily, [19.06.18 20:05] data_with_hash: = SHA1 (data) + data + (eyikeyi awọn baiti ID); iru awọn ti ipari dogba 255 baiti;
encrypted_data: = RSA(data_with_hash, server_public_key); nọmba gigun 255-baiti (nla endian) ti dide si agbara ibeere lori modulus ibeere, ati abajade ti wa ni ipamọ bi nọmba 256-baiti.

Won ni diẹ ninu awọn dope DH

Ko dabi DH eniyan ti o ni ilera
Ko si awọn bọtini gbangba meji ni dx

O dara, ni ipari eyi ni a ṣe lẹsẹsẹ, ṣugbọn iyokù kan wa - ẹri ti iṣẹ jẹ nipasẹ alabara pe o ni anfani lati ṣe ifosiwewe nọmba naa. Iru aabo lodi si awọn ikọlu DoS. Ati bọtini RSA nikan ni a lo ni ẹẹkan ni itọsọna kan, pataki fun fifi ẹnọ kọ nkan new_nonce. Ṣugbọn lakoko ti iṣẹ ṣiṣe ti o dabi ẹnipe o rọrun yoo ṣaṣeyọri, kini iwọ yoo ni lati koju?

Vasily, [20.06.18/00/26 XNUMX:XNUMX] Emi ko ti wọle si ibeere appid sibẹsibẹ.

Mo fi ibeere yii ranṣẹ si DH

Ati pe, ninu ibi iduro irinna o sọ pe o le dahun pẹlu awọn baiti 4 ti koodu aṣiṣe. Gbogbo ẹ niyẹn

O dara, o sọ fun mi -404, nitorina kini?

Nitorinaa Mo sọ fun u pe: “Mu akọmalu rẹ ti paroko pẹlu bọtini olupin pẹlu itẹka kan bii eyi, Mo fẹ DH,” o si dahun pẹlu 404 aṣiwere kan.

Kini iwọ yoo ronu ti esi olupin yii? Kin ki nse? Ko si ẹnikan lati beere (ṣugbọn diẹ sii lori iyẹn ni apakan keji).

Nibi gbogbo awọn anfani ti wa ni ṣe lori ibi iduro

Emi ko ni nkan miiran lati ṣe, Mo kan nireti ti yiyipada awọn nọmba pada ati siwaju

Meji 32 bit awọn nọmba. Mo ko wọn jọ bi gbogbo eniyan miiran

Ṣugbọn rara, awọn meji wọnyi nilo lati ṣafikun si laini akọkọ bi BE

Vadim Goncharov, [20.06.18 15:49] ati nitori 404 yii?

Vasily, [20.06.18 15:49] BẸẸNI!

Vadim Goncharov, [20.06.18 15:50] nitori naa Emi ko loye ohun ti ko le “ko ri”

Vasily, [20.06.18 15:50] to

Emi ko le rii iru ibajẹ bẹ sinu awọn ifosiwewe akọkọ%)

A ko paapaa ṣakoso ijabọ aṣiṣe

Vasily, [20.06.18 20:18] Oh, MD5 tun wa. Tẹlẹ awọn hashes oriṣiriṣi mẹta

Ti ṣe iṣiro itẹka bọtini bi atẹle:

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

SHA1 ati sha2

Nitorina jẹ ki a fi sii auth_key a gba 2048 die-die ni iwọn lilo Diffie-Hellman. Kini atẹle? Nigbamii ti a ṣe iwari pe awọn kekere 1024 kekere ti bọtini yii ko lo ni ọna eyikeyi ... ṣugbọn jẹ ki a ronu nipa eyi fun bayi. Ni ipele yii, a ni ikọkọ ti o pin pẹlu olupin naa. Afọwọṣe ti igba TLS ti ni idasilẹ, eyiti o jẹ ilana ti o gbowolori pupọ. Ṣugbọn olupin naa ko tun mọ ohunkohun nipa ẹniti a jẹ! Ko sibẹsibẹ, kosi. aṣẹ. Awon. ti o ba ronu ni awọn ofin ti “ọrọ-iwọle-iwọle”, bi o ti ṣe ni ẹẹkan ni ICQ, tabi o kere ju “bọtini-iwọle”, bi ninu SSH (fun apẹẹrẹ, lori diẹ ninu awọn gitlab/github). A gba ohun ailorukọ kan. Kini ti olupin naa ba sọ fun wa “awọn nọmba foonu wọnyi jẹ iṣẹ nipasẹ DC miiran”? Tabi paapaa "nọmba foonu rẹ ti gbesele"? Ohun ti o dara julọ ti a le ṣe ni pa bọtini naa mọ ni ireti pe yoo wulo ati pe kii yoo bajẹ nigba naa.

Nipa ọna, a "gba" pẹlu awọn ifiṣura. Fun apẹẹrẹ, ṣe a gbẹkẹle olupin naa? Ti o ba jẹ iro? Awọn sọwedowo cryptographic yoo nilo:

Vasily, [21.06.18 17:53] Wọn nfun awọn onibara alagbeka lati ṣayẹwo nọmba 2kbit fun primality%)

Ṣugbọn ko ṣe kedere rara, nafeijoa

Vasily, [21.06.18 18:02] Iwe naa ko sọ kini lati ṣe ti ko ba rọrun.

Ko sọ. Jẹ ki a wo kini alabara Android osise ṣe ninu ọran yii? A ohun niyen (ati bẹẹni, gbogbo faili jẹ ohun ti o nifẹ) - bi wọn ṣe sọ, Emi yoo kan fi eyi silẹ nibi:

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

Rara, dajudaju o tun wa nibẹ diẹ ninu Awọn idanwo wa fun ipo akọkọ ti nọmba kan, ṣugbọn tikalararẹ Emi ko ni imọ to ti mathimatiki mọ.

O dara, a ni bọtini titunto si. Lati wọle, i.e. firanṣẹ awọn ibeere, o nilo lati ṣe fifi ẹnọ kọ nkan siwaju, ni lilo AES.

Bọtini ifiranṣẹ naa jẹ asọye bi awọn iwọn aarin 128 ti SHA256 ti ara ifiranṣẹ (pẹlu igba, ID ifiranṣẹ, ati bẹbẹ lọ), pẹlu awọn baiti padding, ti a ti ṣaju nipasẹ awọn baiti 32 ti o gba lati bọtini aṣẹ.

Vasily, [22.06.18 14:08] Apapọ, bishi, die-die

Gba auth_key. Gbogbo. Ni ikọja wọn ... ko ṣe kedere lati inu iwe-ipamọ naa. Lero ọfẹ lati ṣe iwadi koodu orisun ṣiṣi.

Ṣe akiyesi pe MTProto 2.0 nilo lati 12 si 1024 awọn baiti ti padding, tun wa labẹ ipo pe ipari ifiranṣẹ abajade jẹ pipin nipasẹ awọn baiti 16.

Nitorina Elo padding o yẹ ki o fi kun?

Ati bẹẹni, 404 tun wa ni ọran ti aṣiṣe kan

Ti ẹnikẹni ba farabalẹ ka aworan ati ọrọ ti iwe naa, wọn ṣe akiyesi pe ko si MAC nibẹ. Ati pe AES ti lo ni ipo IGE kan ti a ko lo nibikibi miiran. Wọn, dajudaju, kọwe nipa eyi ni FAQ wọn ... Nibi, bi, bọtini ifiranṣẹ funrararẹ tun jẹ SHA hash ti data ti a ti sọ dicrypted, ti a lo lati ṣayẹwo otitọ - ati ni idi ti aiṣedeede, awọn iwe aṣẹ fun idi kan. ṣe iṣeduro ni ipalọlọ aibikita wọn (ṣugbọn kini nipa aabo, kini ti wọn ba fọ wa?).

Emi kii ṣe cryptographer, boya ko si ohun ti ko tọ si pẹlu ipo yii ninu ọran yii lati oju wiwo imọ-jinlẹ. Ṣugbọn Mo le lorukọ ni gbangba iṣoro ti o wulo, ni lilo Desktop Telegram bi apẹẹrẹ. O encrypts kaṣe agbegbe (gbogbo awọn wọnyi D877F783D5D3EF8C) ni ọna kanna bi awọn ifiranṣẹ ni MTProto (nikan ninu apere yi version 1.0), i.e. akọkọ bọtini ifiranṣẹ, lẹhinna data funrararẹ (ati ibikan si apakan nla akọkọ auth_key 256 baiti, lai si eyi ti msg_key asan). Nitorinaa, iṣoro naa di akiyesi lori awọn faili nla. Eyun, o nilo lati tọju awọn ẹda meji ti data naa - ti paroko ati decrypted. Ati pe ti awọn megabytes ba wa, tabi fidio ṣiṣanwọle, fun apẹẹrẹ?... Awọn ero Ayebaye pẹlu MAC lẹhin ti ọrọ-ọrọ gba ọ laaye lati ka ṣiṣan, lẹsẹkẹsẹ gbigbe. Ṣugbọn pẹlu MTProto o yoo ni lati ni akoko encrypt tabi decrypt gbogbo ifiranṣẹ, nikan lẹhinna gbe lọ si nẹtiwọki tabi disk. Nitorinaa, ni awọn ẹya tuntun ti Ojú-iṣẹ Telegram ninu kaṣe ninu user_data Ọna kika miiran tun lo - pẹlu AES ni ipo CTR.

Vasily, [21.06.18 01:27] Oh, Mo rii kini IGE jẹ: IGE ni igbiyanju akọkọ ni “ipo fifi ẹnọ kọ nkan,” Ni akọkọ fun Kerberos. O jẹ igbiyanju ti o kuna (ko pese aabo iduroṣinṣin), ati pe o ni lati yọkuro. Iyẹn jẹ ibẹrẹ ti ibeere ọdun 20 kan fun ipo fifi ẹnọ kọ nkan ti n ṣiṣẹ, eyiti o pari laipẹ ni awọn ipo bii OCB ati GCM.

Ati nisisiyi awọn ariyanjiyan lati ẹgbẹ kẹkẹ:

Ẹgbẹ ti o wa lẹhin Telegram, nipasẹ Nikolai Durov, ni awọn aṣaju ACM mẹfa, idaji wọn Ph.Ds ni iṣiro. O gba wọn bii ọdun meji lati yi ẹya tuntun ti MTProto jade.

Iyen pa ni lerin. Ọdun meji ni ipele kekere

Tabi o le kan gba tls

O dara, jẹ ki a sọ pe a ti ṣe fifi ẹnọ kọ nkan ati awọn nuances miiran. Ṣe o ṣee ṣe nipari lati firanṣẹ awọn ibeere serialized ni TL ati deserialize awọn idahun? Nitorina kini ati bawo ni o ṣe yẹ ki o firanṣẹ? Nibi, jẹ ki a sọ, ọna naa initAsopọmọra, boya eyi ni?

Vasily, [25.06.18 18:46] Ibẹrẹ asopọ ati fi alaye pamọ sori ẹrọ olumulo ati ohun elo.

O gba app_id, device_model, system_version, app_version ati lang_code.

Ati diẹ ninu ibeere

Iwe aṣẹ bi nigbagbogbo. Lero ọfẹ lati kawe orisun ṣiṣi

Ti ohun gbogbo ba fẹrẹ to pẹlu invokeWithLayer, lẹhinna kini aṣiṣe nibi? O wa ni jade, jẹ ki a sọ pe a ni - alabara ti ni nkan lati beere lọwọ olupin nipa - ibeere kan wa ti a fẹ lati firanṣẹ:

Vasily, [25.06.18 19:13] Ni idajọ nipa koodu, ipe akọkọ ti wa ni we ni yi inira, ati awọn inira tikararẹ ti wa ni we ni invokewithlayer.

Kilode ti initConnection ko le jẹ ipe ti o yatọ, ṣugbọn o gbọdọ jẹ ohun ipari? Bẹẹni, bi o ti wa ni jade, o gbọdọ ṣee ṣe ni gbogbo igba ni ibẹrẹ igba kọọkan, kii ṣe ni ẹẹkan, bi pẹlu bọtini akọkọ. Sugbon! Ko le pe nipasẹ olumulo laigba aṣẹ! Bayi a ti de ipele nibiti o ti wulo Eyi iwe iwe - ati pe o sọ fun wa pe ...

Nikan ipin kekere ti awọn ọna API wa fun awọn olumulo laigba aṣẹ:

  • auth.sendCode
  • auth.resendCode
  • iroyin.getPassword
  • auth.checkPassword
  • auth.checkPhone
  • auth.signUp
  • auth.signIn
  • auth.importAṣẹ
  • iranlọwọ.getConfig
  • help.getNearestDc
  • help.getAppUpdate
  • help.getCdnConfig
  • langpack.getLangPack
  • langpack.getStrings
  • langpack.getDifference
  • langpack.getLanguages
  • langpack.getLanguage

Ni akọkọ ninu wọn, auth.sendCode, ati pe ibeere akọkọ wa ti o nifẹ ninu eyiti a firanṣẹ api_id ati api_hash, ati lẹhin eyi a gba SMS kan pẹlu koodu kan. Ati pe ti a ba wa ni DC ti ko tọ (awọn nọmba tẹlifoonu ni orilẹ-ede yii jẹ iranṣẹ miiran, fun apẹẹrẹ), lẹhinna a yoo gba aṣiṣe pẹlu nọmba ti DC ti o fẹ. Lati wa iru adiresi IP wo nipasẹ nọmba DC ti o nilo lati sopọ si, ran wa lọwọ help.getConfig. Ni akoko kan awọn titẹ sii 5 nikan wa, ṣugbọn lẹhin awọn iṣẹlẹ olokiki ti 2018, nọmba naa ti pọ si ni pataki.

Bayi jẹ ki a ranti pe a de ipele yii lori olupin ni ailorukọ. Ṣe kii ṣe gbowolori pupọ lati kan gba adiresi IP kan? Kilode ti o ko ṣe eyi, ati awọn iṣẹ miiran, ni apakan ti a ko paṣiparọ ti MTProto? Mo gbọ atako: "Bawo ni a ṣe le rii daju pe kii ṣe RKN ti yoo dahun pẹlu awọn adirẹsi eke?" Lati eyi a ranti pe, ni apapọ, awọn onibara osise Awọn bọtini RSA ti wa ni ifibọ, i.e. o le kan ami alaye yi. Lootọ, eyi ti n ṣe tẹlẹ fun alaye lori didi idena ti awọn alabara gba nipasẹ awọn ikanni miiran (ni oye, eyi ko ṣee ṣe ni MTProto funrararẹ; o tun nilo lati mọ ibiti o ti sopọ).

O DARA. Ni ipele yii ti aṣẹ alabara, a ko ti fun ni aṣẹ ati pe ko ti forukọsilẹ ohun elo wa. A kan fẹ lati rii fun bayi kini awọn idahun olupin si awọn ọna ti o wa si olumulo laigba aṣẹ. Ati nibi…

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;

Ninu ero, akọkọ yoo wa ni keji

Ninu eto tdesktop iye kẹta jẹ

Bẹẹni, lati igba naa, dajudaju, iwe-ipamọ ti ni imudojuiwọn. Botilẹjẹpe o le laipe di ko ṣe pataki lẹẹkansi. Bawo ni o yẹ ki olupilẹṣẹ alakobere mọ? Boya ti o ba forukọsilẹ ohun elo rẹ, wọn yoo sọ fun ọ? Vasily ṣe eyi, ṣugbọn alas, wọn ko firanṣẹ ohunkohun (lẹẹkansi, a yoo sọrọ nipa eyi ni apakan keji).

...O ṣe akiyesi pe a ti lọ tẹlẹ bakan si API, i.e. si awọn tókàn ipele, ati ki o padanu nkankan ni MProto koko? Ko si iyalenu:

Vasily, [28.06.18 02:04] Mm, wọn n ṣe ariwo nipasẹ diẹ ninu awọn algoridimu lori e2e

Mtproto n ṣalaye awọn algoridimu fifi ẹnọ kọ nkan ati awọn bọtini fun awọn ibugbe mejeeji, bakanna bi diẹ ninu eto ti ipari

Ṣugbọn wọn dapọ awọn ipele oriṣiriṣi ti akopọ nigbagbogbo, nitorinaa ko nigbagbogbo han ibiti mtproto pari ati ipele ti atẹle bẹrẹ.

Bawo ni wọn ṣe dapọ? O dara, eyi ni bọtini igba diẹ kanna fun PFS, fun apẹẹrẹ (nipasẹ ọna, Ojú-iṣẹ Telegram ko le ṣe). O ti wa ni ṣiṣe nipasẹ ohun API ìbéèrè auth.bindTempAuthKey, i.e. lati oke ipele. Ṣugbọn ni akoko kanna o dabaru pẹlu fifi ẹnọ kọ nkan ni ipele kekere - lẹhin rẹ, fun apẹẹrẹ, o nilo lati tun ṣe. initConnection ati bẹbẹ lọ, eyi kii ṣe o kan deede ìbéèrè. Ohun ti o tun ṣe pataki ni pe o le ni bọtini igba diẹ kan fun DC, botilẹjẹpe aaye naa auth_key_id ninu ifiranṣẹ kọọkan gba ọ laaye lati yi bọtini pada o kere ju gbogbo ifiranṣẹ, ati pe olupin naa ni ẹtọ lati “gbagbe” bọtini igba diẹ nigbakugba - iwe ko sọ kini lati ṣe ninu ọran yii… daradara, kilode ti o le ṣe. Ṣe o ni awọn bọtini pupọ, bi pẹlu ṣeto ti awọn iyọ iwaju, ati ?..

Awọn nkan miiran wa ti o tọ lati ṣe akiyesi nipa akori MTProto.

Awọn ifiranṣẹ ifiranṣẹ, msg_id, msg_seqno, awọn ijẹrisi, pings ni ọna ti ko tọ ati awọn idiosyncrasies miiran

Kini idi ti o nilo lati mọ nipa wọn? Nitoripe wọn "jo" si ipele ti o ga julọ, ati pe o nilo lati mọ wọn nigbati o ba n ṣiṣẹ pẹlu API. Jẹ ki a ro pe a ko nifẹ si msg_key; ipele isalẹ ti decrypted ohun gbogbo fun wa. Ṣugbọn inu data ti a sọ di mimọ a ni awọn aaye wọnyi (tun ipari data naa, nitorinaa a mọ ibiti padding naa wa, ṣugbọn iyẹn ko ṣe pataki):

  • iyọ - int64
  • session_id - int64
  • message_id - int64
  • seq_no - int32

Jẹ ki a leti pe iyọ kan ṣoṣo ni o wa fun gbogbo DC. Kini idi ti o mọ nipa rẹ? Kii ṣe nitori pe ibeere kan wa get_future_salts, eyi ti o sọ fun ọ iru awọn aaye arin ti yoo wulo, ṣugbọn nitori pe ti iyọ rẹ ba jẹ "rotten", lẹhinna ifiranṣẹ (ibeere) yoo padanu nikan. Olupin yoo, dajudaju, jabo iyọ tuntun nipasẹ ipinfunni new_session_created - ṣugbọn pẹlu ti atijọ iwọ yoo ni lati tun fi ranṣẹ bakan, fun apẹẹrẹ. Ati pe ọrọ yii ni ipa lori faaji ohun elo.

A gba olupin laaye lati ju awọn akoko silẹ lapapọ ati dahun ni ọna yii fun awọn idi pupọ. Lootọ, kini igba MTProto lati ẹgbẹ alabara? Iwọnyi jẹ awọn nọmba meji session_id и seq_no awọn ifiranṣẹ laarin yi igba. O dara, ati asopọ TCP ti o wa labẹ, dajudaju. Jẹ ki a sọ pe alabara wa ko tun mọ bi a ṣe le ṣe ọpọlọpọ awọn nkan, o ge asopọ ati tun ṣe. Ti eyi ba ṣẹlẹ ni kiakia - igba atijọ tẹsiwaju ni asopọ TCP tuntun, pọ si seq_no siwaju sii. Ti o ba gba akoko pipẹ, olupin le paarẹ, nitori ni ẹgbẹ rẹ o tun jẹ isinyi, bi a ti rii.

Kini o yẹ ki o jẹ seq_no? Oh, ibeere ẹtan ni iyẹn. Gbiyanju lati ni oye ohun ti o tumọ si ni otitọ:

Ifiranṣẹ ti o ni ibatan akoonu

Ifiranṣẹ to nilo ifọkanbalẹ ti o fojuhan. Iwọnyi pẹlu gbogbo olumulo ati ọpọlọpọ awọn ifiranṣẹ iṣẹ, o fẹrẹ jẹ gbogbo laisi awọn apoti ati awọn ifọwọsi.

Nọmba Isọsẹ-ọrọ (msg_seqno)

Nọmba 32-bit kan ti o dọgba si ilọpo meji nọmba ti awọn ifiranṣẹ ti o ni ibatan si akoonu (awọn ti o nilo ifọkansi, ati ni pataki awọn ti kii ṣe awọn apoti) ti o ṣẹda nipasẹ olufiranṣẹ ṣaaju ifiranṣẹ yii ati lẹhinna pọsi nipasẹ ọkan ti ifiranṣẹ lọwọlọwọ ba jẹ akoonu-jẹmọ ifiranṣẹ. A eiyan ti wa ni nigbagbogbo ti ipilẹṣẹ lẹhin ti awọn oniwe-gbogbo awọn akoonu ti; nitorina, nọmba ọkọọkan rẹ tobi ju tabi dogba si awọn nọmba ọkọọkan ti awọn ifiranṣẹ ti o wa ninu rẹ.

Iru Sakosi wo ni eyi pẹlu afikun nipasẹ 1, ati lẹhinna miiran nipasẹ 2?... Mo fura pe lakoko wọn tumọ si “bit ti o kere julọ fun ACK, iyokù jẹ nọmba kan”, ṣugbọn abajade kii ṣe ohun kanna - ni pato, o ba jade, le ti wa ni rán pupọ ìmúdájú nini kanna seq_no! Bawo? O dara, fun apẹẹrẹ, olupin naa fi nkan ranṣẹ si wa, firanṣẹ, ati pe awa tikararẹ wa dakẹ, nikan ni idahun pẹlu awọn ifiranṣẹ iṣẹ ti o jẹrisi gbigba awọn ifiranṣẹ rẹ. Ni idi eyi, awọn ijẹrisi ti njade wa yoo ni nọmba ti njade kanna. Ti o ba faramọ pẹlu TCP ati ro pe eyi dun bakan egan, ṣugbọn o dabi pe ko ni egan pupọ, nitori ni TCP seq_no ko ni yi, ṣugbọn ìmúdájú lọ si seq_no ní ìhà kejì, èmi yóò yára láti bí ọ́ nínú. Awọn iṣeduro ti pese ni MTProto KO on seq_no, bi ni TCP, ṣugbọn nipasẹ msg_id !

Kini eyi msg_id, pataki julọ ninu awọn aaye wọnyi? Idanimọ ifiranṣẹ alailẹgbẹ, bi orukọ ṣe daba. O ti wa ni asọye bi nọmba 64-bit, awọn iwọn kekere ti eyiti o tun ni idan “olupin-kii ṣe olupin”, ati pe iyoku jẹ akoko akoko Unix, pẹlu apakan ida, yi awọn die-die 32 si apa osi. Awon. timestamp fun aaya (ati awọn ifiranṣẹ pẹlu awọn akoko ti o yatọ pupọ yoo jẹ kọ nipasẹ olupin). Lati eyi o wa ni pe ni apapọ eyi jẹ idanimọ ti o jẹ agbaye fun onibara. Fun iyẹn - jẹ ki a ranti session_id - a ni iṣeduro: Labẹ ọran kankan o le fi ifiranṣẹ ti o tumọ fun igba kan ranṣẹ si igba miiran. Iyẹn ni, o wa ni pe o wa tẹlẹ mẹta ipele - igba, nọmba igba, ifiranṣẹ id. Kilode ti iru ilolura, ohun ijinlẹ yii jẹ nla pupọ.

Ati bẹ, msg_id nilo fun...

RPC: awọn ibeere, awọn idahun, awọn aṣiṣe. Awọn iṣeduro.

Gẹgẹbi o ti le ṣe akiyesi, ko si pataki “ṣe ibeere RPC kan” iru tabi iṣẹ nibikibi ninu aworan atọka, botilẹjẹpe awọn idahun wa. Lẹhinna, a ni akoonu-jẹmọ awọn ifiranṣẹ! Ti o jẹ, eyikeyi ifiranṣẹ naa le jẹ ibeere! Tabi kii ṣe lati jẹ. Lẹhinna, ti kọọkan ni msg_id. Ṣugbọn awọn idahun wa:

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

Eyi ni ibiti o ti tọka ifiranṣẹ wo ni eyi jẹ idahun si. Nitorinaa, ni ipele oke ti API, iwọ yoo ni lati ranti kini nọmba ibeere rẹ jẹ - Mo ro pe ko si ye lati ṣalaye pe iṣẹ naa jẹ asynchronous, ati pe ọpọlọpọ awọn ibeere le wa ni ilọsiwaju ni akoko kanna, awọn idahun si eyi ti o le wa ni pada ni eyikeyi ibere? Ni opo, lati eyi ati awọn ifiranṣẹ aṣiṣe bii ko si awọn oṣiṣẹ, faaji lẹhin eyi le ṣe itopase: olupin ti o ṣetọju asopọ TCP pẹlu rẹ jẹ iwọntunwọnsi iwaju-opin, o firanṣẹ awọn ibeere si awọn ẹhin ati gba wọn pada nipasẹ message_id. O dabi pe ohun gbogbo nibi jẹ kedere, ọgbọn ati ti o dara.

Bẹẹni? .. Ati pe ti o ba ronu nipa rẹ? Lẹhinna, idahun RPC funrararẹ tun ni aaye kan msg_id! Njẹ a nilo lati kigbe si olupin naa “iwọ ko dahun idahun mi!”? Ati bẹẹni, kini o wa nipa awọn iṣeduro? Nipa oju-iwe awọn ifiranṣẹ nipa awọn ifiranṣẹ sọ ohun ti o jẹ fun wa

msgs_ack#62d6b459 msg_ids:Vector long = MsgsAck;

ati pe o gbọdọ ṣe ni ẹgbẹ kọọkan. Ṣugbọn kii ṣe nigbagbogbo! Ti o ba gba esi Rpc, o jẹ iṣẹ tikararẹ bi ijẹrisi kan. Iyẹn ni, olupin le dahun si ibeere rẹ pẹlu MsgsAck - bii, “Mo gba.” RpcResult le dahun lẹsẹkẹsẹ. O le jẹ mejeeji.

Ati bẹẹni, o tun ni lati dahun idahun naa! Ìmúdájú. Bibẹẹkọ, olupin naa yoo ro pe ko le firanṣẹ ati firanṣẹ pada si ọ lẹẹkansi. Paapaa lẹhin isọdọkan. Ṣugbọn nibi, dajudaju, ọrọ ti awọn akoko ipari dide. Jẹ ki a wo wọn diẹ diẹ nigbamii.

Lakoko, jẹ ki a wo awọn aṣiṣe ipaniyan ibeere ti o ṣeeṣe.

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

Oh, ẹnikan yoo kigbe, eyi ni ọna kika eniyan diẹ sii - laini kan wa! Lo akoko rẹ. Nibi akojọ ti awọn aṣiṣe, ṣugbọn dajudaju ko pari. Lati ọdọ rẹ a kọ pe koodu naa jẹ nkankan bi Awọn aṣiṣe HTTP (daradara, nitorinaa, awọn atunmọ ti awọn idahun ko bọwọ fun, ni awọn aaye kan wọn pin laileto laarin awọn koodu), ati laini naa dabi. CAPITAL_LETTERS_AND_NUMBERS. Fun apẹẹrẹ, PHONE_NUMBER_OCCUPIED tabi FILE_PART_Х_MISSING. O dara, iyẹn ni, iwọ yoo tun nilo laini yii itupalẹ... Fun apere, FLOOD_WAIT_3600 yoo tunmọ si wipe o ni lati duro wakati kan, ati PHONE_MIGRATE_5, pe nọmba tẹlifoonu pẹlu ìpele yi gbọdọ wa ni iforukọsilẹ ni 5th DC. A ni iru ede, otun? A ko nilo ariyanjiyan lati okun kan, awọn deede yoo ṣe, dara.

Lẹẹkansi, eyi kii ṣe lori oju-iwe awọn ifiranṣẹ iṣẹ, ṣugbọn, bi o ti jẹ deede pẹlu iṣẹ akanṣe yii, alaye naa le rii lori miiran iwe iwe... Tabi ifura ifura. Ni akọkọ, wo, titẹ / ṣẹ Layer - RpcError le ti wa ni iteeye ni RpcResult. Kilode ti kii ṣe ita? Kini a ko ṣe akiyesi?...Ni ibamu, nibo ni ẹri naa wa RpcError le MA wa ni ifibọ ni RpcResult, ṣugbọn jẹ taara tabi itẹ-ẹiyẹ ni iru miiran?... Ati pe ti ko ba le, kilode ti kii ṣe ni ipele oke, ie. o sonu req_msg_id ? ..

Ṣugbọn jẹ ki a tẹsiwaju nipa awọn ifiranṣẹ iṣẹ. Onibara le ro pe olupin n ronu fun igba pipẹ ati ṣe ibeere iyanu yii:

rpc_drop_answer#58e4a740 req_msg_id:long = RpcDropAnswer;

Awọn idahun ti o ṣee ṣe mẹta wa si ibeere yii, tun ṣe idapọ pẹlu ẹrọ ìmúdájú; igbiyanju lati ni oye kini wọn yẹ ki o jẹ (ati kini atokọ gbogbogbo ti awọn iru ti ko nilo ijẹrisi) ti fi silẹ si oluka bi iṣẹ amurele (akọsilẹ: alaye ninu koodu orisun tabili tabili Telegram ko pari).

Oògùn afẹsodi: ifiranṣẹ statuses

Ni gbogbogbo, ọpọlọpọ awọn aaye ni TL, MTProto ati Telegram ni gbogbogbo fi rilara agidi silẹ, ṣugbọn nitori iwa-rere, ọgbọn ati awọn miiran. ogbon ogbon A fi tọ̀wọ̀tọ̀wọ̀ dákẹ́ jẹ́ẹ́ nípa rẹ̀, a sì fọwọ́ yẹpẹrẹ mú àwọn ìwà ìbàjẹ́ nínú àwọn ìjíròrò náà. Sibẹsibẹ, ibi yiОjulọ ​​ti awọn iwe jẹ nipa awọn ifiranṣẹ nipa awọn ifiranṣẹ O jẹ iyalẹnu paapaa fun mi, ti o ti n ṣiṣẹ pẹlu awọn ilana nẹtiwọọki fun igba pipẹ ati pe o ti rii awọn kẹkẹ keke ti awọn iwọn ti o yatọ.

Ti o ba bẹrẹ innocuously, pẹlu ìmúdájú. Nigbamii ti wọn sọ fun wa nipa

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;

O dara, gbogbo eniyan ti o bẹrẹ ṣiṣẹ pẹlu MTProto yoo ni lati ṣe pẹlu wọn; ni “atunse - atunṣe - ifilọlẹ” ọmọ, gbigba awọn aṣiṣe nọmba tabi iyọ ti iṣakoso lati lọ buburu lakoko awọn atunṣe jẹ ohun ti o wọpọ. Sibẹsibẹ, awọn aaye meji wa nibi:

  1. Eyi tumọ si pe ifiranṣẹ atilẹba ti sọnu. A nilo lati ṣẹda diẹ ninu awọn laini, a yoo wo iyẹn nigbamii.
  2. Kini awọn nọmba aṣiṣe ajeji wọnyi? 16, 17, 18, 19, 20, 32, 33, 34, 35, 48, 64... nibo ni awọn nọmba miiran wa, Tommy?

Awọn iwe aṣẹ sọ pe:

Ero naa ni pe awọn iye aṣiṣe_code ti wa ni akojọpọ (aṣiṣe_koodu >> 4): fun apẹẹrẹ, awọn koodu 0x40 — 0x4f ni ibamu si awọn aṣiṣe ninu jijẹ eiyan.

ṣugbọn, ni akọkọ, iyipada ni ọna miiran, ati keji, ko ṣe pataki, nibo ni awọn koodu miiran wa? Ni awọn onkowe ká ori?... Sibẹsibẹ, wọnyi ni o wa kekere.

Afẹsodi bẹrẹ ninu awọn ifiranṣẹ nipa awọn ipo ifiranṣẹ ati awọn adakọ ifiranṣẹ:

  • Ibere ​​fun Alaye Ipo Ifiranṣẹ
    Ti ẹgbẹ mejeeji ko ba ti gba alaye lori ipo awọn ifiranṣẹ ti njade fun igba diẹ, o le beere ni gbangba lati ọdọ ẹgbẹ miiran:
    msgs_state_req#da69fb52 msg_ids:Vector long = MsgsStateReq;
  • Ifiranṣẹ Alaye nipa Ipo Awọn ifiranṣẹ
    msgs_state_info#04deb57d req_msg_id:long info:string = MsgsStateInfo;
    Nibi, info jẹ okun ti o ni awọn baiti kan pato ipo ifiranṣẹ fun ifiranṣẹ kọọkan lati inu atokọ msg_ids ti nwọle:

    • 1 = ko si ohun ti a mọ nipa ifiranṣẹ naa (msg_id ti lọ silẹ pupọ, ẹgbẹ miiran le ti gbagbe rẹ)
    • 2 = ifiranṣẹ ti ko gba (msg_id ṣubu laarin ibiti o ti fipamọ awọn idamọ; sibẹsibẹ, dajudaju ẹgbẹ miiran ko ti gba iru ifiranṣẹ bẹẹ)
    • 3 = ifiranṣẹ ti ko gba (msg_id ga ju; sibẹsibẹ, esan ti ẹgbẹ miiran ko ti gba a sibẹsibẹ)
    • 4 = ifiranṣẹ ti o gba (akiyesi pe idahun yii tun jẹ igbakanna iwe-ẹri gbigba)
    • +8 = ifiranṣẹ ti gba tẹlẹ
    • +16 = Ifiranṣẹ ti ko nilo ifọwọsi
    • +32 = Ibeere RPC ti o wa ninu ifiranṣẹ ti n ṣiṣẹ tabi ti pari tẹlẹ
    • +64 = esi ti o ni ibatan akoonu si ifiranṣẹ ti o ti ipilẹṣẹ tẹlẹ
    • +128 = Ẹgbẹ miiran mọ fun otitọ pe ifiranṣẹ ti gba tẹlẹ
      Idahun yii ko nilo ifọwọsi. O jẹ ifọwọsi msgs_state_req ti o wulo, ninu ati funrararẹ.
      Ṣe akiyesi pe ti o ba han lojiji pe ẹgbẹ miiran ko ni ifiranṣẹ ti o dabi pe o ti firanṣẹ si i, ifiranṣẹ naa le jẹ tun-firanṣẹ nikan. Paapa ti ẹnikeji ba yẹ ki o gba ẹda meji ti ifiranṣẹ naa ni akoko kanna, ẹda-ẹda naa yoo jẹ kọbikita. (Ti akoko pupọ ba ti kọja, ti atilẹba msg_id ko wulo mọ, ifiranṣẹ naa ni lati fi wewe sinu msg_copy).
  • Ibaraẹnisọrọ atinuwa ti Ipo ti Awọn ifiranṣẹ
    Eyikeyi ẹgbẹ le atinuwa sọfun ẹgbẹ keji ti ipo awọn ifiranṣẹ ti ẹgbẹ miiran gbejade.
    msgs_all_info#8cc0d131 msg_ids:Vector long info:string = MsgsAllInfo
  • Ibaraẹnisọrọ Atinuwa ti o gbooro ti Ipo ti Ifiranṣẹ Kan
    ...
    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;
  • Ibeere ti o fojuhan lati Tun Awọn ifiranṣẹ Firanṣẹ
    msg_resend_req#7d861a08 msg_ids:Vector long = MsgResendReq;
    Ẹgbẹ latọna jijin dahun lẹsẹkẹsẹ nipa fifiranṣẹ awọn ifiranṣẹ ti o beere […]
  • Ibeere ti o fojuhan lati Tun-firanṣẹ Awọn idahun
    msg_resend_ans_req#8610baeb msg_ids:Vector long = MsgResendReq;
    Ẹgbẹ latọna jijin dahun lẹsẹkẹsẹ nipasẹ fifiranṣẹ idahun si awọn ifiranṣẹ ti a beere […]
  • Awọn ẹda Ifiranṣẹ
    Ni awọn ipo kan, ifiranṣẹ atijọ pẹlu msg_id ti ko wulo mọ nilo lati tun fi ranṣẹ. Lẹhinna, a we sinu apoti ẹda kan:
    msg_copy#e06046b2 orig_message:Message = MessageCopy;
    Ni kete ti o ba ti gba, ifiranṣẹ naa ti wa ni ilọsiwaju bi ẹnipe apamọ ko si nibẹ. Bibẹẹkọ, ti o ba mọ daju pe ifiranṣẹ orig_message.msg_id ti gba, lẹhinna ifiranṣẹ tuntun ko ni ilọsiwaju (lakoko kan naa, it ati orig_message.msg_id ti jẹwọ). Iye orig_message.msg_id gbọdọ jẹ kekere ju msg_id apoti lọ.

Jẹ ki a paapaa pa ẹnu mọ nipa kini msgs_state_info lẹẹkansi awọn etí ti awọn unfinished TL duro jade (a nilo a fekito ti awọn baiti, ati ninu awọn kekere meji die-die wà enum, ati ninu awọn ti o ga meji die-die ni awọn asia). Ojuami ti o yatọ. Ṣe ẹnikẹni loye idi ti gbogbo eyi wa ni iṣe? ni onibara gidi nilo? Ṣugbọn nibi awọn ibeere ti wa ni apejuwe irin-ajo alọ ati abọ.

O tẹle pe ẹgbẹ kọọkan ko gbọdọ ṣe encrypt ati firanṣẹ awọn ifiranṣẹ nikan, ṣugbọn tun tọju data nipa ara wọn, nipa awọn idahun si wọn, fun iye akoko ti aimọ. Iwe naa ko ṣe apejuwe boya awọn akoko tabi ilowo ti awọn ẹya wọnyi. ko si ọna. Kini iyalẹnu julọ ni pe wọn lo ni otitọ ni koodu ti awọn alabara osise! Nkqwe wọn sọ ohun kan ti a ko fi sinu iwe ti gbogbo eniyan. Ni oye lati koodu fun kini, ko si ohun to rọrun bi ninu ọran ti TL - kii ṣe apakan ti o ya sọtọ (ni ibatan) ọgbọn, ṣugbọn nkan kan ti a so si faaji ohun elo, ie. yoo nilo akoko pupọ diẹ sii lati ni oye koodu ohun elo naa.

Pings ati timings. Awọn ila.

Lati ohun gbogbo, ti a ba ranti awọn amoro nipa faaji olupin (pinpin ti awọn ibeere kọja awọn ẹhin ẹhin), ohun ibanujẹ kuku tẹle - laibikita gbogbo awọn iṣeduro ifijiṣẹ ni TCP (boya data ti wa ni jiṣẹ, tabi iwọ yoo sọ fun ọ nipa aafo naa, ṣugbọn data yoo wa ni jiṣẹ ṣaaju ki iṣoro naa waye), pe awọn iṣeduro ni MTProto funrararẹ - ko si onigbọwọ. Awọn olupin le awọn iṣọrọ padanu tabi jabọ jade ifiranṣẹ rẹ, ati ohunkohun ko le ṣee ṣe nipa o, o kan lo yatọ si orisi ti crutches.

Ati akọkọ ti gbogbo - ifiranṣẹ queues. O dara, pẹlu ohun kan ohun gbogbo ti han gbangba lati ibẹrẹ - ifiranṣẹ ti ko ni idaniloju gbọdọ wa ni ipamọ ati binu. Bawo ni yoo ṣe pẹ to? Ati awọn jester mọ rẹ. Boya awọn ifiranṣẹ iṣẹ afẹsodi wọnyẹn bakan yanju iṣoro yii pẹlu awọn crutches, sọ, ni Ojú-iṣẹ Telegram nibẹ ni o wa nipa awọn ila 4 ti o baamu si wọn (boya diẹ sii, bi a ti sọ tẹlẹ, fun eyi o nilo lati ṣawari sinu koodu rẹ ati faaji diẹ sii ni pataki; ni kanna akoko, a mọ pe ko le ṣe mu bi apẹẹrẹ; nọmba kan ti awọn oriṣi lati ero MTProto ko lo ninu rẹ).

Kini idi ti eyi n ṣẹlẹ? Boya, awọn olupilẹṣẹ olupin ko lagbara lati rii daju igbẹkẹle laarin iṣupọ, tabi paapaa buffering lori iwọntunwọnsi iwaju, ati gbe iṣoro yii si alabara. Ninu ainireti, Vasily gbiyanju lati ṣe yiyan yiyan, pẹlu awọn ila meji nikan, ni lilo awọn algoridimu lati TCP - wiwọn RTT si olupin ati ṣatunṣe iwọn “window” (ni awọn ifiranṣẹ) da lori nọmba awọn ibeere ti ko jẹrisi. Iyẹn ni, iru heuristic ti o ni inira fun ṣiṣe iṣiro fifuye olupin ni iye awọn ibeere wa ti o le jẹun ni akoko kanna ati pe ko padanu.

O dara, iyẹn ni, o loye, otun? Ti o ba ni lati ṣe TCP lẹẹkansi lori oke ilana ti nṣiṣẹ lori TCP, eyi tọkasi ilana ti a ṣe apẹrẹ ti ko dara.

Bẹẹni, kilode ti o nilo isinyi diẹ sii ju ọkan lọ, ati kini eyi tumọ si fun eniyan ti n ṣiṣẹ pẹlu API ipele giga kan lọnakọna? Wo, o beere ibeere kan, serialize rẹ, ṣugbọn nigbagbogbo o ko le firanṣẹ lẹsẹkẹsẹ. Kí nìdí? Nitori idahun yoo jẹ msg_id, eyi ti o jẹ ibùgbéаMo jẹ aami kan, iṣẹ iyansilẹ ti eyiti o dara julọ ti sun siwaju titi di pẹ bi o ti ṣee - ti o ba jẹ pe olupin naa kọ ọ nitori aiṣedeede akoko laarin wa ati oun (dajudaju, a le ṣe crutch ti o yi akoko wa pada lati isisiyi si olupin naa nipa fifi iṣiro delta kan kun lati awọn idahun olupin - awọn alabara osise ṣe eyi, ṣugbọn o jẹ robi ati pe ko pe nitori ifipamọ). Nitorinaa, nigbati o ba ṣe ibeere pẹlu ipe iṣẹ agbegbe kan lati ile-ikawe, ifiranṣẹ naa lọ nipasẹ awọn ipele atẹle:

  1. O wa ni isinyi kan ati pe o duro de fifi ẹnọ kọ nkan.
  2. Ti yàn msg_id ati awọn ifiranṣẹ si lọ si miiran isinyi - ṣee ṣe Ndari; firanṣẹ si iho .
  3. a) Olupin naa dahun MsgsAck - ifiranṣẹ naa ti jiṣẹ, a paarẹ lati “isinyi miiran”.
    b) Tabi ni idakeji, ko fẹran nkan, o dahun badmsg - firanṣẹ lati “isinyi miiran”
    c) Ko si ohun ti a mọ, ifiranṣẹ naa nilo lati binu lati isinyi miiran - ṣugbọn a ko mọ gangan nigbati.
  4. Olupin naa dahun nipari RpcResult - idahun gangan (tabi aṣiṣe) - kii ṣe jiṣẹ nikan, ṣugbọn tun ṣe ilana.

Jasi, lilo awọn apoti le yanju iṣoro naa ni apakan. Eyi ni nigbati opo awọn ifiranṣẹ ba wa sinu ọkan, ati olupin naa dahun pẹlu ijẹrisi si gbogbo wọn ni ẹẹkan, ni ọkan. msg_id. Ṣugbọn oun yoo tun kọ idii yii, ti nkan kan ba jẹ aṣiṣe, ni gbogbo rẹ.

Ati ni aaye yii awọn ero ti kii ṣe imọ-ẹrọ wa sinu ere. Lati iriri, a ti ri ọpọlọpọ awọn crutches, ati ni afikun, a yoo bayi ri diẹ apeere ti buburu imọran ati faaji - ni iru awọn ipo, ni o tọ igbekele ati ṣiṣe iru awọn ipinnu? Ibeere naa jẹ arosọ (dajudaju kii ṣe).

Kini a n sọrọ nipa? Ti o ba wa lori koko-ọrọ ti “awọn ifiranṣẹ oogun nipa awọn ifiranṣẹ” o tun le ṣe akiyesi pẹlu awọn atako bii “o jẹ aṣiwere, iwọ ko loye ero ti o wuyi!” (bẹẹ kọ awọn iwe-ipamọ ni akọkọ, bi awọn eniyan deede ṣe yẹ, pẹlu awọn idi ati awọn apẹẹrẹ ti paṣipaarọ apo, lẹhinna a yoo sọrọ), lẹhinna awọn akoko / awọn akoko ipari jẹ ibeere ti o wulo ati pato, ohun gbogbo nibi ti mọ fun igba pipẹ. Kini iwe naa sọ fun wa nipa awọn akoko ipari?

Olupin nigbagbogbo jẹwọ gbigba ifiranṣẹ lati ọdọ alabara kan (deede, ibeere RPC) ni lilo esi RPC kan. Ti idahun ba jẹ igba pipẹ ti nbọ, olupin le kọkọ fi iwe-ẹri iwe-ẹri ranṣẹ, ati ni diẹ lẹhinna, idahun RPC funrararẹ.

Onibara gba deede gbigba ifiranṣẹ lati ọdọ olupin kan (nigbagbogbo, idahun RPC) nipa fifi ijẹrisi kun ibeere RPC ti o tẹle ti ko ba ti pẹ ju (ti o ba jẹ ipilẹṣẹ, sọ, 60-120 awọn aaya lẹhin gbigba ti ifiranṣẹ lati ọdọ olupin). Sibẹsibẹ, ti o ba jẹ pe fun igba pipẹ ko si idi lati fi awọn ifiranṣẹ ranṣẹ si olupin naa tabi ti o ba wa nọmba nla ti awọn ifiranṣẹ ti a ko gba lati ọdọ olupin naa (sọ, ju 16), onibara n ṣe igbasilẹ idaniloju-nikan.

... Mo tumọ: awa tikararẹ ko mọ iye ati bi a ṣe nilo rẹ, nitorina jẹ ki a ro pe jẹ ki o jẹ bi eyi.

Ati nipa pings:

Awọn ifiranṣẹ Ping (PING/PONG)

ping#7abe77ec ping_id:long = Pong;

Idahun kan maa n pada si asopọ kanna:

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

Awọn ifiranṣẹ wọnyi ko nilo awọn ijẹwọ. A gbejade pong nikan ni idahun si ping kan nigba ti ping le ṣe ipilẹṣẹ nipasẹ ẹgbẹ mejeeji.

Pipade Asopọ ti o da duro + PING

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

Ṣiṣẹ bi ping. Ni afikun, lẹhin eyi ti o ti gba, olupin naa bẹrẹ aago kan eyiti yoo pa asopọ asopọ lọwọlọwọ disconnect_delay iṣẹju-aaya nigbamii ayafi ti o ba gba ifiranṣẹ tuntun ti iru kanna eyiti o tunto gbogbo awọn akoko iṣaaju laifọwọyi. Ti alabara ba firanṣẹ awọn pings wọnyi lẹẹkan ni gbogbo iṣẹju 60, fun apẹẹrẹ, o le ṣeto disconnect_delay dogba si awọn aaya 75.

Ṣe o n sinwin?! Ni iṣẹju-aaya 60, ọkọ oju-irin yoo wọ ibudo naa, lọ silẹ ati gbe awọn ero-ọkọ, ati lẹẹkansi padanu olubasọrọ ni oju eefin naa. Ni iṣẹju-aaya 120, nigba ti o ba gbọ, yoo de si ọkan miiran, ati pe asopọ naa yoo ṣeese pọ. O dara, o han gbangba ibiti awọn ẹsẹ ti nbọ - “Mo gbọ ohun orin kan, ṣugbọn ko mọ ibiti o wa”, algorithm Nagl wa ati aṣayan TCP_NODELAY, ti a pinnu fun iṣẹ ibaraenisepo. Ṣugbọn, da mi, di iye aiyipada rẹ mu - 200 Miliiṣẹju-aaya Ti o ba fẹ gaan lati ṣe afihan nkan ti o jọra ki o fipamọ sori awọn apo-iwe meji ti o ṣeeṣe, lẹhinna fi sii fun iṣẹju-aaya 5, tabi ohunkohun ti “Olumulo ti n tẹ…” akoko ipari ifiranṣẹ ti wa ni bayi. Sugbon ko si siwaju sii.

Ati nikẹhin, pings. Iyẹn ni, ṣayẹwo igbesi aye ti asopọ TCP. O jẹ ẹrin, ṣugbọn ni nkan bi ọdun 10 sẹhin Mo kọ ọrọ pataki kan nipa ojiṣẹ ti ibugbe ile-iwe wa - awọn onkọwe nibẹ tun pin olupin naa lati ọdọ alabara, kii ṣe idakeji. Ṣugbọn awọn ọmọ ile-iwe ọdun 3rd jẹ ohun kan, ati pe ọfiisi kariaye jẹ omiiran, otun?…

Ni akọkọ, eto ẹkọ kekere kan. Asopọ TCP kan, ni isansa ti paṣipaarọ apo, le gbe fun awọn ọsẹ. Eyi jẹ rere ati buburu, da lori idi. O dara ti o ba ni asopọ SSH ti o ṣii si olupin naa, o dide lati kọnputa naa, tun atunbere olulana naa, pada si aaye rẹ - igba nipasẹ olupin yii ko ya (iwọ ko tẹ ohunkohun, ko si awọn apo-iwe) , o rọrun. O buru ti ẹgbẹẹgbẹrun awọn alabara wa lori olupin naa, ọkọọkan n gba awọn orisun (hello, Postgres!), Ati pe agbalejo alabara le ti tun bẹrẹ ni igba pipẹ sẹhin - ṣugbọn a kii yoo mọ nipa rẹ.

Awọn ọna iwiregbe/IM ṣubu sinu ọran keji fun idi afikun kan - awọn ipo ori ayelujara. Ti olumulo naa ba “ṣubu”, o nilo lati sọ fun awọn alamọja rẹ nipa eyi. Bibẹẹkọ, iwọ yoo pari pẹlu aṣiṣe kan ti awọn olupilẹṣẹ Jabber ṣe (ati atunṣe fun ọdun 20) - olumulo ti ge asopọ, ṣugbọn wọn tẹsiwaju lati kọ awọn ifiranṣẹ si i, ni igbagbọ pe o wa lori ayelujara (eyiti o tun padanu patapata ninu iwọnyi. iṣẹju diẹ ṣaaju ki a ge asopọ). Rara, aṣayan TCP_KEEPALIVE, eyiti ọpọlọpọ eniyan ti ko loye bii awọn akoko TCP ṣe n ṣiṣẹ jabọ laileto (nipa ṣeto awọn iye egan bii mewa ti awọn aaya), kii yoo ṣe iranlọwọ nibi - o nilo lati rii daju pe kii ṣe ekuro OS nikan ti ẹrọ olumulo ti wa laaye, ṣugbọn tun ṣiṣẹ ni deede, ni anfani lati dahun, ati ohun elo funrararẹ (ṣe o ro pe ko le di? Teligirafu Desktop lori Ubuntu 18.04 froze fun mi diẹ sii ju ẹẹkan lọ).

Ti o ni idi ti o ni lati ping olupin ibara, ati kii ṣe idakeji - ti alabara ba ṣe eyi, ti asopọ ba bajẹ, ping kii yoo ṣe jiṣẹ, ibi-afẹde naa kii yoo waye.

Kini a ri lori Telegram? O ni pato idakeji! O dara, iyẹn ni. Ni deede, dajudaju, awọn ẹgbẹ mejeeji le ping kọọkan miiran. Ni iṣe, awọn alabara lo crutch ping_delay_disconnect, eyi ti o ṣeto aago lori olupin naa. O dara, ṣagbe fun mi, kii ṣe si alabara lati pinnu igba melo ti o fẹ lati gbe nibẹ laisi ping. Olupin naa, ti o da lori ẹru rẹ, mọ dara julọ. Ṣugbọn, dajudaju, ti o ko ba fiyesi awọn ohun elo, lẹhinna o yoo jẹ Pinocchio buburu ti ara rẹ, ati pe crutch yoo ṣe ...

Báwo ló ṣe yẹ kí wọ́n ṣe é?

Mo gbagbọ pe awọn otitọ ti o wa loke fihan kedere pe ẹgbẹ Telegram / VKontakte ko ni agbara pupọ ni aaye gbigbe (ati isalẹ) ti awọn nẹtiwọọki kọnputa ati awọn afijẹẹri kekere wọn ni awọn ọran ti o yẹ.

Kini idi ti o fi di idiju, ati bawo ni awọn ayaworan ile Telegram ṣe le gbiyanju lati tako? Ni otitọ pe wọn gbiyanju lati ṣe igba kan ti o ye awọn adehun asopọ TCP, ie, ohun ti a ko firanṣẹ ni bayi, a yoo firanṣẹ nigbamii. O ṣee ṣe pe wọn tun gbiyanju lati ṣe ọkọ irinna UDP, ṣugbọn wọn koju awọn iṣoro ati fi silẹ (eyi ni idi ti iwe-ipamọ naa ṣofo - ko si nkankan lati ṣogo nipa rẹ). Ṣugbọn nitori aini oye ti bii awọn nẹtiwọọki ni gbogbogbo ati TCP ṣe n ṣiṣẹ ni pato, nibiti o ti le gbarale rẹ, ati nibiti o nilo lati ṣe funrararẹ (ati bii), ati igbiyanju lati darapo eyi pẹlu cryptography “awọn ẹiyẹ meji pẹlu okuta kan”, eyi ni abajade.

Bawo ni o ṣe pataki? Da lori otitọ pe msg_id jẹ aami-akoko pataki lati oju wiwo cryptographic lati yago fun awọn ikọlu atunṣe, o jẹ aṣiṣe lati so iṣẹ idamọ alailẹgbẹ kan mọ. Nitorinaa, laisi iyipada ipilẹ faaji lọwọlọwọ (nigbati ṣiṣan Awọn imudojuiwọn ba ti ipilẹṣẹ, iyẹn jẹ koko-ọrọ API ipele giga fun apakan miiran ti jara ti awọn ifiweranṣẹ), ọkan yoo nilo lati:

  1. Olupin ti o ni asopọ TCP si alabara gba ojuse - ti o ba ti ka lati iho, jọwọ jẹwọ, ilana tabi da aṣiṣe pada, ko si pipadanu. Lẹhinna ijẹrisi kii ṣe fekito ti ids, ṣugbọn nirọrun “seq_no ti o kẹhin gba” - nọmba kan, bi ninu TCP (awọn nọmba meji - seq rẹ ati ọkan ti a fọwọsi). A wa nigbagbogbo laarin igba, ṣe kii ṣe awa?
  2. Awọn timestamp lati ṣe idiwọ awọn ikọlu atunwi di aaye lọtọ, la nonce. O ti ṣayẹwo, ṣugbọn ko ni ipa ohunkohun miiran. To ati uint32 Ti iyọ wa ba yipada ni o kere ju gbogbo idaji ọjọ kan, a le pin awọn iwọn 16 si awọn iwọn kekere-ibere ti apakan odidi ti akoko lọwọlọwọ, iyokù - si apakan ida kan ti iṣẹju kan (bii bayi).
  3. Yiyọ kuro msg_id ni gbogbo - lati awọn ojuami ti wo iyato ibeere lori backends, o wa, ni ibere, awọn ose id, ati keji, igba id, concatenate wọn. Nitorinaa, ohun kan nikan ni o to bi idanimọ ibeere kan seq_no.

Eyi tun kii ṣe aṣayan aṣeyọri julọ; ID pipe le ṣiṣẹ bi idanimọ - eyi ti ṣe tẹlẹ ni API ipele giga nigbati fifiranṣẹ ifiranṣẹ kan, ni ọna. Yoo dara julọ lati tun ṣe faaji patapata lati ibatan si pipe, ṣugbọn eyi jẹ koko-ọrọ fun apakan miiran, kii ṣe ifiweranṣẹ yii.

API?

Ta-daamu! Nitorinaa, ti o tiraka nipasẹ ọna ti o kun fun irora ati awọn crutches, a ni nipari ni anfani lati firanṣẹ awọn ibeere eyikeyi si olupin naa ati gba awọn idahun eyikeyi si wọn, bakannaa gba awọn imudojuiwọn lati ọdọ olupin naa (kii ṣe idahun si ibeere kan, ṣugbọn funrararẹ rán wa, bi PUSH, ti o ba ti ẹnikẹni ti o ni clearer wipe ọna).

Ifarabalẹ, bayi yoo jẹ apẹẹrẹ nikan ni Perl ninu nkan naa! (fun awọn ti ko faramọ pẹlu sintasi, ariyanjiyan akọkọ ti ibukun ni eto data nkan naa, ekeji ni kilasi rẹ):

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

Bẹẹni, kii ṣe apanirun lori idi - ti o ko ba ti ka rẹ sibẹsibẹ, tẹsiwaju ki o ṣe!

Oh, wai~~... Kini eleyi dabi? Nkankan ti o faramọ pupọ… boya eyi ni igbekalẹ data ti oju opo wẹẹbu aṣoju aṣoju ni JSON, ayafi ti awọn kilasi tun so mọ awọn nkan?…

Nitorinaa eyi ni bii o ṣe wa… Kini gbogbo rẹ, awọn ẹlẹgbẹ?.. Igbiyanju pupọ - ati pe a duro lati sinmi nibiti awọn olutọpa wẹẹbu o kan bereṢe kii ṣe JSON nikan lori HTTPS jẹ rọrun?! Kini a gba ni paṣipaarọ? Ṣe akitiyan naa tọsi bi?

Jẹ ki a ṣe ayẹwo ohun ti TL+MTProto fun wa ati kini awọn ọna miiran ṣee ṣe. O dara, HTTP, eyiti o dojukọ awoṣe-idahun ibeere, jẹ ibamu buburu, ṣugbọn o kere ju nkankan lori oke TLS?

Iwapọ serialization. Ri eto data yii, ti o jọra si JSON, Mo ranti pe awọn ẹya alakomeji wa. Jẹ ki a samisi MsgPack bi aipe to, ṣugbọn o wa, fun apẹẹrẹ, CBOR - nipasẹ ọna, boṣewa ti a ṣalaye ninu RFC 7049. O ṣe akiyesi fun otitọ pe o ṣalaye afi, bi ohun imugboroosi siseto, ati laarin tẹlẹ idiwon wa:

  • 25 + 256 - rirọpo awọn laini atunṣe pẹlu itọkasi nọmba laini, iru ọna funmorawon olowo poku
  • 26 - serialized Perl ohun pẹlu kilasi orukọ ati Constructor ariyanjiyan
  • 27 - serialized ede-ominira ohun pẹlu iru orukọ ati Constructor ariyanjiyan

O dara, Mo gbiyanju lati serialize data kanna ni TL ati ni CBOR pẹlu okun ati iṣakojọpọ ohun. Abajade bẹrẹ lati yatọ ni ojurere ti CBOR ibikan lati megabyte kan:

cborlen=1039673 tl_len=1095092

Ati bẹ, ipari: Awọn ọna kika ti o rọrun pupọ wa ti ko ṣe koko-ọrọ si iṣoro ti ikuna amuṣiṣẹpọ tabi idanimọ aimọ, pẹlu ṣiṣe afiwera.

Sare asopọ idasile. Eyi tumọ si odo RTT lẹhin isọdọkan (nigbati bọtini ba ti ṣe ipilẹṣẹ ni ẹẹkan) - wulo lati ifiranṣẹ MTProto akọkọ akọkọ, ṣugbọn pẹlu awọn ifiṣura - lu iyọ kanna, igba naa ko bajẹ, ati bẹbẹ lọ. Kini TLS fun wa dipo? Sọ lori koko:

Nigba lilo PFS ni TLS, awọn tiketi igba TLS (RFC 5077) lati tun bẹrẹ igba fifi ẹnọ kọ nkan laisi awọn bọtini idunadura tun-idunadura ati laisi fifipamọ alaye bọtini lori olupin naa. Nigbati o ba ṣii asopọ akọkọ ati ṣiṣẹda awọn bọtini, olupin naa ṣe ifipamọ ipo asopọ ati gbejade si alabara (ni irisi tikẹti igba kan). Nitorinaa, nigbati asopọ ba tun bẹrẹ, alabara firanṣẹ tikẹti igba kan, pẹlu bọtini igba, pada si olupin naa. Tikẹti naa funrararẹ jẹ fifipamọ pẹlu bọtini igba diẹ (bọtini tikẹti igba), eyiti o wa ni ipamọ sori olupin ati pe o gbọdọ pin kaakiri laarin gbogbo awọn olupin iwaju ti n ṣe SSL ni awọn ojutu iṣupọ.[10]. Nitorinaa, iṣafihan tikẹti igba kan le rú PFS ti awọn bọtini olupin igba diẹ ba ni ipalara, fun apẹẹrẹ, nigbati wọn ba tọju wọn fun igba pipẹ (OpenSSL, nginx, Apache tọju wọn nipasẹ aiyipada fun gbogbo iye akoko ti eto naa; awọn aaye olokiki lo. bọtini fun awọn wakati pupọ, titi di awọn ọjọ).

Nibi RTT kii ṣe odo, o nilo lati ṣe paṣipaarọ o kere ClientHello ati ServerHello, lẹhin eyi alabara le firanṣẹ data pẹlu Finished. Ṣugbọn nibi a yẹ ki o ranti pe a ko ni oju opo wẹẹbu, pẹlu opo rẹ ti awọn isopọ tuntun ti a ṣii, ṣugbọn ojiṣẹ kan, asopọ eyiti o jẹ ọkan ati diẹ sii tabi kere si igbesi aye gigun, awọn ibeere kukuru kukuru si awọn oju-iwe wẹẹbu - ohun gbogbo ni pupọ. inu. Iyẹn ni, o jẹ itẹwọgba pupọ ti a ko ba pade apakan alaja ti o buru pupọ.

Nkankan miran ti o gbagbe? Kọ ninu awọn comments.

A tun ma a se ni ojo iwaju!

Ni apakan keji ti jara ti awọn ifiweranṣẹ a yoo gbero kii ṣe imọ-ẹrọ, ṣugbọn awọn ọran eto - awọn isunmọ, arosọ, wiwo, ihuwasi si awọn olumulo, ati bẹbẹ lọ. Da, sibẹsibẹ, lori alaye imọ-ẹrọ ti a gbekalẹ nibi.

Apa kẹta yoo tẹsiwaju lati ṣe itupalẹ paati imọ-ẹrọ / iriri idagbasoke. Iwọ yoo kọ ẹkọ, ni pataki:

  • itesiwaju pandemonium pẹlu ọpọlọpọ awọn oriṣi TL
  • aimọ ohun nipa awọn ikanni ati supergroups
  • idi ti awọn ibaraẹnisọrọ buru ju iwe akọọlẹ
  • nipa idi vs ojulumo ifiranṣẹ sọrọ
  • Kini iyato laarin aworan ati aworan
  • bawo ni emoji ṣe dabaru pẹlu ọrọ italic

ati awọn crutches miiran! Duro si aifwy!

orisun: www.habr.com

Fi ọrọìwòye kun