Jak obliczana jest reputacja na Steem?

in #polish6 years ago (edited)

Wstęp

Jeśli porównalibyśmy Steem do firmy, w której pracujemy i której jesteśmy udziałowcami, to moglibyśmy przyjąć następujący opis tego czym jest reputacja.

Reputacja - respekt w firmie, z pozoru do niczego się nie przydaje, ale jednak lepiej mieć wyższy niż niższy, jak ktoś bardzo narozrabiał (ma reputację mniejszą od 0), to jest odsunięty od pewnych benefitów dawanych przez firmę (np: brak premii (a na Steem widoczność postów)).

Reputacja przyjmuje dwie formy:

  • "surowa wartość" reputacji:

  • poziom reputacji wyświetlany użytkownikowi:

Ta pierwsza wartość jest przechowywana w blockchainie i na niej są przeprowadzane wszelkie obliczenia. Ta druga powstaje z tej pierwszej, za pomocą pewnego wzoru (o czym w dalszej części artykułu).

Zmiana reputacji na skutek głosu

Każdy nowy użytkownik startuje z reputacją równą 25 ("surowa wartość" reputacji = 0). Reputacja ta rośnie / maleje w miarę otrzymywania głosów. Ale w jaki dokładnie sposób?

Zacznijmy od tego, że jeśli użytkownik oddaje głos na post, to przydziela pewną część puli nagród - rshares, która zależy od jego SP (oraz VP i wagi głosu). Dla przykładu, spójrzmy na następujący post:
https://steemit.com/polish/@jacekw/kolorowa-pizza-kreci-sie-w-steemitowej-kuchni-jacekw-serwuje-sierpniowe-statystyki

Użytkownikrshares
gtg1496730817114
noisy906919846492
sisters161642472556
nero12126821195679
jakipatryk67258542551
diosbot65555343236
michalx2008x56995762371
bowess54050313447
rozioo48614115629
annaburska47358520954
lukmarcus35393359481
jamzed32234857415
saunter30865615214
fervi27392176897
grecki-bazar-ewy21448653047
jozef23020382270094
breadcentric16934919861
fraktale16237330466
bocik15571518318
kryptojanusz14475454064
firesteem13103243574
marcon13046887314
cron12658721353
alcik12548907868
pignys11868391834
nervi11351266468
astromaniak10487181313
pkocjan9708007407
andzi769316918829
steelman8374638785
anka8123843882
postcardsfromlbn7977126155
shogunma7396118803
browery6632155858
azizbd4776227066
romualdd4722559753
steemtaker3841563939
saladyn2763820425153
grzyb773712968930
lokibalboa3711659218
kryptomario3166501649
rozku3052604203
wolontariusz3029426309
dutmistrz2962274501
karolczyk19872907416103
lashotta2629751868
xuanito2436685081
mys2421046859
curiosit1740984798
nieidealna.mama1514285022
didymos1503918001
mykitchenlab1242027201
flocki1239769749
aguta1197328314
herbacianymag1119838927
tomosan1071575416
baro89982002551
pixelfan938978048
lukasztemplar921582293
strefanetu831808241
suchy815194716
cryptos681129756
nwacrypto633695332
gonia609263772
patryshiasroka607514783
who-knock606942191
jahedkhan606456224
coincollecto596272795
tesaj575725092
ivela573749579
puzzle.maniac551595161
chewing517958881
callmejoe513894390
leancenter488983371
ciekawski488603330
dorotti479411375
shammi470001906
mano.world424842268
anadello424818491
ewriel415696214
mikits307488764
cardboard217923512
pl-kuchnia110429400
dreamarif101529207
openart73165041

Każdy taki głos, może powodować zmianę reputacji. Zmiana ta jest wyliczana właśnie na podstawie rshares głosu. Jak dokładnie? Zajrzyjmy do: https://github.com/steemit/steem/blob/master/libraries/plugins/follow/follow_plugin.cpp

Mamy tutaj taki sympatyczny fragment kodu (w C++).

const auto& rep_idx = db.get_index< reputation_index >().indices().get< by_account >();
auto voter_rep = rep_idx.find( op.voter );
auto author_rep = rep_idx.find( op.author );

// Rules are a plugin, do not effect consensus, and are subject to change.
// Rule #1: Must have non-negative reputation to effect another user's reputation
if( voter_rep != rep_idx.end() && voter_rep->reputation < 0 ) return;

if( author_rep == rep_idx.end() )
{
   // Rule #2: If you are down voting another user, you must have more reputation than them to impact their reputation
   // User rep is 0, so requires voter having positive rep
   if( cv->rshares < 0 && !( voter_rep != rep_idx.end() && voter_rep->reputation > 0 )) return;

   db.create< reputation_object >( [&]( reputation_object& r )
   {
      r.account = op.author;
      r.reputation = ( cv->rshares >> 6 ); // Shift away precision from vests. It is noise
   });
}
else
{
   // Rule #2: If you are down voting another user, you must have more reputation than them to impact their reputation
   if( cv->rshares < 0 && !( voter_rep != rep_idx.end() && voter_rep->reputation > author_rep->reputation ) ) return;

   db.modify( *author_rep, [&]( reputation_object& r )
   {
      r.reputation += ( cv->rshares >> 6 ); // Shift away precision from vests. It is noise
   });
}

Przeanalizujmy kluczowe fragmenty.


Pobierz reputację głosującego.

auto voter_rep = rep_idx.find( op.voter );


Pobierz reputację autora.

auto author_rep = rep_idx.find( op.author );


Jeśli reputacja głosującego jest mniejsza od 0 to przerwij operację.

if( voter_rep != rep_idx.end() && voter_rep->reputation < 0 ) return;


Przypadek 1: Jeśli autor nie ma jeszcze reputacji (jest równa 0 i nie było jeszcze żadnych zmian).

if( author_rep == rep_idx.end() )


Jeśli głos jest ujemny, a głosujący nie ma większej reputacji od autora, to przerwij operację.

if( cv->rshares < 0 && !( voter_rep != rep_idx.end() && voter_rep->reputation > 0 )) return;


Utwórz obiekt przechowujący reputację. Będzie ona równa rshares >> 6, co jest równoważne rshares / 64.

db.create< reputation_object >( [&]( reputation_object& r )
{
  r.account = op.author;
  r.reputation = ( cv->rshares >> 6 ); // Shift away precision from vests. It is noise
});

Przypadek 2: Jeśli autor ma już reputację.

else


Jeśli głos jest ujemny, a głosujący nie ma większej reputacji od autora, to przerwij operację.

if( cv->rshares < 0 && !( voter_rep != rep_idx.end() && voter_rep->reputation > author_rep->reputation ) ) return;


Dodaj do aktualnej reputacji autora rshares >> 6.

db.modify( *author_rep, [&]( reputation_object& r )
{
  r.reputation += ( cv->rshares >> 6 ); // Shift away precision from vests. It is noise
});

Powyższy fragment kodu możemy podsumować następująco:

  • jeśli głosujący ma reputację mniejszą od 0 (surowa wartość), to nie zmienia reputacji autorowi
  • jeśli głos jest ujemny, to zmiana reputacji jest tylko wtedy kiedy głosujący ma reputację wyższą od autora
  • zmiana reputacji jest wyliczana jako rshares/64




źródło obrazka

Reputacja wyświetlana użytkownikowi

Teraz czas na drugą część, a mianowicie - jak jest obliczana wartość reputacji, która jest wyświetlana użytkownikowi?

Wykorzystywany jest następujący wzór (jako reputation wstawiamy surową wartość reputacji).
max(log10(abs(reputation)) - 9, 0) * ((reputation >= 0) ? 1 : -1) * 9 + 25

Jak to wygląda w praktyce?

ReputacjaPróg
261 291 549 665
271 668 100 537
282 154 434 690
292 782 559 402
303 593 813 664
314 641 588 834
325 994 842 503
337 742 636 827
3410 000 000 000
3512 915 496 650
3616 681 005 372
3721 544 346 900
3827 825 594 022
3935 938 136 638
4046 415 888 336
4159 948 425 032
4277 426 368 268
43100 000 000 000
44129 154 966 501
45166 810 053 720
46215 443 469 003
47278 255 940 221
48359 381 366 380
49464 158 883 361
50599 484 250 319
51774 263 682 681
521 000 000 000 000
531 291 549 665 015
541 668 100 537 200
552 154 434 690 032
562 782 559 402 207
573 593 813 663 805
584 641 588 833 613
595 994 842 503 189
607 742 636 826 811
6110 000 000 000 000
6212 915 496 650 149
6316 681 005 372 001
6421 544 346 900 319
6527 825 594 022 071
6635 938 136 638 046
6746 415 888 336 128
6859 948 425 031 894
6977 426 368 268 113
70100 000 000 000 000
71129 154 966 501 489
72166 810 053 720 006
73215 443 469 003 188
74278 255 940 220 712
75359 381 366 380 463
76464 158 883 361 281
77599 484 250 318 945
78774 263 682 681 132
791 000 000 000 000 000
801 291 549 665 014 870
8116 681 005 372 000 226
8221 544 346 900 318 136
8327 825 594 022 070 040
8435 938 136 638 044 328
8546 415 888 336 124 776
8659 948 425 031 889 560
8777 426 368 268 106 000
88100 000 000 000 000 000
89129 154 966 501 474 400
90166 810 053 719 986 016
91215 443 469 003 160 384
92278 255 940 220 673 312
93359 381 366 380 408 256
94464 158 883 361 202 496
95599 484 250 318 837 120
96774 263 682 680 984 448
971 000 000 000 000 000 000
981 291 549 665 014 617 856
991 668 100 537 199 697 152
1002 154 434 690 031 393 280

Widzimy, że zdobycie każdego kolejnego poziomu reputacji jest około 1.29 raza trudniejsze od poprzedniego. Albo patrząc inaczej - zwiększenie poziomu reputacji o 3 oczka, wymaga mniej więcej tyle samo pracy co zdobycie wszystkich poprzednich poziomów od samego początku.

Artykuł dedykuję ferviemu, którego rshares >> 6 systematycznie zwiększają reputacje niejednej osobie ;)



Sort:  

zwiększenie poziomu reputacji o 3 oczka, wymaga mniej więcej tyle samo pracy co zdobycie wszystkich poprzednich poziomów od samego początku.

To tak jak z natężeniem hałasu. Każde 3 decybele zwiększają hałas dwukrotnie. Dlatego ja lubię porównywać reputację na Steem do naszej "głośności" w sieci.
Logarytmy, logarytmy.

Świetny artykuł... Trochę czarna magia, ale wielu osobom może pomóc :)

no dla mnie trochę czarna magia ,ale może do ogarnięcia ,ehh

No po prostu...WOW!

Nie spodziewałem się, że tyle składowych potrzeba dla tej według niektórych nic nie znaczącej cyferki.
Dobra robota @jacekw!

Najwyższa znana mi reputacja do 82, mogłeś do 85 dobić XD

Dobiłem do 100, może Steem wytrzyma jeszcze z 50 lat, tak żeby komuś się udało tyle uzyskać ;)

Przypuszczam, że z 5 lat potrzeba do 100 ;)

Dobra robota.

Dziękuję za wyczerpujące wyjaśnienie: zaufanie waluta przyszłości :)

Trudno mi to wszystko ogarnąć , jestem od niedawna ,mam nadzieję ,że ogarnę, chyba nie mam jeszcze reputacji ? hmmm

Twoja reputacja jest równa 38 (startowa była 25).

Czyli już jakiś progres jest :) Tylko oczywiście, każdy kolejny poziom jest coraz trudniejszy do uzyskania.

hmm to rośnie :) chociaż jedna dobra wiadomość dziś ,dziękuje :)

Coin Marketplace

STEEM 0.35
TRX 0.12
JST 0.040
BTC 70541.68
ETH 3582.21
USDT 1.00
SBD 4.74