好奇的探索者,理性的思考者,踏实的行动者。
Table of Contents:
EOS-VM 是纯头文件的,这意味着 EOS-VM 可以被嵌入进几乎所有的 C++项目中。
对于浮点数,很多开发者往往片面的认为其运算是不精确的,无法用于区块链系统。实际上并非如此,只是对于一些不同的硬件中,因为各种各样的历史原因,硬件中固化的浮点数运算有一些差异,解决这一点最好的方式是使用 softfloat 库,不使用机器硬件提供的浮点数,这样不同的硬件机器上,浮点数运算的结果都是相同的了。当然这里 Block.one 也提到,如果不在乎所有平台上保持浮点数运算的确定性,则可以使用基于硬件的浮点数运算,这样效率会比使用 softfloat 快很多,这种情况一般是节点硬件机器会保持统一的状态下使用的。
在 EOSIO 中其实也集成了 softfloat 库,但是之前的实现是在链中嵌入的,原生的虚拟机中本身不支持,现在并入虚拟机实现,可以降低其他区块链使用 EOS-VM 时的开发成本。
EOS-VM 增加了 watchdog 机制以确保运行字节码的运行时间限制,这个类似看门狗的机制,会在细粒度上对合约进行资源使用限制。
parser.hpp
解析wasm二进制文件,并且生成module对象
parse_module(wasm_code_ptr& code_ptr, size_t sz, module& mod)
parse_section 解析wasm二进制格式的不同段,这个方法是重载的
parse_function_body()
parse_function_body_code()
解析函数的body体的指令,parser文件的主要代码量用在处理各个指令上
types.hpp
用c++的结构来定义wasm的类型,比如func_type、import_entry、table_type、memory_type
watchdog.hpp
看门狗定时器,指定时间后或除了作用域触发给定的callback
backend.hpp
backend对象构造时所做的工作:
1.解析wasm二进制文件,生成module对象 2.向module对象的import_functions中注入自定义的方法
host_function.hpp
1.registered_host_functions 该结构体在 mappings 中保存自定义的方法
2.通过add接口来实现自定义的方法的添加到mappings中
rhf_t::add<nullptr_t, &print_num, wasm_allocator>("env", "print_num");
3.resolve()
将module中的imports和mappings中的方法关联起来
execution_context.hpp
execution_context_base
jit_execution_context
execution_context
execute(Host* host, Visitor&& visitor, const std::string_view func,Args... args)
execute(Host* host, Visitor&& visitor, uint32_t func_index, Args... args)
_mod.get_exported_function(func); 通过module找出执行函数的index
分两种情况:
1.imported_function
2.非imported_function
allocator.hpp
执行内存分配的类
opcodes.hpp opcodes_def.hpp
定义wasm的所有操作码
base_visitor.hpp
disassembly.hpp
interpret_visitor.hpp
解析操作码
[[gnu::always_inline]] inline void operator()(const i64_mul_t& op) {
context.inc_pc();
const auto& rhs = context.pop_operand().to_ui64();
auto& lhs = context.peek_operand().to_ui64();
lhs *= rhs;
}
【维基链】
wasm_context_interface
wasm_context_rpc
wasm_context
执行上下文中包含着
receiver,
其中拥有wasm_interface对象
wasm_interface.cpp
validate() 读取并验证wasm是否合法
execute()
pInstantiated_module->apply(pWasmContext); 具体的执行
wasm_runtime.cpp
instantiate_module()
创建出backend对象
apply(wasm::wasm_context_interface *pContext)
传入执行的上下文,之后会执行合约的某个action
rpcapiconf.h
所有rpcapi定义的地方
【合约】
rpcsubmittx.cpp
submitsetcodetx() 部署合约
读取wasm, validate()验证wasm
读取abi
submittx() 执行合约
【交易】
universaltx.h
交易的通用结构
【abi】
abi_def.hpp
用struct abi_def来表示abi的结构
wasm_variant.hpp
json和abi数据类型之间的转换
test_abi.cpp
测试abi功能
{
"version": "wasm::abi/1.0",
"types": [{
"new_type_name": "A",
"type": "name"
},{
"new_type_name": "name",
"type": "A"
}],
"structs": [],
"actions": [],
"tables": [],
"ricardian_clauses": []
}