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 ...
随机推荐
- golang写业务代码,用全局函数还是成员函数
在golang中,函数划分为全局函数和成员函数,在使用的时候,有种情况,会产生一些疑惑的,就是在写业务代码的时候,使用全局函数好像会比较方便,一般业务代码,都不会复用,都是针对特定的业务进行编程,要复 ...
- Build a Machine Learning Portfolio(构建机器学习投资组合)
Complete Small Focused Projects and Demonstrate Your Skills (完成小型针对性机器学习项目,证明你的能力) A portfolio is ty ...
- sed修炼系列(二):sed武功心法(info sed翻译+注解)
sed系列文章: sed修炼系列(一):花拳绣腿之入门篇sed修炼系列(二):武功心法(info sed翻译+注解)sed修炼系列(三):sed高级应用之实现窗口滑动技术sed修炼系列(四):sed中 ...
- html中的Session
采用setItem()方法存储 sessionStorage.setItem('testKey','这是一个测试的value值'); // 存入一个值sessionStorage.getItem('t ...
- C# XML入门
什么是XML? XML:可扩展标记语言. XML的作用: 纯文本,兼容性强. 和HTML的区别: xml: 主要用来处理.存储数据.无规定标签,可扩展. html:对数据的显示和描述. 语法标签固定. ...
- C#调用C++(QT5.5.1项目)的C++/CLI(CLR项目)项目技术笔记
导航 1.编译环境 2.项目配置 1.设置附加包含目录 2.设置附加库目录 3.设置附加依赖项 3.CLR中各种定义 1.接口定义 2.类定义 3.枚举定义 4.属性定义 4.CLR中各种使用 1.类 ...
- IIS发布网站 报错500.19 错误解决过程记录
首先先报上我的环境 WindowsServer 2012 IIS 8.5 网站是FrameWork 4.0 发布网站后浏览,报错信息如下: 解决过程记录如下: 1.看到这个问题首先想到的是权限问题,设 ...
- Core知识整理
概述 Commond-Line ASP.NET结构文件 Startup 配置文件 中间件和依赖注入 依赖注入原理 框架自带的依赖注入(IServiceCollection) 依赖注入生命周期 依赖注入 ...
- [PHP] 算法-顺时针打印矩阵的PHP实现
1.行数和列数取出来row,col,圈数就是 (较小值-1)/2+1 2.外层循环控制圈数,内层四个for循环,i 3.第一个for循环,从左到右,j=i;j<col-i;j++;j<; ...
- P、NP、NPC、NP-Hard问题到底是何方神圣?
最近在做一个求解有向图中回路的问题,老师说求解图中全部回路是一个NP难问题.突然想到P.NP.NPC.NP-hard的描述一致不是很清楚,所以又学习了一下. 在解释这四个概念之前,我们需要先知道两个问 ...