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

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

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

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

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

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

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

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

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

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

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

對(duì)于refund表的更新,根據(jù)不同條件有不同操作:
1)如果是undelegatebw操作,refund表中的cpu和net資源增加,表示為待贖回,request_time更新為目前的時(shí)間,這個(gè)時(shí)間很重要,會(huì)在計(jì)算贖回周期時(shí)用到。
2)如果是delegatebw給自己的操作,會(huì)優(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不同,會(huì)觸發(fā)transfer操作,將質(zhì)押的EOS所有權(quán)也一并轉(zhuǎn)讓。





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

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

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

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



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