IMBTC投稿:淺析EOS系統資源

EOS系統中的資源類型

在EOS資源分配的核心思想中,token代表系統資源的使用權。EOS用戶或者DAPP開發者需要購買token,並將其抵押到EOS的系統賬戶,用以獲取網絡帶寬資源和CPU計算資源的使用權。EOS系統中有5類重要的資源:

1、 網絡帶寬資源

2、 CPU計算資源

3、 內存資源

4、 存儲資源

5、 投票資源

網絡帶寬資源

1、什麼是帶寬資源

用戶發送一筆交易信息後,區塊生產者需要將交易打包生成區塊,然後將區塊通過網絡同步給其它生產者,這個過程需要消耗一定網絡帶寬資源。而帶寬資源的計量方式為,交易信息在區塊中所佔的字節數,比如,一條交易信息佔用100字節,如果用戶進行10筆交易的話,大概需要100 * 10 = 1KB。帶寬資源的計費方式類似手機流量,用戶每發送一筆交易信息就消耗一點帶寬資源,如果帶寬資源消耗為0,則無法繼續發送交易信息。

2、如何獲取帶寬資源

獲取帶寬資源的方式有兩種,1)如果用戶賬戶持有token,那麼可以直接將 token抵押到EOS系統賬戶,然後,系統會根據抵押token所佔全網token的比例,分配給用戶對應的帶寬資源。比如,用戶持有1%的token,那麼該用戶就擁有全網1%的帶寬資源。同時,用戶可以取消抵押,將帶寬資源轉換為等量的token。這種帶寬獲取方式本身不會消耗token,但是,已經抵押的token不能夠繼續抵押或者出售,抵押鎖定期至少3天。 2)如果用戶賬戶沒有token,可以從其它用戶手中租賃帶寬資源。

帶寬資源的獲取和釋放是通過系統智能合約完成,其中,抵押token獲取帶寬資源通過delegatebw函數實現,取消抵押通過undelegatebw函數實現。如果receiver為其他人的賬戶,則表示將帶寬資源出租給其他人,否則表示自用。

在delegatebw函數中,from為抵押token的賬戶,receiver為帶寬資源的接收賬戶,如果和from參數相同,表示自用資源,否則,表示出租給其他人,stake_net_quantity表示用來抵押網絡帶寬資源的token數量,stake_cpu_quantity表示用來抵押CPU計算資源的token數量,transfer為TRUE表示接收賬戶可以解除抵押,為FALSE表示只有發起賬戶才能解除抵押。

void system_contract::delegatebw( account_name from, account_name receiver,

asset stake_net_quantity,

asset stake_cpu_quantity, bool transfer )

{

changebw( from, receiver, stake_net_quantity, stake_cpu_quantity, transfer);

}

抵押token的具體實現通過changebw函數完成。首先,更新接收方賬戶的帶寬資源,接著,設置接收方賬戶在運行環境中資源限額,最後將token轉給eosio系統賬戶鎖定。

void system_contract::changebw( account_name from, account_name receiver,

const asset stake_net_delta, const asset stake_cpu_delta, bool transfer )

{

// 更新資源接受方的賬戶資源

totals_tbl.modify( tot_itr, from == receiver ? from : 0, [&]( auto& tot ) {

tot.net_weight += stake_net_delta;

tot.cpu_weight += stake_cpu_delta;

});

// 在運行環境中設置接受方賬戶的資源限額

set_resource_limits(receiver,tot_itr->ram_bytes,tot_itr->net_weight.amount,tot_itr->cpu_weight.amount );

// 將token轉給eosio系統賬戶鎖定

INLINE_ACTION_SENDER(eosio::token, transfer)( N(eosio.token), {source_stake_from, N(active)},{ source_stake_from, N(eosio.stake), asset(transfer_amount), std::string(“stake bandwidth”) } );

}

解除抵押之後,資源會馬上釋放,但是token需要鎖定期到期後才能釋放會賬戶,目前鎖定期默認為3天。

CPU計算資源

當用戶調用智能合約時,區塊生產者需要根據智能合約地址查找合約代碼,然後將代碼加載到內存中執行,這個過程需要消耗一定的CPU算力。CPU計算資源的計量方式為,運行智能合約(交易也屬於智能合約的一種)所消耗的時間,用戶每次調用智能合約都會消耗一點計算資源,如果消耗為0則無法繼續執行合約。 獲取計算資源的方式也是通過抵押token或者向其它用戶購買。解除抵押之後,token也需要至少鎖定3天。

RAM資源

1、什麼是RAM資源

我們知道,智能合約由一系列action組成,當用戶調用智能合約時,區塊生產者需要為這些action創建一個運行環境(也叫Action“Apply”Context),主要包括CPU計算資源和RAM內存資源。可以看出來,RAM資源是DAPP運行的基礎。

IMBTC投稿:淺析EOS系統資源

2、如何獲取RAM資源

RAM資源也是通過抵押token獲取的,但是和網絡帶寬資源不同的是,抵押或者解除抵押需要收取0.5%的手續費,並且獲得RAM不能出租給其他人,只能給自己使用。交易RAM通過系統智能合約buyram和sellram實現,其中,buyer表示購買RAM的賬戶,receiver表示接收RAM的賬戶,tokens表示用於購買RAM的token數量。

void system_contract::buyram(account_name buyer, account_name receiver, asset tokens);

void system_contract::buyrambytes(account_name buyer, account_name receiver, uint32_t bytes);

購買RAM的流程為,從receiver賬戶扣除0.5%的交易手續費,然後,根據當前RAM的價格,將token兌換成RAM,接著更新receiver賬戶的RAM數量,

void system_contract::buyram( account_name payer, account_name receiver, asset quant )

{

// 從receiver賬戶扣除0.5%的交易手續費

auto fee = quant;

fee.amount = ( fee.amount + 199 ) / 200; /// .5% fee (round up)

auto quant_after_fee = quant;

quant_after_fee.amount -= fee.amount;

// 根據當前RAM的價格,將token兌換成RAM

int64_t bytes_out;

const auto& market = _rammarket.get(S(4,RAMCORE), “ram market does not exist”);

_rammarket.modify( market, 0, [&]( auto& es ) {

bytes_out = es.convert( quant_after_fee, S(0,RAM) ).amount;

});

// 更新receiver賬戶的RAM數量

userres.modify( res_itr, receiver, [&]( auto& res ) {res.ram_bytes += bytes_out;});

}

從RAM的交易函數名稱使用“buy/sell”而不是“delegate/undelegate”,也說明了RAM資源只能買賣不能租賃。不過,RAM的買賣,實質是發生在用戶賬戶和系統賬戶之間的交易行為,而不是直接的市場交易行為。

IMBTC投稿:淺析EOS系統資源

3、為什麼RAM採用了不同的經濟模型

從供給側來看,RAM的總量由超級節點共同投票決定,一旦確定之後,短時間內不會發生大幅的擴容。而RAM的需求端由DAPP市場需求決定,當DAPP上線運行後,會一直鎖定內存,不會釋放,而且目前市場的RAM價格昂貴,所以,RAM會成為一種稀缺資源。相比之下,帶寬資源和CPU計算資源會隨著時間推移,由超級節點源源不斷的提供,所以,不具備明顯的稀缺性。

和帶寬資源的價格計算方式不同,RAM的價格採用bancor算法,其核心思想就是根據市場的供求關係決定RAM價格,買的人越多,價格越高。

IMBTC投稿:淺析EOS系統資源

那麼,如何抑制早期囤積大量RAM的投機客炒作價格呢?1)大量買入RAM後,相應的token會被鎖定,既不能流通,也不能抵押帶寬出租,將會損失EOS升值以及租賃帶來的收益。2)RAM不可以直接轉讓,必須換回token才能繼續交易,並且出售RAM需要0.5%的手續費,這意味著隨著RAM價格的升高,手續費也會隨之增加。3)隨著內存的價格降低,超級節點會提高RAM供應量,這樣進一步抑制了囤積RAM的獲利行為。

存儲資源

DAPP應用需要保存大量的圖片、視頻文件,這些數據沒有直接存儲在區塊鏈中,而是通過IPFS分佈式文件系統,僅僅將文件地址保存在區塊鏈上,而文件內容則放在更為廉價的分佈式存儲上。目前這部分功能還沒有實現。

投票資源

1、什麼是投票資源

持有token的賬戶擁有投票選舉超級節點的權利,相比於其它資源來說,投票資源不能為用戶產生直接的價值,從長期來看,投票的價值在於選舉出更有實力的超級節點為EOS社區服務,進一步提升EOS的影響力,而作為EOS利益共同體的用戶,也會從中受益。

2、如何進行投票

1)token持有者需要先將手中的token抵押成網絡帶寬資源;

2)被抵押的token會轉換成投票數量,1個token兌換30票,可以向最多30個超級節點投票;

3)被抵押的token有3天的鎖定期,到期後可以解除抵押;

4)可以將投票權委託給其它代理人,負責投票過程。

IMBTC投稿:淺析EOS系統資源

向區塊生產者或者代理人投票的過程通過voteproducer函數完成。

void system_contract::voteproducer( const account_name voter_name, const account_name proxy, const std::vector& producers ) {

require_auth( voter_name );

update_votes( voter_name, proxy, producers, true );


分享到:


相關文章: