主页 > imtoken国际版 > FISCO BCOS 2.0原理解析:预编译合约架构设计

FISCO BCOS 2.0原理解析:预编译合约架构设计

imtoken国际版 2023-09-16 05:09:53

FISCO BCOS 2.0提出了一套预编译的合约框架,允许用户使用C++编写智能合约。 由于不进入EVM执行,预编译合约可以获得更高的性能,适用于合约逻辑简单但调用频繁,或者合约逻辑固定但计算量大的场景。

本文介绍了预编译合约的由来和实现,主要包括以下几个方面:

Solidity合约的使用与不足

在FISCO BCOS平台上使用Solidity合约一般需要以下五个步骤。 Solidity合约开发完成后,必须将编译好的合约部署到底层平台,只能根据平台返回的地址调用合约的接口。

以太坊dag大小查询_以太坊每日交易量查询_以太坊 dag文件

Solidity合约的优点是完全兼容以太坊,开发资源丰富,相对通用,但Solidity合约也存在虚拟机执行性能低以太坊dag大小查询,成本高,开发复杂等问题。 尤其是联盟链治理的场景,有些参数需要链上所有节点一致,非常适合合约管理,但是如果用Solidity实现,部署步骤会出错! 经常! 复杂的! 各种各样的!

FISCO-BCOS 1.3版本使用Solidity实现一套系统合约,并​​使用代理合约管理其他系统合约。 其部署流程如下图所示:

以太坊 dag文件_以太坊每日交易量查询_以太坊dag大小查询

部署系统合约后,需要在代理合约中配置系统合约的地址,然后在节点配置文件中配置代理合约的地址并重启调用这套系统治理合约,后续节点扩容也需要根据创世节点的配置操作保持一致。

以太坊 dag文件_以太坊每日交易量查询_以太坊dag大小查询

FISCO BCOS 2.0增加预编译合约

FISCO BCOS 2.0 受以太坊内置合约的启发,实现了一套预编译的合约框架。 未来,我们也会尝试将已有的典型业务场景抽象出来,开发成预编译的合约模板,作为底层提供的基础能力,帮助用户在业务中更快、更方便地使用FISCO BCOS。

预编译合约的好处

可访问的分布式存储接口:基于此框架,用户可以访问本地DB存储状态并实现他们需要的任何逻辑。

更好的性能:由于实现是C++代码,会在底层编译,不需要进入EVM执行,所以可以有更好的性能。

无需学习Solidity语言即可上手:基于FISCO BCOS预编译合约框架,开发者无需学习Solidity语言,即可使用C++开发自己的预编译合约,快速实现所需的业务逻辑。

并行模型大大提高了处理能力:在2.0版本中,我们基于预编译合约和DAG实现了合约的并行执行。 用户只需指定接口冲突域,底层会根据冲突域自动构建事务依赖图。 根据依赖关系,尽可能多的事务并行执行,导致事务处理能力大幅提升。

以太坊 dag文件_以太坊dag大小查询_以太坊每日交易量查询

预编译合约与以太坊内置合约的比较

如前所述,FISCO BCOS预编译合约的灵感来自于以太坊的内置合约,但实现原理却大相径庭。

以太坊使用内置合约来避免 EVM 中复杂计算的成本。 以太坊目前使用内置合约来实现 8 个功能(如下表所示)。 可以看出,以太坊内置合约占用8个地址0x1-0x8,每个内置合约实际上是一个局部函数调用,只能用于状态无关的计算。

以太坊 dag文件_以太坊dag大小查询_以太坊每日交易量查询

要使用Solidity中内置的合约,用户需要使用call操作依次输入以下参数

调用(gasLimit,to,值,inputOffset,inputSize,outputOffset,outputSize)

包括内置合约地址、输入参数偏移量、输入参数大小、输出参数偏移量和输出参数大小,这对用户来说不是一件简单的事情。

以太坊dag大小查询_以太坊 dag文件_以太坊每日交易量查询

FISCO BCOS的预编译合约框架支持复杂的参数类型,支持通过AMDB读取和存储数据。 每个预编译合约的地址是固定的,合约中可以实现多个接口,实现接口的调用方式与原生Solidity完全一致。

下图是更直观的对比:

以太坊 dag文件_以太坊dag大小查询_以太坊每日交易量查询

注:√表示支持,×表示不支持

FISCO BCOS预编译合约结构

通过本节,您可以清楚的了解预编译合约模块在FISCO BCOS中的位置以及预编译合约的执行过程。

如下图所示,预编译合约将被区块执行引擎调用。 区块验证者通过区块执行引擎执行区块。 执行引擎在执行区块时,会根据被调用合约的地址判断是否使用EVM。 它也是一个预编译的合约引擎。

以太坊 dag文件_以太坊每日交易量查询_以太坊dag大小查询

以太坊 dag文件_以太坊每日交易量查询_以太坊dag大小查询

当被调用的合约地址是EVM合约时,执行引擎会创建并执行EVM来执行交易; 当调用的合约地址为已注册的预编译合约地址时,执行引擎会调用该地址交易对应的预编译合约接口执行。

预编译合约的执行流程如下图所示:

以太坊dag大小查询_以太坊 dag文件_以太坊每日交易量查询

执行引擎首先根据预编译的合约地址获取合约对象,然后通过调用合约对象的调用接口获取执行结果。 调用界面中的操作主要包括:

根据调用参数解析被调用接口

根据ABI编码解析传入的参数

以太坊每日交易量查询_以太坊dag大小查询_以太坊 dag文件

执行调用的合约接口

对执行结果进行ABI编码并返回

因此,如果开发者想要开发一个预编译合约,只需要实现预编译合约的调用接口,并将实现的合约地址注册到执行引擎中即可。

预编译合约在FISCO BCOS 2.0中的应用

系统合约

FISCO BCOS 2.0基于预编译合约实现了一套系统合约,使用系统合约管理需要共识的链配置,包括组内节点的增删、节点身份的转换、CNS服务的管理、以及链权限的管理,CRUD合约的使用等。

FISCO BCOS当前系统合约及地址如下:

以太坊 dag文件_以太坊每日交易量查询_以太坊dag大小查询

CRUD 合约支持

FISCO BCOS 2.0基于预编译合约实现AMDB存储对应的预编译合约,使用户可以在Solidity中访问AMDB存储,这是FISCO BCOS 2.0的CRUD合约编写方式。 通过这种方式,用户可以将合约数据存储在底层的AMDB存储中以太坊dag大小查询,将合约逻辑与数据分离,一方面提高了合约处理性能,另一方面也方便了合约逻辑的升级。