博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EOS智能合约存储实例讲解
阅读量:6787 次
发布时间:2019-06-26

本文共 2121 字,大约阅读时间需要 7 分钟。

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
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
(); auto tuple = load_record_tuple
: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&params)const;
利用这个开发者就能读取到合约目前的所有状态,开发自己的钱包了。

总结:

EOS.IO发布的版本已经提供了开发智能合约的基本API,本次从数据库到持久化方法介绍了EOS智能合约的数据库API。
基于这些API,开发者就可以开发出自己的钱包。

转载于:https://www.cnblogs.com/tokenpai/p/9207237.html

你可能感兴趣的文章
谈Docker安全合规建设
查看>>
LR中的关联
查看>>
nginx配置php连接
查看>>
调整状态学会放下与五月份的个人计划
查看>>
Oracle中如何将姓名中有空格的字段更新成没有空格的?
查看>>
OpenStack主要逻辑模块–Keystone身份验证服务
查看>>
Java中ConcurrentHashMap的实现
查看>>
如何从零开始学习hadoop?
查看>>
有关tomcat的性能调优【待完善】
查看>>
QA和软件测试员的区别
查看>>
windows 批处理常用指令 -- 持续更新
查看>>
Jenkins+Shell+Docker实现自动化CI/CD发布Java项目
查看>>
【转】Java经典问题:传值与传引用?
查看>>
xp扩容C盘后盘符丢失的资料怎么找到
查看>>
CVE-2017-12617
查看>>
SSH管理服务
查看>>
废旧行业迎来春天 环保部重启绿色GDP研究
查看>>
监控——JVM监控安装
查看>>
Working with System Properties
查看>>
为什么我墙裂建议大家使用枚举来实现单例
查看>>