[轉]EOS智慧合約 & 私鏈啟用 & 基本操作
連結:https://www.jianshu.com/p/90dea623ffdf
簡介
本篇文章,將跟大家介紹eos私鏈的啟用、基礎智慧合約的安裝,以及為大家演示轉賬等基礎操作。還沒有安裝eos私鏈的同學,可以參考我上篇文章,先搭建好私鏈。
智慧合約
承接上篇文章,我們啟動私鏈 —> 建立公私鑰對 —> 建立錢包 —> 將公私鑰對匯入錢包 —> 建立user賬戶。有同學會問,我們什麼時候能發交易、做一些轉賬等基本操作?那我們就不得不提出一個新概念—智慧合約。簡單來說,智慧合約是條款以計算機語言而非日常語言或法律語言記錄的智慧合同,其工作的基本原理類似於計算機程式的if-then語句,在預先設定的條件達成時,就自動執行相應的合同條款。
eos的所有功能,都是基於智慧合約完成的。所以,如果我們要啟用私鏈,想在私鏈上完成轉賬等交易,就需要部署eos的基礎合約。eos有幾個比較重要的系統合約,是我們必須要部署的:
- eosio.bios:eos的系統啟動合約。這個合約是eos很多命令的基礎合約,讓我們可以直接通過eosio賬戶控制eos私鏈
- eosio.token:eos的發幣合約。系統執行這個合約發行EOS,合約實現了指定代幣發行給哪個賬戶、代幣最大發行量、轉賬方法等功能
- eosio.msig:eos的提案合約。EOS持有人可以使用合約方法提出一個提案,其他人可以表決通過或者不通過這個提案,通過這個合約能實現交易的多重簽名方案
- eosio.system:eos的系統命令合約。這個合約幾乎實現了eos全部的系統命令,包括建立賬戶、資源質押、超級節點投票、域名競拍等功能
所有的系統合約都在eos/contracts目錄下面,這幾個合約內部的方法實現細節,我會單獨寫文章介紹,大家現在只需要大致記住它們的作用即可。
私鏈啟用
我們將模擬eos主網的部署啟動過程,對eos私鏈進行啟用:建立一系列系統賬戶、部署一系列系統合約、發幣、選舉超級節點等,大家跟著我一步一步操作。
第一步,部署eosio.bios系統合約,部署賬戶為eosio。
我們需要使用cleos命令列工具部署智慧合約
cd eos
cleos set contract eosio contracts/eosio.bios -p eosio
tips:
- 這個操作是將eosio.bios合約部署到了eosio賬戶上,-p是指定授權賬戶為eosio。執行這個命令時,錢包一定要處於unlock狀態,方便調取eosio賬戶的私鑰。
- 執行cleos set contract時,可能會出現下面的報錯:
這是因為eos的虛擬機器使用的是webassembly,智慧合約原始碼是用c++寫的,需要先編譯成wasm/wast檔案,再部署到eos上面,才能被虛擬機器執行。我們使用eos自帶的工具eosiocpp去編譯原始碼,這個工具在節點安裝時就已經安裝好了:
cd eos/contracts/eosio.bios
eosiocpp -o eosio.bios.wast eosio.bios.cpp
第二步,建立一系列系統賬戶。
eos的系統賬戶是用來部署智慧合約的,由eosio賬戶建立,有以下幾個賬戶:
- eosio.bpay:超級節點獲取出塊獎勵的臨時代管賬戶,增發EOS的1%的25%會先轉到這個賬戶
- eosio.msig:用來部署eosio.msig合約
- eosio.names:用來管理域名競拍
- eosio.ram:用來管理ram買賣
- eosio.ramfee:用來管理ram買賣產生的手續費,每筆買賣扣1%的手續費
- eosio.saving:增發EOS臨時存放賬戶,增發總量 5%,其中80%放在此賬戶,另外 20%再分成25%和75%,分別給eosio.bpay和eosio.vpay
- eosio.stake:用來管理抵押換取cpu、net資源的EOS
- eosio.token:用來部署eosio.token合約
- eosio.vpay:節點們按照獲得投票多少比例獲取獎勵的臨時代管賬戶,增發EOS的1%的75%會先轉到這個賬戶
使用cleos create key生成公私鑰對,再將私鑰匯入錢包,最後執行cleos create account生成系統地址,忘記怎麼操作的同學,請回顧我上篇內容中的錢包、賬戶部分。
cleos create key
cleos wallet import -n <wallet name> --private-key <private key>
cleos create account eosio <system account name> <owner public key> <active public key>
給大家舉個例子,展示eosio.token賬戶是怎麼建立的:
第三步,部署eosio.token合約,部署賬戶為eosio.token。
cd eosio
cleos set contract eosio.token contracts/eosio.token -p eosio.token
第四步,部署eosio.msig合約,部署賬戶為eosio.msig。
cd eos
cleos set contract eosio.msig contracts/eosio.msig -p eosio.msig
第五步,釋出EOS代幣,呼叫eosio.token賬戶下的eosio.token智慧合約的create函式。
cleos push action eosio.token create '[ "eosio", "1000000000.0000 EOS"]' -p eosio.token
tips:cleos push action命令,用來觸發eosio.token合約的create函式,代幣發行賬戶是eosio,發行量10億,代幣的符號是EOS。
第六步,將EOS資產打入eosio賬戶,呼叫eosio.token賬戶下的eosio.token智慧合約的issue函式。
因為EOS的發行人是eosio賬戶,所以呼叫issue這個函式,需要eosio賬戶授權
cleos push action eosio.token issue '[ "eosio", "1000000000.0000 EOS", "test message"]' -p eosio
第七步,部署eosio.system合約,部署賬戶為eosio。
cd eos
cleos set contract eosio contracts/eosio.system -p eosio -x 1000
第八步,建立賬戶。
這裡我們建立賬戶,將使用cleos system newaccount命令,這是eos上建立普通賬戶所用的命令,底層實際上呼叫的是eosio.system合約的newaccount函式。之前提到的cleos create account命令,其實是為了eosio賬戶建立系統賬戶提供的命令,需要特殊許可權才能執行。
cleos system newaccount <account to pay for create cost> <new account name> <owner public key> <active public key> --stake-net <amount> --stake-cpu <amount> --buy-ram <amount>
eosio賬戶建立了一個賬戶voter1,為這個新賬戶抵押了20000EOS、20000EOS去換取cpu和net資源,付費20000EOS為這個賬戶買了ram資源。
tips:
- 新建立的賬戶,需要抵押一定的EOS去換取cpu、net資源,需要花費一定EOS去買ram資源,用於交易的傳送。用於抵押cpu和net的EOS是可以贖回的,贖回需要3天時間。
- 資源的分配是按比例的。比如,抵押全網1%的eos,就可以換取全網1%的cpu或者net資源。
- cpu和net資源是可再生的,使用後一天就可恢復,ram是不可再生資源,用完得再買。
第九步,投票選舉超級節點
上一步,我們建立兩個賬戶voter1和bp1。eos的主鏈或者私鏈,初始的時候都是被系統賬戶eosio控制的。但是,如果想要啟用eos的所有功能,則必須投票選舉超級節點,且全網投票必須超過發行總量的15%,即1.5個億。主鏈上是選舉21個超級節點,它們輪流出塊。私鏈上,我們只需要選舉一個超級節點,讓它出塊即可。下面,我們將為大家演示超級節點的選舉過程。
1)eosio將1.5億EOS轉賬給voter1
cleos transfer eosio voter1 "150000000.0000 EOS" -p eosio
2)voter1將EOS抵押為cpu、net資源,因為只有抵押為資源的EOS才能用於投票。
cleos system delegatebw voter1 voter1 "150000000.0000 EOS" "0 EOS"
我們抵押了1.5億 EOS去換cpu資源,0 EOS去換net資源。cleos system delegatebw命令詳情如下,from是出抵押的EOS的賬戶,to是接收抵押資源的賬戶,stake_net_quantity和stake_cpu_quantity是抵押EOS的金額:
3)將bp1註冊為超級節點,只有註冊的賬戶,其他賬戶才能給它投票
cleos system regproducer bp1 <bp1's public key>
4)voter1投票給bp1,這裡的投票是賬戶行為,等於將voter1抵押的全部EOS都投給了bp1
cleos system voteproducer prods voter1 bp1
這步執行完畢後,私鏈就算激活了,這時你會發現eosio賬戶已經不能出塊了,我們需要修改配置檔案config.ini,將producer-name替換為bp1,signature-provider換成bp1的公私鑰對,然後執行nodeos重啟節點,這時就是bp1負責出塊了
基本操作
激活了私鏈之後,我們就解鎖了eos全部的功能。下面,我將為大家介紹下EOS上的基本操作,如:查詢賬戶詳情、轉賬、質押資源、投票、查詢賬戶餘額等
賬戶相關
1)查詢賬戶,這個命令可以看到賬戶的基本許可權、cpu和net的質押和使用情況
cleos get account <account name>
2)轉賬
cleos transfer <from account> <to account> <amount> <transfer message>
3)查詢賬戶餘額
cleos get currency balance <發幣合約部署的賬戶> <account name> <代幣符號>
4)質押EOS換取cpu、net資源
cleos system delegatebw <from account> <to account> <amount of EOS for cpu> <amount of EOS for net>
from account和to account相同時,是自己給自己質押資源;不同時,是其他賬戶幫忙質押資源給自己。
5)取消資源質押
cleos system undelegatebw <from account> <to account> <amount of EOS for cpu> <amount of EOS for net>
6)檢視待贖回的資源
取消質押後,EOS並不會馬上回到賬戶餘額裡,需要等待三天。這時可以在refunds表裡檢視待贖回的資源。
cleos get table <合約部署賬戶> <account name> refunds
7)手動觸發refund
如果三天後發現EOS還沒回到餘額裡,則需要手動觸發refund函式。undelegatebw命令,本質上是在函式裡延遲三天呼叫refund函式,屬於合約調合約,有失敗的可能。這裡我不多做解釋,今後會專門寫一篇文章具體介紹。refund函式屬於eosio.system合約,所以需要使用cleos push action命令:
cleos push action eosio refund '["account"]' -p account
因為沒到3天就觸發refund,節點的輸出日誌會報錯,需要等待
投票相關
1)註冊為候選超級節點,註冊之後其他賬戶才能為其投票
cleos system regproducer <account name> <public>
2)為超級節點投票
cleos system voteproducer prods <account name> <account you want to vote>
3)檢視超級節點投票情況
cleos system listproducers