【eos全家桶系列】eos系統(tǒng)合約介紹 — 系統(tǒng)操作合約eosio.system (上)

簡介

本篇將為大家介紹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才能用于投票。

voter2賬戶抵押給自己了51個(gè)EOS換取cpu、49個(gè)EOS換取net

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

delegatebw命令詳細(xì)解釋

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

bp1注冊(cè)為超級(jí)節(jié)點(diǎn)候選賬戶

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

regproducer命令詳細(xì)解釋

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

voter2投票給bp1

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

voter2賬戶詳情

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

voteproducer prods命令詳細(xì)解釋

取消投票步驟

當(dāng)投票賬戶想取消投票時(shí),只需要贖回質(zhì)押的EOS即可,贖回期為3天。

下面,將為大家演示贖回的步驟:

1. 取消質(zhì)押,使用的是cleos system undelegatebw命令,與delegatebw命令大同小異

voter2賬戶取消質(zhì)押

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

undelegatebw解除質(zhì)押,并內(nèi)部調(diào)用refund方法將EOS贖回到賬

源碼詳解

質(zhì)押/解除質(zhì)押EOS

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

delegatebw/undelegatebw源碼詳情

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)交。

changebw的方法參數(shù)

對(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)讓。

開始更新refunds_table表
抵押給自己的delegatebw操作和undelegatebw操作,對(duì)refund表的更新
如果有待贖回的EOS,則三天后調(diào)用refund方法進(jìn)行贖回操作
refund_delay設(shè)置為三天
from和receiver不同,觸發(fā)transfer操作

贖回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í)間。

refund方法源碼詳情

投票操作

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

voteproducer方法

賬戶既可以注冊(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)賬戶

投票前置校驗(yà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ì)衰減。

投票權(quán)重更新
投票權(quán)重更新
投票權(quán)重計(jì)算公式

后記

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容