2019-05-15

#include <eosio/eosio.hpp>

#include <eosio/asset.hpp>

#include <eosio/transaction.hpp>

#include <eosio/crypto.hpp>

#include <eosio/time.hpp>

#include <eosio/system.hpp>

#include <eosio/print.hpp>

using namespace eosio;

using namespace std;

CONTRACT pvpbetwallet : public contract {

  public:

      using contract::contract;

      pvpbetwallet( name receiver, name code, datastream<const char*> ds )

        : contract(receiver, code, ds), boardtable(receiver, receiver.value), bettable(receiver, receiver.value) {}

      ACTION transfer(name from, name to, asset quantity, string memo);

      ACTION reveal(const uint64_t &table_id, const checksum256 &seed);

      ACTION send(const int &index, const name &winner, const uint64_t &table_id);     

        // EOSIO network

    const string symbol_name = "EOS";

    // Contract network

    const symbol network_symbol = symbol(symbol_name, 4);

    const name & lord  = name("suwzhaoihuan");

    const name & wallet = name("pvpbetwallet");


    const int values[16][3] = {

        {1000, 1960, 40},

        {1960, 3840, 80},

        {3840, 7520, 160},

        {7520, 14720, 320},

        {14720, 28800, 640},

        {28800, 56320, 1280},

        {56320, 110080, 2560},

        {110080, 215040, 5120},

        {215040, 419840, 10240},

        {419840, 819200, 20480},

        {819200, 1597440, 40960},

        {1597440, 3112960, 81920},

        {3112960, 6062080, 163840},

        {6062080, 11796480, 327680},

        {11796480, 22937600, 655360},

        {22937600, 44564480, 1310720}

    };

    time_point next(){

        return current_time_point() + seconds(360);

    }


    int findIndex(asset quantity){

        for (int i = 0; i < 16; i++){

            if (quantity.amount == values[i][0]){

                return i;

            }

        }

        check(false, "quantity index not found");

    }

    void split(const std::string &s, vector<std::string> &v, const std::string &c){

        std::string::size_type pos1, pos2;

        pos2 = s.find(c);

        pos1 = 0;

        while (std::string::npos != pos2){

            v.push_back(s.substr(pos1, pos2 - pos1));

            pos1 = pos2 + c.size();

            pos2 = s.find(c, pos1);

        }

        if (pos1 != s.length()){

            v.push_back(s.substr(pos1));

        }

    }

TABLE board_table {

            // 仅有一条记录

            uint64_t id;

            // 登顶时间

            time_point top_time;

            // 目前积累的奖赏

            asset pool;

            // 当前头部用户

            name player_name;

            // 头部用户投注额分红后进行减半操作

            asset quantity;

            // 进行下次分红的时间。

            time_point next_time;


            uint64_t primary_key() const { return id; }

          };

          // typedef eosio::multi_index<N(表名),表的对象类型> 实例化变量名

          typedef eosio::multi_index<"boardtablea"_n, board_table> board_tables;

        TABLE bet_table {

            // 桌子的标识

            uint64_t id;

            // 有效时间

            time_point valid_time;

            // 投注额

            asset quantity;

            // 桌子的哈希

            checksum256 table_hash;

            // 玩家1名称

            name p1_name;

            // 玩家2名称

            name p2_name;

            // 玩家1哈希

            checksum256 p1_hash;

            // 玩家2哈希

            checksum256 p2_hash;

            // 桌子的种子

            checksum256 table_seed;

            // 玩家1种子

            checksum256 p1_seed;

            // 玩家2种子

            checksum256 p2_seed;


            uint64_t primary_key() const { return id; }

          };

          typedef eosio::multi_index<"bettablea"_n, bet_table> bet_tables;


      using transfer_action = action_wrapper<"transfer"_n, &pvpbetwallet::transfer>;

      using reveal_action = action_wrapper<"reveal"_n, &pvpbetwallet::reveal>;

      using send_action = action_wrapper<"send"_n, &pvpbetwallet::send>;


      board_tables boardtable;

  bet_tables bettable;

};

ACTION pvpbetwallet::transfer(name from, name to, asset quantity, std::string memo){

  if (from == lord){

    // 补充能量

    return;

  }


  require_auth(_self);

  eosio::check(from != to, "cannot transfer to self");

  eosio::check(_self == to, "must transfer to this contract");

  eosio::check(memo.size() <= 256, "memo must smaller than 256");

  eosio::check(quantity.symbol == eosio::symbol("EOS", 4), "only accepts EOS");

  eosio::check(quantity.is_valid(), "invalid token transfer");

  int index = pvpbetwallet::findIndex(quantity);

  eosio::check(-1 != index, "quantity not found");

  // composed by user_id-table_hash-user_hash-user_seed-player_hash

  std::vector<std::string> memos;

  pvpbetwallet::split(memo, memos, "-");

  std::string user_id = memos[0];

  std::string table_hash = memos[1];

  std::string user_hash = memos[2];

  std::string user_seed = memos[3];

  std::string player_hash = memos[4];

  // 调试

  eosio::print("user_id:" + memos[0]);

  eosio::print("table_hash:" + memos[1]);

  eosio::print("user_hash:" + memos[2]);

  eosio::print("user_seed:" + memos[3]);

  eosio::print("player_hash:" + memos[4]);

// 验证给定数据和其sha256哈希值是否匹配

//void assert_sha256( const char* data, uint32_t length, const eosio::checksum256& hash );

  // 选手需要检查user_hash为user_seed生成。

  //const char* seed_sha256 = const_cast<char*>(user_seed.c_str());

  eosio::assert_sha256(user_seed.c_str, std::strlen(user_seed), user_hash);

  auto player_id = atoi(user_id.c_str);

  auto table_id = player_id / 2;

  // bet_tables bets(_code, _code.value);

  auto bet = bets.find(table_id);

  if (bet == bets.end()){

    bets.emplace(_self, [&](auto &bet) {

        bet.id = table_id;

        bet.valid_time = eosio::current_time_point() + 180000;

        bet.quantity = quantity;

        bet.table_hash = table_hash;

        bet.p1_name = from;

        bet.p1_hash = user_hash;

        bet.p2_hash = player_hash;

        bet.p1_seed = user_seed;

    });

  }else{

    // 选手需要检查user_hash为user_seed生成,

    // 同时检查p1_hash与player_hash相等,同时检查p2_hash与user_hash相等,

    // 同时检查table_hash与数据库的table_hash相等,同时检查数量相等。

    eosio::check(bet->valid_time >= eosio::current_time_point(), "time expired");

    eosio::check(quantity.amount == bet->quantity.amount, "must equal quantity");

    eosio::check(player_hash == bet->p1_hash, "must match player hash");

    eosio::check(user_hash == bet->p2_hash, "must match user hash");

    eosio::check(table_hash == bet->table_hash, "must match table hash");

    bets.modify(bet, _self, [&](auto &bet) {

        bet.p2_name = from;

        bet.p2_seed = user_seed;

    });

  }

}

ACTION pvpbetwallet::reveal(const uint64_t &table_id, const eosio::checksum256 &seed){

}

ACTION pvpbetwallet::send(const int &index, const name &winner, const uint64_t &table_id){

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • yun'zudict: python的dict是字典dictionary,其他语言中为map,有键和值。 还要注意...
    每日派森阅读 246评论 0 0
  • 学习区块链,最刺激的莫过于发币,第一篇文章里介绍了如何搭建EOS开发环境,第二篇文章我们已经介绍了如何部署调用合约...
    P叔阅读 4,710评论 5 6
  • 灞河是发源于秦岭的一条河,是“八水绕长安”中的八水之一,灞河古称滋水,春秋时秦穆公不断向外扩张,称霸西戎后改名霸水...
    长安行阅读 1,233评论 0 1
  • 三个八小时,上班时间可以把工作外接硬盘整理记录下来,随时清空更新记录;下班时间很多时候被琐事和惰性占据,上下班路上...
    曲同宁阅读 199评论 4 0