武侠小说中的群豪们似乎总不缺钱,经常有台词就是小二来两斤熟牛肉、两斤烧酒,不用找了,难道他们都这么有钱的么?熟悉金庸小说《鹿鼎记》的朋友应该对狗官吴之荣还有些印象,庄允城在书中给他夹了若干金叶子。金叶子直接花出去不太方便,需要兑换成银子再进行消费,那么,这个用金叶子换碎银的过程是怎么实现的呢,兑换的比例又有谁来决定呢,兑换的过程中收不收手续费呢,今天我们就以eos智能合约的方式来简单的介绍下金叶子换碎银的一个过程。

eso的合约中包含有一个名为exchange的智能合约,关于该合约的功能及实现,在/contracts/exchange的exchange.hpp注释中都有简单的说明:

本合约可以让用户在任意对标准货币形式间进行交换。交易创建完成之后,创建人有一个初始份额,且交换双方是进行等值交换的。为了防止因四舍五入造成的误差,在创建的时候初始化金额中应该包含有相当数量的基础货币和报价货币,且交易所应持有最大初始存款数量的100倍。用户若要进行交易,必须先抵押一部分自己的资产在这个合约中,一旦这个交易执行,一种新的货币就创建了且对应的货币交易商也会产生。被创建的货币符号应该是唯一的,我们使用货币管理表来管理这些货币符号。

在eos提供的exchange智能合约中提供了一个测试的例子test_exchange.cpp,下面我们就根据这个例子来实现金叶子兑换碎银。Exchange智能合约中包含有exchange_accounts、exchange_state、market_state、exchange四个类,分别实现了关于交易账户、交易状态、市场状态以及交易的过程。其中exchange依赖于market_state,而market_state又依赖于前面两个类。我们从main入手,可以看到首先定义了一个Exchange_state类型的state变量,那么这个结构体是做什么用的包含了哪些内容呢?

state中包含了发行量,本次交易碎银发行量为10000。Symbol即货币类型,本次交易的类型中包含了GL(金叶子)和BS(碎银)两种类型。以及两个连接器类型的基础账户和报价账户,一个交易函数transfer,一个存放了货币类型及余额的key值的map表,同时存放了利润相关的容器。

这两个连接器类型的结构体变量包含了账户的余额,账户中货币类型的权重(初始化为50%),发行商提供的发型金额、已贷金额、剩余可贷金额、利息池等。在convert结构体重实现了以下三个函数:

初始化state的时候,将发行量设置为10000,GL和BS的初始化金额分别为100,同时设置两种货币的权重,初始化完成之后,打印出这个state如下图

官方给test_exchange中做了诸多对convert函数的操作,具体如下:

咱们化繁为简,只对state进行一次convert操作(其实,源码中是有只进行一次的操作,只不过注释掉了,我们就使用注释掉的代码),执行如下操作:

这个convert进行了什么操作呢?就是吴之荣这个狗官去拿着金叶子去兑换碎银子去了,在convert这个函数中首先对传入的各个参数进行和合法性的判断,如传入金额,账户类型的判断等,在这些判断完成之后开始进行convert_to_exchange的操作.

这里,系统设置了一个默认的货币类型"EXC",当你要操作的货币类型不是这个默认货币类型EXC的时候,要么是base账户的货币类型,要么是quote的货币类型,也就是非这两种货币类型的,我们不再继续进行处理.当传入货币类型为其中之一的时候,执行convert_to_exchange的操作.现在我们传入的是金叶子的货币类型:

在convert_to_exchange中进行了一系列的数学计算,具体计算过程及结果不再赘述,各位方便的话可以边调试边看这些数学计算分别实现了什么(同样的适用于convert_from_exhcange也是如此):

调试过程中,各个变量的变化如下:

所有的这些都执行完成之后,我们new_state的结果就会打印出来:

通过对比,我们知道吴之荣这个狗官拿着10个金叶子换了21.3696个碎银,从图中也可以看到base账户上多了10个金叶子,而吴之荣的账户上少了十个金叶子而多了相应的碎银.至此,一个通过eos智能合约的方式完成了吴之荣拿金叶子换碎银的整个过程实现了.

另外,exchange.cpp中实现了一部分通过一种货币兑换另一种货币的方式,包括借贷/还贷等内容,但在这个test_exchange中并未被调用,因此不做展开分析,有需要的同学,可以加我微信一起来讨论.

长按以下二维码,关注本公众号,一起学习eos开发.

微信公众号

有任何疑问或者指教请添加本人个人公众号,当然有对eos开发感兴趣或者金庸粉的也可以添加,备注eos开发或金庸,拉你进群一起交流

个人微信帐号

eos源码赏析(六):EOS智能合约入门金叶子兑换碎银相关推荐

  1. eos源码赏析(十二):EOS之从“狼人游戏”看智能合约调用及权限分配(下)

    接上篇,本篇从智能合约内部权限使用出发,结合"狼人游戏"源码,谈谈eosio中权限的分配及使用,本文主要分为以下三部分: 狼人团队的声明探析 多签名账户 权限eosio.code的 ...

  2. eos源码赏析(五):EOS智能合约入门之无崖子传功虚竹

    读过<天龙八部>小说或者看过<天龙八部>影视剧的朋友们对无崖子将自己毕生功力传给虚竹都应该不算陌生.我们平时在了解或者熟悉基于各种语言或环境的智能合约开发的时候都不可避免的接触 ...

  3. eos源码赏析(二十三):默克尔树在EOS中的应用(上)

    前面文章中在分析push_transactioneos源码赏析(二十):EOS智能合约之push_transaction的天龙八"步"以及区块签名eos源码赏析(二十一):EOS智 ...

  4. eos源码赏析(十一):EOS之从“狼人游戏”看智能合约调用及权限分配(上)

    火了没几天的"狼人游戏"因某些原因遭到口诛笔伐而下线,后期参与的玩家可谓损失惨重,而这一切的操盘仿佛都指向一个并不算匿名的匿名团队,毕竟在区块链上任何动作的执行都是可追溯的.该游戏 ...

  5. [EOS源码分析]1.EOS源码编译运行

    本文所有实践都是基于EOS dawn-v4.1.0,请切到该分支然后实践 切换命令:git checkout dawn-v4.1.0 目前网络上都是针对老版EOS2.0源码编译的文章,我在mac上参考 ...

  6. [EOS源码分析]4.EOS源码调试

    在[EOS源码编译运行]一文已经详细描述了EOS源码编译.但是阅读代码,光跑代码是不够的,必须要可以调试.一搜发现网上没有相关的文章,只好自己探索折腾.不过很快发现其实EOS已经为我们做好了的,只需带 ...

  7. [EOS源码分析]7.EOS智能合约开发实践之合约调用合约(inline action)

    首先,目前dawn-4.1, dawn-4.2使用inline action是会报如下错误 transaction declares authority '{"actor":&qu ...

  8. [EOS源码分析]6.EOS特殊智能合约eosio

    这里说的eosio智能合约不是泛指eos的智能合约,它是一个特殊的具体的合约.它本事可大了,我们一起来看看它有哪些功能 负责智能合约部署 大家有注意到如下红色字体的log吗 $ cleos set c ...

  9. [EOS源码分析]5.EOS编写HelloWorld智能合约及各种坑

    本文所有实践都是基于EOS dawn-v4.1.0,请切到该分支然后实践 切换命令:git checkout dawn-v4.1.0 HelloWorld源码 #include <eosioli ...

最新文章

  1. hive mysql 远程_ubuntu中为hive配置远程MYSQL database
  2. acm算法模板(1)
  3. pylucene构建索引_pyLucene
  4. 大数据WEB阶段 Js常用的页面操作
  5. 微服务配置中心实战:Spring + MyBatis + Druid + Nacos
  6. python概率密度函数参数估计_EM算法求高斯混合模型参数估计——Python实现
  7. 批处理启动vm虚拟机服务 vm12启动无界面启动vm虚拟机系统 windows上如何操作服务 sc net启动关闭服务...
  8. 二、Linxu的目录结构
  9. Oracle SQL存储过程结构、异常处理示例
  10. snprintf与sprintf的区别
  11. MySQL学习(五、数据操作语言DML和事务处理语言TCL)
  12. laravel mysql 悲观锁_Laravel中悲观锁 乐观锁的使用
  13. DevExpress ChartControl 绘制圆滑曲线
  14. 空天地一体化无线光通信网络关键技术及其发展趋势
  15. 自制hdmi线一头改vga图_最全VGA、DVI、PS/2、USB等接头详解焊接方法
  16. 全面解析《嵌入式程序员应该知道的16个问题》
  17. docker镜像与容器基本的基本操作
  18. Linux中vsftpd服务配置(匿名,用户,虚拟用户)
  19. 分布式存储系统 之 数据备份
  20. 【贪心】Bin Packing

热门文章

  1. [ubuntu] 外挂硬盘
  2. 内审员和外审员哪个含金量高一点?
  3. JS强制类型转换和隐式类型转换
  4. 关于amd64和ia64的理解
  5. CSDN 永远的神.gif
  6. 【个性化推荐系统】推荐算法
  7. popstate_操纵浏览器历史记录--popstate() history.pushState()
  8. PostgreSQL 自旋锁浅析
  9. linux 下制作fat32文件系统的命令
  10. 名悦集团董车长1.0,一站式租车服务平台