我的项目rvtool(https://github.com/Zeraka/rvtool)中增加了生成solidity语言格式的监控器的模块。

solidity特殊之处在于,它是运行在以太坊虚拟机环境中的。EVM和环境是隔离的,因此无法直接读取文件。所以rvtool中通过读取LTL文本生成监控器的方式无法直接照搬到solidity上面。rvtool中建立了表达自动机监控器的数据结构,对该数据结构的赋值是通过几个循环结构完成的。而这个部分无法在solidity代码中表达。将LTL转化为buchi自动机的算法库难以移植到solidity中,也得不偿失。所以,最好的实现办法就是直接生成已经写好的监控器,包括数据结构以及对它的初始化。

最后生成的solidity代码是这样的:

pragma solidity >=0.4.22 <0.6.0;

contract monitor_automata {
struct Word_set {
string word;
mapping(string => uint256) wordset;
} struct Monitor_label {
string label;
string[] strlist;
Word_set[] word_sets;
int256 next_state;
} struct Monitor_state {
int256 own_state;
int256 label_numbers;
Monitor_label[] monitor_labels;
} struct Monitor {
int256 state_number;
mapping(uint256 => Monitor_state) nodes;
}
Monitor monitor;
Monitor_state monitor_state_0;
Monitor_label monitor_label_0;
Word_set ws_0;
Monitor_label monitor_label_1;
Word_set ws_1;
Monitor_state monitor_state_1;
Monitor_label monitor_label_2;
Word_set ws_2; function Monitor_init() public {//对数据结构的初始化,无法用循环结构表达
//================= monitor_state_0.own_state = 0; monitor_label_0.label = "!event3";
monitor_label_0.next_state = 0; ws_0.word = "!event3";
ws_0.wordset["event3"] = 0;
monitor_label_0.word_sets.push(ws_0); monitor_state_0.monitor_labels.push(monitor_label_0); monitor_label_1.label = "event3";
monitor_label_1.next_state = 1; ws_1.word = "event3";
ws_1.wordset["event3"] = 1;
monitor_label_1.word_sets.push(ws_1); monitor_state_0.monitor_labels.push(monitor_label_1);
monitor_state_0.label_numbers = 2;
monitor.nodes[0] = monitor_state_0;
//================= monitor_state_1.own_state = 1; monitor_label_2.label = "!event1 & !event3 & event4";
monitor_label_2.next_state = 0; ws_2.word = "!event1 & !event3 & event4";
ws_2.wordset["event1"] = 0;
ws_2.wordset["event3"] = 0;
ws_2.wordset["event4"] = 1;
monitor_label_2.word_sets.push(ws_2); monitor_state_1.monitor_labels.push(monitor_label_2);
monitor_state_1.label_numbers = 1;
monitor.nodes[1] = monitor_state_1;
} //将输入的字符串解析为数据结构。然后将其
}

代码生成分为3步: 1、生成固定结构的结构体2、生成结构体变量的声明语句3、生成对结构体变量进行赋值的语句。

function Monitor_init()实现的是对该数据结构的初始化,它无法用循环结构来表达,因为这里并没有编写solidity解析LTL公式的模块。

采用直接生成"声明并逐一对数据结构变量进行初始化"代码的办法。针对rvtool中的循环结构中的同名变量,我使用了后缀编号的方式。

例如

//int m = 0;
for (auto &t : label_set)
{
Word_set ws;
string ws_m = "ws_"+m;
ofile<<" Word_set ws_"<<m<<";\n";
m++;
}

这个循环结构中,程序声明了Word_set ws这个结构体变量,然而它是在内存中完成的,是linux环境,它是无法在solidity的EVM环境中使用的。

于是在这个循环体中加入了 ofile<<" Word_set ws_"<< m<<";\n";语句,该语句将被输出为文本成为 solidity文件的一部分。m是一个全局int类型,

每执行一次循环,就会自增,于是每次循环打印出来的语句都代表不同的结构体变量。这样,便初步解决了如何生成solidity语言的buchi自动机监控器的问题。

用C++生成solidity语言描述的buchi自动机的初级经验的更多相关文章

  1. 用solidity语言开发代币智能合约

    智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发 ...

  2. Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)

    jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...

  3. 【数据结构】之二叉树(Java语言描述)

    有关树的一些基础知识点请参考[这篇文章]. 本文主要记录Java语言描述的二叉树相关的一些操作,如创建.遍历等. 首先,我们需要一个表示树中节点的数据结构TreeNode,代码如下: public c ...

  4. 【数据结构】之链表(C语言描述)

    链表是线性表的一种,是一种物理存储单元上非连续的存储结构,链表中的数据元素之间是通过指针链接实现的. 链表由一系列节点组成,节点可以在运行时动态的生成. 链表中国的每个节点分为两部分:一部分是存储数据 ...

  5. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

  6. 用VC编译lua源码,生成lua语言的解释器和编译器

    用VC编译lua源码,生成lua语言的解释器和编译器 1.去网址下载源码 http://www.lua.org/download.html 2.装一个VC++,我用的是VC6.0 3.接下来我们开始编 ...

  7. 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)

    三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述) 用经典矩阵转置算法和普通的三元组矩阵转置在时间复杂度上都是不乐观的.快速转置算法在增加适当存储空间后实现快速转置具体原理见代码注释部 ...

  8. 利用栈实现算术表达式求值(Java语言描述)

    利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...

  9. 生成跨语言的类型声明和接口绑定的工具(Djinni )

    Djinni 是一个用来生成跨语言的类型声明和接口绑定的工具,主要用于 C++ 和 Java 以及 Objective-C 间的互通. 示例接口定义文件: # Multi-line comments ...

随机推荐

  1. mybaits源码分析--binding模块(五)

    一.binding模块 接下来我们看看在org.apache.ibatis.binding包下提供的Binding模块 ,binding其实在执行sqlSession.getMapper(UserMa ...

  2. 前端使用a标签启动本地.exe程序

    目录 1,需求 2,效果图 3,实现原理 4,代码 5,注意事项 1,需求 最近有一个需求,在web页面上有一个按钮,点击按钮,调起本地的.exe程序客户端,我在网上找了很多,感觉都不完整,所以自己总 ...

  3. Flask(6)- debug 模式

    使用 Flask 开发过程中存在两个常见的问题 当 Flask 程序出错时,没有提示错误的详细信息 修改 Flask 源代码后需要重启 Flask 程序 这两个问题非常的影响开发效率,因此 Flask ...

  4. GIT:创建、查看分支命令(git branch -vv)

    在开发过程中一般会用到Git进行版本管理,创建查看分支并与远程仓库交互是非常常见的操作. branch分支 是指在开发主线中分离出来的,做进一步开发而不影响到原来的主线. Git存储的不是一系列的更改 ...

  5. HCNP Routing&Switching之IS-IS邻居建立、LSDB同步、拓扑计算和路由形成

    前文我们了解了IS-IS的报文结构和类型相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15260670.html:今天我们来聊一聊IS-IS建立邻居. ...

  6. C# 反射 + Quartz,实现流程处理

    场景: 前不久,公司里项目经理要求我实现流程处理,比如,用户可以定义一个定时任务,每周一查看报表.定时任务很简单,用Quartz可以实现,但是用户自己选择报表就比较麻烦,因为系统的不同模块的生成报表的 ...

  7. (4)java Spring Cloud+Spring boot+mybatis企业快速开发架构之SpringCloud-Spring Cloud开发环境的准备和Lombok安装步骤

    ​ 开发环境的准备主要涉及三个方面:JDK.Maven.Spring Tools 4 for Eclipse. 1.JDK JDK 的版本用 1.8 即可,环境变量大家自行去配置.配置好环境变量,在命 ...

  8. NOIP初赛:完善程序做题技巧

    最近写的文章好像还很多的.那么今天我们来讨论NOIP初赛的题型--完善程序.完善程序相对是比较难的题目了.全卷100分,完善程序占了大概26分,占比非常大.如果和英语考试试卷做比较,相当于首字母填空( ...

  9. git报错:Auto Merge Failed; Fix Conflicts and Then Commit

    本文来源:http://blog.csdn.net/trochiluses/article/details/101007191.出错场景: 协同开发时,我们从远程服务器上pull下代码的时候,出现以下 ...

  10. ecshop调用指定广告的方法

    在include/lib_goods.php文件下面新增:function getads($cat,$num){ $time = gmtime();$sql = "SELECT * FROM ...