簡介
本篇將為大家介紹eos最重要的系統(tǒng)操作合約—eosio.system合約,合約地址詳見eosio.system。eosio.system合約涵蓋了非常多的功能,包括:創(chuàng)建賬戶、投票選舉超級節(jié)點(diǎn)、質(zhì)押資源、域名競拍等,本篇將為大家介紹eosio.system是如何實(shí)現(xiàn)質(zhì)押資源和投票選舉超級節(jié)點(diǎn)的。
質(zhì)押資源與投票步驟
eos的超級節(jié)點(diǎn)選舉、以及超級節(jié)點(diǎn)投票,都是圍繞賬戶進(jìn)行的。eosio.system的投票功能,都集成在了cleos system命令里,大家可以很方便使用命令行工具進(jìn)行操作。
投票分為兩個角色:投票賬戶和候選節(jié)點(diǎn)賬戶。它們想完成投票/當(dāng)選,需要進(jìn)行以下步驟:
投票賬戶:質(zhì)押EOS—投票
候選節(jié)點(diǎn)賬戶:注冊為出塊節(jié)點(diǎn)
下面,將為大家演示下具體的步驟:
1. 抵押EOS換取cpu和net,只有抵押后的EOS才能用于投票。

delegatebw命令,可以指定哪個賬戶出EOS,以及抵押后的資源給哪個賬戶使用。

2. 賬戶注冊為超級節(jié)點(diǎn)候選賬戶,這樣別的賬戶才能給它投票

注冊為超級節(jié)點(diǎn)候選賬戶,需要提供公鑰,這個公鑰是用于當(dāng)選超級節(jié)點(diǎn)后,產(chǎn)塊時簽名驗(yàn)證用

3. 投票給超級節(jié)點(diǎn)候選賬戶

可以看到voter2已經(jīng)成功投票給了bp1

我們來看voteproducer命令的詳解,cleos system voteproducer prods是直接投給超級節(jié)點(diǎn)的命令,可以指定投票賬戶,可以一次性投給多個超級節(jié)點(diǎn)候選賬戶,賬戶名需要按字母從小到大排序,最多不超過30個賬戶。

取消投票步驟
當(dāng)投票賬戶想取消投票時,只需要贖回質(zhì)押的EOS即可,贖回期為3天。
下面,將為大家演示贖回的步驟:
1. 取消質(zhì)押,使用的是cleos system undelegatebw命令,與delegatebw命令大同小異

我本機(jī)的私鏈,將贖回期改為了3分鐘,可以看到undelegatebw命令,內(nèi)部調(diào)用了refund方法,33分鐘后將質(zhì)押的EOS贖回到賬了。具體的源碼詳情,我馬上會講到。

源碼詳解
質(zhì)押/解除質(zhì)押EOS
delegatebw/undelegatebw的源碼,本質(zhì)上調(diào)用了changebw的方法。

changebw會進(jìn)行如下操作:
1)更新cpu、net的質(zhì)押表del_bandwidth_table
2)更新receiver賬戶的總體資源表user_resources_table
3)更新from賬戶的refunds_table,這個表用于標(biāo)記贖回中的資源
4)更新投票權(quán)重
系統(tǒng)會通過傳入的參數(shù)判斷,是delegatebw還是undelegatebw操作,賬戶是否delegatebw給自。transfer參數(shù)為true表示from和receiver賬戶不同,將EOS的資源抵押給receiver并將EOS所有權(quán)一并轉(zhuǎn)交。

對于refund表的更新,根據(jù)不同條件有不同操作:
1)如果是undelegatebw操作,refund表中的cpu和net資源增加,表示為待贖回,request_time更新為目前的時間,這個時間很重要,會在計算贖回周期時用到。
2)如果是delegatebw給自己的操作,會優(yōu)先從refund表中取尚未贖回的cpu和net,重新做抵押。如果refund表中不夠,就從余額表中取EOS進(jìn)行抵押
3)如果refund表中cpu和net的額度不為0,則need_deferred_trx標(biāo)記為true,表示三天贖回周期到了后,要調(diào)用refund方法贖回EOS。
4)如果from和receiver不同,會觸發(fā)transfer操作,將質(zhì)押的EOS所有權(quán)也一并轉(zhuǎn)讓。





贖回EOS
上面講的undelegatebw方法,當(dāng)有需要贖回的EOS時,會觸發(fā)一個三天后才生效的defer交易,這個交易會觸發(fā)refund方法,進(jìn)行EOS的贖回。
方法會判斷refund表中的request_time+refund_delay是否小于當(dāng)前時間,小于當(dāng)前時間才可以進(jìn)行贖回操作。request_time就undelegatebw更新refund表的時間。

投票操作
投票操作的源碼,本質(zhì)上調(diào)用了update_votes方法

賬戶既可以注冊為超級節(jié)點(diǎn)候選賬戶,還可以注冊為代理賬戶proxy。代理賬戶可以集中普通賬戶的投票權(quán),代替其進(jìn)行投票。
進(jìn)行投票操作前,先要做一系列前置校驗(yàn),比如:
1)不能同時投給超級節(jié)點(diǎn)候選賬戶和代理賬戶
2)超級節(jié)點(diǎn)賬戶需要按照字母順序從小到大進(jìn)行排序
3)代理節(jié)點(diǎn)賬戶不能投給其他代理節(jié)點(diǎn)賬戶

為了鼓勵用戶認(rèn)真的投票,EOS引入了投票權(quán)重的概念。投票的權(quán)重會隨著時間的推移不斷衰減,當(dāng)用戶重新觸發(fā)vote操作時,投票權(quán)重會更新為新權(quán)重。所以,用戶需要定期為心儀的超級節(jié)點(diǎn)重新投票,以保證自己的投票效力不會衰減。



后記
本篇文章為大家介紹了eos投票和資源質(zhì)押的操作和源碼,后面講為大家介紹下eosio.system域名競拍相關(guān)的功能,以及源碼實(shí)現(xiàn),敬請期待!