Bytom 2.0 合约语言初识

BytomDAO
7 min readSep 30, 2021

--

什么是智能合约语言

智能合约语言是编写区块链智能合约的编程语言,为了对开发者更加的友好,更容易上手,当前的智能合约语言一般都是参考现有的编程语言,比如Solidity是参考了Java Script,也受到C++和Python等语言的影响。而Bytom2.0的合约语言则采用类Golang的设计。

为什么Bytom2.0引入新的语言

Bytom1.0的合约语言Equity,在UTXO上实现了图灵完备,且具有良好的编程性,但在语法,词法和程序结构等方面和当前编程语言有较大差别,入门时间较长,学习曲线陡峭,不利于开发者进入。

为了改进Equity语言的这些缺陷,Bytom2.0的合约语言借鉴了Golang的设计,在程序结构,声明,函数定义,类型定义等方面基本和Go语言保持一致,让拥有Go语言编程经验(或者有一定编程经验)的开发者可以无门槛的进行编程。从而更利于合约的推广和扩展

语言特性

1、类Go语言的设计

2、静态类型(编译时已知变量类型)

3、UTXO操作引入struct、assetId引入全局变量

4、UTXO引入lock built-in方法

后续支持:

  • 库(您可以创建从不同的合约调用的可重用代码 — — 就像静态函数在其它面向对象编程语言的静态类中一样)。

程序结构

合约程序由以下要素构成:

  • 声明部分:声明引入的全局库,当前版本暂无
  • 顶层结构:由语句(statement)组成,程序由合约源文件顶层结构开始执行。
  • 函数定义(声明):声明定义函数
  • 类型定义:结构体、枚举,执行同函数。

简单举例:

func t1(a int64, b int64) int64 {
var c int64 = 12345678
if a > b {
c = a
} else {
c = b
}
return c
}

语法规则

1、源文件字符编码

使用与处理器相同的字符编码。unix为UTF-8,windows为GB2312。除注释及定义字符串字面量,其他不能使用非ASCII字符。

2、关键字

以下单词作为关键字,不能作为变量名、函数名、结构体名使用。

if、else、type、struct、var、goto、for、range、break、continue、func、nil、
bool、string、const、amount、asset、hash、publickey、signature、program

3、空白字符处理

空格、制表符、换行,用来区分不同标识符。其中换行在函数的语句中表示当前语句结束。

4、注释

同golang,`/*xxx*/`块注释、`//`行注释。

5、标识符

变量名、函数名、结构体名等的使用的标识符,规则:

  • 第一个字母必须为英文大小写字母或下划线,`A-Za-z_`。
  • 第二个字母开始可以为英文大小写字母、下划线或数字,`A-Za-z_0–9`。

6、字面量

  • bool字面量:true false
  • 整形字面量:[1–9][0–9]*)|0
  • 浮点数字面量:[0–9]+\.[0–9]+
  • 字符串字面量:[A-Za-z_][A-Za-z_0–9]*

7、数据类型

  • bool类型
  • 整数类型
  • 浮点数类型
  • 字符串类型
  • 结构体类型
  • 枚举类型
  • amount类型
  • asset类型
  • hash类型
  • publicKey类型
  • signature类型
  • program类型
  • built-in方法

8、表达式

expression运算符连接起来的意愿表达式

一元表达式

  • 字面量
  • 标识符
  • 枚举

案例

// stateData:  [creater, nftAsset, owner, marginAsset, marginAmount]
var (
CreaterScript hex = "63726561746572536372697074"
NftAsset asset = "a0a71c215764e342d10d003be6369baf4145d9c7977f7b8f6bf446e628d8b8b8"
OwnerScirpt hex = "6f776e6572536369727074"
MarginAsset asset = "a0a71c215764e342d10d003be6369baf4145d9c7977f7b8f6bf446e628d8b8b8"
MarginAmount amount = 200000000
)
// alt stack [creater,, nftAsset, owner, marginAsset, marginAmount]
// data statck [newMarginAsset, newMarginAmount, selecter]
func editMargin(marginAsset asset, marginAmount amount) {
MarginAmount = marginAmount
MarginAsset = marginAsset
lock(1, NftAsset, "")
lock(MarginAmount, MarginAsset, "")
}
// alt stack [creater, taxRate, nftAsset, owner, marginAsset, marginAmount]
// data statck [buyer, payAmount, marginAmount, selecter]
func buy(buyer hex, payAmount amount, marginAmount amount) {
var MarginFold int64 = 10
// []byte("platformScript")
var PlatformScript hex = "706c6174666f726d536372697074"
platformFee := int64(payAmount) / 100
ownerGot := int64(payAmount) - platformFee - createrTax
verify(ownerGot < int64(MarginAmount)*MarginFold)
lock(amount(platformFee), MarginAsset, PlatformScript)
lock(amount(createrTax), MarginAsset, CreaterScript)
lock(amount(ownerGot), MarginAsset, OwnerScirpt)
OwnerScirpt = buyer
MarginAmount = marginAmount
lock(1, NftAsset, "")
lock(MarginAmount, MarginAsset, "")
}

以上是一个NFT购买合约的案例

1、首先定义了一个全局结构,将NFT相关的信息放入

2、定义了一个购买函数,根据用户的需求,将要购买的NFT和数量作为输入,计算购买费用和平台手续费,然后将该NFT转移所有权到购买者的脚本

未来展望

当前Bytom2.0合约语言还处于完善阶段,以上的部分特性还未完全确定,会根据后续整体的技术路线和方向做进一步完善。

首先会加入更多的语言特性,比如引入库,引入继承能力等等

未来能够进一步兼容以太坊合约体系,在UTXO账户模型的基础上实现EVM/eWASM等主流虚拟机架构,使得外部生态(如以太坊)上 DeFi 应用、生态系统组件和工具与Bytom2.0 兼容,不需要修改或只需要很小的更改,进一步降低开发者的学习成本和迁移难度。

--

--

BytomDAO
BytomDAO

No responses yet