Linear Logic 与 FRP
交互与UI
在CKB的Dapp开发框架中,现阶段只有非常简单的命令式交互,也没有涉及到多方交互。
而实际上一个Dapp除了跟区块链交互,还会涉及跟其他参与方交互的流程。Cell Model这方面更甚,比如多签。
一个Dapp的流程也有可能是动态的,根据链上状态的不同而不同。
出于用户友好的考虑,最好是有一个UI来做信息的展示和用户交互。
Linear Logic Programming
最近看到一个视频,讲利用linear logic programming进行复杂规则游戏的原型验证。
整个游戏世界由一堆初始配置和一些演化规则组成。其中一些规则是关于用户交互调度,随机等的处理。
游戏的进行就是在玩家的动作下,世界状态从初始配置开始,遵循演化规则,一步一步变化。
规则可以使用linear logic来描述,因为游戏世界也跟现实世界很类似,死掉的角色不会再出现,物品用掉之后就没有了。
交互方面,最简单的做法是把当前所有可能的选项列出来,让用户选择并输入对应的序号。
这样的交互太简单了,处理不了更复杂的交互,比如需要用户输入多个值。
另外因为是多玩家,并且分角色或者分队伍,很多选项其实是无效的。
更好的做法是像回合制游戏一样,做一个回合的调度。这样在自己的回合里,用户可以做很多复杂的交互,比如输入。知道当前是哪个角色的回合,以及在整个流程里面的进度,就可以给出比较少的更有针对性的选项。
系统中通常会有一些重要的不变量。基本的比如,每个玩家只有一次条生命;每个玩家都会有自己的回合等。
规则设计的时候,维护系统的这些不变量是很重要的。
如果初始配置是符合这些不变量,且每一条规则对世界状态进行变化的时候也保持这些不变量。那么在整个游戏过程中,这些不变量将会一致成立。
使用linear logic来描述规则对于维持不变量非常有帮助。
对于框架的意义
处理多个参与方的交互,我们可以借鉴上面的一些做法。
linear logic用于Dapp开发,目前不是很紧急。
因为区块链本身就是一个linear logic的系统(参见上一篇文章)。
Dapp通常也都以链上数据为准,客户端如果跟链上状态没有同步,只要保证后续操作报错,不要有误操作即可。
当然使用linear logic之后,就可以在开发阶段发现一些破坏不变量的行为,这对提高Dapp质量是非常有帮助的。
FRP
Functional reactive programming是最近几年非常火的一项技术,多被用在交互式和UI领域。
有一篇文章,我觉得总结的不错。
一提到UI编程,肯定都会想到MVC架构。很多人觉得FRP是代替MVC的,但是其实在FRP里面还是可以看到MVC的影子。FRP可以认为是一种多层Model之间同步的一种技术。也可以认为是嵌套的MVC,这里V并不是直接渲染出可以显示的内容(bitmap),而是将上一层的Model渲染为下一层Model。
Cell Model相比Account Model,在MVC的M上面会更复杂。
Account Model可以认为合约里表示状态的数据结构是核心的M,一般客户端不需要再单独维护自己的M。
但是Cell Model下,链上没有一个显式的全局的M,这项工作必须放到客户端。
在之前的文章中,也提到类似的情况,当时是类比为Arrow。
其实Arrow跟FRP有很密切的关系。在FRP中经常会出现Signal的概念,SF a b = Signal a -> Signal b
,这里的SF类型就是一个Arrow,而不是Monad。
而且我们可以从FRP框架中借鉴一些做法。用户看到的是更上层的Model,开发的也只是上层Model之间的转换函数。我们可以把Cell相关的概念隐藏起来,严格限制对Cell的操作,这样可以让Dapp更加的安全和可靠。