Jak obliczana jest reputacja na Steem?
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żytkownik | rshares |
---|---|
gtg | 1496730817114 |
noisy | 906919846492 |
sisters | 161642472556 |
nero12 | 126821195679 |
jakipatryk | 67258542551 |
diosbot | 65555343236 |
michalx2008x | 56995762371 |
bowess | 54050313447 |
rozioo | 48614115629 |
annaburska | 47358520954 |
lukmarcus | 35393359481 |
jamzed | 32234857415 |
saunter | 30865615214 |
fervi | 27392176897 |
grecki-bazar-ewy | 21448653047 |
jozef230 | 20382270094 |
breadcentric | 16934919861 |
fraktale | 16237330466 |
bocik | 15571518318 |
kryptojanusz | 14475454064 |
firesteem | 13103243574 |
marcon | 13046887314 |
cron | 12658721353 |
alcik | 12548907868 |
pignys | 11868391834 |
nervi | 11351266468 |
astromaniak | 10487181313 |
pkocjan | 9708007407 |
andzi76 | 9316918829 |
steelman | 8374638785 |
anka | 8123843882 |
postcardsfromlbn | 7977126155 |
shogunma | 7396118803 |
browery | 6632155858 |
azizbd | 4776227066 |
romualdd | 4722559753 |
steemtaker | 3841563939 |
saladyn276 | 3820425153 |
grzyb77 | 3712968930 |
lokibalboa | 3711659218 |
kryptomario | 3166501649 |
rozku | 3052604203 |
wolontariusz | 3029426309 |
dutmistrz | 2962274501 |
karolczyk1987 | 2907416103 |
lashotta | 2629751868 |
xuanito | 2436685081 |
mys | 2421046859 |
curiosit | 1740984798 |
nieidealna.mama | 1514285022 |
didymos | 1503918001 |
mykitchenlab | 1242027201 |
flocki | 1239769749 |
aguta | 1197328314 |
herbacianymag | 1119838927 |
tomosan | 1071575416 |
baro89 | 982002551 |
pixelfan | 938978048 |
lukasztemplar | 921582293 |
strefanetu | 831808241 |
suchy | 815194716 |
cryptos | 681129756 |
nwacrypto | 633695332 |
gonia | 609263772 |
patryshiasroka | 607514783 |
who-knock | 606942191 |
jahedkhan | 606456224 |
coincollecto | 596272795 |
tesaj | 575725092 |
ivela | 573749579 |
puzzle.maniac | 551595161 |
chewing | 517958881 |
callmejoe | 513894390 |
leancenter | 488983371 |
ciekawski | 488603330 |
dorotti | 479411375 |
shammi | 470001906 |
mano.world | 424842268 |
anadello | 424818491 |
ewriel | 415696214 |
mikits | 307488764 |
cardboard | 217923512 |
pl-kuchnia | 110429400 |
dreamarif | 101529207 |
openart | 73165041 |
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?
Reputacja | Próg |
---|---|
26 | 1 291 549 665 |
27 | 1 668 100 537 |
28 | 2 154 434 690 |
29 | 2 782 559 402 |
30 | 3 593 813 664 |
31 | 4 641 588 834 |
32 | 5 994 842 503 |
33 | 7 742 636 827 |
34 | 10 000 000 000 |
35 | 12 915 496 650 |
36 | 16 681 005 372 |
37 | 21 544 346 900 |
38 | 27 825 594 022 |
39 | 35 938 136 638 |
40 | 46 415 888 336 |
41 | 59 948 425 032 |
42 | 77 426 368 268 |
43 | 100 000 000 000 |
44 | 129 154 966 501 |
45 | 166 810 053 720 |
46 | 215 443 469 003 |
47 | 278 255 940 221 |
48 | 359 381 366 380 |
49 | 464 158 883 361 |
50 | 599 484 250 319 |
51 | 774 263 682 681 |
52 | 1 000 000 000 000 |
53 | 1 291 549 665 015 |
54 | 1 668 100 537 200 |
55 | 2 154 434 690 032 |
56 | 2 782 559 402 207 |
57 | 3 593 813 663 805 |
58 | 4 641 588 833 613 |
59 | 5 994 842 503 189 |
60 | 7 742 636 826 811 |
61 | 10 000 000 000 000 |
62 | 12 915 496 650 149 |
63 | 16 681 005 372 001 |
64 | 21 544 346 900 319 |
65 | 27 825 594 022 071 |
66 | 35 938 136 638 046 |
67 | 46 415 888 336 128 |
68 | 59 948 425 031 894 |
69 | 77 426 368 268 113 |
70 | 100 000 000 000 000 |
71 | 129 154 966 501 489 |
72 | 166 810 053 720 006 |
73 | 215 443 469 003 188 |
74 | 278 255 940 220 712 |
75 | 359 381 366 380 463 |
76 | 464 158 883 361 281 |
77 | 599 484 250 318 945 |
78 | 774 263 682 681 132 |
79 | 1 000 000 000 000 000 |
80 | 1 291 549 665 014 870 |
81 | 16 681 005 372 000 226 |
82 | 21 544 346 900 318 136 |
83 | 27 825 594 022 070 040 |
84 | 35 938 136 638 044 328 |
85 | 46 415 888 336 124 776 |
86 | 59 948 425 031 889 560 |
87 | 77 426 368 268 106 000 |
88 | 100 000 000 000 000 000 |
89 | 129 154 966 501 474 400 |
90 | 166 810 053 719 986 016 |
91 | 215 443 469 003 160 384 |
92 | 278 255 940 220 673 312 |
93 | 359 381 366 380 408 256 |
94 | 464 158 883 361 202 496 |
95 | 599 484 250 318 837 120 |
96 | 774 263 682 680 984 448 |
97 | 1 000 000 000 000 000 000 |
98 | 1 291 549 665 014 617 856 |
99 | 1 668 100 537 199 697 152 |
100 | 2 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 ;)
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 :)