# 合约语法

# 源文件字符编码

Summoner使用与处理器相同的字符编码。unix为UTF-8,windows为GB2312。除注释及定义字符串字面量,其他不能使用非ASCII字符。

# 关键字

以下单词作为Summoner关键字,不能作为变量名、函数名、结构体名使用。

if、else、type、struct、var、goto、for、range、break、continue、func、nil、
bool、int64、string、const、amount、asset、hash、pubkey、sig、hex

# 空白字符处理

空格、制表符、换行,用来区分不同标识符。其中换行在函数的语句中表示当前语句结束。

# 注释

同Golang,/*xxx*/块注释、//行注释。

# 标识符

变量名、函数名、结构体名等的使用的标识符,规则: 第一个字母必须为英文大小写字母或下划线,A-Za-z_。 第二个字母开始可以为英文大小写字母、下划线或数字,A-Za-z_0-9

# 字面量

bool字面量:true false 整形字面量:[1-9][0-9])|0 浮点数字面量:[0-9]+.[0-9]+ 字符串字面量:[A-Za-z_][A-Za-z_0-9]

# 数据类型

  • bool类型:bool
  • 整数类型: int64
  • 浮点数类型: float64
  • 字符串类型: string
  • amount类型: amount
  • asset类型: asset
  • hash类型: hash
  • publicKey类型: pubkey
  • signature类型: sig
  • hex类型: hex

# built-in方法

  • sha3(s) 返回字节类型字符串参数s的SHA3-256的哈希运算结果.
  • sha256(s) 返回字节类型字符串参数s的SHA-256的哈希运算结果.
  • abs(n) 返回数值n的绝对值.
  • min(x, y) 返回两个数值x和y中最小的一个.
  • max(x, y) 返回两个数值x和y中最大的一个.
  • checkTxSig(key, sig) 根据一个PublicKey和一个Signature验证交易的签名是否正确.
  • below(height) 判断当前区块高度是否低于参数height,如果是则返回true,否则返回false.
  • above(height) 判断当前区块高度是否高于参数height,如果是则返回true,否则返回false.
  • lock(amount,asset,program) 锁定amount数量asset类型的资产到指定的接受对象(program类型)
  • verify(expression) 验证表达式结果是否为真,其中expression的结果必须是bool类型,expression表达式的结果必须为true时表示验证成功

# 表达式

expression将运算符连接起来,支持的种类如下:

  • 字面量表达式
  • 标识符表达式
  • 算术运算表达式:加减乘除取模取反
  • 括号表达式
  • bool表达式
  • 函数调用表达式
  • 比较运算表达式
  • 逻辑运算表达式

# 类型转换

二元运算符类型转换 赋值语句类型转换

# 语句

# 声明语句

声明语句定义了程序的各种实体对象以及部分或者全部的属性 var:对应于变量声明 func:对应于函数实体对象的声明

var变量声明的一般语法:

var 变量名 类型 = 表达式

例如

var a int = 1

func函数声明一般语法:

func 函数名(形式参数列表){
    函数体
}

# 表达式语句

# 一元表达式

  • - expr : 对数学表达式取负值
  • ~ expr : 对字节串做按位翻转

# 条件表达式

下面的表达式都必须为数字类型操作数(即Integer或Amount类型),并且返回一个 Boolean 型的结果:

  • expr1 > expr2 : 检测expr1是否大于expr2
  • expr1 < expr2 : 检测expr1是否小于expr2
  • expr1 >= expr2 : 检测expr1是否大于或等于expr2
  • expr1 <= expr2 : 检测expr1是否小于或等于expr2
  • expr1 == expr2 : 检测expr1是否等于expr2
  • expr1 != expr2 : 检测expr1是否不等于expr2

# 按位操作表达式

下面的表达式为字节类型,且返回值也是字节类型:

  • expr1 ^ expr2 : 得到两操作数按位异或(XOR)的结果
  • expr1 | expr2 : 得到两操作数按位或(OR)的结果
  • expr1 & expr2 : 得到两操作数按位与(AND)的结果

# 数值表达式

下面的表达式都是数值型操作数(Integer或Amount),并且返回数值型的结果:

  • expr1 + expr2 : 两操作数相加
  • expr1 - expr2 : 两操作数相减,expr1减去expr2
  • expr1 * expr2 : 两操作数相乘
  • expr1 / expr2 : 两操作数相除,expr1除以expr2
  • expr1 % expr2 : 操作数取余,即expr1对expr2取余
  • expr1 << expr2 : 将expr1按位左移expr2位
  • expr1 >> expr2 : 将expr1按位右移expr2位

# if语句

if 语句的语法如下:

if 布尔表达式 {    
  /* 在布尔表达式为 true 时执行 */ 
} else {
  /* 在布尔表达式为 false 时执行 */ 
}

例如

if b > c {
    a = b
} else {
    a = c
}

# 函数

# 函数定义

func 函数名(形式参数列表){
    函数体
}

# 函数参数

单个参数:

name TypeName

多个参数列表:

name TypeName, name TypeName, ...

若参数类型相同,则可简写为:

name1, name2, ..., TypeName

如下述两种函数声明等价:

func LockWithMultiSig(pk1 pubkey, pk2 pubkey, pk3 pubkey)

func LockWithMultiSig(pk1, pk2, pk3 pubkey)

支持的类型如下:

bool、int64、string、const、amount、asset、hash、pubkey、sig、hex
上次更新: 2021/11/1下午6:23:50