因为最近一门课大作业与RChain项目有关,不得不临时学习Rholang,以下为个人根据知乎和其他博客关于Rholang的语法小结,可能存在问题,请各位指正
rholang语法:
rholang中基本元素:name与process
name和process可以相互转化,二者关系可以用 c中的指针进行理解,如*p=q,name相当于p这个指针,没有具体内容,process相当于q,有具体内容,name与process也可以进行相似的转化,*name=process,@process=name。
便于了解rholang信息接收机制可将name看为信箱,process看为信件
发送信息基本格式
name ! (process) 表示向name这个信箱发送一个process信件
Myname!(“helloworld”)表示向myname发送”helloworld”
@”stdout”!(“helloworld”)表示向@”stdout”这个name,发送”helloworld”,即向标准输出中写入helloworld
接收信息基本格式
for (name1<-name2){...}
具体含义为从name2中取出一个process,并将它用@process=name1的方式进行替换,{...}中的内容为接收信息后相关操作,最简单操作为Nil,即什么都不做。
声明一个name
new Myname in{...},{}中为接收或发送操作,例如:
new Myname in{
for (v-<Myname)
{Nil}|
Myname !(“Helloworld”)
}
由于rholang中除数据依赖时不存在顺序执行,多个操作用|连接。
以上为rholang基本语法,可以用下列总结:
P,Q,R::=0
X,ptrn::=@P
for (prtn1<-x1,prtn2<-x2...)
P
P|Q
X!(Q)
*x
name信箱注意事项
name取process顺序不保证与存入顺序一致
当for(x<-prtn)P时表示取件后执行P,如果信箱为空,则将P放入信箱,并称其为continuation
当信箱中存有continuation时接收process Q,则不将Q放入信箱,将Q与continuation匹配后执行
合约
用<-接收消息后操作只会执行一次,而用<=接收消息每次都会执行
可将<-看作预设一次操作,而<=为信箱的性质
如
new Myname in{
for (x<-Myname)
{
@”stdout”!(*x)
}|
Myname!(“Hi”)|
Myname!(“Hello”)
}
如果用<-只会输出Hi或Hello,而用<=则都会
同时<=等价与contract Myname(x)={@”stdout”!(*x)}
以下为对RChain项目要的部分了解
多个name构成元组空间,一堆服务器维护一个元组空间,这堆服务器叫名字空间
RChain中货币的流通树形方案
存在根名字空间,其他空间创建时必须有父名字空间,purse只能在名字空间中移动,父子空间的货币兑换通过系列合约进行,父名字空间有记录子空间金额总数的参数
父向子空间转账时,转账钱包先分离金额,金额经过兑换后删除,同时在子空间生成相对应兑换金额,父空间记录金额参数随之改变,接收者融合兑换后金额完成转账