aelf配置中心:Configuration合约
通过了解Configuration合约的机制,可以了解aelf内部的链上(智能合约与StateDb)和链下(区块生产和ChainDb)是如何交互的。
当部署分布式服务的时候,每个实例都可以通过配置中心来完成基础的配置,保证其配置的一致性。在区块链的世界中,是不存在类似于下图中的中心化分布式中的配置中心的东西的(图是偷来的)。
因此在设计区块链的时候,就重新面临这么一个需求:对aelf节点的一个配置项进行修改的时候,需要整个aelf网络中每个节点都同时生效(只有这样才能保证诚实节点产生的区块能够互相通过验证)。这个需求无法通过中心化的配置中心来实现,因为如果这样做的话,配置中心就是一个中心失效点,完全不符合去中心化的理念。
不过解决方案也很简单:通过智能合约管理该配置项,每个节点都监听该智能合约关于配置项已被修改的事件,从而更改自己产生区块或验证区块的行为即可。
这个合约就是Configuration合约。
Configuration合约设计
在功能上,Configuration也只是起到了配置中心的作用。我们把它当成一个全局的appsettings.json就可以了。所以Configuration合约只有两个主要接口:
SetConfiguration:入参为kv pair
GetConfiguration:入参为key,出参为value
当然,还有一个ConfigurationSet事件,每当新增配置和修改配置的时候,都会抛出来:
还有两个接口是关于设置权限的,我们并不希望谁都可以新增和修改aelf全局的配置。
ChangeConfigurationController:移交控制权限。默认情况下,权限在Parliament的默认组织手上。
GetConfigurationController:获取当前控制权限信息。
Configuration合约的实现极其简单,就不讨论了。
ConfigurationSet事件的处理
aelf节点的链下部分,服务之间通过EventBus交流。在这里,我们以一个aelf全节点(非BP)的视角来看如何监听和处理合约中抛出来的LogEvent。下面的pipeline中的每一个列都是一个服务的实例(v1.2.0)。

简而言之,在把新区块添加到本地的区块链的过程中,会抛出一个BlockAcceptedEvent事件。通过处理这个事件,可以捕获到刚刚执行的区块中的交易中的感兴趣的事件(这里就是ConfigurationSet事件),然后编写相应的逻辑,解析该事件,并影响aelf节点的行为。
到了最后一步ConfigurationService.ProcessConfigurationAsync,通过注入的IConfigurationProcessor的实现列表处理新增或刚修改的配置信息。
Configuration合约和Feature生效功能
如果Configuration合约中插入了一个以AElfFeature_为前缀的key,其value就应该是一个Int64Value类型。这个key标识着要生效的feature,value代表这个feature生效的高度。
主要逻辑在FeatureActiveService里。
这里其实就是从Configuration合约里读一下指定feature的生效高度,如果能够生效,就返回true。
其他feature如果涉及按指定高度生效,就注入一下IFeatureActiveService,可以参考MockService和单测FeatureManageTest。
Last updated