簡介
本篇將為大家介紹eos最重要的系統(tǒng)操作合約—eosio.system合約,合約地址詳見eosio.system趴俘。eosio.system合約涵蓋了非常多的功能,包括:創(chuàng)建賬戶、投票選舉超級節(jié)點、質(zhì)押資源支子、域名競拍等,本篇將為大家介紹eosio.system是如何實現(xiàn)質(zhì)押資源和投票選舉超級節(jié)點的达舒。
質(zhì)押資源與投票步驟
eos的超級節(jié)點選舉值朋、以及超級節(jié)點投票,都是圍繞賬戶進行的巩搏。eosio.system的投票功能昨登,都集成在了cleos system命令里,大家可以很方便使用命令行工具進行操作贯底。
投票分為兩個角色:投票賬戶和候選節(jié)點賬戶丰辣。它們想完成投票/當(dāng)選,需要進行以下步驟:
投票賬戶:質(zhì)押EOS—投票
候選節(jié)點賬戶:注冊為出塊節(jié)點
下面,將為大家演示下具體的步驟:
1. 抵押EOS換取cpu和net笙什,只有抵押后的EOS才能用于投票飘哨。
delegatebw命令得湘,可以指定哪個賬戶出EOS杖玲,以及抵押后的資源給哪個賬戶使用顿仇。
2. 賬戶注冊為超級節(jié)點候選賬戶淘正,這樣別的賬戶才能給它投票
注冊為超級節(jié)點候選賬戶,需要提供公鑰臼闻,這個公鑰是用于當(dāng)選超級節(jié)點后鸿吆,產(chǎn)塊時簽名驗證用
3. 投票給超級節(jié)點候選賬戶
可以看到voter2已經(jīng)成功投票給了bp1
我們來看voteproducer命令的詳解,cleos system voteproducer prods是直接投給超級節(jié)點的命令述呐,可以指定投票賬戶惩淳,可以一次性投給多個超級節(jié)點候選賬戶,賬戶名需要按字母從小到大排序乓搬,最多不超過30個賬戶思犁。
取消投票步驟
當(dāng)投票賬戶想取消投票時,只需要贖回質(zhì)押的EOS即可进肯,贖回期為3天激蹲。
下面,將為大家演示贖回的步驟:
1. 取消質(zhì)押江掩,使用的是cleos system undelegatebw命令学辱,與delegatebw命令大同小異
我本機的私鏈,將贖回期改為了3分鐘环形,可以看到undelegatebw命令策泣,內(nèi)部調(diào)用了refund方法,33分鐘后將質(zhì)押的EOS贖回到賬了抬吟。具體的源碼詳情萨咕,我馬上會講到。
源碼詳解
質(zhì)押/解除質(zhì)押EOS
delegatebw/undelegatebw的源碼任洞,本質(zhì)上調(diào)用了changebw的方法。
changebw會進行如下操作:
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進行抵押
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方法勾扭,進行EOS的贖回毡琉。
方法會判斷refund表中的request_time+refund_delay是否小于當(dāng)前時間,小于當(dāng)前時間才可以進行贖回操作妙色。request_time就undelegatebw更新refund表的時間桅滋。
投票操作
投票操作的源碼,本質(zhì)上調(diào)用了update_votes方法
賬戶既可以注冊為超級節(jié)點候選賬戶身辨,還可以注冊為代理賬戶proxy丐谋。代理賬戶可以集中普通賬戶的投票權(quán),代替其進行投票煌珊。
進行投票操作前号俐,先要做一系列前置校驗,比如:
1)不能同時投給超級節(jié)點候選賬戶和代理賬戶
2)超級節(jié)點賬戶需要按照字母順序從小到大進行排序
3)代理節(jié)點賬戶不能投給其他代理節(jié)點賬戶
為了鼓勵用戶認(rèn)真的投票定庵,EOS引入了投票權(quán)重的概念吏饿。投票的權(quán)重會隨著時間的推移不斷衰減踪危,當(dāng)用戶重新觸發(fā)vote操作時,投票權(quán)重會更新為新權(quán)重猪落。所以贞远,用戶需要定期為心儀的超級節(jié)點重新投票,以保證自己的投票效力不會衰減笨忌。
后記
本篇文章為大家介紹了eos投票和資源質(zhì)押的操作和源碼蓝仲,后面講為大家介紹下eosio.system域名競拍相關(guān)的功能,以及源碼實現(xiàn)官疲,敬請期待袱结!