如何使用eosio-web-ide发布一个eidos代币

最近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 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
  • 加载对应的合约,加载eidos合约

cd /workspace/eosio-web-ide/contract/eidos 
cleos set contract eidos ./token/
  • 加载eosio.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链上的合约,有兴趣的可以读一下源码并在测试网上部署一下。

Last updated

Was this helpful?