ONT实现API的流程
[TOC]
实现方式
本体是在原有VM的基础上添加了memory部分,实现wasm虚拟机的堆栈处理部分。 在调用合约时会执行下面函数:
func (this *WasmVmService) Invoke() (interface{}, error) {
stateMachine := NewWasmStateMachine()
//register the "CallContract" function
stateMachine.Register("ONT_CallContract", this.callContract)
stateMachine.Register("ONT_MarshalNativeParams", this.marshalNativeParams)
stateMachine.Register("ONT_MarshalNeoParams", this.marshalNeoParams)这里注册了ONT的API,注册函数将函数执行和名称存在一个map里:
等待执行时取出,实现体内部则是调用自己实现的memory:
将获取的结果存入堆栈中,并返回指针。 在执行代码时,首先解析module部分,然后创建新的VM:
load部分就是将解析出的module加载到虚拟机,这个过程会调用vm.newFuncTable()来生成函数列表:
vm.call里面就实现了我们上面定义的API:
这里还有一个问题存疑,就是在解析wasm文件时,调用的ONT API是作为外部函数的,解析时会找不到,这个是通过编译器解决的还是其他方式还未看懂。
最后更新于
这有帮助吗?