用C++生成solidity语言描述的buchi自动机的初级经验
我的项目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自动机的初级经验的更多相关文章
- 用solidity语言开发代币智能合约
智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发 ...
- Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)
jquery提供的serialize方法能够实现. $("#searchForm").serialize();但是,观察输出的信息,发现serialize()方法做的是将表单中的数 ...
- 【数据结构】之二叉树(Java语言描述)
有关树的一些基础知识点请参考[这篇文章]. 本文主要记录Java语言描述的二叉树相关的一些操作,如创建.遍历等. 首先,我们需要一个表示树中节点的数据结构TreeNode,代码如下: public c ...
- 【数据结构】之链表(C语言描述)
链表是线性表的一种,是一种物理存储单元上非连续的存储结构,链表中的数据元素之间是通过指针链接实现的. 链表由一系列节点组成,节点可以在运行时动态的生成. 链表中国的每个节点分为两部分:一部分是存储数据 ...
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- 用VC编译lua源码,生成lua语言的解释器和编译器
用VC编译lua源码,生成lua语言的解释器和编译器 1.去网址下载源码 http://www.lua.org/download.html 2.装一个VC++,我用的是VC6.0 3.接下来我们开始编 ...
- 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)
三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述) 用经典矩阵转置算法和普通的三元组矩阵转置在时间复杂度上都是不乐观的.快速转置算法在增加适当存储空间后实现快速转置具体原理见代码注释部 ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- 生成跨语言的类型声明和接口绑定的工具(Djinni )
Djinni 是一个用来生成跨语言的类型声明和接口绑定的工具,主要用于 C++ 和 Java 以及 Objective-C 间的互通. 示例接口定义文件: # Multi-line comments ...
随机推荐
- redux的使用
1.redux的使用 核心概念 action 动作的对象 包含2个属性 type:标识属性, 值为字符串, 唯一, 必要属性 data:数据属性, 值类型任意, 可选属性 例子:{ type: 'AD ...
- C# Collection
数组与集合不同的适用范围: 数组:数组最适用于创建和使用固定数量的强类型化对象. 集合:集合提供更灵活的方式来使用对象组. 与数组不同,你使用的对象组随着应用程序更改的需要动态地放大和缩小. 对于某些 ...
- Spring Boot 2.x 之 Spring Data JPA, Hibernate 5
1. Spring Boot常用配置项 基于Spring Boot 2.0.6.RELEASE 1.1 配置属性类 spring.jpa前缀的相关配置项定义在JpaProperties类中, 1.2 ...
- Apollo 配置中心详细教程
一.简介 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理 ...
- Django学习day04随堂笔记
每日测验 """ 今日考题 1.列举你知道的orm数据的增删改查方法 2.表关系如何判定,django orm中如何建立表关系,有什么特点和注意事项 3.请画出完整的dj ...
- Mysql backup and Recovery Data Type.
数据库备份方法: 备份类型:物理备份和逻辑备份: 物理备份是指直接复制存储数据库内容的目录和文件,这种类型的备份适用于出现问题时需要快速恢复的大型重要数据库.逻辑备份保存以逻辑数据库结构(create ...
- centos7 未启用swap导致内存使用率过高。
情况描述: 朋友在阿里云上有一台系统为CentOS7的VPS,内存为2GB,用于平时开发自己的项目时测试使用: 他在上面运行了5个docker实例,运行java程序:还有一个mysql服务: 上述5个 ...
- trait能力在PHP中的使用
相信大家对trait已经不陌生了,早在5.4时,trait就已经出现在了PHP的新特性中.当然,本身trait也是特性的意思,但这个特性的主要能力就是为了代码的复用. 我们都知道,PHP是现代化的面向 ...
- nginx 禁止某IP访问
首先建立下面的配置文件放在nginx的conf目录下面,命名为blocksip.conf: deny 95.105.25.181; 保存一下. 在nginx的配置文件nginx.conf中加入:inc ...
- 5UCMS判断当前栏目高亮(用于当前所在栏目加背景图片或颜色)
5UCMS判断当前栏目高亮标签 比较简单的是频道页(channel.html): 大类代码: <!--menu:{ $row=10 $table=channel }--> <li { ...