RChain的一键形式化验证:关于RCast 33 – LADL话题的讨论摘要
作者/Atticbee
在这一集,Greg和RChain的研究人员Isaac,Christian讨论了TLA(Temporal Logic of Actions)和RChain的LADL(Logic As Distribution Law)。下面是Atticbee做的摘要,然后加了一些自己的理解。
TLA (Temporal
Logic of Actions,行为时序逻辑)是并发系统进行形式化验证的首选工具,很多分布式的并发系统都用选用这个工具来进行验。有一些背景介绍在这些文章里:
https://www.zhihu.com/question/268593174/answer/423871132。
很有意思,亚马逊的云服务就利用TLA找出了很多设计上的bug。
用TLA进行验证相对与传统的软件测试来说已经是很大的进步了。传统的测试,对于并发系统来说是远远不够的。有过多线程代码经验的码工应该有体会,有些错误是很难重现的,可能运行100万次会崩溃一次。对于非重要应用这个无所谓,因为学习这些形式化验证工具的成本很高,然后业界觉得对大多数的传统应用,有bug也无所谓,大不了重启,回滚交易。
Atticbee注:但对于区块链这种直接和钱打交道的,没法回滚的去中心化系统,这种bug就很要命了。尽管有些项目用了更安全的语言比如Rust,以及更安全的设计模式如OCAP来减少很多bug,但是智能合约的安全性是0和1的关系,不是0.9999999和1的关系。只要不通过形式验证,黑客总是可以用模型检测器找到发起攻击的途径。
用TLA进行验证,有个重要的缺陷就是,TLA的模型语言和最后的产品实现语言是不同的。在TLA的流程中,你首先用TLA建模语言定义一个模型,然后用这个语言定义一些目标性质(比如没有死锁,系统不会进入非法状态等等),最后用这个自动化工具检验这个模型是否满足指定的目标性质。检验完成后,产品代码按照这个模型来实现。然而,你验证了TLA模型的正确性,并不表明你最后的代码实现是正确的。
Atticbee注:这就好比你设计了一座桥,进行力学计算验证了这座桥是安全的,但你最后的工程实施如果和设计有所差距,造出的桥还是会倒。
所以,最好的解决方案就是,发明一种语言,它既可以是用来形式验证的建模语言,同时又可以作为产品化的代码语言。这就是为什么我们对名字空间逻辑中的LADL感兴趣的原因。Rholang中的名字空间逻辑可以用来建立一套行为类型系统,对很多有意思的性质进行表达和检查。所以在这个意义上,Rholang同时是一个产品化的代码语言,也是一个TLA那样的形式化建模语言。
Rholang可以推导出的类型可以表达TLA能验证的同样的目标性质,实际上更接近空间逻辑模型检测器(Spatial Logic
Model Checker)能验证的目标性质。但Rholang的名字空间逻辑更具有表达力,因为由于反射它可以检查名字之间的结构。所以有很多事,Rholang的名字空间逻辑可以做,但Spatial Logic Model
Checker做不到。一个很好的例子就是编译期的防火墙:在类型检查期间(远在代码执行之前),你就可以判断一个进程是否只在规定的名字集合中进行通信,而不会超出这个范围。甚至,你可以随时调整这个约束,比如规定在某些状态下你的进程可以在规定的名字上进行通信。这种都是在代码类型检查期间完成的,所以称之为编译期防火墙。
注意现有的RChain还没有实现这个名字空间逻辑,这是金星的规划,水星是不带类型的。尽管在Rholang 0.1的规格中,Greg给出了一个类型系统的草案,但还有很多事情要做,比如让类型定义的语法变得对开发人员更加友好。巧合的是,TLA中目标性质定义的语法和Rholang 0.1中类型定义的语法非常类似。事实上,名字空间逻辑中的类型、空间逻辑模型里的类型、TLA中的目标性质这几个都有相应的对应关系,都是非常有意思的数学概念。而Rholang名字空间逻辑上的推导类型的LADL算法(用分配律表示逻辑)是这些概念的一个推广,不光是数学上很有意思,在分布式系统的工程实现中也有非常重要的好处。
要理解LADL,需要知道上世纪三十年代就被发现了的柯里-霍华德同构(zh.wikipedia.org/wiki/%):人们发现,Lambda演算和直觉逻辑的公式之间是紧密对应的,两者可以相互转换。直觉逻辑中的公式或命题可以对应成为Lambda演算中的类型。直觉逻辑中对命题的证明的推导(规约)步骤对应了Lambda演算中的beta规约。上世纪的90年代,Pi演算提出后,人们也进而发现用Pi演算中的进程代替Lambda演算中的项(Term)也得到同样的对应关系:一个进程要满足的逻辑命题等价于这个进程满足的类型。你的进程通过了一个类型检查,也就自然证明了这个进程满足对应的逻辑命题,从而实现了自动化的形式验证。(Atticbee注:Greg在接下来讲了很多LADL的知识,需要很多数学功底才能理解,所以略过很多细节。)
LADL(用分配律表达逻辑)是一种推导、检查类型的算法。注意有一些类型是不满足分配律的,比如列表,因为列表中元素存在次序关系所以不满足交换律。但集合这个类型是满足的。然而我们并不需要支持最通用的类型集合(那就太复杂了,很难快速、自动的求解),只需要支持一个尽可能大的子集就行。
所以LADL的思路是放弃了对最普遍的代数结构的支持,这就不用求解非常难解的问题了,转而只支持一个子集(Atticbee注:最普遍的情况非常难解,需要穷举各种状态的组合,计算量非常大。)用LADL有很多好处,首先,可以一键快速生成类型系统(Atticbee注:从而也实现了在这个子集上的代码的一键形式化证明);然后,可以用来作为一个更好的查询语言。比如现有的github系统,你是无法根据代码的结构进行查询的。如果可能根据代码的结构和行为进行查询,那会使得程序员的效率大大提高。
/ 关于Rholang的第一手中文资料 /
为了让大家更方便地了解RChain,追踪最新信息,将项目相关资源链接整理如下:
RChain官网
rchain.coop
RChain社区
discord.gg/NWkQnfH
注:需要认证为Coop会员才能进入
认证入口:www.rchain.coop/community
视频
www.youtube.com/channel/UCSS3jCffMiz574_q64Ukj_w/videos
注:RChain创始人Greg每周会发布视频更新,内容包括由产品负责人Kelly主持的每周开发总结,由Greg亲自操刀的理论研究进展,和一些及时的社区反馈信息。
RChain代码
RChain区块链项目主代码库:
github.com/rchain/rchain
官方dApp项目RSong的代码库
github.com/rchain/rsong
RChain社区自带干粮的码农贡献的代码
github.com/rchain-community
RChain-API 代码库
github.com/rchain-community/rchain-api
治理
董事会文档
github.com/rchain/board
RChain社区特别会议提案区
github.com/rchain-community/sm19a
技术文档
mobile-process-calculi-for-programming-the-new-blockchain.readthedocs.io/en/latest
注:最值得研究的文档
关于LADL
arxiv.org/pdf/1610.02247.pdf
注:Mike Stay和Greg共同撰写的论文
关于CBC Casper
RChain Dev Conference - CBC Casper
docs.google.com/presentation/d/1I15PD5cV-OxL9I45B-cX6KTPwQJQu4BYgHfLwLthByg/edit#slide=id.p
注:Vlad在Rchain 开发者大会上的PPT
Rholang的早期文档
The Rholang specification
developer.rchain.coop/assets/rholang-spec-0.2.pdf
RChain项目管理
rchain.atlassian.net/wiki/spaces/CORE/overview
注:信息量巨大,慢慢研究吧
测试网相关信息
rchain.atlassian.net/wiki/spaces/CORE/pages/678756429/RChain+public+testnet+information
Rholang中文社区
rholang-china.org/
注:使命是在中文区推广Rholang语言,由愁虫主持。
Rholang中文教程
slides.com/dimworm/rholang_v1/
注:由中文社区出品
R链中文社区
www.genesisfor.com/
注:汇集所有中文RChain的文章,由链随运营。
http://rchain.site/
注:中文社区爱好者网站,目前在维护中。
RChain的一键形式化验证:关于RCast 33 – LADL话题的讨论摘要的更多相关文章
- 形式化验证工具(PAT)Reader-Writers Problem学习
经过前几次的学习,我们应该对PAT有一点点的了解了,我们加下来就直接看例子中的一个问题,这个问题比较简单. 看代码: //The classic Readers/Writers Example mod ...
- 形式化验证工具(PAT)2PC协议学习
今天我们来看看2PC协议,不知道大家对2PC协议是不是了解,我们先简单介绍一下. 两阶段提交协议(two phase commit protocol, 2PC)可以保证数据的强一致性,许多分布式关系型 ...
- 形式化验证工具(PAT)羊车门代码学习
首先介绍一下PAT工具,下图是PAT工具的图标 PAT工具全称是Process Analysis Toolkit,可以做一些简单的验证. 今天我们分析一下例子里面的Monty Hall Problem ...
- 形式化验证工具(PAT)Perterson Algorithm学习
今天学习一下Perterson Algorithm. 这个算法是使用三个变量来实现并发程序的互斥性算法. 具体看一下代码: Peterson算法是一个实现互斥锁的并发程序设计算法,核心就是三个标志位是 ...
- [转]ASP.NET Web API(三):安全验证之使用摘要认证(digest authentication)
本文转自:http://www.cnblogs.com/parry/p/ASPNET_MVC_Web_API_digest_authentication.html 在前一篇文章中,主要讨论了使用HTT ...
- ASP.NET Web API(三):安全验证之使用摘要认证(digest authentication)
在前一篇文章中,主要讨论了使用HTTP基本认证的方法,因为HTTP基本认证的方式决定了它在安全性方面存在很大的问题,所以接下来看看另一种验证的方式:digest authentication,即摘要认 ...
- kickstart一键自动安装Linux系统
kickstart,无人值守,自动安装系统.本文介绍kickstart的用法. #安装系统的信息——可以参考 [root@larrywen pdf]# vim ~/anaconda-ks.cfg 第一 ...
- 安全验证之使用摘要认证(digest authentication)
安全验证之使用摘要认证(digest authentication) 在前一篇文章中,主要讨论了使用HTTP基本认证的方法,因为HTTP基本认证的方式决定了它在安全性方面存在很大的问题,所以接下来看看 ...
- 【Asp.net入门15】第一个Asp.net应用程序-输入验证
前言 所谓输入验证,顾名思义就是验证用户输入符不符合要求.前面我们已经完成了这个简单的应用程序,但还有一个问题需要解决:用户可以在Default.aspx窗体中 提交任何数据,甚至可以提交根本不包含任 ...
随机推荐
- 快排java代码
定一个基准位,递归左右两边排序. public void fun(){ int arr[] = {2,3,4,5,6,7,822,3,4,5,8,6,5,4,2,1}; //System.out.pr ...
- dotnet 将文件删除到回收站
默认删除文件的时候 File.Delete 是将文件永久删除,如果是一些文档,建议删除到回收站,这样用户可以自己还原 通过 SHFileOperation 可以将文件放在回收站 本文提供的方法暂时只能 ...
- 【21.00%】【vijos P1018】智破连环阵
描述 B国在耗资百亿元之后终于研究出了新式武器--连环阵(Zenith Protected Linked Hybrid Zone).传说中,连环阵是一种永不停滞的自发性智能武器.但经过A国间谍的侦察发 ...
- 一个vue管理系统的初步搭建总结
ps:目前这个项目只是有一个大致的框架,并没有做完 前期准备工作 前端构建工具:Visual Studio Code后端构建工具:IDEA数据库和服务器构建工具:WampServer (使用的是2.4 ...
- 【2016常州一中夏令营Day4】
小 W 走迷宫[问题描述]小 W 被小 M 困在了一个方格矩阵迷宫里,矩阵边界在无穷远处,我们做出如下的假设:a. 每走一步时,只能从当前方格移动一格,走到某个相邻的方格上:b. 走过的格子立即塌陷无 ...
- koa2入门--02.koa2路由
首先输入在项目文件下使用cmd,输入 npm install koa-router --save const koa = require('koa');//引入koa const Router = r ...
- win10 uwp 录制任意应用屏幕
在 1803 可以使用 Windows.Graphics.Capture 捕获屏幕,可以用来录制应用的窗口 通过 CompositionAPI 和 win2d 可以作为 D3D 绘制,通过 Direc ...
- 解决IDEA下tomcat启动server乱码
亲测成功的方式: 配置TOMCAT时,在VM opthions 添加 -Dfile.encoding=UTF-8
- filter 开发
在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目 ...
- appium+android自动化测试环境部署
1 node.js安装 官网(https://nodejs.org/en/) 下载对应版本的node.js并安装 安装完成后cmd中输入node -v,输入版本号则安装成功 2 jdk安装 下载对应版 ...