FISCO BCOS智能合约开发
众所周知,智能合约的出现,使qukuailian不仅能处理简单的转账功能,还能实现复杂的业务逻辑,极大地推动了qukuailian技术发展,加速应用落地。目前,在众多qukuailian平台中,大多数集成了以太坊虚拟机,并使用Solidity作为智能合约kaifa语言。作为一门面向合约的编程语言,Solidity借鉴了C++、Python和JavaScript等语言的设计,使用静态类型,不仅支持基础/复杂数据类型操作、逻辑操作,同时提供语言的相关特性,比如继承、重载、库和用户自定义类型等。作为大活跃的国产开源联盟链社区,FISCOBCOS无缝支持Solidity合约,并提供从kaifa、编译、部署到调用的全链路工具和完整解决方案,使智能合约和qukuailian应用kaifa变得简单。除此之外,基于大量探索和实践,FISCOBCOS不仅支持Solidity合约,还支持Precompiled合约,并在用户层提供CRUD合约接口。面向库表kaifa的CRUD合约不仅更符合用户kaifa习惯,进一步降低合约kaifa难度,提升性能,使qukuailian应用满足高并发场景的诉求。
智能合约分类
FISCOBCOS平台支持两种类型的智能合约:Solidity合约和Precompiled合约。
Solidity合约
Solidity合约运行在EVM上,EVM为以太坊虚拟机,采用哈佛架构,指令、数据和栈完全分离。在智能合约运行期间,首先创建一个沙盒环境(EVM实例),沙盒环境与外部环境完全隔离,无法访问网络、文件系统其它进程,智能合约在EVM内只允许进行有限的操作。交易执行时,EVM通过获取合约的opcode,将opcode转化为对应的EVM指令,并按照指令进行执行。
从应用落地的数量来看,Solidity合约使用为广泛,几乎所有qukuailian平台都支持,但Solidity也有很多缺点。如下:
合约在EVM中串行执行,性能较差;
跨合约调用会新建EVM,内存开销较大;
合约变量和数据存在MPT数中,不便于合约升级;
逻辑和数据耦合,不便于存储扩容。
Precompiled合约
Precompiled合约即预编译合约。预编译合约通过Precompiled引擎执行,采用C++编写合约逻辑,合约编译集成进FISCOBCOS底层节点。调用合约不进EVM,可并行执行,突破EVM性能瓶颈;提供标准kaifa框架,只需继承基类,实现call接口即可;适合于逻辑相对确定、追求高并发的场景;数据存在表中,与合约分离,可升级合约逻辑。
当然,预编译合约的使用有一定的门槛。如下:
对于数据的存储,需要创建FISCOBCOS特有的表结构;
编写合约时需继承Precompiled类,然后实现Call接口函数;
完成合约kaifa后,需在底层为预编译合约注册地址;
编写完成合约后,需要重新编译FISCOBCOS源码。
为了屏蔽预编译合约在kaifa和使用中的门槛,FISCOBCOS基于预编译合约和分布式存储设计了CRUD合约接口。用户在编写Solidity合约时,只需要引入抽象合约接口文件Table.sol,便可使用CRUD功能,用户不需要关心底层的具体实现。
智能合约kaifa
本节将基于全球英文认证考试成绩管理作为场景,基于FISCOBCOS平台对智能合约进行kaifa。全球认证考试包括GRE、TOEFL、IELTS等。为了简化合约逻辑,所有成绩统一由考试管理中心发布和管理,学生可以根据自己的账号(地址)查询自己的考试成绩。
Solidity合约kaifa
在Solidity中,合约类似于面向对象编程语言中的类。Solidity合约有自身的代码结构,由几个部分组成,如下所示。
状态变量:状态变量是存储在合约中的值
构造函数:用于部署并初始化合约
事件:事件是能方便地调用以太坊虚拟机日志功能的接口
修饰器:函数修饰器可以用来改变函数的行为,比如自动检查,类似Spring的AOP
函数:函数是合约中代码的可执行单元
创建合约
首先创建一个名为StudentScoreBySol的合约,用于管理学生的成绩。如下代码所示,开头需要引入合约版本。
定义状态变量
状态变量用于存储和管理学生的考试成绩。
在当前场景中定义两个变量,其中_owner为合约的创建者,即考试管理中心;_scores用于存储学生成绩,为一个嵌套mapping类型,个mapping的key(address)为学生的账户(私钥对应的地址),value也为一个mapping类型,对应为每一科的成绩,在第二个mapping中key(bytes32)为科目名称,如GRE、TOEFL等,value(uint8)为成绩。如下所示。
定义事件
定义一个事件setScoreEvent,用于跟踪对学生成绩的新增/修改操作,可以在业务层面对事件进行监听。事件的定义是可选的,如果没有定义也没关系,在业务层面可以根据方法的返回值去判断交易是否成功,但无法做到更精细的问题定位。
定义修饰器
智能合约中的修饰器(Modifier)类似面向对象编程中的AOP,满足条件才会执行后续操作。如下所示,修饰器要求必须是合约的Owner才能进行后续操作,其中Owner为考试管理中心。
定义构造方法
构造方法用于实例化合约,在当前构造方法中,指定Owner为合约的部署者。