EOS智能合约存储实例讲解
EOS智能合约存储实例
智能合约中的基础功能之一是token在某种规则下转移。以EOS提供的token.cpp为例,定义了eos token的数据结构:typedef eos::token<uint_t,N(eos)>Tokens;
以Currency合约为例。该合约中,也用类token模板类生成了代币currency:typedef eos::token<uint_t,N(currency)>CurrencyTokens;
有了 eos token和我们发行的子代币,我们就能编写智能合约,让用户使用不同的代币进行交易。在currency.cpp或者exchange.cpp中,eos实现了发行代币、代币流通、兑换功能。
struct Transfer{
AccountName from;
AccountName to;
Tokens quantity;
};
这样,在转账时,调用currency.cpp中实现的api传入Transfer结构表明想要转账的token数量:
Transfer MeToYou;
MeToYou.form=N(Me)
MeToYou.to=N(You)
MeToYou.quantity=Tokens(100);
当eos合约处理接受到这样的请求时,会调用相关流程完成对应token的处理。
void apply_transfer(const Transfer& transfer){
auto from=getAccount(transfer.from);
auto to =getAccount(transfer.to);
from.banlance-=transfer.quantituy;
to.banlance+=transfer.quantituy;
assertion storeAccount(transfer.from,from);
storeAccount(transfer.to,to);
}
最终存储结果将保存到沙盒的内存中。
EOS智能合约数据库的持久化
在沙盒机制中,当我们运行一个合约、发行一个代币时,EOS为我们提供的一些基础运行框架。其中最重要的两个:第一,实现了平台无关的account存储机制;第二,提供了一个account间结算的业务平台。同时EOS会将沙盒里面的数据存储接口存储在具体物理设备上来,实现数据的持久化。
在chain/wasm_interface.cpp中,对接了wasm的context,并使用context获取到db.php中实现的数据存储接口,然后将这些接口实现到了message_handing_contexts.hpp中。
这样后面的处理流程就比较清晰了。当合约在读取数据时,将调用message_handing_contexte.hpp中的load_record接口:
template<typename IndexType,typename Scope>
int32_t load_record(Name scope,Name code,Name table,typename IndexType::value_type::key_type* keys,char* value,unit32_t valuelen){
const auto& idx=db.get_index<IndexType,Scope>();
auto tuple = load_record_tuple<typename IndexType::value_type,Scope>:get(scope,code,table,keys);
auto itr =idx.lower_bound(tuple);
上面load_record代码中,调用了db.get_index方法,此处的db也就是chainbase/chainbase.hpp 中实现的database类。database中使用了boost的managed_mapped_file,实现了对数据的存储和读取的接口。
}
在EOS提供的插件plugins/chain_plugin/chain_.php中提供了一种从数据库读取table的方法
get_table_rows_result get_table_rows( const get_table_rows_params¶ms)const;
利用这个开发者就能读取到合约目前的所有状态,开发自己的钱包了。
总结:
EOS.IO发布的版本已经提供了开发智能合约的基本API,本次从数据库到持久化方法介绍了EOS智能合约的数据库API。
基于这些API,开发者就可以开发出自己的钱包。
EOS智能合约存储实例讲解的更多相关文章
- EOS智能合约授权限制和数据存储
EOS智能合约授权限制和数据存储 在EOS合约中,调用合约需要来自账户的授权,同时还要指定需要调用的动作.当然,有的合约并不是所有账户都可以调用的,这就需要用到授权限制.接下来我们就来看看如何限制合约 ...
- eos 智能合约开发体验
eos编译安装 eos 特性 数据存储 eos投票智能合约开发 eos投票智能合约部署测试 注意避坑 eos编译安装 ERROR: Could not find a package configura ...
- 【精解】EOS智能合约演练
EOS,智能合约,abi,wasm,cleos,eosiocpp,开发调试,钱包,账户,签名权限 热身 本文旨在针对EOS智能合约进行一个完整的实操演练,过程中深入熟悉掌握整个EOS智能合约的流程,过 ...
- Go-Ethereum 1.7.2 结合 Mist 0.9.2 实现代币智能合约的实例
目录 目录 1.什么是 Mist 2.Mist 在哪里下载? 3.Mist 有哪些依赖? 4.如何安装 Mist? 4.1.安装 Mist 依赖工具包 4.2.安装 Mist 4.3.启动 Mist, ...
- EOS智能合约开发(四):智能合约部署及调试(附编程示例)
EOS智能合约开发(一):EOS环境搭建和创建节点 EOS智能合约开发(二):EOS创建和管理钱包 EOS智能合约开发(三):EOS创建和管理账号 部署智能合约的示例代码如下: $ cleos set ...
- EOS智能合约开发(三):EOS创建和管理账号
没有看前面文章的小伙伴可以看一下 EOS智能合约开发(一):EOS环境搭建和启动节点 EOS智能合约开发(二):EOS创建和管理钱包 创建好钱包.密钥之后,接下来你就可以创建账号了,账号是什么?账号保 ...
- EOS智能合约开发(二):EOS创建和管理钱包
上节介绍了EOS智能合约开发之EOS环境搭建及启动节点 那么,节点启动后我们要做的第一件事儿是什么呢?就是我们首先要有账号,但是有账号的前提是什么呢?倒不是先创建账号,而是先要有自己的一组私钥,有了私 ...
- EOS 智能合约编写(一)
本文编写了一个简单的EOS智能合约,实现用户管理和资产管理,包括存钱,取钱,转帐的功能,旨在学习如何编写自己的EOS合约功能. 系统:Ubuntu EOS版本:v1.1.1 一.智能合约代码 ...
- eos智能合约与主进程交互
eos智能合约与主进程交互 1.启动wasm 参考eos智能合约执行流程.md 2.智能合约调用主进程api 如何实现wasm代码与eos宿主交互还需要摸索! 大致:在wasm_interface.c ...
随机推荐
- 【原创】Python第二章——标识符命名规则
在Python中,一切都是对象,包括常量数据类型,如整数数据类型(1,2,3...),字符串数据类型("ABC").想要使用这些对象,就要使用它的对象引用.赋值操作符,实际上是使得 ...
- Go内建函数copy
Go内建函数copy: func copy(dst, src []Type) int 用于将源slice的数据(第二个参数),复制到目标slice(第一个参数). 返回值为拷贝了的数据个数,是len( ...
- Perl的子程序
子程序(subroutine) perl中的子程序其实就是自定义函数.它使用sub关键字开头,表示声明一个子程序 子程序名称有独立的名称空间,不会和其它名称冲突 Perl中的子程序中可以定义.引用.修 ...
- 被遗忘的C结构体打包技术
今天看到的一篇文章,记录一下:https://github.com/ludx/The-Lost-Art-of-C-Structure-Packing 失传的C结构体打包技艺 作者:Eric S. Ra ...
- [转]windows 10 搭建angular开发环境
本文转自:https://www.cnblogs.com/lilunpai/articles/7992538.html 一.环境介绍 1.开发环境:Windows10 2.开发ide工具:VS cod ...
- SQL语句NOT IN优化之换用NOT EXISTS
NOT IN查询示例(示例背景描述:根据条件查询Questions表得到的数据基本在PostedData表中不存在,为完全保证查询结果在PostedData表中不存在,使用NOT IN): SET S ...
- ASP.NET MVC 学习笔记-7.自定义配置信息(后续)
自定义配置信息的高级应用 通过上篇博文对简单的自定义配置信息的学习,使得更加灵活的控制系统配置信息.实际项目中,这种配置的灵活度往往无法满足项目的灵活度和扩展性. 比如,一个配置信息有三部分组成,而每 ...
- .net Core使用Orcle官方驱动连接数据库
最近在研究.net Core,因为公司的项目用到的都是Oracle数据库,所以简单试一下.net Core怎样连接Oracle. Oracle官方现在已经提供.net Core的官方驱动(预览版),也 ...
- [android] 测试的相关概念
/********************2016年5月4日 更新********************************/ 知乎:如何专业地进行黑盒测试? 之前遇到过有些黑盒测试人员,感觉他 ...
- 小兔的棋盘(hdu2067)
小兔的棋盘 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...