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

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

点击查看更多区块链技术干货.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 学习区块链,最刺激的莫过于发币,第一篇文章里介绍了如何搭建EOS开发环境,第二篇文章我们已经介绍了如何部署调用合约...
    P叔阅读 4,987评论 5 6
  • 1 EOS智能合约的介绍1.1 所需背景知识1.2 EOS智能合约基础知识1.3 技术局限性 2 智能合约文件2....
    cenkai88阅读 30,994评论 5 28
  • extern用在不导入头文件,又想调用其他文件的全局变量或函数 只要被static修饰了,那么其他文件就算导入头文...
    even林0阅读 641评论 0 0
  • 去年暑假,实验室和中国联合航空公司签了一个合同,由我们帮他们做一套旅游网站。现在项目已经上线数月,前一阵联航那边人...
    时芥蓝阅读 1,774评论 0 6
  • 从报名薛兆丰老师的北大经济学课开始,掐指一算有8个月了。每天虽然只有10分钟的课程,没有感觉出什么,等到复盘课的时...
    乐得其说阅读 1,035评论 9 3

友情链接更多精彩内容