EOSIO源码分析 - 给CDT增加eosio的fc开发库

为什么选择FC库

fc库是eosio中实现的C++反射机制的代码,通过这套机制,您可以极大的提高您的开发效率,他有如下优点:

  • 跨平台,支持linux和windows,可以轻松加入到您的开发工程
  • 代码简洁,便于修改移植,可以方便的编译成静态库,可执行程序,甚至wasm字节码
  • 和EOSIO合约代码天然融合,更方便移植进入eosio合约开发库
  • 合约参数可以使用json实现,极大扩展了合约参数的灵活性,也方便其他语言的对接

需要修改和移植的文件

fc  ----- fc库文件夹
    |-----include:头文件夹
        |-----reflect:反射定义文件
        	|-----reflect.hpp
        	|-----typename.hpp
        	|-----variant.hpp
		|-----json_relaxed.hpp:json解析定义
		|-----json.hpp:json解析头文件
		|-----utf8.hpp:utf8编码
		|-----utility.hpp:通用方法定义
		|-----variant_object.hpp:变体类型定义
		I-----variant.hpp:编译类型定义
	|-----src
		|-----json.cpp:json解析实现
		|-----utf8.cpp:utf8编码
		|-----utility.cpp:通用方法实现
		|-----variant_object.cpp:变体定义实现
		|-----variant.cpp:变体对象实现
修改要点
  • 按照合约要求处理代码中出现的异常,断言
  • 移植文件,精心必要的头文件路径修改

使用举例

反射定义

namespace eosio{
	class token{
		struct [[forest::table("accounts")]] accounts_object {
         std::string       account;
         uint64_t          amount_int;
         uint64_t          amount_fract;
      };
	}
}
FC_REFLECT( eosio::token::accounts_object, (account)(amount_int)(amount_fract) );

发射使用

  • 将json字符串转化成variant对象
auto var = fc::json::from_string(json_str);
  • 将variant对象unpack成具体的定义对象
auto balance = var.as<eosio::token::accounts_object>();
  • 集合起来使用如下
auto var = fc::json::from_string(json_str);
check( var.get_object().contains("from"), "invalid params(from)");
check( var.get_object().contains("to"), "invalid params(to)");
check( var.get_object().contains("quantity"), "invalid params(quantity)");
check( var.get_object().contains("memo"), "invalid params(memo)");

eosio::token::accounts_object balance;			// 定义一个accounts_object对象balance
balance.account = "demo001";
balance.amount_int = 100;
balance.amount_fract = 0;
auto packed_data = fc::raw::pack(balance);	//将对象balance进行pack,得到压缩bytes类型的压缩数据
auto json_data = fc::json::to_string(balance);//将对象balance进行json编码,得到json字符串

总结

  • 关于fc库中json解析,pack,unpack的更多用法与实现可以学习eosio的源代码
  • 本例子中只移植了fc中json解析相关的代码,如果要移植其他功能,读者可以自行学习
  • 使用fc库后,编译出来的wasm体积要明显增大,会增加部署的成本

猜你喜欢

转载自blog.csdn.net/whg1016/article/details/127165130