智能合约:BUMO 智能合约语法说明

BUMO 智能合约语法说明

概述

Bumo 智能合约使用 JaveScript 语言编写,为了方便开发者更规范的,更安全的开发合约,在作合约语法检测时候,使用了 JSLint 作限制。参考JSLint GitHub。编辑合约时候,首先须要在 JSLint 里检测经过,才能够被 Bumo 系统检测为一个合法的合约。html

JSLint 的标准语法在官方网站有详尽的说明。本文档的目的是做为一个完善文档,整理了原有的 JSLint 语法规则,同时对 Bumo 修改后的规则进行了补充说明,文档会举例说明其用法。对于本文没有提到的部分,请参考 JsLint 帮助手册git

或者经过节点服务器、钱包地址访问文档 127.0.0.1:36002/jslint/help.htmlgithub

检测工具

JSLint 检测工具地址:JSLint 语法检测工具web

或者经过节点服务器、钱包地址使用工具 127.0.0.1:36002/jslint/index.html数组

错误说明,在 web 工具里调试合约语法时候,会有详尽的错误描述。当输入以下代码时候安全

"use strict";
function init(bar)
{
    
}

错误以下服务器

Empty block.   2.0
{

错误缘由:空的语句块,在第 2 行,第 0 列。工具

正确的代码以下:网站

"use strict";
function init(bar)
{
    return;    
}

正确的检测结果,不会报出红色的 Warnings 信息this

文本压缩

合约文档写好以后,能够使用 JSMin 工具进行压缩,注意保存原文档,压缩是不可逆的操做。

工具地址

Demo

"use strict";
function init(bar)
{
    /*init whatever you want*/
    return;
}

function main(input) 
{
    log(input);

    //for statement
    let i;
    for (i = 0; i < 5; i += 1) 
    {
        log(i);
    }

    //while statement
    let b = 10;
    while (b !== 0) 
    {
        b -= 1;
        log(b);
    }

    //if statement
    let compare = 1;
    if(compare === 1)
    {
        log("it is one");
    }
    else if(compare === 2)
    {
        log("it is two");
    }
    else
    {
        log("it is other");
    }

    //if statement
    if(compare !== 2)
    {
        log("no, different");
    }

    //switch statement
    let sw_value = 1;
    switch(sw_value)
    {
    case 1:
        log("switch 1");
        break;
    default:
        log("default");
    }

    //Number
    let my_num = Number(111);
    log(my_num);

    //String
    let my_str = String(111);
    log(my_str);

    //Boolean
    let my_bool = Boolean(111);
    log(my_bool);

    //Array
    let str_array = ["red","black"]; 
    log(str_array);

    //Array
    let num_array = [1,2,3,4];
    log(num_array);

    throw "this is a exception";
}

规则列表

  • 严格检测声明,全部的源码在开始必需要添加 "use strict"; 字段

  • 语句块内尽可能使用 let 声明变量

  • 使用=== 代替 == 判断比较;使用 !== 代替 != 比较

  • 语句必须以 ; 结束

  • 语句块必须用 {} 包括起来,且禁止空语句块

  • for 的循环变量初始变量需在条件语句块以前声明,每次使用从新赋值

  • 禁用 ++ 和 --,使用 += 和 -= 替代

  • 禁止使用 evalvoid 关键字

  • 禁止使用 new 建立 NumberStringBoolean对象,能够使用其构造调用来获取对象

  • 禁止使用的数组关键字建立数组

  • 禁止使用 trycatch 关键字,能够使用 throw 手动抛出异常

"Array", "ArrayBuffer", "Float32Array", "Float64Array", 
"Int8Array", "Int16Array", "Int32Array", "Uint8Array", 
"Uint8ClampedArray", "Uint16Array", "Uint32Array"

let color = new Array(100); //编译报错

//能够使用替代 new Array(100) 语句;
let color = ["red","black"]; 
let arr = [1,2,3,4];
  • 禁止使用的关键字
"DataView", "decodeURI", "decodeURIComponent", "encodeURI", 
"encodeURIComponent", "Generator","GeneratorFunction", "Intl", 
"Promise", "Proxy", "Reflect", "System", "URIError", "WeakMap", 
"WeakSet", "Math", "Date"