Az Algorand jutalmazási rendszere

2019. nov. 13.

Módosítás: 2020. jan. 02. [Algo jutalmak, táblázat]

 

Forrás: Demystifying Algorand Rewards Distribution: A Look at How & When Algorand Token Rewards Are Calculated

Hálózati jutalom

Az Algorand rendszerben a számlák kétféle állapotban lehetnek: (1) az offline állapot azt jelenti, hogy a számla nem vesz részt a következő blokk előállításában, (2) online állapotú számlák esetén a számlán lévő pénz a teljes pénzmennyiséggel arányos szavazati joghoz jut a következő blokk előállításában.

Eredetileg csak az online számlákat részesítette volna jutalomban a rendszer, jelenlegi azonban mind az offline, mind az online állapotú számlák megkapják a jutalmat.

A jutalom mértéke attól függ, hogy eddig hány blokk képződött. Az alábbi táblázat ennek mértékét mutatja:

\begin{array}{|c|c|c|c|c|} \hline \text{Időszak} & \text{Kezdő blokk} & \text{Záró blokk} & \text{Teljes jutalom} & \text{Blokkonkénti} \\ \text{} & \text{} & \text{} & \text{Algóban} & \text{jutalom Algóban} \\ \hline \phantom{1}1 & \phantom{1\,000\,00}1 & \phantom{1}500\,000 & 10\,000\,000 & 20\\ \hline \phantom{1}2 & \phantom{1}500\,001 & 1\,000\,000 & 13\,000\,000 & 26\\ \hline \phantom{1}3 & 1\,000\,001 & 1\,500\,000 & 16\,000\,000 & 32\\ \hline \phantom{1}4 & 1\,500\,001 & 2\,000\,000 & 19\,000\,000 & 38\\ \hline \phantom{1}5 & 2\,000\,001 & 2\,500\,000 & 22\,000\,000 & 44\\ \hline \phantom{1}6 & 2\,500\,001 & 3\,000\,000 & 25\,000\,000 & 50\\ \hline \phantom{1}7 & 3\,000\,001 & 3\,500\,000 & 28\,000\,000 & 56\\ \hline \phantom{1}8 & 3\,500\,001 & 4\,000\,000 & 31\,000\,000 & 62\\ \hline \phantom{1}9 & 4\,000\,001 & 4\,500\,000 & 26\,000\,000 & 52\\ \hline 10 & 4\,500\,001 & 5\,000\,000 & 18\,000\,000 & 36\\ \hline 11 & 5\,000\,001 & 5\,500\,000 & 13\,000\,000 & 26\\ \hline 12 & 5\,500\,001 & 6\,000\,000 & 13\,000\,000 & 26\\ \hline \end{array}

Jelenleg, a $3\,000\,001$-ik és $3\,500\,000$-ik blokk között, egy blokk előállításakor a jutalom mértéke $56$ Algo/blokk. Egy blokk előállítási ideje (mérés alapján) kb. $4,4$ mp. Jutalom jelenleg csak annak jár, akinek legalább $1$ Algo van a számláján. A jutalom megjelenítése (legalábbis az Android-os Algorand pénztárcában) akkor történik meg, ha az $1$ Algo után járó jutalom mértéke eléri a legkisebb egységet, az $1\,\mu$Algót: \begin{equation*} 1\,\text{Algo} \cdot \frac{\text{blokk_jutalom}}{\text{teljes_pénzmennyiség}} \cdot \text{blokkok_száma} \geqq 1\,\mu \text{Algo}. \end{equation*} Ennek alapján a jutalom megjelenítéséhez szükséges blokkok száma: \begin{equation*} \text{blokkok_száma} \geqq 10^{-6} \cdot \frac{\text{teljes_pénzmennyiség}}{\text{blokk_jutalom}}. \end{equation*}

A $\text{teljes_pénzmennyiség}$ a goal ledger supply paranccsal állapítható meg. A teljes pénzmennyiség jelenleg $2,156\cdot 10^9$ Algo. Ennek alapján a jutalom megjelenítése olyan időközönként történik meg, amelyre az előállított blokkok száma: \begin{equation*} \text{blokkok_száma} \geqq 10^{-6} \cdot \frac{2,156\cdot 10^{9}}{56} = 38,5. \end{equation*}

Ha megmérjük, hogy az Android-os Algorand pénztárcában hány másodpercenként történik meg a jutalom megjelenítése, akkor $169$ mp-et mérünk. A fenti számítás szerint pedig elvileg $38,5 \cdot 4,4$ mp-enként, vagyis $169,4$ mp-enként történik a jutalom megjelenítése. Az egyezés kiváló.

A végső csavar: a jutalom (azaz a kamat) akkor kerül tőkésítésre, azaz a rendszer akkor adja hozzá a számlán lévő összeghez, ha valamilyen számláművelet (pénz küldés vagy fogadás) történik.

A kamat mértéke, ha évenként egyszer történik a számlán művelet: \begin{equation*} 10^{-6}\cdot \dfrac{86400 \cdot 365}{169,4}\cdot 100 \%=18,6 \%. \end{equation*}

Kamatos kamat - mennyi a maximum?

Mennyi lesz a jutalom, ha nem évente, hanem a jutalom megjelenítéséhez szükséges blokkok számának valamilyen többszörösénél írjuk jóvá a kamatot? Tegyük fel, hogy a számlán lévő összeg eredetileg $S$. Tegyük fel, hogy nem évente, hanem a megjelenítéshez szükséges blokkok $n$-szeresénél végzünk számlaműveletet. Mivel egy művelet díja jelenleg $0,001$ Algo, ezért a számlán lévő összeg a művelet elvégzése után \begin{equation*} S\cdot (1+0,0000001\cdot n)-0,001 \end{equation*} lesz, az év végén pedig a következő összeg lesz a számlán: \begin{equation*} S\cdot (1+0,0000001\cdot n -0,001/S)^{\left[\dfrac{86400\cdot 365}{169,4\cdot n}\right]}, \end{equation*} ahol \begin{equation*} 1 \leqq n \leqq \frac{86400\cdot 365}{169,4}. \end{equation*} Vajon $n$ milyen értéke esetén lesz a kamat maximális?

Nyilvánvaló, hogy ha pozitív jutalmat szeretnénk, akkor nem lehet nagyon gyakran tőkésíteni a jutalmat, vagyis fenn kell állnia, hogy \begin{equation*} 0,0000001\cdot n -0,001/S \gt 0. \end{equation*} Ebből \begin{equation*} n \gt \frac{1000}{S}. \end{equation*}

A maximum helyének megállapítása analitikus eszközökkel (deriváltszámítás) vagy a függvény kirajzolásával lehetséges. Ha a második utat választjuk, akkor pl. a Sage szimbolikus algebrai rendszer SageMathCell interfészének segítségével a következőképpen tudjuk kirajzoltatni a különféle $S$ értékeknél a függvényeket:


def f(n): return (1+0.000001*n-0.001/S)**(86400*365/(169.4*n))
S=100
p1=plot(f, (n, 1, 10000), ymin=1.203, ymax=1.205, scale="semilogx", 
        plot_points=10000, color='red', legend_label="S=100")
S=1000
p2=plot(f, (n, 1, 10000), ymin=1.203, ymax=1.205, scale="semilogx", 
        plot_points=10000, color='orange', legend_label="S=1000")
S=10000
p3=plot(f, (n, 1, 10000), ymin=1.203, ymax=1.205, scale="semilogx", 
        plot_points=10000, color='green', legend_label="S=10**4")
S=100000
p4=plot(f, (n, 1, 10000), ymin=1.203, ymax=1.205, scale="semilogx", 
        plot_points=10000, color='blue', legend_label="S=10**5")
p1+p2+p3+p4

A kapott görbék a következők:

Hozam görbék

ahol a vízszintes tengelyen az egység az az idő, ami alatt a jutalom kiírása megtörténik ($169,4$ mp), a függőleges tengelyen az egység az eredeti összeg.

A könnyebb alkalmazhatóság érdekében nem csak ilyen elvont „jutalom kiírási egységekben”, hanem másodpercekben is kiírattam a maximumok helyén a független és a függő változót. Ehhez a következő Sage programot használtam:


def f(n): return (1+0.000001*n-0.001/S)**(86400*365/(169.4*n))
for i in [1..8] :
    S=10**i
    f_max=0; n_max=0
    for n in range (1, 86400*365/(169.4)):
        if f(n) > f_max :
            f_max=f(n)
            n_max=n
    print '{:2d}'.format(i), '{:10d}'.format(S), '{:5d}'.format(n_max), 
	      '{:10.7}'.format(f_max), round(169.4*n_max/3600.0, 1)
print

Az eredmények:


 i    S=10**i n_max f_max      hours
 
 1         10 14275 1.20148    671.7
 2        100  4485 1.20361    211.0
 3       1000  1416 1.20430    66.6
 4      10000   447 1.20451    21.0
 5     100000   141 1.20458    6.6
 6    1000000    45 1.20460    2.1
 7   10000000    14 1.20461    0.7
 8  100000000     5 1.20461    0.2

A maximális kamat kb. $20,4 \%$. Ha valakinek egymillió Algója van, akkor ez úgy érhető el, ha 2 óránként végez egy számlaműveletet, de ha csak tízezer Algója van, akkor elég naponta egy műveletet végeznie.

Kérdése van? Írjon!