为什么选择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体积要明显增大,会增加部署的成本