最近EIDOS很火,用户只需要向合约帐户eidos转账就可以挖取EIDOS代币,EIDOS甚至直接导致了eos主链上CPU的不足,下面就详细分析下EIDOS的代码,并尝试在eosio-web-ide上面部署下EIDOS的合约。
EIDOS代码分析
eidos项目代码也是开源的,代码位置为:https://github.com/enumivo/eidos.git.仔细看了一下eidos的代码,eidos合约只是在原来eosio.token的代码基础上添加了claim的一个功能,下面就说一下claim实现了什么功能。
claim的定义
[[eosio::on_notify("eosio.token::transfer")]] void claim(name from, name to, eosio::asset quantity, std::string memo);
claim的定义是在token.hpp里面,这个函数是由eosio.token合约上面的transfer操作进行触发的一个函数。
claim的实现
if (to != get_self() || from == get_self()) return;
action{
permission_level{get_self(), "active"_n},
"eosio.token"_n,
"transfer"_n,
std::make_tuple(get_self(), from, quantity, std::string("Refund EOS"))
}.send();
首先看下对转过来代币的处理,这里判断下是有人给我转发代币后,先调用eosio.token的transfer操作把别人的币原样转回去。
int elapsed = current_time_point().sec_since_epoch();
if (elapsed > 1572595200) {
asset supply = eosio::token::get_supply(get_self(), symbol_code("EIDOS"));
int64_t expected = (elapsed - 1572595200) * 25;
asset balance = eosio::token::get_balance(get_self(), get_self(), symbol_code("EIDOS"));
if (expected > 1000000000)
expected = 1000000000;
asset expected_supply = asset(expected, symbol("EIDOS", 4));
expected_supply *= 10000;
这段带是是获取当前时间的时间戳,并与1572595200进行比较(1572595200时间戳的时间是2019-11-01 16:00:00),也就是说值由2019-11-01 16:00:00 以后才开始空投,在这个时间之前的转帐不会获得空投。增发的规则是当前时间减去1572595200 然后乘以25,也就是根据时间来增发,也就是每秒增发25 EIDOS,代币总数量不能大于1000000000。
如果重新部署一个合约,1572595200可以修改为你想要开始挖矿的时间的时间戳。 如果想要自己发自己的待币,可以修改代币名称EIDOS,把这个文件里面有EIDOS修改你自己想要的待币名称,如TEST,但是要所有地方都进行修改。
if (supply < expected_supply){
asset claim = expected_supply-supply;
action{
permission_level{get_self(), "active"_n},
get_self(),
"issue"_n,
std::make_tuple(get_self(), claim, std::string("Issue EIDOS"))
}.send();
balance += claim;
claim = claim / 5;
action{
permission_level{get_self(), "active"_n},
get_self(),
"transfer"_n,
std::make_tuple(get_self(), "eidosoneteam"_n, claim, std::string("Send to EIDOS Team."))
}.send();
balance -= claim;
}
如果当前的代币供应量小于当前时间应该有的供应量,则进行增发(issue)操作,并把此次增发的1/5发送给帐户eidosoneteam。 如果想要把1/5发给自己的帐户,需要把eidosoneteam修改成自己团队帐户名。
if (balance > asset(0, symbol("EIDOS", 4))) {
if (balance <= asset(10000, symbol("EIDOS", 4)))
balance = asset(1, symbol("EIDOS", 4));
else
balance /= 10000;
action{
permission_level{get_self(), "active"_n},
get_self(),
"transfer"_n,
std::make_tuple(get_self(), from, balance, std::string("Airdrop EIDOS"))
}.send();
}
然后把总供应量的万分之一(不够1 EIDOS的按1 EIDOS来算)的EIDOS发送给用户。
eosio-web-ide
EOSIO Quickstart Web IDE是一种一键式基于Web的IDE,可在浏览器中运行,旨在从根本上简化开发人员的体验。 eosio-web-ide的代码地址是:https://github.com/EOSIO/eosio-web-ide.git,我们可以先fork到自己的目录下面然后进行操作。
启动eosio-web-ide
只需要在我们fork以后的代码目录上面添加gitpod.io/#/如(https://gitpod.io/#/github.com/***/eosio-web-ide),便可以自动在浏览器上面启动一个eosio的测试网。
下载eidos合约和eosio.token合约
启动测试网以后,上面是集成VSCODE的代码编辑部分,下面的terminal显示了测试网的出块过程,我们这里这里先把eidos和eosio.token的合约代码下载下来。
通过Terminal->New Terminal 重新打开一个Terminal,然后cd contract/ 进入contract目录
cd /workspace/eosio-web-ide/contract
git clone https://github.com/enumivo/eidos.git
cd eidos/
mkdir token
eosio-cpp token.cpp -o token/token.wasm
cd /workspace/eosio-web-ide/contract
git clone https://github.com/EOSIO/eosio.contracts.git
cd eosio.contracts/
./build.sh
通过上面操作,我们已经下载并编译了eidos和eosio.contract的合约代码,下面就是在链上的操作。
链上加载对应的合约
创建帐户 eidos,eosio.token,测试帐户eosforce,eidos合约上面的开发团队帐户eidosoneteam
cleos create account eosio eosio.token EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eidos EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eosforce EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio eidosoneteam EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cd /workspace/eosio-web-ide/contract/eidos
cleos set contract eidos ./token/
cd /workspace/eosio-web-ide/contract/eosio.contracts/build/contracts
cleos set contract eosio.token ./eosio.token/
eosio.token 合约上面创建并增发TEST代币
cleos push action eosio.token create '["eosforce","100000000.0000 TEST"]' -p eosio.token cleos push action eosio.token issue '["eosforce","100.0000 TEST","test"]' -p eosforce
eidos合约创建EIDOS代币,增发代币并将eidos帐户权限赋予eidos合约
cleos push action eidos create '["eidos","10000000000.0000 EIDOS"]' -p eidos
cleos push action eidos issue '["eidos","1.0000 EIDOS","test"]' -p eidos
cleos set account permission eidos active '{ "threshold": 1, "keys": [ {"key":"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV","weight":1} ], "accounts":[ { "permission": { "actor": "eidos", "permission": "eosio.code" }, "weight": 1 } ] }' owner
使用eosforce帐户通过eosio.token合约向eidos帐户转帐
cleos push action eosio.token transfer '["eosforce","eidos","0.0001 TEST","get eidos"]' -p eosforce
查看eosforce在eosio.token和eidos上面的代币
cleos get table eosio.token eosforce accounts
{
"rows": [{
"balance": "100.0000 TEST"
}
],
"more": false
}
cleos get table eidos eosforce accounts
{
"rows": [{
"balance": "3108.4440 EIDOS"
}
],
"more": false
}
结束语
本文简单介绍了eidos合约的内容,以及如何通过eosio-web-ide部署eidos合约以及通过转帐在eidos合约上面进行挖矿的相关操作。eosio-web-ide是和方便的测试合约的工具,后续会对合约开发者有很大的帮助,EIDOS合约作为目前比较火的EOS链上的合约,有兴趣的可以读一下源码并在测试网上部署一下。