一、目的
eosio.token 系统合约定义了允许用户为基于 EOSIO 的区块链创建、发行和管理代币的结构和操作,它演示了一种实现允许创建和管理代币的智能合约的方法。本文详细介绍了 eosio.token 系统合约并在本地测试链上实际发行了代币进行演示,适用于 EOS 智能合约的初级开发人员,熟悉如何进行代币的创建、发行和转移。
二、概述
(一)合约数据结构简介
eosio.token 合约通过使用两个内部多索引结构管理代币、账户及其相应余额的集合:accounts 和 stats。accounts 多索引表的每一行都包含 account 对象的实例,而 account 对象包含有关一个代币余额的信息。accounts 表的范围是一个 eosio 帐户,它根据代币的符号对行进行索引。这意味着当一个人在 accounts 多索引表中查询一个账户名时,结果是该账户目前持有的所有代币。
类似地,stats 多索引表为每一行保存 currency_stats 对象的实例,其中包含有关当前供应量、最大供应量和符号代币的创建者帐户的信息。stats 表的范围是代币符号。因此,当查询 stats 表中的代币符号时,如果查询的符号代币先前已创建,则结果是对应于查询符号代币的单个条目/行,否则为空。
(二)合约方法简介
eosio.token 合约定义了 create、issue、retire、transfer、open、close 共六个 action 供用户创建和管理代币。
三、环境准备
(一)一条正在运行且可访问的区块链
中移链(基于 EOS)测试环境搭建
https://mp.weixin.qq.com/s?__biz=MzkwNjI1OTg1MA==&mid=2247489304&idx=2&sn=6d22be6194d821dbd04f6079c79930a3&scene=21#wechat_redirect
(二)确保本地钱包已打开并解锁
如何创建钱包:
https://developers.eos.io/manuals/eos/latest/cleos/how-to-guides/how-to-create-a-wallet图片
四、合约方法
(一)create
Type: void
允许 issuer 帐户在 maximum_supply 的供应中创建代币。如果验证成功,将在 statstable 中为代币符号范围创建一个新条目。
(二)issue
Type: void
此 action 向 to 帐户发放 quantity 代币。
(三)retire
Type: void
与 create 操作相反,如果所有验证都成功,则会扣除 statstable.supply 金额。
(四)transfer
Type: void
允许 from 账户将 quantity 代币转移到 to 账户。一个账户被记入借方,另一个账户被记入 quantity 代币的贷方。
(五)open
Type: void
允许 ram_payer 作为付款账户为代币 symbol 创建一个余额为零的帐户 owner。
可以在 issue61、issue62 阅读更多信息。
https://github.com/EOSIO/eosio.contracts/issues/61https://github.com/EOSIO/eosio.contracts/issues/62
(六)close
Type: void 此操作与 open 相反,它关闭代币 symbol 的帐户 owner 。
五、创建、发行和转移代币
(一)获取合约
1、转到 contract 目录
2、拉取合约源码
git clone https://github.com/EOSIO/eosio.contracts --branch master --single-branch
复制代码
cd eosio.contracts/contracts/eosio.token
复制代码
(二)为合约创建账户
您可能需要先解锁钱包
cleos create account eosio eosio.token PUBLIC_KEY
复制代码
(三)编译合约
eosio-cpp -I include -o eosio.token.wasm src/eosio.token.cpp --abigen
复制代码
(四)部署代币合约
cleos set contract eosio.token CONTRACTS_DIR/eosio.contracts/contracts/eosio.token --abi eosio.token.abi -p eosio.token@active
复制代码
结果应类似于以下内容:
Reading WASM from ...
Publishing contract...
executed transaction:
69c68b1bd5d61a0cc146b11e89e11f02527f24e4b240731c4003ad1dc0c87c2c 9696 bytes 6290 us
# eosio <= eosio::setcode
{"account":"eosio.token","vmtype":0,"vmversion":0,"code":"0061736d0100000001aa011c60037f7e7f0060047f...
# eosio <= eosio::setabi
{"account":"eosio.token","abi":"0e656f73696f3a3a6162692f312e30000605636c6f73650002056f776e6572046e61...
warning: transaction executed locally, but may not be confirmed by the network yet ]
复制代码
(五)创建代币
cleos push action eosio.token create '[ "eosio", "1000000000.0000 SYS"]' -p eosio.token@active
复制代码
结果应类似于以下内容:
executed transaction: 0e49a421f6e75f4c5e09dd738a02d3f51bd18a0cf31894f68d335cd70d9c0e12 120 bytes 1000 cycles
# eosio.token <= eosio.token::create
{"issuer":"eosio","maximum_supply":"1000000000.0000 SYS"}
复制代码
另一种方法使用命名参数:
cleos push action eosio.token create '{"issuer":"eosio",
"maximum_supply":"1000000000.0000 SYS"}' -p eosio.token@active
复制代码
结果应类似于以下内容:
executed transaction:
0e49a421f6e75f4c5e09dd738a02d3f51bd18a0cf31894f68d335cd70d9c0e12 120 bytes 1000 cycles
# eosio.token <= eosio.token::create
{"issuer":"eosio","maximum_supply":"1000000000.0000 SYS"}
复制代码
该命令创建了一个新代币SYS
,精度为 4 位小数,最大供应量为 1000000000.0000 SYS。创建此代币需要 eosio.token 合约的授权。出于此原因,-p eosio.token@active
用来授权。
(六)发行代币
在我们的例子中,发行人可以向发行人账户发行代币。
cleos push action eosio.token issue '[ "eosio", "100.0000 SYS", "memo" ]' -p eosio@active
复制代码
结果应类似于以下内容:
executed transaction:
a26b29d66044ad95edf0fc04bad3073e99718bc26d27f3c006589adedb717936 128 bytes 337 us
# eosio.token <= eosio.token::issue
{"to":"eosio","quantity":"100.0000 SYS","memo":"memo"}
warning: transaction executed locally, but may not be confirmed by the network yet ]
复制代码
(七)转移代币
现在帐户 eosio 已发行代币,将其中一些代币转移到帐户 bob 。
cleos push action eosio.token transfer '[ "eosio", "bob", "25.0000 SYS", "m" ]' -p eosio@active
复制代码
您需要先创建 bob 账户
结果应类似于以下内容:
executed transaction:
60d334850151cb95c35fe31ce2e8b536b51441c5fd4c3f2fea98edcc6d69f39d 128 bytes 497 us
# eosio.token <=
eosio.token::transfer
{"from":"eosio","to":"bob","quantity":"25.0000 SYS","memo":"m"}
# eosio <=
eosio.token::transfer
{"from":"eosio","to":"bob","quantity":"25.0000 SYS","memo":"m"}
# bob <=
eosio.token::transfer
{"from":"eosio","to":"bob","quantity":"25.0000 SYS","memo":"m"}
warning: transaction executed locally, but may not be confirmed by the network yet ]
复制代码
现在使用 cleos get currency balance 检查“bob”是否获得了代币
cleos get currency balance eosio.token bob SYS
复制代码
结果:
检查 eosio 的余额,注意代币已从帐户中扣除:
评论