基于EOS的去中心化交易所

本文由【区块链研习社】优质内容计划支持,更多关于区块链的深度好文,请点击《区块链研习社》

请注意,本文是在EOS DAWN 2.0代币的。

exchange智能合约模拟的是交易所的功能,支持充值提现eos和currency,支持eos和currency之间的买卖,别有一番玩味。
值得注意的是,将currency token转到交易所,是使用了我们上节课讲到的currency智能合约,因为currency token是currency智能合约发行的,由它管理currency token的转账是必须的。

充值eos:往交易所充值eos。

$ eosc push message eos transfer '{"from":"inita","to":"exchange","amount":50, "memo":"imToken"}' --scope inita,exchange --permission inita@active

tips:充值只需要个人账户授权

提现eos:从交易所提现eos。

$ eosc push message eos transfer '{"from":"exchange","to":"inita","amount":50, "memo":"binance"}' --scope exchange,inita --permission exchange@active --permission inita@active

tips: 提现需要交易所账户和个人账户授权

至于为什么使用的是这个结构体(exchange.abi没有这个结构体),可以使用eosc查询abi文件:

$ eosc get code eos -a eos.abi
code hash: 0000000000000000000000000000000000000000000000000000000000000000
saving abi to eos.abi
$ cat eos.abi
  ...
  "structs": [{
      "name": "transfer",
      "base": "",
      "fields": {
        "from": "account_name",
        "to": "account_name",
        "amount": "uint64",
        "memo": "string"
      }
      ...

由于打印太多,我只摘取了transfer部分。
从上面可以看出,我们转账eos,其实使用了的是智能合约,也就是说eos代币本身也是用智能合约生成的

充值currency:往交易所充值currency

$ eosc push message currency transfer '{"from":"inita","to":"exchange","quantity":50}' --scope inita,exchange --permission inita@active

提现currency:往交易所提现currency

$ eosc push message currency transfer '{"from":"exchange","to":"inita","quantity":50}' --scope inita,exchange --permission exchange@active inita@active

值得注意的是,以上命令的格式取决于已经部署的currency.abi。因为exchange智能合约在转账currency时使用了currency.hpp中的currency名称空间。
如果currency.abi的transfer的格式是这样的

{
      "name": "transfer",
      "base": "",
      "fields": {
        "from": "account_name",
        "to": "account_name",
        "quantity": "currency_tokens"
      }
}

那么以上的充值命令需要改为:

$ eosc push message currency transfer '{"from":"inita","to":"exchange","quantity":{"quantity":50}}' --scope inita,exchange --permission inita@active

提现命令改为:

$ eosc push message currency transfer '{"from":"exchange","to":"inita","quantity":{"quantity":50}}' --scope inita,exchange --permission exchange@active inita@active

修改的理由参考我上一篇文章《EOS currency智能合约的那些坑》

如果按照EOS官方提供的代码,下买单或者卖单是不能成功的,需要修改一下几个地方:
1、修改exchange.hpp中bids、asks这两个table的定义,第4个参数原本是bids/asks,需要改成bid/ask,否则会报错

   TABLE2(bids,exchange,exchange,bid,bid,bids_by_id,order_id,bids_by_price,price);
   TABLE2(asks,exchange,exchange,ask,ask,asks_by_id,order_id,asks_by_price,price);

2、修改/usr/local/include/eoslib/token.hpp中struct price的operator *,

    friend BaseToken operator * ( const QuoteToken& b, const price& q ) {
      eosio::print( "b: ", b, " \n" );
      eosio::print( "operator* ", uint128(b.quantity), " * ", uint128( q.base_per_quote ), " / ", precision, "\n" );
      //return QuoteToken( uint64_t( mult_div_i128( b.quantity, q.base_per_quote, precision ) ) );
      //return BaseToken( uint64_t((b.quantity * q.base_per_quote) / precision) );
      return BaseToken( uint64_t(b.quantity * q.base_per_quote) );
    }

值得注意的是,price结构体有2个构造函数,exchange智能合约使用了第一个构造函数,如果使用第2个构造函数,那上面的*操作符就不需要修改了。

    /**
    * Default constructor.
    * Initialize base per quote to be 1.
    * @brief Default constructor.
    */
    price():base_per_quote(1ul){}

    /**
    * Construction for price given the base token and quote token.
    * @brief Construction for price given the base token and quote token.
    * @param base - base token
    * @param quote - quote token
    */
    price( BaseToken base, QuoteToken quote ) {
      assert( base  >= BaseToken(1ul), "invalid price" );
      assert( quote >= QuoteToken(1ul), "invalid price" );

      base_per_quote = base.quantity;
      base_per_quote *= precision;
      base_per_quote /= quote.quantity;
    }

这样就可以下买单或者卖单了。

下买单:

$ eosc push message exchange buy '{"buyer":{"name":"inita","number":5},"at_price":"1","quantity":5,"expiration":"2018-04-14T08:53:41","fill_or_kill":"0"}' -S exchange,inita -p inita@active

下卖单:

$ eosc push message exchange sell '{"seller":{"name":"initb","number":5},"at_price":"1","quantity":5,"expiration":"2018-04-14T08:53:41","fill_or_kill":"0"}' -S exchange,initb -p initb@active

取消买单:

$ eosc push message exchange cancelbuy '{"name":"inita","number":5}' -S inita,exchange -p inita@active

取消卖单:

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

推荐阅读更多精彩内容