作者/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话题的讨论摘要的更多相关文章

  1. 形式化验证工具(PAT)Reader-Writers Problem学习

    经过前几次的学习,我们应该对PAT有一点点的了解了,我们加下来就直接看例子中的一个问题,这个问题比较简单. 看代码: //The classic Readers/Writers Example mod ...

  2. 形式化验证工具(PAT)2PC协议学习

    今天我们来看看2PC协议,不知道大家对2PC协议是不是了解,我们先简单介绍一下. 两阶段提交协议(two phase commit protocol, 2PC)可以保证数据的强一致性,许多分布式关系型 ...

  3. 形式化验证工具(PAT)羊车门代码学习

    首先介绍一下PAT工具,下图是PAT工具的图标 PAT工具全称是Process Analysis Toolkit,可以做一些简单的验证. 今天我们分析一下例子里面的Monty Hall Problem ...

  4. 形式化验证工具(PAT)Perterson Algorithm学习

    今天学习一下Perterson Algorithm. 这个算法是使用三个变量来实现并发程序的互斥性算法. 具体看一下代码: Peterson算法是一个实现互斥锁的并发程序设计算法,核心就是三个标志位是 ...

  5. [转]ASP.NET Web API(三):安全验证之使用摘要认证(digest authentication)

    本文转自:http://www.cnblogs.com/parry/p/ASPNET_MVC_Web_API_digest_authentication.html 在前一篇文章中,主要讨论了使用HTT ...

  6. ASP.NET Web API(三):安全验证之使用摘要认证(digest authentication)

    在前一篇文章中,主要讨论了使用HTTP基本认证的方法,因为HTTP基本认证的方式决定了它在安全性方面存在很大的问题,所以接下来看看另一种验证的方式:digest authentication,即摘要认 ...

  7. kickstart一键自动安装Linux系统

    kickstart,无人值守,自动安装系统.本文介绍kickstart的用法. #安装系统的信息——可以参考 [root@larrywen pdf]# vim ~/anaconda-ks.cfg 第一 ...

  8. 安全验证之使用摘要认证(digest authentication)

    安全验证之使用摘要认证(digest authentication) 在前一篇文章中,主要讨论了使用HTTP基本认证的方法,因为HTTP基本认证的方式决定了它在安全性方面存在很大的问题,所以接下来看看 ...

  9. 【Asp.net入门15】第一个Asp.net应用程序-输入验证

    前言 所谓输入验证,顾名思义就是验证用户输入符不符合要求.前面我们已经完成了这个简单的应用程序,但还有一个问题需要解决:用户可以在Default.aspx窗体中 提交任何数据,甚至可以提交根本不包含任 ...

随机推荐

  1. 理解Servlet

    题记:框架横行,似乎已经忘记JavaWeb最基础Servlet是如何工作的,这也是为什么要写这篇文章. Servlet是Java语言应用到Web的扩展技术,是运行在Web应用服务器上的Java程序.与 ...

  2. import()函数

    简介 import命令会被 JavaScript 引擎静态分析,先于模块内的其他模块执行(叫做”连接“更合适).所以,下面的代码会报错. // 报错 if (x === 2) { import MyM ...

  3. dotnet 特性 DynamicallyInvokable 是用来做什么的

    我在 Linq 很多函数都看到 __DynamicallyInvokable 这个特性,这是一个没有官方文档的特性,也许是用来优化反射 在堆栈 网找到了以下描述 这个 __DynamicallyInv ...

  4. ELK系统分析nginx日志

    一.nginx nginx 服务器日志的log_format格式: log_format main '$remote_addr - $remote_user [$time_local] "$ ...

  5. 多线程事儿(task)之 一(转载)

    此文转载作为记录,转载地址https://www.cnblogs.com/xiaoXuZhi/p/XYH_tsak_one.html 多线程,一个多么熟悉的词汇,作为一名程序员,我相信无论是从事什么开 ...

  6. IntelliJ IDEA的常用设置及快捷键

    IntelliJ IDEA的常用设置及快捷键 基本设置 打开设置:ctrl+alt+s 修改主题.字体.字号 快捷键设置 创建项目和模块 标记源码文件 标记资源文件 设置jdk版本号 配置Tomcat ...

  7. .NET Core 3.1和WorkerServices构建Windows服务

    介绍 ASP.NET Core 3增加了一个非常有意思的功能Worker Service.他是一个ASP.NET Core模板,他允许我们创建托管长期的运行的后台服务,这些服务具体实现IHostedS ...

  8. 为什么大家都说Java中只有值传递?

    最近跟Java中的值传递和引用传递杠上了,一度怀疑人生.查了很多资料,加上自己的理解,终于搞清楚了,什么是值传递和引用传递.也搞明白了,为什么大家都说Java只有值传递,没有引用传递.原来,我一直以来 ...

  9. iSO垂直滑动条VerticalSlider

    由于项目需要实现一个垂直的Slider,滑动条使用UIlabel实现,按钮使用UIButton,按钮可以设置背景图片,代码如下 VerticalSlider.h // // VerticalSlide ...

  10. css常用单词

    <!-- type = circle表示空心圆 -->     <!-- type = disc 表示实心圆 -->     <!-- type = square表示方块 ...