区块链的智能合约需要在区块链虚拟机上执行,需要把数据和状态存储在区块链之上。由于虚拟机和区块链存储空间都比较珍贵,就需要编写智能合约的语言短小精悍。Lua语言由于编译后文件非常小巧,只有100多k,所以受到一些公链的青睐。下面树哥就把这个lua语言的基础语法和使用案例简单进行总结。(素材总结自lua菜鸟教程和维基链开发文档,更加详细介绍请查阅相关资料)。
一、Lua语言背景
Lua 属于嵌入到程序中的语言,为应用程序提供灵活的扩展功能,所以它是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放。
特点:
- 轻量级:编译后只有100多k。
- 可扩展:可以利用宿主语言接口进行扩展,通常为c语言。
所以,lua会被用于区块链智能合约的开发,就是因为它短小精悍。
系统安装(mac 为例)
curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make macosx test
make install
二、语法注意事项介绍
1.基本语法
标示符
注意:Lua 是一个区分大小写的编程语言,Shuge和shuge是两个不同的标示符。
保留关键字
and break do else elseif end false for
function if in local nil not or repeat
return then true until while
2.数据类型
Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。
Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。
注意:
1)在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字
- print("2" + 6) 结果 8.0;
- print("2 + 6")结果 2 + 6
2)使用 # 来计算字符串的长度,放在字符串前面
- len = "www.runoob.com" , print(#len)结果:14
- print(#"www.runoob.com") 结果 14
3)在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据
- local tbl1 = {}-- 创建一个空的 table
- local tbl2 = {"apple", "pear", "orange", "grape"} -- 直接初始表
3.变量
Lua 变量有三种类型:全局变量、局部变量、表中的域。
Lua 中的变量全是全局变量,除非用 local 显式声明为局部变量。
赋值
- a = "hello" .. "world"--两个连接在一起
- a, b = 10, 2x <--> a=10; b=2x
- a[i], a[j] = a[j], a[i] -- swap 'a[i]' for 'a[j]'
- a, b = f()--f()返回两个值,第一个赋给a,第二个赋给b。
- 应该尽可能的使用局部变量,避免重名,速度比全局变量更快。
索引
对 table 的索引使用方括号 []和. 操作。
site["key"] = "www.runoob.com"
- print(site["key"]) 结果:www.runoob.com
- print(site.key) 结果:www.runoob.com
4.流程控制
循环
- while(condition) do statements end
- for var=exp1,exp2,exp3 do <执行体> end
- repeat statementsuntil( condition )
5.函数
- 实现打印功能
myprint = function(param)
print("这是打印函数 - ##",param,"##")
end
- 函数当成参数传递给函数
function add(num1,num2,functionPrint)
result = num1 + num2
functionPrint(result)
end
调用函数myprint(10)结果: ## 10 ##
add(2,5,myprint)结果: ## 7 ##
Lua函数可以返回多个结果值,比如string.find
s, e = string.find("www.runoob.com", "runoob")
print(s, e) 结果: 5,10lua 函数可以接受可变数目的参数,和 C 语言类似,在函数参数列表中使用三点 ... 表示函数有可变的参数
function add(...)
for i, v in ipairs{...} do --> {...} 表示一个由所有变长参数构成的数组我们可以将可变参数赋值给一个变量。
local arg={...}
for i,v in ipairs(arg) do也可以通过 select("#",...) 来获取可变参数的数量:
print("总共传入 " .. select("#",...) .. " 个数")
6.各类符号字符及表
运算符
- 算术运算符:加减乘除外,%取余,^乘幂,-负号
- 关系运算符:==等于,~=不等于,>,<,>=,<=
- 逻辑运算符:and or not
- 其他:..连接两个字符串;#返回字符串或表的长度。#"Hello" 返回 5
字符串
- string.upper(argument)变大写
- string.lower(argument)变小写
- string.gsub(mainString,findString,replaceString,num)替换
- string.find (str, substr, [init, [end]])
- string.format(...)字符串格式化
%c转asc码,%d,%i有符号整数,%x十六进制小写,%X十六进制大些 - string.char(arg) 和 string.byte(arg[,int])
- string.len(arg)
print("字符串长度 ",string.len(string2)) - string.match(str, pattern, init)
数组
数组,就是相同数据类型的元素按一定顺序排列的集合,可以是一维数组和多维数组。
- 初始化数组 array = {}
- 单纬数组for i= 0, 2 do print(array[i]) end
- 二维数组(可以为多纬数组)
for i=1,3 do
for j=1,3 do
print(array[i][j])
end
end
迭代器
在 Lua 中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。
- 泛型 for 迭代器,保存三个值:迭代函数、状态常量、控制变量。
for k, v in pairs(t) do
print(k, v)
end
k, v为变量列表;pairs(t)为表达式列表。
- 无状态迭代器不保留任何状态的迭代器,因循环中利用无状态迭代器避免创建闭包花费额外的代价
function square(iteratorMaxCount,currentNumber)
if currentNumberthen
currentNumber = currentNumber+1
return currentNumber, currentNumber*currentNumber
end
endfor i,n in square,3,0
do
print(i,n)
end
- 多状态的迭代器要保存多个状态信息,使用闭包或封装到 table 内
local count = #collection -- 闭包函数
表
表是一种数据结构,本质上是指向一部分内存。
Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。
- alternatetable = mytable-- alternatetable和mytable的是指同一个 table
- mytable["wow"] = "修改前" --表中,key是wow的value为修改前。
常用操作方法
- table.concat (table [, sep [, start [, end]]]):列出数组元素
fruits = {"banana","orange","apple"}
print("连接后的字符串 ",table.concat(fruits,", ", 2,3))
结果:连接后的字符串 orange, apple - table.insert (table, [pos,] value):插入。pos无则末尾。
table.insert(fruits,2,"grapes") - table.remove (table [, pos])移除,后面前挪。
table.remove(fruits)--删掉最后一个元素 - table.sort (table [, comp])升序排序。
模块与包
模块类似于一个封装库,公用的代码放在一个文件里,以 API 接口的形式调用。
Lua 的模块是由变量、函数等已知元素组成的 table,创建一个 table,然后把需要导出的常量、函数放入其中,最后返回这个 table 就行。
- require("<模块名>")用来加载模块
- require 用于搜索 Lua 文件的路径是存放在全局变量 package.path
其他的内容和智能合约开发关系没有那么大,就不一一总结了。
三、智能合约范例
1、mylib = require ("mylib”)
mylib是维基区块链的模块,其内封装的功能可以直接调用。所以智能合约的第一条语句就是这条。
- mylib.GetScriptID()获取智能合约的ID号
function mylib_GetScriptID()
local result = {mylib.GetScriptID()}
assert(#result > 0," GetScriptID err")
for i = 1,#result do
print("GetScriptID",i,(result[i]))
end
end
- mylib.GetBase58Addr(Unpack(accountTbl))根据智能合约ID号获取智能合约的地址
function mylib_GetBase58Addr()
local accountTbl = {5,157,0,0,7,34} --6字节的regid
local result = {mylib.GetBase58Addr(Unpack(accountTbl))}
assert(#result == 34,"GetBase58Addr err")
end
- mylib.GetCurTxHash()获取当前交易哈希值
function mylib_GetCurTxHash()
local result = {mylib.GetCurTxHash()}
assert(#result == 32,"GetCurTxHash err");
end
2.常用开发方法
- 通过key值,从区块链上取value值
GetContractValue = function (key)
assert(#key > 0, "Key is empty")
local tValue = { mylib.ReadData(key) }
if TableIsNotEmpty(tValue) then
return true,tValue
else
LogMsg("Key not exist")
return false,nil
end
end
- 调取合约调用者给合约转了多少钱
GetCurTxPayAmount = function ()
local payMoney = mylib.ByteToInteger(mylib.GetCurTxPayAmount())
assert(payMoney >= 0,"GetCurrTxPayAmount: payMoney < 0")
return payMoney
end
- 确定合约调用者是不是合约所有者
senderIsOwner = function()
local msg_senderTbl = GetCurrTxAccountAddress() -- 34bytes table
local exist,ownerTbl = GetContractValue(owner_key)-- 34bytes table
if(exist == false) then
return true
else
return MemIsEqual(msg_senderTbl,ownerTbl) == true
end
end
总结:虽然lua语言本身比较简单,智能合约开发本身难度也不大,不过也不可能用一篇文章就能全部罗列出来。不过,最基础的框架和使用案例已经总结出来,之后只要按图索骥,需要哪个知识点再仔细研究哪个知识点即可。
区块链相关
大数据时代下的IPFS应用
交易所上币如何与区块链进行对接?
一个“区块链智能合约”如何诞生及运行?
区块链数据上链的几种方式?
一个基于IPFS的视频分发网站Dtube
树哥解读:为啥V神提议以太坊2.0验证者回报率为3.3%?
Filecoin存储和检索机制
火爆的Fomo3D区块链游戏,是不是成为千万富翁的机会?
雷电网络为啥可以治以太坊的“堵”病?
EOS RAM是否值得投资
【树哥区块链02课】区块链—身边的未来世界!
【树哥区块链01课】今天你放高利贷吗?
一篇文章给小白讲透火到不行的IPFS挖矿(一)
一篇文章给小白讲透火到不行的IPFS挖矿(二)—挖矿原理
一篇文章给小白讲透火到不行的IPFS挖矿(三)—矿机
为啥说因为DPOS才导致EOS这么牛?!
比特币和它的诸多儿子
OK交易所做了什么,让OKB突然大涨?
小白的第一款区块链钱包
一篇文章让小白了解挖矿概念
小白如何快速理解比特币存储与转账?
科技及思考
通过美国逮捕法国高管事件看“华为孟晚舟被捕事件”
你的努力没有结果,是因为没有看到因果!
你不是在节省,而是在毁掉财富自由的机会!
最会用人的十个大佬!
小学题都不会,还想定小目标?洗洗睡吧!
你真以为电信诈骗能根除?别做梦了!除非……
你屡屡错过成功良机的5个本质原因!
你缺的不只是“女排精神”,还有独立的思考!
华为手机玩机宝典
iPhone手机玩机宝典
excel50个逆天功能动画讲解
50个ppt技巧,让你的ppt瞬间亮光闪闪!
82页ppt看懂千亿级市场物联网市场!