井通科技 智能合约文档

1. 概述

井通智能合约以Lua为实现语言,贴合C++实现小型化、配置化和轻量化的智 能合约引擎,同时又对系统的改动不大,以及能够保持在C++中实现lua的高效运 行。
井通智能合约支持两个智能合约交易,分别是智能合约部署交易和智能合约 调用交易。
智能合约部署的curl命令如下:
这里写图片描述

其中,各个参数含义如下:

这里写图片描述
合约部署成功,返回一个合约地址,此合约地址即是后续进行合约调用的目 标地址。例如:
这里写图片描述

这里写图片描述

合约payload字段说明如下:
这里写图片描述
合约脚本中必须包含Init函数,合约执行需要存储的数据在该函数中完成。 合约中result={}是固定的,必须包含。合约返回值交由result返回,result中包含 两个字段:’state’和’res’。State是bool类型表示接口调用是否成功,’res’是string类 型,存储的是接口调用结果或者错误信息。Init函数和foo函数接收参数t是一个lua语言table类型。用户传递的参数都在这个table中,在lua代码中获取方式如value =t[‘0’]。注:在编写lua代码时不要有换行回车。
井通系统合约引擎对于合约函数的调用,通过lua的talble类型进行参数传递, table中参数顺序为:
1) 按顺序压入用户传入的参数,用户参数在table的key编号从‘0’开始。
2) 最后压入固定的5个参数,分别是合约账号地址(table中对应的key为 ‘TDstAccountID’)、交易引擎指针(table中对应的key为 ‘TEnginePointer’)、交易指针(table中对应的key为‘TTxn’),交易引 擎校验值(table中对应的key为‘TEnginePointerHash’),交易指针校验值 (table中对应的key为‘TTxnHash’)。

2. 合约库函数规范

所有合约库函数都以sc开头,sc是smart contract的缩写。信息获取以scGet+获取 信息,如获取账号信息函数命名应该是:scGetAccountInfo。功能操作类库函数命名 是sc+功能名称,如支付功能:scPayment。
所有合约库函数函数参数都只能是 lua_State *L,返回值只能是 static int,该返 回值表示的传出参数的个数。传出参数是一个 table 类型的值,table 中包含两个成 员:table[‘state’]和 table[‘res’]。table[‘state’]是一个是 boolean 值,表示库函数执行是否成 功,1 表示成功,0 表示失败。table[‘res’]为 string 类型,库函数执行成功返回的是 库函数执行结果,失败返回的是错误原因。这个结果记录在交易请求的 contract state 里面。

3. 收费机制

系统以 SWT 为基础的手续费收取,目前收费机制是按照 lua 脚本的字节长度 和调用 lua 操作码的难以程度进行双重收费。Lua 脚本长度收费标准:每个字节 收取十万分之一 SWT 的费用;lua 操作码的收费标准如下(收费单位是百万分之一 SWT):
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

4. 合约库列表 4.1 账号类接口
4.1.1 获得账号信息接口

static int scGetAccountInfo(lua_State* L) 接口简介:查询指定账号的账号信息。
这里写图片描述
这里写图片描述
合约调用格式如下,其中 curl 命令中 payload 字段是 lua 脚本的十六进制编码 格式,参数也是字符串的十六进制编码格式。合约调用结果会在交易结果中 contractstate 字段中显示。合约部署作用是将生成合约账号,将 payload 中 lua 合约进 行存储。合约调用时 destination 字段必须填写部署合约生成的合约账号的地址。
这里写图片描述
这里写图片描述

4.1.2 获得账号挂单和信任线总数接口 scGetAccountOwnerCount(lua_State* L)

接口简介:查询指定账号的 ownercount 数目,ownercount 是指该账号挂单数目 和信任线的总和。
这里写图片描述
这里写图片描述
合约调用格式如下,其中 curl 命令中 payload 字段是 lua 脚本的十六进制编码格式, 参数也是字符串的十六进制编码格式。合约调用结果会在交易结果中 contractstate 字段中显示。合约部署作用是将生成合约账号,将 payload 中 lua 合约进行存储。 合约调用时 destination 字段必须填写部署合约生成的合约账号的地址。
这里写图片描述
这里写图片描述

4.1.3 获得账号余额接口

static int scGetAccountBalance(lua_State *L)
接口简介:获得指定账户的 swt 余额。
这里写图片描述
这里写图片描述
这里写图片描述

4.1.4 获得账号挂单数目接口

static int scGetAccountOrderCount(lua_State *L) 接口简介:获得指定账号的挂单数目。
这里写图片描述
这里写图片描述
这里写图片描述

4.1.5 获得账号指定货币余额接口 static int scGetAccountTum(lua_State *L)

接口简介:获得指定账号的指定货币的余额
这里写图片描述
这里写图片描述
这里写图片描述

4.1.6 获得账号当前交易序列号接口 static int scGetAccountSequence(lua_State *L)

接口简介:获得指定账号当前所做的交易总数。
这里写图片描述
这里写图片描述
这里写图片描述

4.1.7 获得指定交易接口

static int scGetTransaction(lua_State* L)
接口简介:查询指定交易 ID 的交易内容
这里写图片描述
这里写图片描述
这里写图片描述

4.2.账本类接口

4.2.1 获得账本头信息
static int scGetLedgerInfo(lua_State* L) 命令简介:查询指定账本内容信息
这里写图片描述
这里写图片描述

4.2.2 获得当前账本序列号接口

static int scGetLedgerIndex(lua_State* L)
接口简介:获得当前账本号。
这里写图片描述
这里写图片描述

4.2.3 获得最新关闭账本序列号

static int scGetLedgerClosedIndex(lua_State* L)
接口简介:获得上一个关闭账本的账本号。
这里写图片描述
这里写图片描述

4.3 交易类接口
4.3.1 支付接口

static int scPayment(lua_State* L)
接口简介:同步支付接口,支付的源账号必须是合约账号或者是交易操作账 号。否则无法成功
这里写图片描述
这里写图片描述

4.4 状态存取类接口
4.4.1 状态存储接口

static int scStateStorage(lua_State* L) 接口简介:存储合约状态,存储合约调用时需要的参数
这里写图片描述
这里写图片描述

4.4.2 状态获取接口

static int scStateGet(lua_State* L)
这里写图片描述
这里写图片描述

5. lua 基本语法

Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值,值可以存储在 变量中,作为参数传递或结果返回。本节中只介绍合约系统用到的 lua 的基本语 法。
智能合约采用的是 lua5.2,进过修改剪裁,不支持 io 和多线程操作。不支持 lua 脚本中包含多个 Init(t)函数。

6.1 lua 数据结构

系统用到中有 6 个基本类型分别为:nil、boolean、number、string、function 和 table。
这里写图片描述

6.2 lua 变量

变量在使用前,必须在代码中进行声明,即创建该变量,编译程序执行代码 之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值。Lua 变量 有三种类型:全局变量、局部变量、表中的域。Lua 中的变量全是全局变量,那 怕是语句块或是函数里,除非用 local 显式声明为局部变量。局部变量的作用域 为从声明位置开始到所在语句块结束。变量的默认值均为 nil
这里写图片描述
赋值语句
赋值是改变一个变量的值和改变表域的最基本的方法

a = "hello" 
"world" t.n = t.n + 1

Lua 可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值 语句右边的值会依次赋给左边的变量。

a, b = 10, 2*x               <-->               a=10; b=2*x

遇到赋值语句 Lua 会先计算右边所有的值然后再执行赋值操作,所以我们可以这
样进行交换变量的值:

x, y = y, x                                             -- swap 'x' for 'y' a[i], a[j] = a[j], a[i]                   -- swap 'a[i]' for 'a[j]'

当变量个数和值的个数不一致时,Lua 会一直以变量个数为基础采取以下策略: a. 变量个数 > 值的个数 按变量个数补足 nil
b. 变量个数 < 值的个数 多余的值会被忽略
例如:

a, b, c = 0, 1print(a,b,c)                           --> 0         1         nil
a, b = a+1, b+1, b+2           -- value of b+2 is ignoredprint(a,b)                               --> 1           2 a, b, c = 0print(a,b,c)                           --> 0         nil       nil

上面最后一个例子是一个常见的错误情况,注意:如果要对多个变量赋值必须依 次对每个变量赋值。

a, b, c = 0, 0, 0print(a,b,c)                           --> 0       0           0

多值赋值经常用来交换变量,或将函数调用返回给变量:

a, b = f()
f()返回两个值,第一个赋给 a,第二个赋给 b。

应该尽可能的使用局部变量,有两个好处: 1. 避免命名冲突。
2. 访问局部变量的速度比全局变量更快。
索引
对 table 的索引使用方括号 []。Lua 也提供了 . 操作。

t[i]
t.i                                       -- 当索引为字符串类型时的一种简化写法 gettable_event(t,i) -- 采用索引访问本质上是一个类似这样的函数调用
6.3 lua 循环

很多情况下我们需要做一些有规律性的重复操作,因此在程序中就需要重复 执行某些语句。一组被重复执行的语句称之为循环体,能否继续重复,决定循环 的终止条件。循环结构是在一定条件下反复执行某段程序的流程结构,被反复执 行的程序被称为循环体。循环语句是由循环体及循环的终止条件两部分组成的。
这里写图片描述
var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次”执行体 “。exp3 是可选的,如果不指定,默认为 1。
泛型 for 循环
泛型 for 循环通过一个迭代器函数来遍历所有值,类似 java 中的 foreach 语句。
Lua 编程语言中泛型 for 循环语法格式:

--打印数组 a 的所有值     for i,v in ipairs(a) do print(v) end

循环控制语句

while( a < 20 )do print("a 的值为:", a) a=a+1
if( a > 15)
then
--[ 使用 break 语句终止循环 --]
break endend
6.4 lua 流程控制

Lua 编程语言流程控制语句通过程序设定一个或多个条件语句来设定。在条
件为 true 时执行指定程序代码,在条件为 false 时执行其他指定代码。

控制结构的条件表达式结果可以是任何值,Lua 认为 false 和 nil 为假,true 和 非 nil 为真。
要注意的是 Lua 中 0 为 true:
这里写图片描述

if(布尔表达式)then
--[ 在布尔表达式为 true 时执行的语句 --]end


if(布尔表达式)then
     --[ 布尔表达式为 true 时执行该语句块 --]else
--[ 布尔表达式为 false 时执行该语句块 --]end if( 布尔表达式 1)then
--[ 布尔表达式 1true 时执行该语句块 --] if(布尔表达式 2)
then
--[ 布尔表达式 2true 时执行该语句块 --]
endend
6.5 Lua 函数

在 Lua 中,函数是对语句和表达式进行抽象的主要方法。既可以用来处理一 些特殊的工作,也可以用来计算一些值。 Lua 提供了许多的内建函数,你可以 很方便的在程序中调用它们,如 print()函数可以将传入的参数打印在控制台上。 Lua 函数主要有两种用途: 1.完成指定的任务,这种情况下函数作为调用语句使 用; 2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。
函数定义

optional_function_scope function function_name( argument1, argument2, argument3..., argumentn) function_body
return result_params_comma_separated end

optional_function_scope: 该参数是可选的制定函数是全局函数还是局部函数,未 设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local。
function_name: 指定函数名称。
argument1,argument2,argument3…,argumentn: 函数参数,多个参数以逗号隔开,函 数也可以不带参数。
function_body: 函数体,函数中需要执行的代码语句块。
result_params_comma_separated: 函数返回值,Lua语言函数可以返回多个值,每个 值以逗号隔开。
多返回值

s, e = string.find("www.runoob.com", "runoob")

可变参数
lua函数可以接受可变数目的参数,和 C 语言类似在函数参数列表中使用三 点 表示函数有可变的参数。
lua将函数的参数放在一个叫 arg 的表中,#arg 表示传入参数的个数。 例如,我们计算几个数的平均值:

function average(...) result = 0
local arg={...}
for i,v in ipairs(arg) do
result = result + v end
print("总共传入 " .. #arg .. " 个数") return result/#argend
print("平均值为",average(10,5,3,4,5,6))
6.6 运算符 算数运算符

下表列出了 Lua 语言中的常用算术运算符,设定 A 的值为 的值为 20:
这里写图片描述

逻辑运算符
下表列出了 Lua 语言中的常用逻辑运算符,设定 A 的值为 true,B 的值为
false:
这里写图片描述
这里写图片描述

关系运算符
下表列出了 Lua 语言中的常用关系运算符,设定 A 的值为 10,B 的值为 20:
这里写图片描述
运算符优先级从高到底的顺序

^ not - (unary) * / + - .. < > <= >= ~= ==andor

##### 6.7 Lua table
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数字、 字典等。
Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个 值不能是 nil。
Lua table 是不固定大小的,你可以根据自己需要进行扩容。
Lua 也是通过 table 来解决模块(module)、包(package)和对象(Object)的。 例
如 string.format 表示使用”format”来索引 table string。 table 的构造
构造器是创建和初始化表的表达式。表是 Lua 特有的功能强大的东西。最简 单的构造函数是{},用来创建一个空表。可以直接初始化数组:

-- 初始化表
mytable = {}
-- 指定值
mytable[1]= "Lua"
-- 移除引用
mytable = nil-- lua 垃圾回收会释放内存

当我们为 table a 并设置元素,然后将 a 赋值给 b,则 a 与 b 都指向同一个 内存。如果 a 设置为 nil ,则 b 同样能访问 table 的元素。如果没有指定的变量 指向 a,Lua 的垃圾回收机制会清理相对应的内存。
以下列出 Table 操作常用的方法:
这里写图片描述

作为一个开发者,有一个学习的氛围跟一个交流的圈子特别重要,下面是我们的社区交流群,不管你是小白还是大牛欢迎入住,分享经验、讨论技术、社区开发。大家一起交流学习共同成长!希望开发者少走弯路。
1.社区开发者大赛 QQ 群:568285439
2.社区论坛:http://bbswtc.com
3.社区公众号:SWTC 互动社区、SWTC 社区
4.github:https://github.com/swtcpro

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值