一篇文章总结区块链智能合约开发语言Lua的简单用法

2019-05-08  本文已影响0人  树哥区块链

区块链的智能合约需要在区块链虚拟机上执行,需要把数据和状态存储在区块链之上。由于虚拟机和区块链存储空间都比较珍贵,就需要编写智能合约的语言短小精悍。Lua语言由于编译后文件非常小巧,只有100多k,所以受到一些公链的青睐。下面树哥就把这个lua语言的基础语法和使用案例简单进行总结。(素材总结自lua菜鸟教程和维基链开发文档,更加详细介绍请查阅相关资料)。

一、Lua语言背景

Lua 属于嵌入到程序中的语言,为应用程序提供灵活的扩展功能,所以它是一种轻量小巧的脚本语言,用标准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 会尝试将这个数字字符串转成一个数字

2)使用 # 来计算字符串的长度,放在字符串前面

3)在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据

3.变量
Lua 变量有三种类型:全局变量、局部变量、表中的域。
Lua 中的变量全是全局变量,除非用 local 显式声明为局部变量。
赋值

索引
对 table 的索引使用方括号 []和. 操作。
site["key"] = "www.runoob.com"

4.流程控制
循环

5.函数

myprint = function(param)
print("这是打印函数 - ##",param,"##")
end

function add(num1,num2,functionPrint)
result = num1 + num2
functionPrint(result)
end

6.各类符号字符及表
运算符

字符串

数组
数组,就是相同数据类型的元素按一定顺序排列的集合,可以是一维数组和多维数组。

for i=1,3 do
for j=1,3 do
print(array[i][j])
end
end

迭代器
在 Lua 中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。

for k, v in pairs(t) do
print(k, v)
end
k, v为变量列表;pairs(t)为表达式列表。

function square(iteratorMaxCount,currentNumber)
if currentNumber<iteratorMaxCount
then
currentNumber = currentNumber+1
return currentNumber, currentNumber*currentNumber
end
end

for i,n in square,3,0
do
print(i,n)
end


表是一种数据结构,本质上是指向一部分内存。
Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。

常用操作方法

模块与包
模块类似于一个封装库,公用的代码放在一个文件里,以 API 接口的形式调用。
Lua 的模块是由变量、函数等已知元素组成的 table,创建一个 table,然后把需要导出的常量、函数放入其中,最后返回这个 table 就行。

其他的内容和智能合约开发关系没有那么大,就不一一总结了。

三、智能合约范例

1、mylib = require ("mylib”)
mylib是维基区块链的模块,其内封装的功能可以直接调用。所以智能合约的第一条语句就是这条。

function mylib_GetScriptID()
local result = {mylib.GetScriptID()}
assert(#result > 0," GetScriptID err")
for i = 1,#result do
print("GetScriptID",i,(result[i]))
end
end

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

function mylib_GetCurTxHash()
local result = {mylib.GetCurTxHash()}
assert(#result == 32,"GetCurTxHash err");
end

2.常用开发方法

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看懂千亿级市场物联网市场!

上一篇 下一篇

猜你喜欢

热点阅读