成功在Caterpillar代码中插入事件对象-20200917
首先搞清楚了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的更多相关文章
- Javascript中的事件对象和事件类型
接上次看JS的事件冒泡和捕获,所以顺带就把事件相关的知识都看完好了 而且想到一个好的学习方法,第一天自己看,第二天把前一天学习的东西写下来,一方面可以当复习,一方面当重新整理并且分享 事件对象 事件处 ...
- DOM中的事件对象
三.事件对象事件对象event1.DOM中的事件对象(1).type:获取事件类型(2).target:事件目标(3).stopPropagation() 阻止事件冒泡(4).preventDefau ...
- js中获取事件对象的方法小结
原文地址:http://jingyan.baidu.com/article/d8072ac4594d6cec95cefdac.html 事件对象 的获取很简单,很久前我们就知道IE中事件对象是作为全局 ...
- DOM和IE中的 事件对象
DOM中的事件对象:(符合W3C标准) preventDefault() 取消事件默认行为 stopImmediatePropagation() 取消事件冒泡同时阻止当前节点 ...
- JavaScript中的事件对象
JavaScript中的事件对象 JavaScript中的事件对象是非常重要的,恐怕是我们在项目中使用的最多的了.在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含这所有与事件有 ...
- js事件对象--DOM中的事件对象/IE中的事件对象/跨浏览器的事件对象
事件对象 在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息.包括导致事件的元素.事件的类型,以及其他与特定事件相关的信息.例如,鼠标操作导致的事件对 ...
- IE中的事件对象
IE中的事件对象 1)type属性 用于获取事件类型 2)srcElement属性 用于获取事件的目标 3)cancelBubble属性 用于阻止事件冒泡 设置为true表示阻止事件冒泡 设置为fa ...
- DOM中的事件对象和IE事件对象
DOM中的事件对象 IE事件对象 属性/方法 类型 读/写 说明 属性/方法 类型 读/写 说明 bubles Boolean 只读 表明事件是否冒泡 cancleBubble Boolean ...
- 本地C代码中创建Java对象
作者:唐老师,华清远见嵌入式学院讲师. 创建Java域的对象就是创建Java类的实例,再调用Java类的构造方法. 以Bitmap的构建为例,Bitmap中并没有Java对象创建的代码及外部能访问的构 ...
随机推荐
- dotnet C# 给结构体字段赋值非线程安全
在 dotnet 运行时中,给引用对象进行赋值替换的时候,是线程安全的.给结构体对象赋值,如果此结构体是某个类的成员字段,那么此赋值不一定是线程安全的.是否线程安全,取决于结构体的大小,取决于此结构体 ...
- xxs攻击
1 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中.比如这些代码包括HTML代码和客户端脚本.攻击者利用XSS漏洞旁路掉访问控制--例如 ...
- shell传参和变量赋值
1.变量赋值方式 (1)方式1--直接赋值(=) (2)方式2--read交互式赋值 (3)方式3--脚本传参赋值 2.read read -p "请输入你的名字和年龄:" nam ...
- ubantu与CentOS虚拟机之间搭建GRE隧道
Author : Email : vip_13031075266@163.com Date : 2020.01.23 Copyright : 未经同意不得 ...
- (7)java Spring Cloud+Spring boot+mybatis企业快速开发架构之SpringCloud-Spring Boot Starter的介绍及使用
Spring Boot 的便利性体现在,它简化了很多烦琐的配置,这对于开发人员来说是一个福音,通过引入各种 Spring Boot Starter 包可以快速搭建出一个项目的脚手架推荐分布式架构源 ...
- Vue3.x全家桶+vite+TS-搭建Vue3.x项目
目录 一.搭建基础项目 1.vite创建项目 3.运行项目 2.环境变量设置介绍 vite配置多环境打包 二.配置Router 1.安装路由 2.配置路由 3.引入 三.配置Vuex 1.安装vuex ...
- Spring框架(第一天)
一. 引言 a) 什么是Spring框架?(spring官网:www.springsource.org) 3.x 不提供第三发依赖jar 目前已经到了5.x版本. Spring轻量级(代码入侵性小) ...
- windows日志查看与清理
日志查看 (1) 启动Windows实验台,点击:开始 - 控制面板 - 管理工具 - 事件查看器. (2) 应用程序日志.安全日志.系统日志.DNS日志默认位置:%sys temroot%\syst ...
- PHP 一个树为另一棵树的子结构 [TO BE CONTINUED]
输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) <?php class TreeNode { private $val; private $left; ...
- php 设计模式 --组合器模式
PHP 开启错误显示并设置错误报告级别 ini_set('error_reporting', E_ALL); ini_set('display_errors', 'on'); 目的:分级处理:整体 ...