在智能合约中,一般是需要两类函数。初始化函数——init,调用合约——invoke;
初始化函数主要作用是为了初始化当前合约的状态,一般在创建合约的时候执行一次;
调用函数是在合约初始化之后,用户用来获取或者更新合约的函数;对于获取状态的函数,其实有两种方式,
1、用户直接获取节点本地的数据库,即不上链的操作;2、用户获取状态的交易,通过共识,在链上留痕;
实现:
我们还是使用rust的过程宏,来实现;将普通函数标记为我们合约的函数;
形式:
参数与返回值
#[derive(Serialize, SchemaType)]
struct Address {
address : AccountAddress,
}
#[derive(Serialize, SchemaType)]
struct Balance {
balance: u64,
}
init函数格式
#[init(contract="erc20", parameter="Address", result="Balance", payable, event)]
invoke函数格式
#[invoke(contract="erc20",name="balanceof", parameter="Address", result="Balance", payable, event)]
属性:
这两种函数标记,使用一样的属性;只是init函数不需要重新给他设置函数名称。
contract:函数所属的合约名称;
name:函数名称,只有receive函数有;
parameter:函数的参数,一般是struct、enum类型的名称;
result:函数的返回值,一般是struct类型的名称;
payable:该函数执行时,是否可以转入代币;
event:使能函数的event功能;
通过rust的过程宏,我们就可以将rust语言进行改造,形成我们自己的智能合约语言规范,如果有新的需求你可以继续添加新的属性与功能;