淺析EOS系統(tǒng)資源區(qū)塊鏈
在EOS資源分配的核心思想中,token代表系統(tǒng)資源的使用權(quán)。EOS用戶或者DAPP開發(fā)者需要購買token,并將其抵押到EOS的系統(tǒng)賬戶,用以獲取網(wǎng)絡(luò)帶寬資源和CPU計(jì)算資源的使用權(quán)。
EOS系統(tǒng)中的資源類型
在EOS資源分配的核心思想中,token代表系統(tǒng)資源的使用權(quán)。EOS用戶或者DAPP開發(fā)者需要購買token,并將其抵押到EOS的系統(tǒng)賬戶,用以獲取網(wǎng)絡(luò)帶寬資源和CPU計(jì)算資源的使用權(quán)。EOS系統(tǒng)中有5類重要的資源:
1、 網(wǎng)絡(luò)帶寬資源
2、 CPU計(jì)算資源
3、 內(nèi)存資源
4、 存儲資源
5、 投票資源
網(wǎng)絡(luò)帶寬資源
1、什么是帶寬資源
用戶發(fā)送一筆交易信息后,區(qū)塊生產(chǎn)者需要將交易打包生成區(qū)塊,然后將區(qū)塊通過網(wǎng)絡(luò)同步給其它生產(chǎn)者,這個(gè)過程需要消耗一定網(wǎng)絡(luò)帶寬資源。而帶寬資源的計(jì)量方式為,交易信息在區(qū)塊中所占的字節(jié)數(shù),比如,一條交易信息占用100字節(jié),如果用戶進(jìn)行10筆交易的話,大概需要100 * 10 = 1KB。帶寬資源的計(jì)費(fèi)方式類似手機(jī)流量,用戶每發(fā)送一筆交易信息就消耗一點(diǎn)帶寬資源,如果帶寬資源消耗為0,則無法繼續(xù)發(fā)送交易信息。
2、如何獲取帶寬資源
獲取帶寬資源的方式有兩種,1)如果用戶賬戶持有token,那么可以直接將 token抵押到EOS系統(tǒng)賬戶,然后,系統(tǒng)會根據(jù)抵押token所占全網(wǎng)token的比例,分配給用戶對應(yīng)的帶寬資源。比如,用戶持有1%的token,那么該用戶就擁有全網(wǎng)1%的帶寬資源。同時(shí),用戶可以取消抵押,將帶寬資源轉(zhuǎn)換為等量的token。這種帶寬獲取方式本身不會消耗token,但是,已經(jīng)抵押的token不能夠繼續(xù)抵押或者出售,抵押鎖定期至少3天。 2)如果用戶賬戶沒有token,可以從其它用戶手中租賃帶寬資源。
帶寬資源的獲取和釋放是通過系統(tǒng)智能合約完成,其中,抵押token獲取帶寬資源通過delegatebw函數(shù)實(shí)現(xiàn),取消抵押通過undelegatebw函數(shù)實(shí)現(xiàn)。如果receiver為其他人的賬戶,則表示將帶寬資源出租給其他人,否則表示自用。
在delegatebw函數(shù)中,from為抵押token的賬戶,receiver為帶寬資源的接收賬戶,如果和from參數(shù)相同,表示自用資源,否則,表示出租給其他人,stake_net_quantity表示用來抵押網(wǎng)絡(luò)帶寬資源的token數(shù)量,stake_cpu_quantity表示用來抵押CPU計(jì)算資源的token數(shù)量,transfer為TRUE表示接收賬戶可以解除抵押,為FALSE表示只有發(fā)起賬戶才能解除抵押。
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的具體實(shí)現(xiàn)通過changebw函數(shù)完成。首先,更新接收方賬戶的帶寬資源,接著,設(shè)置接收方賬戶在運(yùn)行環(huán)境中資源限額,最后將token轉(zhuǎn)給eosio系統(tǒng)賬戶鎖定。
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;
});
// 在運(yùn)行環(huán)境中設(shè)置接受方賬戶的資源限額
set_resource_limits(receiver,tot_itr->ram_bytes,tot_itr->net_weight.amount,tot_itr->cpu_weight.amount );
// 將token轉(zhuǎn)給eosio系統(tǒng)賬戶鎖定
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需要鎖定期到期后才能釋放會賬戶,目前鎖定期默認(rèn)為3天。
CPU計(jì)算資源
當(dāng)用戶調(diào)用智能合約時(shí),區(qū)塊生產(chǎn)者需要根據(jù)智能合約地址查找合約代碼,然后將代碼加載到內(nèi)存中執(zhí)行,這個(gè)過程需要消耗一定的CPU算力。CPU計(jì)算資源的計(jì)量方式為,運(yùn)行智能合約(交易也屬于智能合約的一種)所消耗的時(shí)間,用戶每次調(diào)用智能合約都會消耗一點(diǎn)計(jì)算資源,如果消耗為0則無法繼續(xù)執(zhí)行合約。 獲取計(jì)算資源的方式也是通過抵押token或者向其它用戶購買。解除抵押之后,token也需要至少鎖定3天。
RAM資源
1、什么是RAM資源
我們知道,智能合約由一系列action組成,當(dāng)用戶調(diào)用智能合約時(shí),區(qū)塊生產(chǎn)者需要為這些action創(chuàng)建一個(gè)運(yùn)行環(huán)境(也叫Action“Apply”Context),主要包括CPU計(jì)算資源和RAM內(nèi)存資源。可以看出來,RAM資源是DAPP運(yùn)行的基礎(chǔ)。
2、如何獲取RAM資源
RAM資源也是通過抵押token獲取的,但是和網(wǎng)絡(luò)帶寬資源不同的是,抵押或者解除抵押需要收取0.5%的手續(xù)費(fèi),并且獲得RAM不能出租給其他人,只能給自己使用。交易RAM通過系統(tǒng)智能合約buyram和sellram實(shí)現(xiàn),其中,buyer表示購買RAM的賬戶,receiver表示接收RAM的賬戶,tokens表示用于購買RAM的token數(shù)量。
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%的交易手續(xù)費(fèi),然后,根據(jù)當(dāng)前RAM的價(jià)格,將token兌換成RAM,接著更新receiver賬戶的RAM數(shù)量,
void system_contract::buyram( account_name payer, account_name receiver, asset quant )
{
// 從receiver賬戶扣除0.5%的交易手續(xù)費(fèi)
auto fee = quant;
fee.amount = ( fee.amount 199 ) / 200; /// .5% fee (round up)
auto quant_after_fee = quant;
quant_after_fee.amount -= fee.amount;
// 根據(jù)當(dāng)前RAM的價(jià)格,將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數(shù)量
userres.modify( res_itr, receiver, [&]( auto& res ) {res.ram_bytes = bytes_out;});
}
從RAM的交易函數(shù)名稱使用“buy/sell”而不是“delegate/undelegate”,也說明了RAM資源只能買賣不能租賃。不過,RAM的買賣,實(shí)質(zhì)是發(fā)生在用戶賬戶和系統(tǒng)賬戶之間的交易行為,而不是直接的市場交易行為。
3、為什么RAM采用了不同的經(jīng)濟(jì)模型
從供給側(cè)來看,RAM的總量由超級節(jié)點(diǎn)共同投票決定,一旦確定之后,短時(shí)間內(nèi)不會發(fā)生大幅的擴(kuò)容。而RAM的需求端由DAPP市場需求決定,當(dāng)DAPP上線運(yùn)行后,會一直鎖定內(nèi)存,不會釋放,而且目前市場的RAM價(jià)格昂貴,所以,RAM會成為一種稀缺資源。相比之下,帶寬資源和CPU計(jì)算資源會隨著時(shí)間推移,由超級節(jié)點(diǎn)源源不斷的提供,所以,不具備明顯的稀缺性。
和帶寬資源的價(jià)格計(jì)算方式不同,RAM的價(jià)格采用bancor算法,其核心思想就是根據(jù)市場的供求關(guān)系決定RAM價(jià)格,買的人越多,價(jià)格越高。
那么,如何抑制早期囤積大量RAM的投機(jī)客炒作價(jià)格呢?1)大量買入RAM后,相應(yīng)的token會被鎖定,既不能流通,也不能抵押帶寬出租,將會損失EOS升值以及租賃帶來的收益。2)RAM不可以直接轉(zhuǎn)讓,必須換回token才能繼續(xù)交易,并且出售RAM需要0.5%的手續(xù)費(fèi),這意味著隨著RAM價(jià)格的升高,手續(xù)費(fèi)也會隨之增加。3)隨著內(nèi)存的價(jià)格降低,超級節(jié)點(diǎn)會提高RAM供應(yīng)量,這樣進(jìn)一步抑制了囤積RAM的獲利行為。
存儲資源
DAPP應(yīng)用需要保存大量的圖片、視頻文件,這些數(shù)據(jù)沒有直接存儲在區(qū)塊鏈中,而是通過IPFS分布式文件系統(tǒng),僅僅將文件地址保存在區(qū)塊鏈上,而文件內(nèi)容則放在更為廉價(jià)的分布式存儲上。目前這部分功能還沒有實(shí)現(xiàn)。
投票資源
1、什么是投票資源
持有token的賬戶擁有投票選舉超級節(jié)點(diǎn)的權(quán)利,相比于其它資源來說,投票資源不能為用戶產(chǎn)生直接的價(jià)值,從長期來看,投票的價(jià)值在于選舉出更有實(shí)力的超級節(jié)點(diǎn)為EOS社區(qū)服務(wù),進(jìn)一步提升EOS的影響力,而作為EOS利益共同體的用戶,也會從中受益。
2、如何進(jìn)行投票
1)token持有者需要先將手中的token抵押成網(wǎng)絡(luò)帶寬資源;
2)被抵押的token會轉(zhuǎn)換成投票數(shù)量,1個(gè)token兌換30票,可以向最多30個(gè)超級節(jié)點(diǎn)投票;
3)被抵押的token有3天的鎖定期,到期后可以解除抵押;
4)可以將投票權(quán)委托給其它代理人,負(fù)責(zé)投票過程。
向區(qū)塊生產(chǎn)者或者代理人投票的過程通過voteproducer函數(shù)完成。
void system_contract::voteproducer( const account_name voter_name, const account_name proxy, const std::vector<account_name>& producers ) {
require_auth( voter_name );
update_votes( voter_name, proxy, producers, true );
}
1.TMT觀察網(wǎng)遵循行業(yè)規(guī)范,任何轉(zhuǎn)載的稿件都會明確標(biāo)注作者和來源;
2.TMT觀察網(wǎng)的原創(chuàng)文章,請轉(zhuǎn)載時(shí)務(wù)必注明文章作者和"來源:TMT觀察網(wǎng)",不尊重原創(chuàng)的行為TMT觀察網(wǎng)或?qū)⒆肪控?zé)任;
3.作者投稿可能會經(jīng)TMT觀察網(wǎng)編輯修改或補(bǔ)充。