
1. 文章摘要
【本文目標】
在EOS私鏈環(huán)境發(fā)行TOKEN代幣,并進行轉(zhuǎn)賬交易。
【環(huán)境前置條件】
1)已搭建好EOS私鏈環(huán)境(可參考第4課 如何在UBUNTU虛擬機上編譯EOS完成環(huán)境搭建?)
2)會進行相關(guān)錢包賬號的操作( 參考第5課 EOS環(huán)境搭建入門(私鏈節(jié)點-錢包-密鑰-賬號))
3) 本文操作時已存在以下資源信息
1] 錢包名稱 duncanwang,對應的解鎖密碼為"PW5JYSZRvSropLhguyxYY1zXgeQidSZnRKPKUXr2JUVTYay2zhuxT"
2] 系統(tǒng)私鑰/公鑰對已導入錢包:
EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV / 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
【技術(shù)收獲】
1) 創(chuàng)建自有代幣
2) 發(fā)行自有代幣
3) 代幣轉(zhuǎn)賬操作
2. 操作內(nèi)容
本文的操作內(nèi)容的流程圖如下所示:

2.1 創(chuàng)建賬戶
創(chuàng)建3個賬號,eosio.token賬號用于創(chuàng)建ColorBayToken代幣,wangdenghui賬號用于發(fā)行代幣,創(chuàng)建賬戶ouyanggege用于接收代幣。
創(chuàng)建eosio.token賬號
cleos create account eosio eosio.token EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
輸出內(nèi)容:
duncanwang@duncanwang:~$ cleos wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 -n duncanwang
imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
duncanwang@duncanwang:~$ cleos create account eosio eosio.token EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
executed transaction: 5679e2ad487fe7956ab287beb1c8642635e493d54ef4e948be06e0c24af48520 200 bytes 1133 us
# eosio <= eosio::newaccount {"creator":"eosio","name":"eosio.token","owner":{"threshold":1,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcf...
warning: transaction executed locally, but may not be confirmed by the network yet
創(chuàng)建wangdenghui賬號
cleos create account eosio wangdenghui EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
輸出內(nèi)容:
duncanwang@duncanwang:~/eos$ cleos create account eosio wangdenghui EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
executed transaction: 09688423e0f287cd0ae829fc358b58ecd0ec7f6e7e403684969bcaa3c7227a91 200 bytes 320 us
# eosio <= eosio::newaccount {"creator":"eosio","name":"wangdenghui","owner":{"threshold":1,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcf...
warning: transaction executed locally, but may not be confirmed by the network yet
創(chuàng)建ouyanggege賬號
cleos create account eosio ouyanggege EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
輸出內(nèi)容:
duncanwang@duncanwang:~/eos$ cleos create account eosio ouyanggege EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
executed transaction: 316a20b2c20669d853b116d6126b9f09fdece00a62c888acc2d4ab4c845d875b 200 bytes 738 us
# eosio <= eosio::newaccount {"creator":"eosio","name":"ouyanggege","owner":{"threshold":1,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcfn...
warning: transaction executed locally, but may not be confirmed by the network yet
2.2 部署代幣合約
cleos set contract eosio.token build/contracts/eosio.token -p eosio.token
參數(shù)說明:
-p,--permission TEXT 表示授權(quán)賬號,該合約授權(quán)給eosio.token賬號。
代幣合約eosio.token能讓許多不同的代幣同時在一個智能合約上發(fā)行,但是卻能被不同用戶管理。
duncanwang@duncanwang:~/eos$ cleos set contract eosio.token build/contracts/eosio.token -p eosio.token
Reading WAST/WASM from build/contracts/eosio.token/eosio.token.wasm...
Using already assembled WASM...
Publishing contract...
executed transaction: 74e746a1bcb58d69a47b8182a960f2657b56023ab30df959ff5e29405fec785b 8104 bytes 2088 us
# eosio <= eosio::setcode {"account":"eosio.token","vmtype":0,"vmversion":0,"code":"0061736d01000000017e1560037f7e7f0060057f7e...
# eosio <= eosio::setabi {"account":"eosio.token","abi":"0e656f73696f3a3a6162692f312e30010c6163636f756e745f6e616d65046e616d65...
warning: transaction executed locally, but may not be confirmed by the network yet
2.3 創(chuàng)建一個代幣
cleos push action eosio.token create '[ "eosio", "1000000000.0000 CBT", 0, 0, 0]' -p eosio.token
參數(shù)說明:
1) create 函數(shù)是用來新建一種代幣,并輸入代幣的各種屬性,同時 create 函數(shù)也是一個 action。action 是 eos 智能合約的接口函數(shù),定義外界可以對智能合約做什么動作。
結(jié)合操作命令,說明各個參數(shù)的定義:
create( account_name issuer,/發(fā)行方賬號的名稱為"eosio"/
asset maximum_supply,/總供應量為10億和代幣名稱CBT (ColorBayToken的縮寫)/
uint8_t can_freeze,/資產(chǎn)是否可以凍結(jié),0表示否/
uint8_t can_recall,/資產(chǎn)是否可以召回,0表示否/
uint8_t can_whitelist );/資產(chǎn)是否可以設(shè)置白名單,0表示無/
2)-p,--permission Type: Text - 授權(quán)給賬號eosio.token
duncanwang@duncanwang:~/eos$ cleos push action eosio.token create '[ "eosio", "1000000000.0000 CBT", 0, 0, 0]' -p eosio.token
executed transaction: 791687224acb86a715639af9b3b4660ac06ac07908c8746851382be661218739 120 bytes 4703 us
# eosio.token <= eosio.token::create {"issuer":"eosio","maximum_supply":"1000000000.0000 CBT"}
warning: transaction executed locally, but may not be confirmed by the network yet
2.4 發(fā)行代幣
cleos push action eosio.token issue '[ "wangdenghui", "10000.0000 CBT", "first ColorBayToken issue" ]' -p eosio
參數(shù)說明:
1) issue 函數(shù)是用來增發(fā)代幣,eosio.token 合約并不是新建了代幣就會得到代幣,新建的代幣只是存儲了資料,發(fā)幣者要想獲取代幣,需要調(diào)用 issue action 來獲得代幣。
void issue(
account_name to, /代幣的發(fā)行方為賬戶為wangdenghui,之前已經(jīng)創(chuàng)建/
asset quantity, /發(fā)行代幣的數(shù)量為10000個,代幣名稱為CBT/
string memo ); /表示備注說明,不能超過256個字節(jié)/
執(zhí)行輸入結(jié)果如下:
duncanwang@duncanwang:~/eos$ cleos push action eosio.token issue '[ "wangdenghui", "10000.0000 CBT", "first ColorBayToken issue" ]' -p eosio
executed transaction: 33b23322d6a413108350a21f23c77150d77de71a8aeeaefd5befd9e30ceec288 144 bytes 2602 us
# eosio.token <= eosio.token::issue {"to":"wangdenghui","quantity":"10000.0000 CBT","memo":"first ColorBayToken issue"}
# eosio.token <= eosio.token::transfer {"from":"eosio","to":"wangdenghui","quantity":"10000.0000 CBT","memo":"first ColorBayToken issue"}
# eosio <= eosio.token::transfer {"from":"eosio","to":"wangdenghui","quantity":"10000.0000 CBT","memo":"first ColorBayToken issue"}
# wangdenghui <= eosio.token::transfer {"from":"eosio","to":"wangdenghui","quantity":"10000.0000 CBT","memo":"first ColorBayToken issue"}
warning: transaction executed locally, but may not be confirmed by the network yet
2.5 代幣轉(zhuǎn)賬
輝哥賬號轉(zhuǎn)賬給歐陽哥哥合計8000個彩貝幣,用于支付午餐費用。
cleos push action eosio.token transfer '[ "wangdenghui", "ouyanggege", "8000.0000 CBT", "pay for lunch!" ]' -p wangdenghui
轉(zhuǎn)賬成功輸出結(jié)果:
duncanwang@duncanwang:~/eos$ cleos push action eosio.token transfer '[ "wangdenghui", "ouyanggege", "8000.0000 CBT", "pay for lunch!" ]' -p wangdenghui
executed transaction: 42c0f99566561977424df6417581114c3d9865c5194256f6b7a1311abf97802a 144 bytes 2011 us
# eosio.token <= eosio.token::transfer {"from":"wangdenghui","to":"ouyanggege","quantity":"8000.0000 CBT","memo":"pay for lunch!"}
# wangdenghui <= eosio.token::transfer {"from":"wangdenghui","to":"ouyanggege","quantity":"8000.0000 CBT","memo":"pay for lunch!"}
# ouyanggege <= eosio.token::transfer {"from":"wangdenghui","to":"ouyanggege","quantity":"8000.0000 CBT","memo":"pay for lunch!"}
warning: transaction executed locally, but may not be confirmed by the network yet
2.6 查詢余額
查詢輝哥和歐陽哥哥的賬號,核實金額是否已到賬。
cleos get currency balance eosio.token wangdenghui
cleos get currency balance eosio.token ouyanggege
正確輸出結(jié)果:
duncanwang@duncanwang:~/eos$ cleos get currency balance eosio.token wangdenghui
2000.0000 CBT
duncanwang@duncanwang:~/eos$ cleos get currency balance eosio.token ouyanggege
8000.0000 CBT
2.7 閱讀eosio.token智能合約代碼
EOS 官方提供了一個代幣(資產(chǎn))智能合約 Demo —— eosio.token,這個示例合約給出了 EOS 官方智能合約開發(fā)的標準結(jié)構(gòu)和開發(fā)方法,并且真正的 EOS 代幣也會借鑒這個示例合約的邏輯,是 EOS 智能合約入門的經(jīng)典案例。
默認情況下,該智能合約存在路徑:~/eos/contracts/eosio.token
文件解釋如下:
eosio.token.hpp - 頭文件,定義類和函數(shù)
eosio.token.cpp - 實現(xiàn)
eosio.token.abi - Application Binary Interface,是一個接口文件,描述了智能合約與上層應用之間的數(shù)據(jù)交換格式
CMakeLists.txt - 編譯文件
3. 參考
1) 在EOSIO上發(fā)行代幣
2) Introduction to the EOSIO Token Contract
3)【許曉笛】EOS智能合約案例解析(1)