Smart Media Tokens Whitepaper [PL] cz. 7
Parametry inflacji
Tworzenie SMT po uruchomieniu nazywa się inflacją. Inflacja jest środkiem, za pomocą którego SMT nagradza twórców za wartość, którą zapewniają. Zdarzenia inflacyjne wykorzystują następującą strukturę danych:
struct smt_inflation_unit
{
flat_map< account_name_type, uint16_t > token_unit;
};
// Event: Support issuing tokens to target at time
struct token_inflation_event
{
timestamp schedule_time;
smt_inflation_unit unit;
uint32_t num_units;
};
Możliwy cel inflacyjny
Celem jest podmiot, do którego kierowana jest inflacja. Celem może być normalne konto Steem kontrolowane przez indywidualnego założyciela lub chronione wieloma podpisami konto złożone z kilku założycieli. Ponadto możliwe jest kilka specjalnych celów reprezentujących pozbawione zaufania funkcje zapewniane przez samą blokadę:
• Nagrody. Specjalne miejsce docelowe reprezentujące nagrody.
• Nabywanie. Specjalne miejsce docelowe reprezentujące przydzielone tokeny.
Sekwencje zdarzeń
Tradycyjne sieci blockchain obliczają inflację w przeliczeniu na blok, ponieważ nagroda za produkcję bloku jest głównym (często jedynym) sposobem inflacji. Jednak nie ma dobrego powodu, aby łączyć inflację w celu blokowej produkcji dla SMT. W rzeczywistości, SMT nie mają nagród blokowych, ponieważ nie mają bloków (podstawowa funkcjonalność produkcji blokowej jest dostarczana przez świadków Steema, którzy są nagradzani STEEM)
Powtarzanie inflacji w regularnych odstępach czasu można włączyć, dodając interval_seconds i interval_count do struktury danych token_inflation_event. Wynikiem jest nowa struktura danych o nazwie token_inflation_event_seq_v1:
// Event seq v1: Support repeatedly issuing tokens to target at time
struct token_inflation_event_seq_v1
{
timestamp schedule_time;
smt_inflation_unit unit;
asset new_smt;
int32_t interval_seconds;
uint32_t interval_count;
};
Struktura danych reprezentuje zdarzenie inflacji tokena, które powtarza się co interval_seconds sekund, dla czasów interval_count. Maksymalna wartość całkowita 0xFFFFFFFF to specjalna wartość wartownika, która reprezentuje sekwencję zdarzeń, która powtarza się na zawsze. Uwaga: new_smt to ilość SMT, a nie liczba jednostek. Liczba jednostek jest określana jako podzielenie new_smt przez sumę członków jednostki.
Dodanie inflacji względnej
Często rozkłady inflacji wyrażane są w procentach podaży, a nie w wartościach bezwzględnych:
// Event seq v2: v1 + allow relative amount of tokens
struct token_inflation_event_seq_v2
{
timestamp schedule_time;
smt_inflation_unit unit;
uint32_t num_units;
int32_t interval_seconds;
uint32_t interval_count;
asset abs_amount;
uint32_t rel_amount_numerator;
};
Następnie obliczamy new_smt w następujący sposób z podaży:
rel_amount = (smt_supply * rel_amount_numerator) / SMT_REL_AMOUNT_DENOMINATOR;
new_smt = max( abs_amount, rel_amount );
Jeśli ustawimy SMT_REL_AMOUNT_DENOMINATOR na potęgę dwóch, podział można zoptymalizować do operacji zmiany bitów. Aby uzyskać bardziej dynamiczny zakres od bitów, możemy pozwolić, aby zmiana była zmienna:
// Event seq v3: v2 + specify shift in struct
struct token_inflation_event_seq_v3
{
timestamp schedule_time;
smt_inflation_unit unit;
int32_t interval_seconds;
uint32_t interval_count;
asset abs_amount;
uint32_t rel_amount_numerator;
uint8_t rel_amount_denom_bits;
};
Następnie obliczenia stają się:
rel_amount = (smt_supply * rel_amount_numerator) >> rel_amount_denom_bits;
new_smt = max( abs_amount, rel_amount );
Oczywiście implementacja tych obliczeń musi ostrożnie radzić sobie z potencjalnym przepełnieniem w wartości pośredniej smt_supply * rel_amount_numerator!
Dodawanie modulacji czasu
Modulacja czasu pozwala na realizację stopy inflacji, która zmienia się w sposób ciągły w miarę upływu czasu zgodnie z odcinkową funkcją liniową. Można to osiągnąć, po prostu określając lewy / prawy punkt końcowy przedziału czasu i określając bezwzględne wartości na obu punktach końcowych:
// Event seq v4: v3 + modulation over time
struct token_inflation_event_seq_v4
{
timestamp schedule_time;
smt_inflation_unit unit;
int32_t interval_seconds;
uint32_t interval_count;
timestamp lep_time;
timestamp rep_time;
asset lep_abs_amount;
asset rep_abs_amount;
uint32_t lep_rel_amount_numerator;
uint32_t rep_rel_amount_numerator;
uint8_t rel_amount_denom_bits;
};
Kilka uwag na ten temat:
• Tylko licznik względnych ilości jest interpolowany, mianownik jest taki sam dla obu punktów końcowych.
• W przypadku czasów sprzed czasu lewego punktu końcowego używana jest kwota z lewego punktu końcowego.
• W przypadku czasów po właściwym czasie końcowym używana jest kwota w prawym punkcie końcowym.
Kod wygląda mniej więcej tak:
Jeśli( now <= lep_time )
{
abs_amount = lep_abs_amount;
rel_amount_numerator = lep_rel_amount_numerator;
}
Jeśli ( now >= rep_time )
{
abs_amount = rep_abs_amount;
rel_amount_numerator = rep_rel_amount_numerator;
}
lub
{
// t is a number between 0.0 and 1.0
// this calculation will need to be implemented
// slightly re-arranged so it uses all integer math
t = (now - lep_time) / (rep_time - lep_time)
abs_amount = lep_abs_amount * (1-t) + rep_abs_amount * t;
rel_amount_numerator = lep_rel_amount_numerator * (1-t) + rep_rel_amount_numerator * t;
}
Operacje inflacyjne
Operacja inflacji jest określona następująco:
{
account_name_type control_account;
timestamp schedule_time;
smt_inflation_unit inflation_unit;
int32_t interval_seconds = 0;
uint32_t interval_count = 0;
timestamp lep_time;
timestamp rep_time;
asset lep_abs_amount;
asset rep_abs_amount;
uint32_t lep_rel_amount_numerator = 0;
uint32_t rep_rel_amount_numerator = 0;
uint8_t rel_amount_denom_bits = 0;
extensions_type extensions
};
Operacja setup_inflation_operation jest operacją początkową, która musi zostać wykonana przed działaniem smt_setup_operation. Zobacz rozdział dotyczący operacji wstępnego ustawienia SMT.
FAQ o inflacji
• P: Czy struktury danych dotyczących inflacji SMT mogą wyrażać aktualny program inflacyjny Steema?
• O: Tak (z wyjątkiem błędów zaokrąglania).
• P: Czy struktury danych dotyczących inflacji SMT mogą nagradzać założycieli bezpośrednio po X miesięcy / lat?
• O: Tak.
• P: Nie dbam o modulację czasu. Czy mogę to wyłączyć?
• O: Tak, ustaw tylko lep_abs_amount == rep_abs_amount i lep_rel_amount_numerator
== rep_rel_amount_numerator na tę samą wartość i ustaw lep_time = rep_time (dowolna wartość wystarczy).
• P: Czy te złożone ustawienia mogą być ukryte przez dobrze zaprojektowany interfejs użytkownika?
• O: Tak.
• P: Czy możemy modelować inflację jako funkcję czasu z pełną dokładnością?
• O: Struktury danych inflacji można w pełni modelować / symulować. W przypadku niektórych problemów struktur, kwota wydana zależy od tego, ile jest podniesiona, więc struktury problemu nie można modelować z pełną dokładnością.