网络部分暂且放一放
还是setup()的下一步
V8 is Google's open source JavaScript engine.
n.nvm = nvm.NewNebulasVM()
type NebulasVMstruct{}
// NewNebulasVM create new NebulasVM
func NewNebulasVM() core.NVM {
return &NebulasVM{}
}
初始化一个VM
if err = n.nvm.CheckV8Run(); err != nil {
logging.CLog().WithFields(logrus.Fields{
"err": err,
}).Fatal("Failed to setup V8.")
}
看一下V8环境变量是否正确设置
接下来看一下
文件结构
nf/nvm/
lib ____js库
lnvm_____没有用
native_____v8动态链接库以及星云链桥接的c++代码
test————测试代码
v8_______js库和go实现的桥接逻辑
blockchain___blockchain相关函数
context____NVM的context
crypto______加密相关函数
engine_____NVM接口实现
enginev8____smartcontractengine 接口实现
event___事件相关函数
module__模块相关函数
storage____账户储存相关函数
types_____类型相关定义
接下有关V8的几个API
isolate context
isolate有完整的V8实例,有完整的堆和栈。context是一个上下文,js代码都是在一个context中运行的
https://stackoverflow.com/questions/19383724/what-exactly-is-the-difference-between-v8isolate-and-v8context
上边有他们的区别
一个isolate某一时刻只有一个runtime
包括但不限于一个heap管理器,垃圾回收等
一段时间内,有且只有一个线程能使用此isolate,不过多个线程可以同时使用多个isolate
单独的isolate不足以运行脚本,需要一个全局对象。context就是这样的一个提供全局对象的工具
对于一个给定的isolate不仅可以有多个context,并且这些context可以共享某个对象
handle和handle scope
handle是一个js对象的索引
它指向js对象在v8管理的heap中的位置
handle不存在heap中,而是存在于stack中。只有一个Handle被释放后才能从stack中推出。
有时候需要声明很多handle。未免太麻烦,所以就有了handle scope
template模板
模板(Template)用在定义一个Context下的JS的对象或者函数。Funct ionTemplate将
C++的函数暴露给JS。每个Funct ionTemplate对应- -个0bj ectTemplate。
Funct ionTemplate相当于0bj ectTemp late的构造函数。Template 的示例如下:
创建一个模板实例
v8: :Handle
将我们之前实现的Plus函数模板,与JavaScript的plus函数关联起来,相当于其回调函数
global->Set(v8: :String: :New("plus"), v8:: FunctionTemplate: :New(Plus));
accessor
一个accessor是c++的一个回调函数,当javascript访问一个对象属性时。它被回调并返回一个值。accessor通过object template来设置
accessor需要通过一个object template来设置 使用setAccessor 该方法需要提供一个属性和关联的两个回调作为参数
type V8Engine struct {
ctx *Context //context
modules Modules //模块
v8engine *C.V8Engine // v8中的V8engine
strictDisallowUsageOfInstructionCounter int //
enableLimits bool
limitsOfExecutionInstructions uint64
limitsOfTotalMemorySize uint64
actualCountOfExecutionInstructions uint64
actualTotalMemorySize uint64
lcsHandler uint64
gcsHandler uint64
innerErrMsg string
innerErr error
}