我的项目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. Mac shell 调节音量

    $ osascript -e 'get volume settings' $ osascript -e 'output volume of (get volume settings)' $ osasc ...

  2. (一)Superset 1.3图表篇——Table

    本系列文章基于Superset 1.3.0版本.1.3.0版本目前支持分布,趋势,地理等等类型共59张图表.本次1.3版本的更新图表有了一些新的变化,而之前也一直没有做过非常细致的图表教程. 而且目前 ...

  3. com.google.zxing.NotFoundException-识别图片二维码信息错误

    一.问题由来 自己在做一个小程序项目的后台,其中需要使用到识别图片二维码信息,而且是必须在Java后台进行识别二维码操作.去百度里面很快找到一个方法, 可以识别简单的二维码,而且自己生成的简单的二维码 ...

  4. Vue Abp vNext用户登录(Cookie)

    因为Abp vNext没找到Vue的模板,网上也没找到相关vNext的例子,只能自己试着写写,asp.net core abp vue都是刚学不久,所以很粗糙也可能有错误的地方,如果您看到请指正,谢谢 ...

  5. SpringSecurity-Shiro-初见

    目录 简介 实战环境搭建 SpringSecurity 认证和授权 权限控制和注销 记住我 Shiro 快速上手 shiro整合mybais 简介 在 Web 开发中,安全一直是非常重要的一个方面. ...

  6. Datagird样式

    <Window  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  xmlns:x=&qu ...

  7. lua中的随机数

    Lua 生成随机数需要用到两个函数:math.randomseed(xx), math.random([n [, m]]) 1. math.randomseed(n) 接收一个整数 n 作为随机序列种 ...

  8. Linux上安装服务器监视工具,名为pyDash。

    pyDash – A Web Based Linux Performance Monitoring Tool 你可以通过以下命令来判断是否已安装: pip --version # Python2.x ...

  9. Maven专题3——生命周期与插件

    三套生命周期 Maven有3套相互独立的生命周期,用户可以调用某个生命周期的阶段,而不会对其他生命周期产生影响. 每个生命周期包含一些有先后顺序的阶段,后面的阶段依赖于前面的阶段,意味着用户调用后面的 ...

  10. 一生挚友redo log、binlog《死磕MySQL系列 二》

    系列文章 原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 一生挚友redo log.binlog<死磕MySQL系列 二> 前言 咔咔闲谈 上期根据 ...