LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资产 > “智能坊”虚拟机的实现

“智能坊”虚拟机的实现

2015-04-11 ranger 来源:智能坊创始人

  “智能坊”虚拟机的实现

QQ截图20150410161240

   注:阅读此文需要您有一定的CPU硬件知识

  虚拟机是实现智能合约系统最为关键和核心的技术,智能坊虚拟采用虚拟成熟的8051处理器的方案满足了系统的需求,同时可以直接使用成熟稳定的商业编译器(iar for 8051、keil for 8051 ),为系统的开发节省了大量时间。

  下面我们就来揭开其神秘的面纱,为满足智能合约特定的需求,对系统进行了一些改造如图:

QQ截图20150409151007

  8051是哈弗结构的处理器,虚拟机把用不到的中断等功能去掉,只留下数据运算和处理部分,每一个应用开始运行前都需要加载到虚拟机ROM里,其数据结构必须如上图所示,否则虚拟机将直接判应用非法,强制退出。

  首先看代码实现(官方代码是在IAR for 8051 上开发,不同的编译器可能写法不一样)

  __root __code static const char version[]@0×0004 = {0×00,0×01,0×01};

  __root __code static const char exitcall[]@0×0008 = {0×22,0×22};

  __root __code static const char apicall[]@0×0012 = {0×22,0×22};

  __root __xdata __no_init static unsigned char Communicate[4*1024]@0xEFFF;

  __root __xdata __no_init static unsigned char Result[2]@0xEFFD;

  0000h LJMP 指令

  虚拟机复位后直接从0000h开始执行,读取LJMP后的地址直接跳转到app入口,由编译器自动生成。

  0004H version

  解说 :

  存放app编译时SDK 版本号,主要是为未来可能升级,做版本识别。

  0008H 应用退出地址

  解说:

  传统8051没有exit接口,但是在我们虚拟机必需要有,而且需要异常恶化正常两种退出方式。

  Exit 实现原理:

  应用把退出code写入Result@0xEFFD 后直接call 0×0008, 虚拟机检测到PC指针指向00×0008后就中断应用的运行。

  应用sdk代码片段:

  __noreturn void __VmExit(EXIT_CODE tep) {

  Result[0] = tep;

  ((void (*)(void)) (0×0008))();

  }

  虚拟机代码片段:

  if (Sys.PC == 0×0008) {

  INT8U result = GetExRam(0xEFFD);

  if (result == 0×01) {

  return step;

  }

  return 0;

  }

  0012H API调用地址

  解说:

  应用需要调用系统的一些功能时,需要调用此接口,如查询某个账户余额。

  应用每次调用API时需要把API 编码存放于Result@0xEFFD,API需要传给系统的参数存放于缓存区Communicate[4*1024]@0xEFFF,然后call 0×0012

  sdk代码片段:

  __root void __CallApi(CALL_API_FUN tep) {

  Result[0] = (unsigned char) (tep & 0xFF);

  Result[1] = (unsigned char) ((tep >> 8) & 0xFF);

  ((void (*)(void)) (0×0012))();

  }

  虚拟机代码片段:

  if (Sys.PC == 0×0012) {

  INT16U methodID = ((INT16U) GetExRam(VM_FUN_CALL_ADDR) | ((INT16U) GetExRam(VM_FUN_CALL_ADDR+1) << 8));

  unsigned char *ipara = (unsigned char *) GetExRamAddr(VM_SHARE_ADDR);

  RET_DEFINE retdata = CallExternalFunc(methodID, ipara, pVmEvn);

  }

  Code区

  存放可执行代码。

  更多细节,请前往代码仓库 github: https://github.com/SoyPay/dacrs

—-

文章来源:http://www.8btc.com/github

编译者/作者:ranger

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...

相关阅读:

LOADING...