Skip to content

Latest commit

 

History

History
112 lines (89 loc) · 4.83 KB

2.2 语法规范(上)——ECMAScript篇.md

File metadata and controls

112 lines (89 loc) · 4.83 KB

概述里提到过,ASCH 智能合约的实现最终采用了 Node.js 的 VM(ECMAScript 运行环境) + TypeScript 子集(智能合约语言,最终编译成 js)的方案。下面讲解一下哪些语言特性是合约内可以使用的,哪些是不可以使用的。

首先,我们得明确 ECMAScript 是语言标准,而 Node.js 是 JavaScript(ECMAScript 的主要实现)的运行时环境,并且提供了额外的底层功能,如:文件操作、网络 IO 等等。Node.js 的 VM 是 ECMAScript/JavaScript 的运行环境(基于 V8),并不能使用 Node.js 中独有的 API,即 ASCH 智能合约中也只能使用 ECMAScript 的部分特性。

2.2.1 智能合约内可以使用的

运算符

  1. 一元运算符:+、-、!、~、typeof、void
  2. 自增减运算符:++、--
  3. 二元运算符:==、!=、===、!==、<、<=、>、>=、<<、>>、>>>、+、-、*、/、%、|、^、&、in、instanceof
  4. 赋值运算符:=、+=、-=、*=、/=、%=、<<=、>>=、>>>=、|=、^=、&=
  5. 逻辑运算符:&&、||
  6. 三元运算符:?:
  7. new 操作符

全局变量

  1. Object

    1. 静态方法:assign、entries、keys、values、is
  2. Array

    1. 静态方法:from、isArray、of
    2. 实例方法:concat、copyWithin、every、fill、filter、find、findIndex、forEach、includes、indexOf、join、lastIndexOf、map、pop、push、reduce、reduceRight、reverse、shift、unshift、slice、some、sort、splice、toString
  3. String

    1. 静态方法:fromCharCode
    2. 实例方法:charAt、charCodeAt、startsWith、endsWith、includes、indexOf、lastIndexOf、padStart、padEnd、repeat、slice、substr、substring、split、toLowerCase、toUpperCase、trim、trimLeft、trimRight、toString
  4. Number

    1. 静态方法:isNaN、parseFloat、parseInt
    2. 实例方法:toExponential、toFixed、toPrecision、toString
  5. Math

    1. 静态方法:abs、acos、acosh、asin、asinh、atan、atan2、atanh、cbrt、ceil、clz32、cos、cosh、exp、expm1、floor、fround、hypot、imul、log、log10、log1p、log2、max、min、pow、round、sign、sin、sinh、sqrt、tan、tanh、trunc
  6. BigInt

    1. 构造函数。如:BigInt(100000000000000)
    2. 实例方法:toString
  7. assert。ASCH 智能合约添加的,断言函数

  8. Mapping。ASCH 智能合约添加的,需要使用 new 实例化,key-value 型对象

  9. 静态方法:fromItems、isMapping、keysOf、sizeOf

  10. Vector。ASCH 智能合约添加的,容器类,需要使用 new 实例化,类似数组

    1. 静态方法:isVector
    2. 实例方法:push、pop、size
  11. Crypto。ASCH 智能合约添加的,常用哈希函数

  12. Crypto.sha256.hash

  13. Crypto.ripemd160.hash

  14. Crypto.ed25519.sign

  15. Crypto.ed25519.verify

  16. ByteBuffer。ASCH 智能合约添加的,二进制操作

    1. 静态方法:wrap、isByteBuffer
    2. 实例方法:readInt8、readUint8、readInt16、readUint16、readInt32、readUint32、readInt64、readUint64、readFloat32、readFloat64、readString、readCString、readIString、writeInt8、writeUint8、writeInt16、writeUint16、writeInt32、writeUint32、writeInt64、writeUint64、writeFloat32、writeFloat64、writeString、writeCString、writeIString、toString、toArrayBuffer、flip
  17. Util。ASCH 智能合约添加的,工具函数集

    1. Util.Address.generateNormalAddress
  18. 修饰器

    1. @payable。转账接口,如果有 isDefault: true 参数,即表示向该合约地址转账时会自动调用这个方法。其他添加 @payable 修饰器的函数,给合约转账时需要指明函数名,格式 {contract_name}/{pay_mothod_name}。
    2. @constant。只读接口,可以通过 HTTP 接口调用,该函数有以下使用限制:
      1. 不能修改合约的状态,即 this 上的属性
      2. 不能使用 this.transfer,即不能转账
      3. 不能使用 this.context,因为没有区块信息

2.2.2 智能合约内不能使用的

关键字

  1. delete
  2. debugger
  3. with
  4. throw
  5. try-catch
  6. AsyncFunction + await
  7. GeneratorFunction + yield
  8. import

全局变量

  1. Date
  2. Function
  3. Boolean
  4. Symbol
  5. Error + EvalError + RangeError + ReferenceError + SyntaxError + TypeError + URIError
  6. RegExp
  7. Int8Array + Uint8Array + Uint8ClampedArray + Int16Array + Uint16Array + Int32Array + Uint32Array + Float32Array + Float64Array
  8. Map + WeakMap
  9. Set + WeakSet
  10. JSON
  11. Promise
  12. Reflect
  13. Proxy
  14. Intl
  15. WebAssembly

全局方法

  1. eval + uneval
  2. isFinite
  3. isNaN
  4. parseFloat + parseInt
  5. encodeURI + decodeURI
  6. encodeURIComponent + decodeURIComponent
  7. escape + unescape
  8. setTimeout + clearTimeout
  9. setInterval + clearInterval
  10. setImmediate + clearImmediate

2.2.3 Node.js 版本要求

因为 ASCH 智能合约支持了 BigInt 类型,所以 Node.js 版本应当是 v10.13.0+