EOS [从零开始 DAPP 开发] 08 - DAPP 业务逻辑合约开发:每日签到领币

pendingauth · 2019年07月09日 · 18 次阅读

本文转载自币乎,作者松果,原文链接: https://bihu.com/article/1319895774

这篇文章开始进行微文DAPP的业务逻辑智能合约(weiwendappss)的开发,注意,Web前端界面的开发在EOS智能合约开发和测试完成后才进行。

EOS合约开发流程

EOS智能合约的开发过程中,需要不断地使用print函数调试代码,并重新编译/部署合约,因此需要多个运行环境来开发,一般的开发和部署流程是这样的:

本地调试合约代码 -> 测试网试运行 -> 主网部署

EOS智能合约基本都会使用multi_index表,如果修改了multi_index表的数据结构,且修改前表中已经有数据了,下次访问multi_index表会报如下错误:

Error 3050003: eosio_assert_message assertion failure

解决方法是使用erase函数删除使用旧表结构的数据,再重新添加数据。

因此,multi_index表的设计要求开发者必须事先周全地考虑需求,尽量避免出现修改已经存有大量数据的表结构的情况;

如果实在避免不了,还可以写一个处理程序,读取旧数据表中的数据,写入到新数据表,数据转移完成后删除旧数据表中的数据。

每日签到领币

weiwendappss合约的第一个业务逻辑是每日签到领币:

每个用户每天可领一次WEI,越早参与领取越多;
前30天,随机领取10000~50000WEI;
第31-120天,随机领取5000~20000WEI;
第121-360天,随机领取2000~10000WEI;
第360天以后,随机领取1000~5000WEI;

每天领取的代币数量是一个随机数,使用上一篇文章中的随机数生成器来生成。

一般一个业务逻辑就对应EOS智能合约的一个Action,下面把每日签到领币的业务逻辑封装到weiwendappss::reward这个Action中,代码如下:

ACTION reward(name account){
  require_auth(account);

  user_t users(_self, _self.value);    
  auto itr = users.find(account.value);

  if(itr == users.end()){
    itr = users.emplace(account, [&](auto& user){
      user.account = account;
      user.balance = asset(0, TOKEN_SYMBOL);
      user.follow_num = 0;   
      user.fans_num = 0;             
      user.post_num = 0;              
      user.like_num = 0;              
      user.last_reward_time = time_point_sec();
      user.last_like_time = time_point_sec();  
      user.like_times = 0;             
    });
  }

  if(!is_today(itr->last_reward_time.sec_since_epoch())){
    auto tokens = asset(get_reward(account)*10000, TOKEN_SYMBOL);
    issue_token(tokens);

    users.modify(itr, account, [&](auto& user){
      user.last_reward_time = time_point_sec(current_time_point()); 
      user.balance += tokens;
    }); 
  }
}

这个Action同时完成用户信息的创建,第一次调用此Action时,会把EOS用户的信息记录到合约的multi_index数据表中;

然后判断用户当天是否领过币,如果没有领过,则获取一笔随机数量的WEI代币。

issue_token函数用于发行WEI代币,定义如下:

void issue_token(asset quantity){
  action(
    permission_level{get_self(),"active"_n},
    "weiwentokens"_n,
    "issue"_n,
    std::make_tuple(get_self(), quantity, std::string("issue token"))
  ).send();
}

构造并发送了一个内联Action,调用了weiwentokens合约的issue Action发行指定数量的代币。

因为调用了内联Action,需要给调用账户授予“合约名@eosio.code”权限,这里调用账户和合约账户都是weiwendappss,可以使用简化版命令授权:

cleos set account permission weiwendappss active --add-code

更多关于内联Action的内容可以看这篇文章,更多签到领币的实现细节点击源码查看。

测试

EOS智能合约的调试都是在本地环境进行的,一边写一边测试。

先测试使用bob账户调用reward Action:

cleos push action weiwendappss reward '["bob"]' -p bob

连续调用两次,可以看到bob第一次随机领取到了18219个WEI,第二次调用时,没有内联调用weiwentokens::issue来发行代币:

为了方便管理,用户领取的代币只是存在usertable表的一条记录:

WEI代币实际分发到了合约账户weiwendappss中:

大部分DAPP都是采用这种通证管理模式,就需要提现功能,让用户可以把代币提现到自己的EOS账户;

因此合约中还需要这两个Action:提现(withdraw)和充值(deposit),把它们放到下一篇文章中来实现。

Tips

项目代码在Github同步更新:https://github.com/songguo6/weiwen-dapp

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册