BLOGCZEJNalpha

Jak obliczana jest reputacja na Steem?

https://steemitimages.com/2x2/https://cdn.steemitimages.com/DQmWeJptacMVxEgsbyAViEXaYCoJD2v6M78VFaAN9y7R4vv/image.png

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++).



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.



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.



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



KOMENTARZE

  • nervi

    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!

  • fervi

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

  • darjo-game

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

  • coincollecto

    Dobra robota.

  • mys

    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.

  • kuchniawedwoje

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

  • dumboandgimbo

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