块内分片

标签: sharding 分片 交易执行


概念

当一条区块链上承载了多个应用时,可采用“块内分片”技术实现应用间交易执行的并行化。

FISCO BCOS支持中对链上的合约进行分组。在执行一个区块内的交易时,一个区块内的交易会根据合约的分组情况拆分成多个“块内分片”下文简称:分片),相同分片的交易调度到同一个执行器中执行。

方案

关键点

  • 并行:一个区块内的不同分片调度至不同的执行器中并行执行。

  • 局部:分片内部合约的相互调用直接在同一个执行器中完成,分片间互不干扰。

  • 跨分片:跨分片调用直接在一个区块内完成,对用户透明无感,其调度基于DMC机制,避免繁重的SPV证明。

  • 配置:用户可用控制台管理合约所属的分片

  • 继承:分片内合约部署的合约属于相同的分片,消除繁琐的分片管理操作。

实现

实现方法如下:

  • 并行:基于FISCO BCOS的架构实现多executor的调度。

  • 局部:一个executor内部,采用DAG的方式并行执行

  • 跨分片:跨分片的交易采用DMC机制进行调度,在一个区块内完成的同时,保证一致性与存在性。

  • 配置:基于BFS实现合约的分片管理,启动控制台,用linkShard命令可绑定合约至分片,用 ls 命令查看分片信息。

  • 继承:分片内合约部署的合约自动继承所属分片配置

举例

分片1:/shard/hello_shard

/shard/hello_shard/hello1
/shard/hello_shard/hello2
/shard/hello_shard/hello3

分片2:/shard/account_shard

/shard/account_shard/alice
/shard/account_shard/bob
/shard/account_shard/charies

操作举例

该操作需要使用控制台,请参考此处部署控制台。分片管理操作请参考此处。

部署合约

部署两个合约:Asset、HelloWorld

[group0]: /apps> deploy Asset 
transaction hash: 0x8dbee4602da3d3435ce73df3778ee975b650cfaf70ce6b53f14db6db478cec10
contract address: 0xcceef68c9b4811b32c75df284a1396c7c5509561
currentAccount: 0x988e6a553f434be3d37786c97abb1fe1f8b7341d

[group0]: /apps> deploy HelloWorld 
transaction hash: 0xcb860822f8d74ac447fc3d18870109a202ff788a6b1ef32970fa53497ba386d5
contract address: 0xd24180cc0fef2f3e545de4f9aafc09345cd08903
currentAccount: 0x988e6a553f434be3d37786c97abb1fe1f8b7341d

创建分片

创建两个分片:account_shard 和 hello_shard

[group0]: /apps> makeShard account_shard
make shard account_shard Ok. You can use 'ls' to check

[group0]: /apps> makeShard hello_shard
make shard hello_shard Ok. You can use 'ls' to check

[group0]: /apps> ls /shards/
account_shard   hello_shard 

合约绑定分片

分别将上述的两个合约绑定到不同的shard

[group0]: /apps> linkShard 0xcceef68c9b4811b32c75df284a1396c7c5509561 account_shard
Add 0xcceef68c9b4811b32c75df284a1396c7c5509561 to account_shard Ok. You can use 'ls' to check

[group0]: /apps> linkShard 0xd24180cc0fef2f3e545de4f9aafc09345cd08903 hello_shard
Add 0xd24180cc0fef2f3e545de4f9aafc09345cd08903 to hello_shard Ok. You can use 'ls' to check

查询分片信息

用getContractShard命令查看合约已经绑定至特定的shard

[group0]: /apps> getContractShard 0xcceef68c9b4811b32c75df284a1396c7c5509561
/shards/account_shard

[group0]: /apps> getContractShard d24180cc0fef2f3e545de4f9aafc09345cd08903
/shards/hello_shard

BFS的ls命令也可以查询

[group0]: /apps> ls /shards/account_shard/
cceef68c9b4811b32c75df284a1396c7c5509561   

[group0]: /apps> ls /shards/hello_shard/
d24180cc0fef2f3e545de4f9aafc09345cd08903 

调用shard内的合约

交易会自动调度至相应的shard中执行,不同的shard在不同的执行器中执行,该操作对用户透明,体验上与调用普通合约无区别

[group0]: /apps> call HelloWorld 0xd24180cc0fef2f3e545de4f9aafc09345cd08903 set nice
transaction hash: 0x41637d8eb5907e84fd2bda6303d444bb7b3b9fe8cd85750dc547139710439b6e
---------------------------------------------------------------------------------------------
transaction status: 0
description: transaction executed successfully
---------------------------------------------------------------------------------------------
Receipt message: Success
Return message: Success
Return value size:0
Return types: ()
Return values:()
---------------------------------------------------------------------------------------------
Event logs
Event: {}