Genesis 生成
egenesis 最前面的 e 代表 embedded, 意思是说创世信息嵌入代码中, 它有两个 full 和 brief 两个版本, full 版本包含所有创世信息, brief 只包含这些创世信息的 hash (创世信息的 hash 也是 chain_id).
full 和 brief 的生成靠的都是下面这段 make 脚本.
// libraries/egenesis/CMakeLists.txt
22 MESSAGE( STATUS "egenesis: " ${GRAPHENE_EGENESIS_JSON} )
23
24 if( GRAPHENE_EGENESIS_JSON )
25 list( APPEND embed_genesis_args --genesis-json "${GRAPHENE_EGENESIS_JSON}" )
26 endif( GRAPHENE_EGENESIS_JSON )
27
28 MESSAGE( STATUS "embed_genesis_args: " ${embed_genesis_args} )
29
30 add_custom_command(
31 OUTPUT
32 "${CMAKE_CURRENT_BINARY_DIR}/egenesis_brief.cpp"
33 "${CMAKE_CURRENT_BINARY_DIR}/egenesis_full.cpp"
34 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
35 COMMAND embed_genesis ${embed_genesis_args}
36 DEPENDS
37 "${GRAPHENE_EGENESIS_JSON}"
38 "${CMAKE_CURRENT_SOURCE_DIR}/egenesis_brief.cpp.tmpl"
39 "${CMAKE_CURRENT_SOURCE_DIR}/egenesis_full.cpp.tmpl"
40 embed_genesis )
其中 GRAPHENE_EGENESIS_JSON
在 bitshares-core 根目录被设置为 genesis.json
:
// ./CMakeLists.txt
26:set(GRAPHENE_EGENESIS_JSON "${CMAKE_CURRENT_SOURCE_DIR}/genesis.json" )
没错, 就是 bitshares-core 源码根目录的那个 genesis.json 文件.
egenesis 相关的代码都位于 libraries/egenesis/
目录. 上面 libraries/egenesis/CMakeLists.txt
里的 embed_genesis
这个命令的源码实际就是 libraries/egenesis/embed_genesis.cpp
; embed_genesis_args
参数展开就是 —genesis-json genesis.json
; embed_genesis
程序会用 egenesis_full.cpp.tmpl, egenesis_brief.cpp.tmpl 这两个模板 egenesis_full.cpp, egenesis_brief.cpp 两个文件.
引用
上面说了 full 和 brief 两个 genesis 源码, 他们在构建时会分别生成 libgraphene_egenesis_full.a
和 libgraphene_egenesis_brief.a
, 这俩库里面实现的方法都是 <egenesis/egenesis.hpp>
中定义的方法, 如果同时链接这两个库势必会造成符号重定义错误. 所以这俩只会链接一个.
仍然以 witness 为例, 在 witness_node/CMakeLists.txt
中我们可以看到, 链接时实际上链的是 full 版本:
// witness_node/CMakeLists.txt
15 PRIVATE graphene_app graphene_delayed_node graphene_account_history graphene_elasticsearch graphene_market_history graphene_witness graphene_chain graphene_debug_witness graphen e_egenesis_full graphene_snapshot fc ${CMAKE_DL_LIBS} ${PLATFORM_SPECIFIC_LIBS} )