首先搞清楚了Caterpillar的solidity代码生成机制。Caterpillar分为Caterpillar Core和 executepanel两部分。

executePanel是UI前端,用于建模以及配置和查看BPMN引擎流程,而Caterpillar Core是后端,用于处理BPMN模型变为代码以及部署合约至以太坊。

如何发现Caterpillar的bpmn生成solidity的机制?

在Caterpillar的前端面板上输入BPMN模型后,发现调试页面向本地的3000端口发送post消息。执行此段功能的代码如下:

createProcessRegistry() {
this.http
.post('http://localhost:3000/registry', { })
.subscribe(
(resp) => {
console.log('SUCCESS: ', resp.json());
return resp.json().address;
},
(error) => {
console.log('ERROR: ', error);
});
}

从中可以发现,前端向3000端口发送注册请求。此代码片段来自于前端的data-store.ts代码。这是Caterpillar的模型注册阶段,设计模型的时候必须先注册模型。

继续通过浏览器前端调试页面,发现了data-store.ts:141 执行了模型的注册。

  registerModel(model: string) {
this.http
.post('http://localhost:3000/models', { bpmn: model })
.subscribe(
(resp) => {
const res = resp.json();
if (res.id && res.bpmn && res.solidity && this.processes.indexOf(res) < 0) {
this.searchRegisteredModel('');
console.log('Model ' + res.name + ' succesfully registered');
} else {
console.log('Error trying to register ' + this.modelId);
}
},
(error) => { });
}

该部分代码执行模型注册功能, 也就是说,在Caterpillar的前端建模并保存后,自动执行了该函数。向 3000端口发送了bpmn模型 并且得到了 solidity代码返回值。

推测3000应该是Caterpillar-core的端口。 原因在于前端的内容一定会向后端发送,至于solidity代码是不是后端生成的。可以在Core界面看到确实终端上打印出了代码。

同时,关闭了Core之后,前端调试页面报错GET http://localhost:3000/models net::ERR_CONNECTION_REFUSED,

充分说明3000端口是后端,并且solidity的代码生成是Core实现的。通过zone.js发现3000端口返回给前端的数据叫做res, 在前端被序列化为json.

res.name是合约名称, res.solidity是生成的代码。需要在其上进行改动。

将模型设计好之后保存,前端将会把bpmn模型文件发送至3000端口,由Core处理。

Core的models.parser.js代码是负责解析bpmn代码的,该js代码由models.parsers.ts代码生成的。

bpmn转化为solidity代码用到了ejs模板语言,具体是Caterpillar-core中的templates/bpmn2sol/ejs. 该模块是ejs模板语言写成的solidity模板。

models.parsers.js将该模块读取,在models.parsers.ts中,有这样一段代码

const bpmn2solEJS = fs.readFileSync(
path.join(__dirname, "../../templates") + "/bpmn2sol.ejs",
"utf-8"
);
let bpmn2solTemplate = ejs.compile(bpmn2solEJS);

该段代码首先读取bpmn2sol.ejs模板文件,然后再用ejs.compile编译该文件,得到模板对象。

模板对象中的变量在接下来的代码中被逐一赋值,存入codeGenerationInfo 字典中。

 let localSolidity = bpmn2solTemplate(codeGenerationInfo);

最后将这些变量的值放入模板对象bpmn2solTemplate中去。

得到了这部分的solidity代码。再将这部分字符串加入modelInfo.solidity中。

由此可见,modelInfo.solidity 是最终存放solidity代码的部分。

modelInfo.solidity += localSolidity;

因此,把localSolidity字符串进行二次处理,插入solidity事件对象即可完成事件插装功能。

typescript代码会每次被编译为js代码。Caterpillar-core中的out目录是src中的ts代码生成的。

因此,只要在models.parsers.ts上修改,生成的models.parsers.js就会相应重新生成。

最终在该部分将localSolidity处理,在solidity代码中插入了event对象。

成功在Caterpillar代码中插入事件对象-20200917的更多相关文章

  1. Javascript中的事件对象和事件类型

    接上次看JS的事件冒泡和捕获,所以顺带就把事件相关的知识都看完好了 而且想到一个好的学习方法,第一天自己看,第二天把前一天学习的东西写下来,一方面可以当复习,一方面当重新整理并且分享 事件对象 事件处 ...

  2. DOM中的事件对象

    三.事件对象事件对象event1.DOM中的事件对象(1).type:获取事件类型(2).target:事件目标(3).stopPropagation() 阻止事件冒泡(4).preventDefau ...

  3. js中获取事件对象的方法小结

    原文地址:http://jingyan.baidu.com/article/d8072ac4594d6cec95cefdac.html 事件对象 的获取很简单,很久前我们就知道IE中事件对象是作为全局 ...

  4. DOM和IE中的 事件对象

    DOM中的事件对象:(符合W3C标准)    preventDefault()        取消事件默认行为    stopImmediatePropagation() 取消事件冒泡同时阻止当前节点 ...

  5. JavaScript中的事件对象

    JavaScript中的事件对象 JavaScript中的事件对象是非常重要的,恐怕是我们在项目中使用的最多的了.在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含这所有与事件有 ...

  6. js事件对象--DOM中的事件对象/IE中的事件对象/跨浏览器的事件对象

    事件对象    在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息.包括导致事件的元素.事件的类型,以及其他与特定事件相关的信息.例如,鼠标操作导致的事件对 ...

  7. IE中的事件对象

    IE中的事件对象 1)type属性 用于获取事件类型 2)srcElement属性 用于获取事件的目标 3)cancelBubble属性 用于阻止事件冒泡 设置为true表示阻止事件冒泡  设置为fa ...

  8. DOM中的事件对象和IE事件对象

    DOM中的事件对象 IE事件对象 属性/方法 类型 读/写 说明 属性/方法 类型 读/写 说明  bubles Boolean 只读  表明事件是否冒泡  cancleBubble Boolean ...

  9. 本地C代码中创建Java对象

    作者:唐老师,华清远见嵌入式学院讲师. 创建Java域的对象就是创建Java类的实例,再调用Java类的构造方法. 以Bitmap的构建为例,Bitmap中并没有Java对象创建的代码及外部能访问的构 ...

随机推荐

  1. 剑指 Offer 36. 二叉搜索树与双向链表

    剑指 Offer 36. 二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的 ...

  2. JavaScript高级程序设计学习笔记之事件

    1.事件流 事件流描述的是从页面中接收事件的顺序. 事件冒泡 IE的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播 ...

  3. GIMP 一键均匀添加多条参考线 一键均匀切分图片

    添加参考线 #!/usr/bin/env python2 # -*- coding: utf-8 -*- from gimpfu import * # orientation: ORIENTATION ...

  4. GRE隧道协议

    1. GRE协议简介 GRE(General Routing Encapsulation ,通用路由封装)是对某些网络层协议(如IP和IPX)的数据报文进行封装,使这些被封装的报文能够在另一网络层协议 ...

  5. WEB漏洞——PHP反序列化

    序列化 首先说说什么是序列化 序列化给我们传递对象提供了一种简单的方法.serialize()将一个对象转换成一个字符串,并且在转换的过程中可以保存当前变量的值 而反序列化unserialize()将 ...

  6. Redis——set,hash与列表

    一.List列表 基于Linked List实现 元素是字符串类型 列表头尾增删快,中间增删慢,增删元素是常态 元素可以重复出现 最多包含2^32-1元素 列表的索引 从左至右,从0开始 从右至左,从 ...

  7. 433MHZ SPI模块使用心得

    最近使用了433MHZ的模块进行了一个通讯项目,选用的是SX1208模块,对接了RTOS和Linux两个操作系统,使用心得如下: 1. 首先要拿来datasheet看一遍,通揽一下它的功能.可以得到一 ...

  8. mysql where in 数组解决小tips

    由于sql语法要求,不可在in后面直接连数组,若数组形式下,则需要转换成逗号隔开的字符串 <?php$arr = array(1,2,3,4,5);$arr_string= join(',', ...

  9. java基础面试题(一)

    1.java中的数据类型,各占多少个字节? 2.面向对象的特性 1-封装:简单来说,封装就是把数据和操作数据的方法绑定起来,如果需要访问,可以使用已定义的接口进行访问 2-继承:从已有的类得到继承信息 ...

  10. CF802O-April Fools‘ Problem(hard)【wqs二分,优先队列】

    正题 题目链接:https://www.luogu.com.cn/problem/CF802O 题目大意 \(n\)天每条有\(a_i\)和\(b_i\). 每条可以花费\(a_i\)准备至多一道题, ...