DAPP 开发指南
智能合约快速入门
请参考Hello World
智能合约调用时参数说明
调用智能合约时,传入的参数格式必须是 Hex
,合约内部通过全局变量 contract
获取此传入的参数
参数转换规则
数字: 先将原数字转化为16进制数字,如果该数字长度为单数则在前面补一个零,然后每两位为单位倒序,最后在后面补相应个数的零。如,10000转为16位编码,具体过程为 1000 => 3e8 => 03e8 => e803 => e803000000000000;解码规则反之;
字符: 先获取每一位字符的ASCII码,再将ASCII码转换成16进制;解码规则反之。
如地址 wKfqqyRzJaMHv1zw77Yb4RFErfZhaVL8cn
=> 774b66717179527a4a614d4876317a77373759623452464572665a6861564c38636e
调试智能合约
- 要查看出错信息,修改WaykiChain.conf文件,打开vm调试开关,在原有debug设定上添加debug=vm。 (debug=INFO --> debug=INFO debug=vm)
-
排错主要靠LogPrint,assert,error打印出错信息到日志。
-
打开main或者testnet目录下的vm.log:
Example
2016-10-12 02:12:49 [txmempool.cpp:125]vm: tx hash=69a787e4c7a35f40eff5f696c9f361972a9cb8a7e1e4263e527e689b9bd23e2c CheckTxInMemPool run contract
2016-10-12 02:12:49 [vm/vmrunevn.cpp:125]vm: tx hash:69a787e4c7a35f40eff5f696c9f361972a9cb8a7e1e4263e527e689b9bd23e2c fees=100000 fuelrate=100 maxstep:90000
2016-10-12 02:12:49 [vm/vmrunevn.cpp:93]vm: CVmScriptRun::intial() LUA
2016-10-12 02:12:49 [vm/vmlua.cpp:252]vm: pVmScriptRun=0x7fa006ffb480
2016-10-12 02:12:49 [vm/vmlua.cpp:259]vm: luaL_loadbuffer fail:[string "line"]:375: Account balance is 0.
2016-10-12 02:12:49 [vm/vmlua.cpp:262]vm: run step=-1
2016-10-12 02:12:49 [vm/vmrunevn.cpp:136]vm: CVmScriptRun::run() LUA
-
其中luaL_loadbuffer fail:[string "line"]:375: Account balance is 0.提示了脚本375行账户余额为0,由此可知合约执行失败的原因
-
如果在开发过程中,边写代码边调试,可能写的代码有语法错误,在执行时也会出错,通过上面的方法可以查看出错误行。将错误修正后,要重新注册该脚本,再进行调试。
注意事项
- 由于安全性考虑,智能合约中只能使用lua中table,math,string库,不能使用io操作等。
- 智能合约只能写在一个文件中,不支持多文件。
- 智能合约文件大小不能超过64k
- 智能合约内部可以通过默认全局变量
contract
获取合约外部调用合约的参数,类型为table
- 外部调用智能合约的参数长度不能超过4096字节。
- 智能合约中如果有异常,或逻辑不对,可以通过assert,error退出执行,链上Lua虚拟机器会捕获到该异常。
- 智能合约必须以mylib = require "mylib"开头,通过mylib调用里面的API,注意一定要放在第一行,第一行如果留空会报异常。