zoukankan      html  css  js  c++  java
  • 成功在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对象。

  • 相关阅读:
    Jquery ajax异步传值的两个实用的方法,你看后肯定会用第二个
    C# ASP.NET 转换为int型的方法 很实用
    NetCore 发送邮件
    解决Visual Studio For Mac Restore失败的问题
    (转)JSONObject的toBean 和 fromObject
    javax.servlet不存在的问题
    关于范式的解说
    在远程连接mysql数据库出现问题怎么办
    (二)SpringCloud学习系列-SpringCloud
    (一)SpringCloud学习系列-微服务
  • 原文地址:https://www.cnblogs.com/goto2091/p/13691214.html
Copyright © 2011-2022 走看看