我们写智能合约的时候,会发现,合约其实是有一个比较明显的范围限定的。例如solidity中,就有类似于面向对象中的类,将一个合约的属性与方法,都设定在一个合约类当中;而在fabric中链码,更接近我们普通的程序,合约分布在几个文件中,用户将其打包成一个智能合约。所以我们在设计智能合约语言的时候,第一步考虑的就是我们的合约是一个怎么样的形式。
简单一点,一组变量和一组方法,基本可以满足合约的要求了。然后就是我们以什么样子的形式把其组织起来呢?先说一下我们的目标,我们希望这组变量和方法可以很明显的被观测到,他们属于一个合约。写合约的时候,也能够让开发者,足够方便且醒目,不至于开发的时候出现错误。
我们的智能合约语言是基于rust实现的,利用rust语言开发一种新的语言——智能合约语言,不过这门新的语言不需要很强大的功能,它能覆盖智能合约需求即可;就具体实现来说,我们其实就是利用rust的宏,实现元编程。相对于ethereum和fabric的两种方法,我们采用标记的方法,即用户主动标记当前的元素——函数、变量——属于哪个合约。
我们主要是使用属性宏——proc_macro_attribute去实现我们的智能合约语言,然后通过他的第一个参数attr,设置合约的名称contract。
例如,设置初始化参数。
#[init(contract="erc20")]
fn erc20_init<T>()->Result<T>{
… …
}
调用函数设置合约,
#[invoke(contract="erc20")]
fn erc20_invoke<T>()->Result<T>{
… …
}
设置事件
#[event(contract="erc20")]
enum event {
… …
}
我们通过在不同的宏中,设置contract的值,来确定各个元素的属于哪个合约。
但从智能合约的结构来说,我们只需要添加一些属性和方法,就完全够用了。后边我们就以这个思路,将其他基本的结构补充完整其骨架,置于具体的实现,后边也会慢慢做。