{"id":95846,"date":"2020-10-04T01:42:23","date_gmt":"2020-10-03T23:42:23","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/mozhno-li-generirovat-sluchajnye-chisla-esli-my-ne-doveryaem-drug-drugu-chast-2"},"modified":"2020-10-04T01:42:23","modified_gmt":"2020-10-03T23:42:23","slug":"mozhno-li-generirovat-sluchajnye-chisla-esli-my-ne-doveryaem-drug-drugu-chast-2","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/mozhno-li-generirovat-sluchajnye-chisla-esli-my-ne-doveryaem-drug-drugu-chast-2","title":{"rendered":"Mo\u017ee li se generirati slu\u010dajne brojeve ako si ne vjerujemo? Dio 2","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Mo\u017ee li se generirati slu\u010dajne brojeve ako si ne vjerujemo? Dio 2\" src=\"\/wp-content\/uploads\/2020\/10\/fc42fe5e99ce4412a0ce99eb63629a42.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Bok, Habr!<\/p>\n<p>U <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/near\/blog\/521090\/\">prvom delu<\/a><\/noindex> U \u010dlanku smo raspravili za\u0161to je mo\u017eda potrebno generirati slu\u010dajne brojeve sudionicima koji si ne vjeruju, koje su zahtjeve postavljene pred takve generatore slu\u010dajnih brojeva i razmotrili dva pristupa njihovoj implementaciji.<\/p>\n<p>U ovom dijelu \u010dlanka detaljno \u0107emo razmotriti jo\u0161 jedan pristup koji koristi pragovne potpise.<\/p>\n<h3>Malo o kriptografiji<\/h3>\n<p>Da bismo razumjeli kako funkcioniraju pragovni potpisi, trebamo razumjeti malo osnovne kriptografije. Koristit \u0107emo dvije koncepcije: skalarne, ili jednostavno brojeve, koje \u0107emo ozna\u010diti malim slovima (<em>x, y<\/em>) i to\u010dke na elipti\u010dnoj krivulji, koje \u0107emo ozna\u010diti velikim slovima.<\/p>\n<p>Za razumijevanje osnova pragovnih potpisa nije potrebno razumjeti kako funkcioniraju elipti\u010dne krivulje, osim nekoliko osnovnih stvari:<\/p>\n<ol>\n<li>\n<p>To\u010dke na elipti\u010dnoj krivulji mogu se zbrajati i mno\u017eiti sa skalarom (mno\u017eenje sa skalarom ozna\u010dit \u0107emo kao <em>xG<\/em>, iako se notacija <em>Gx<\/em> tako\u0111er se \u010desto koristi u literaturi). Rezultat zbrajanja i mno\u017eenja sa skalarnim vrijednostima \u2014 to\u010dka na elipti\u010dnoj krivulji.<\/p>\n<\/li>\n<li>\n<p>Znaju\u0107i samo to\u010dku <em>G<\/em> i njen proizvod sa skalarom <em>xG<\/em> ne mo\u017ee se izra\u010dunati <em>x<\/em>.<\/p>\n<\/li>\n<\/ol>\n<p>Tako\u0111er \u0107emo koristiti koncept polinoma <em>p(x)<\/em> stepeni <em>k<\/em>-1. Konkretno, koristit \u0107emo svojstvo polinoma: ako znamo vrijednost <em>p(x) <\/em>za bilo koje <em>k <\/em>razli\u010dite <em>x <\/em>(i nemamo vi\u0161e nikakve informacije o <em>p(x)<\/em>), mo\u017eemo izra\u010dunati <em>p(x) <\/em>za bilo koji drugi <em>x<\/em>.<\/p>\n<p>Zanimljivo je da, za bilo koji polinom <em>p(x)<\/em> i neku to\u010dku na krivulji <em>G<\/em>, znaju\u0107i vrijednost <em>p(x)G<\/em> za bilo koje <em>k<\/em> razli\u010ditih vrijednosti <em>x<\/em>, tako\u0111er mo\u017eemo izra\u010dunati <em>p(x)G<\/em> za bilo koji <em>x<\/em>.<\/p>\n<p>Ove informacije su dovoljne da se zagrebemo u detalje o tome kako funkcioniraju pragovni potpisi i kako ih koristiti za generiranje slu\u010dajnih brojeva.<\/p>\n<h3>Generator slu\u010dajnih brojeva na pragovnim potpisima<\/h3>\n<p>Pretpostavimo da <em>n<\/em> sudionici \u017eele generirati slu\u010dajan broj, a mi \u017eelimo da sudjelovanje bilo kojih <em>k<\/em> od njih bude dovoljno da generiraju broj, ali da zlonamjerni akteri, koji kontroliraju <em>k<\/em>-1 ili manje sudionika, ne mogu predvidjeti ili utjecati na generirani broj.<\/p>\n<p><img decoding=\"async\" alt=\"Mo\u017ee li se generirati slu\u010dajne brojeve ako si ne vjerujemo? Dio 2\" src=\"\/wp-content\/uploads\/2020\/10\/00d54b3b0ca237a1551cdbdc35688099.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Pretpostavimo da postoji takav polinom <em>p(x)<\/em> stepeni <em>k<\/em>-1, da prvi sudionik zna <em>p(1)<\/em>, drugi zna <em>p(2), <\/em>i tako dalje (<em>n<\/em>-i zna <em>p(n)<\/em>). Tako\u0111er, pretpostavimo da za neku unaprijed odre\u0111enu to\u010dku <em>G<\/em> svi znaju <em>p(x)G <\/em>za sve vrijednosti <em>x<\/em>. Nazvat \u0107emo <em>p(i)<\/em> \u201cprivatnom komponentom\u201d <em>i<\/em>-og sudionika (jer samo <em>i<\/em>-i sudionik zna nju), i <em>p(i)G<\/em> \u201cjavnom komponentom\u201d <em>i<\/em>-og sudionika (jer svi sudionici znaju nju). Kao \u0161to se sje\u0107ate, znanje <em>p(i)G <\/em>nije dovoljno za obnovu <em>p(i).<\/em><\/p>\n<p>Kreiranje takvog polinoma na na\u010din da samo <em>i-<\/em>i sudionik i nitko drugi zna svoju privatnu komponentu \u2013 to je najte\u017ei i najzanimljiviji dio protokola, i razmotrit \u0107emo ga u nastavku. Za sada pretpostavimo da imamo takav polinom, i da svi sudionici znaju svoje privatne komponente.<\/p>\n<p>Kako mo\u017eemo koristiti takav polinom za generiranje slu\u010dajnog broja? Prvo nam treba neka niz koja prije nije kori\u0161tena kao ulaz za generator. U slu\u010daju blockchaina, hash posljednje blokade <em>h<\/em> \u2014 dobar kandidat za takav niz. Neka sudionici \u017eele kreirati nasumi\u010dni broj, koriste\u0107i <em>h <\/em>kao seed. Prvo sudionici konvertiraju <em>h<\/em> u to\u010dku na krivulji koriste\u0107i bilo koju unaprijed odre\u0111enu funkciju:<\/p>\n<p><em>H = scalarToPoint(h)<\/em><\/p>\n<p>Zatim svaki sudionik <em>i<\/em> izra\u010dunava i objavljuje <em>Hi = p(i)H, <\/em>\u0161to mogu u\u010diniti jer znaju<em> p(i) i H. <\/em>Otkrivanje<em> H<\/em>i ne omogu\u0107uje drugim sudionicima obnovu privatne komponente <em>i<\/em>-og sudionika, i stoga jedan skup privatnih komponenti mo\u017ee se koristiti od bloka do bloka. Dakle, skupi algoritam za stvaranje polinoma, opisan u nastavku, potrebno je izvr\u0161iti samo jednom.<\/p>\n<p>Kada <em>k<\/em> sudionici su otkrili <em>Hi = p(i)H, <\/em>svi mogu izra\u010dunati<em> H<\/em>x = <em>p(x)H<\/em> za sve <em>x<\/em> zahvaljuju\u0107i svojstvu polinoma, koje smo raspravili u prethodnom odjeljku. U tom trenutku svi sudionici izra\u010dunavaju <em>H0 = p(0)H, <\/em>i to je rezultantni slu\u010dajni broj. Imajte na umu da nitko ne zna<em> p(0), <\/em>i stoga je jedini na\u010din da se izra\u010duna<em> p(0)H \u2013 <\/em>to je interpolacija<em> p(x)H, <\/em>\u0161to je mogu\u0107e samo kada<em> k <\/em>vrijednosti<em> p(i)H <\/em>su poznate. Otkrivanje bilo kojeg manjeg broja<em> p(i)H <\/em>ne daje nikakve informacije o<em> p(0)H.<\/em><\/p>\n<p><img decoding=\"async\" alt=\"Mo\u017ee li se generirati slu\u010dajne brojeve ako si ne vjerujemo? Dio 2\" src=\"\/wp-content\/uploads\/2020\/10\/a91219381018f90f73b0a92976c92c79.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Generator iznad ima sve osobine koje \u017eelimo: zlonamjerni subjekti koji kontroliraju samo <em>k-<\/em>1 sudionika, ili manje, nemaju nikakve informacije i utjecaj na ishod, dok bilo koji <em>k<\/em> sudionici mogu izra\u010dunati rezultantni broj, i bilo koji podskup od <em>k<\/em> sudionici uvijek dolaze do istog rezultata za istu sjeme.<\/p>\n<p>Postoji jedan problem koji smo pa\u017eljivo izbjegavali ranije. Da bi interpolacija radila, va\u017eno je da vrijednost<em> H<\/em>i koju je objavio svaki sudionik <em>i<\/em> zapravo bude jednaka <em>p(i)H.<\/em> Budu\u0107i da nitko osim <em>i<\/em>-og sudionika ne zna <em>p(i), <\/em>nitko osim <em>i-<\/em>-og sudionika ne mo\u017ee provjeriti da <em>Pozdrav <\/em>zapravo je ispravno izra\u010dunato, i bez nekog kriptografskog dokaza o ispravnosti<em> H<\/em>i zlonamjernik mo\u017ee objaviti bilo koju vrijednost kao <em>Pozdrav, <\/em>i proizvoljno utjecati na izlaz generatora slu\u010dajnih brojeva<em>:<\/em><\/p>\n<p><img decoding=\"async\" alt=\"Mo\u017ee li se generirati slu\u010dajne brojeve ako si ne vjerujemo? Dio 2\" src=\"\/wp-content\/uploads\/2020\/10\/694a86666806c49edb6e44dd9ec26b0f.png\" style=\"display:block;margin: 0 auto;\" \/>Razli\u010dite vrijednosti H_1, poslane od prvog sudionika, dovode do razli\u010ditih rezultantnih H_0<\/p>\n<p>Postoje najmanje dva na\u010dina da se doka\u017ee ispravnost<em> H<\/em>i, razmotrit \u0107emo ih nakon \u0161to obradimo generaciju polinoma.<\/p>\n<h3>Generacija polinoma<\/h3>\n<p>U prethodnom odjeljku pretpostavili smo da imamo takav polinom <em>p(x)<\/em> stepeni <em>k<\/em>-1 koji sudionik <em>i<\/em> zna <em>p(i)<\/em>, i nitko drugi nema nikakve informacije o toj vrijednosti. U sljede\u0107em odjeljku tako\u0111er \u0107e nam biti potrebno da za neku unaprijed odre\u0111enu to\u010dku <em>G<\/em> svi znaju <em>p(x)G <\/em>za sve<em> x<\/em>.<\/p>\n<p>U ovom odjeljku smatrat \u0107emo da svaki sudionik lokalno ima neki privatni klju\u010d <em>xi, <\/em>tako da je svima poznat odgovaraju\u0107i javni klju\u010d<em> X<\/em>i.<\/p>\n<p>Jedan mogu\u0107i protokol generacije polinoma je sljede\u0107i:<\/p>\n<p><img decoding=\"async\" alt=\"Mo\u017ee li se generirati slu\u010dajne brojeve ako si ne vjerujemo? Dio 2\" src=\"\/wp-content\/uploads\/2020\/10\/ccd8afbc3c88a7f5a03714aeb6593361.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<ol>\n<li>\n<p>Svaki sudionik <em>i<\/em> lokalno stvara proizvoljni polinom <em>pi(x) stupnja k-1. <\/em>Oni zatim \u0161alju svakom sudioniku<em> j <\/em>vrijednost<em> p<\/em>i(j), \u0161ifrirano javnim klju\u010dem <em>Xj. <\/em>Tako samo<em> i-<\/em>y<em> <\/em>i<em> j-<\/em>y<em> <\/em>sudionik zna<em> p<\/em>i(j). Sudionik <em>i<\/em> tako\u0111er javno objavljuje <em>pi(j)G <\/em>za sve<em> j <\/em>od<em> 1 <\/em>do<em> k <\/em>uklju\u010divo.<\/p>\n<\/li>\n<li>\n<p>Svi sudionici koriste neki konsenzus kako bi odabrali<em> k <\/em>sudionike \u010diji \u0107e se polinomi koristiti. Budu\u0107i da neki sudionici mogu biti izvan mre\u017ee, ne mo\u017eemo \u010dekati da svi<em> n <\/em>sudionici objave polinome. Rezultat ovog koraka je skup<em> <\/em><strong><em>Z<\/em><\/strong><em> <\/em>sastavljen od barem<em> k <\/em>polinoma stvorenih u koraku (1)<em>.<\/em><\/p>\n<\/li>\n<li>\n<p>Sudionici se uvjeravaju da su poznate vrijednosti<em> p<\/em>i(j) u skladu s javno objavljenim <em>pi(j)G. <\/em>Nakon ovog koraka trebali bi ostati samo polinomi za koje privatno preneseni<em> <\/em><strong><em>Z <\/em><\/strong>izra\u010dunava svoju privatnu komponentu<em> p<\/em>i(j) u skladu s javno objavljenim <em>pi(j)G.<\/em><\/p>\n<\/li>\n<li>\n<p>Svaki sudionik<em> j <\/em>p(j)<em> kao zbroj <\/em>i(j) za sve<em> p<\/em>. Svaki sudionik tako\u0111er izra\u010dunava sve vrijednosti <em>i<\/em> u <strong><em>Z<\/em><\/strong>pi(x)G za sve i <em>p(x)G <\/em>i(j) za sve <em>p(x) \u2013 <\/em>u<em> <\/em><strong><em>Z<\/em><\/strong><em>.<\/em><\/p>\n<\/li>\n<\/ol>\n<p><img decoding=\"async\" alt=\"Mo\u017ee li se generirati slu\u010dajne brojeve ako si ne vjerujemo? Dio 2\" src=\"\/wp-content\/uploads\/2020\/10\/a7a92dba3b9de7a376c415fc6c330c46.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Napomena, kada<em> to je zapravo polinom stupnja <\/em>k-1,<em> . <\/em>jer to je zbroj pojedina\u010dnih<em> p<\/em>i(x), svaki od njih je polinom stupnja <em>k<\/em>-1. Zatim, obratite pa\u017enju da dok svaki sudionik <em>j<\/em> zna <em>p(j), <\/em>nema nikakve informacije o <em>p(x)<\/em> za <em>x \u2260 j<\/em>. Naime, da bi izra\u010dunali ovu vrijednost, moraju znati sve <em>pi(x), <\/em>i dok sudionik<em> j <\/em>ne zna barem jedan od odabranih polinoma, nemaju dovoljno informacija o<em> p(x).<\/em><\/p>\n<p>To je cijeli proces generiranja polinoma koji je bio potreban u pro\u0161lom odjeljku. Koraci 1, 2 i 4 iznad imaju dovoljno o\u010diglednu implementaciju. Me\u0111utim, korak 3 nije tako trivijalan.<\/p>\n<p>Specifi\u010dno, trebamo biti u stanju dokazati da su \u0161ifrirani<em> p<\/em>i(j) zaista u skladu s objavljenim <em>pi(j)G. <\/em>Ako to ne mo\u017eemo dokazati, napada\u010d<em> i <\/em>mo\u017ee poslati sme\u0107e umjesto<em> p<\/em>i(j) sudioniku <em>j<\/em>, i sudionik <em>j <\/em>ne\u0107e mo\u0107i dobiti stvarnu vrijednost <em>pi(j), <\/em>i ne\u0107e mo\u0107i izra\u010dunati svoju privatnu komponentu<em>.<\/em><\/p>\n<p>Postoji kriptografski protokol koji omogu\u0107uje stvaranje dodatne poruke<em> proof<\/em>i(j), tako da bilo koji sudionik, imaju\u0107i neku vrijednost <em>e, <\/em>a tako\u0111er<em> proofi(j) <\/em>i<em> p<\/em>i(j)G, mo\u017ee lokalno provjeriti da <em>e<\/em> \u2013 to je zaista <em>pi(j), <\/em>\u0161ifrirano klju\u010dem sudionika<em> j. <\/em>Na\u017ealost, veli\u010dina takvog dokaza nevjerojatno je velika, i uzimaju\u0107i u obzir da je potrebno objaviti<em> O(nk) <\/em>takvih dokaza, njihovo kori\u0161tenje za ovu svrhu ne\u0107e biti mogu\u0107e.<\/p>\n<p>Umjesto da dokazujemo da <em>pi(j) <\/em>odgovara<em> p<\/em>i(j)G, mo\u017eemo u protokolu generiranja polinoma odvojiti vrlo dugo vremensko razdoblje, tijekom kojeg svi sudionici provjeravaju primljene \u0161ifrirane <em>pi(j), <\/em>i ako de\u0161ifrirana poruka ne odgovara javnom<em> p<\/em>i(j)G, objavljuju kriptografski dokaz da primljena \u0161ifrirana poruka nije ispravna. Dokazati da je poruka <em>ne <\/em>odgovara <em>pi(G)<\/em> mnogo je lak\u0161e nego dokazati da odgovara. Treba napomenuti da to zahtijeva da se svaki sudionik pojavi u mre\u017ei barem jednom tijekom vremena dodijeljenog za stvaranje takvih dokaza, i oslanja se na pretpostavku da ako su takav dokaz objavili, on \u0107e do\u0107i do svih drugih sudionika u to isto dodijeljeno vrijeme.<\/p>\n<p><img decoding=\"async\" alt=\"Mo\u017ee li se generirati slu\u010dajne brojeve ako si ne vjerujemo? Dio 2\" src=\"\/wp-content\/uploads\/2020\/10\/f7d92f18c75aa6161a9e3f1724b57426.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ako se sudionik nije pojavio na mre\u017ei u tom razdoblju, a imao je barem jednu neispravnu komponentu, taj odre\u0111eni sudionik ne\u0107e mo\u0107i sudjelovati u daljnjoj generaciji brojeva. Protokol \u0107e, me\u0111utim, i dalje funkcionirati ako postoji barem <em>k<\/em> sudionika koji su ili samo primili ispravne komponente ili su uspjeli ostaviti dokaze neispravnosti u zadanom vremenu.<\/p>\n<h3>Dokazi ispravnosti H_i<\/h3>\n<p>Posljednji dio koji treba raspraviti je kako dokazati ispravnost objavljenih<em> H<\/em>i, to jest, \u0161to <em>Hi = p(i)H, <\/em>bez otkrivanja<em> p(i).<\/em><\/p>\n<p>Podsjetimo se da su vrijednosti<em> H, G, p(i)G <\/em>javne i poznate svima.<em> <\/em>Operacija dobivanja<em> p(i) <\/em>znaju\u0107i<em> p(i)G <\/em>i<em> G <\/em>zove se diskretni logaritm, ili<em> dlog, <\/em>i \u017eelimo dokazati da:<\/p>\n<p><em>dlog(p(i)G, G) = dlog(H<\/em>i, <em>H<\/em>)<\/p>\n<p>bez otkrivanja <em>p(i)<\/em>. Konstrukcije za takve dokaze postoje, na primjer,<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Proof_of_knowledge#Schnorr_protocol\"> <u>Schnorr Protocol<\/u><\/a><\/noindex>.<\/p>\n<p>S tom konstrukcijom, svaki sudionik zajedno s <em>Pozdrav <\/em>\u0161alje dokaz ispravnosti prema konstrukciji.<\/p>\n<p>Kada se slu\u010dajni broj generira, \u010desto ga trebaju koristiti sudionici koji se razlikuju od onih koji su ga generirali. Tim sudionicima potrebno je poslati sve <em>Pozdrav<\/em> i prate\u0107e dokaze.<\/p>\n<p>Radoznao \u010ditatelj mo\u017ee pitati: budu\u0107i da je kona\u010dni slu\u010dajni broj \u2013 to je<em> H<\/em>0, i <em>p(0)G \u2013 <\/em>to je javna informacija, za\u0161to je potrebno dokazati za svaki pojedina\u010dni<em> H<\/em>i, za\u0161to umjesto toga ne poslati dokaz da<\/p>\n<p>dlog(<em>p(0)G, G) = dlog(H<\/em>0, <em>H<\/em>)<\/p>\n<p>Problem je u tome \u0161to pomo\u0107u Schnorr Protocol-a nije mogu\u0107e stvoriti takav dokaz, jer nitko ne zna vrijednost <em>p(0)<\/em>, potrebnu za stvaranje dokaza, a \u0161tovi\u0161e, cijeli generator slu\u010dajnih brojeva temelji se na tome da nitko ne zna tu vrijednost. Stoga je potrebno imati sve vrijednosti <em>Pozdrav <\/em>i njihove individualne dokaze kako bi se dokazala ispravnost.<em> H<\/em>0.<\/p>\n<p>Me\u0111utim, da je na to\u010dkama na elipti\u010dnim krivuljama postojala neka operacija koja je semanti\u010dki sli\u010dna mno\u017eenju, dokaz ispravnosti <em>H0 <\/em>bio bi trivijalan, jednostavno bismo provjerili da<\/p>\n<p><em>H<\/em>0 \u00d7 <em>G<\/em> = <em>p(0)G \u00d7 H<\/em><\/p>\n<p>Ako odabrana krivulja podr\u017eava <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@VitalikButerin\/exploring-elliptic-curve-pairings-c73c1864e627\"><u>elliptic curve pairings<\/u><\/a><\/noindex>, takav dokaz bi djelovao. U tom slu\u010daju<em> H<\/em>0 nije samo ishod generatora slu\u010dajnih brojeva koji mo\u017ee provjeriti bilo koji sudionik koji zna <em>G, H<\/em> i <em>p(0)G. H<\/em>0 \u2013 to je tako\u0111er oznaka za poruku koja je kori\u0161tena kao seed, potvr\u0111uju\u0107i da <em>k<\/em> i <em>n <\/em>u\u010desnici potpisali tu poruku. Tako da, ako <em>seed \u2013 <\/em>je hash bloka u blockchain protokolu, tada <em>H0<\/em> je to istovremeno multi-potpis na bloku, i veoma dobar slu\u010dajan broj.<\/p>\n<h4>Za kraj<\/h4>\n<p>Ovaj \u010dlanak je deo serije tehni\u010dkih \u010dlanaka na blogu <noindex><a rel=\"nofollow\" href=\"https:\/\/near.org\">NEAR<\/a><\/noindex>. NEAR je blockchain protokol i platforma za razvoj decentralizovanih aplikacija sa naglaskom na jednostavnost razvoja i jednostavnost kori\u0161\u0107enja za krajnje korisnike.<\/p>\n<p>Kod protokola je otvoren, na\u0161a implementacija je napisana na Rust-u, a mo\u017ee se na\u0107i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nearprotocol\/nearcore\">ovdje<\/a><\/noindex>.<\/p>\n<p>Pogledajte kako izgleda razvoj na NEAR-u i eksperimentirajte u online IDE-u <noindex><a rel=\"nofollow\" href=\"https:\/\/examples.near.org\">ovdje<\/a><\/noindex>.<\/p>\n<p>Pratite sve vesti na ruskom jeziku u <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/near_protocol\">grupi na Telegramu<\/a><\/noindex> i u <noindex><a rel=\"nofollow\" href=\"https:\/\/vk.com\/nearprotocol\">grupi na VKontakte<\/a><\/noindex>, a na engleskom u zvani\u010dnom <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/NEARProtocol\">Twitteru<\/a><\/noindex>.<\/p>\n<p>Vidimo se uskoro!<\/p>\n<p>Izvor: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/near\/blog\/521700\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043e\u0431\u0441\u0443\u0434\u0438\u043b\u0438, \u0437\u0430\u0447\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443, \u043a\u0430\u043a\u0438\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0434\u0432\u0438\u0433\u0430\u044e\u0442\u0441\u044f \u043a \u0442\u0430\u043a\u0438\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0434\u0432\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u043e\u0434\u0445\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u043e\u0440\u043e\u0433\u043e\u0432\u044b\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0438. \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":95847,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-95846","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/mozhno-li-generirovat-sluchajnye-chisla-esli-my-ne-doveryaem-drug-drugu-chast-2\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443? \u0427\u0430\u0441\u0442\u044c 2 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/mozhno-li-generirovat-sluchajnye-chisla-esli-my-ne-doveryaem-drug-drugu-chast-2\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-03T23:42:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-03T23:42:23+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Mo\u017ee li se generisati slu\u010dajne brojeve, ako ne verujemo jedni drugima? Deo 2 | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/mozhno-li-generirovat-sluchajnye-chisla-esli-my-ne-doveryaem-drug-drugu-chast-2","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443? \u0427\u0430\u0441\u0442\u044c 2 | ProHoster","og:url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/mozhno-li-generirovat-sluchajnye-chisla-esli-my-ne-doveryaem-drug-drugu-chast-2","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-10-03T23:42:23+00:00","article:modified_time":"2020-10-03T23:42:23+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"95846","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:56:24","updated":"2022-09-30 13:54:48","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/95846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=95846"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/95846\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/95847"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=95846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=95846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=95846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}