mt logoMyToken
Market cap:
0%
FGI:
0%
Cryptocurrencies:--
Exchanges --
ETH Gas:--
EN
USD
APP
Ap Store QR Code

Scan Download

QuarkChain技术揭秘 第三话:状态分割

Collect
Share

QuarkChain技术揭秘 第三话:状态分割

一.QuarkChain分片方案的总体设计

以现有的区块链模型为基础,我们是从以下几个关键点来设计QuarkChain:

(1)智能合约的状态分割。QuarkChain将智能合约进行状态分割,也就是将智能合约放置在不同的片中。智能合约包含代码和存储的数据,因此会比普通的用户帐户大得多(例如一个ERC20合约包含了大量地址和余额的对应映射)。

(2)普通账户的状态分割。QuarkChain不分割用户的帐户,这样用户可以轻松地通过跨片交易将其帐户状态(主要是余额信息)转移到某一个片中。这允许用户只需要一把私钥就可以访问所有片中的全部资源(包括部署在QuarkChain上的全部智能合约)。

(3)原子性:每一个智能合约都有一个片值(在我们的代码库中命名为的fullShardId),在所有具有相同片值的智能合约上进行的任何批操都将保持原子性。此外,我们还将禁止一个智能合约去访问具有不同的片值的智能合约。

(4)负载平衡:假设智能合同的片值是均匀分布的,那么智能合约也将被均匀地分布在不同的片中。

(5)网络可以再次分片。为了降低再分片产生的迁移成本,我们会根据智能合约的片值来把相应片分割成两个新的片。这可以避免对原先片上的数据进行迁移,从而简化了再分片过程。

(6)再分片前后,智能合约的功能不变。需要保证再分片不会影响合约本身的功能,再分片前后读取同一个合约将得到相同的值,写入一个合约将得到同样的状态变化。

二.QuarkChain的系统状态与状态分割

为了维护在QuarkChain进行CRUD(增加(Create)、读取查询(Retrieve)、更新(Update) 和删除(Delete))操作的原子性,QuarkChain将一串32位的片值添加到每个地址中来重新定义帐户和智能合约的地址:

Address:= RIPEMD160(Public key) + Shard key,

这里的“+”是笛卡尔积运算符。当前,QuarkChain的地址是192位的字符串,地址的前160位作为recipient*的主地址。

QuarkChain网络中分片的数量是2的乘幂,再分片操作将使网络分片数量增加一倍。确定分片的数量(shard size)后,分片的索引如下:

Shard Id:= Shard key % Shard size

片中的状态是key-value 映射,其中key是recipient地址,value包含如下信息:

余额(Balance);

一次性随机数(Nonce);

代码(Code);

储存数据(Storage);

片值(ShardKey)。

当设立好片值,key-value对一旦也建立就不可更改。

通过更换地址中的片值,用户能够用单个私钥来管理所有分片中的地址。

三.QuarkChain中的转账

3.1 余额传递类交易

余额传递类交易中的关键参数是发出地址和接收地址,传递过程中有以下两种情况:

(1)片内交易:如果发出地址和接收地址都有相同的片名(即使片值可能不同),则当前交易是一个片内交易,这样的交易只会改变同一片中 recipient的余额。

(2)跨片交易:如果发出地址和接收地址具有不同的片名,则这个交易是一个跨片交易,为了确保交易的原子性我们需要进一步协调交易的过程。幸运的是,这类交易要比跨链交易简单得多,因为两个片都支持相同的加密币(QKC)。跨片交易的细节将在后续的文章进行讨论。

3.2智能合约相关交易

与智能合约相关的交易都是片内交易,即:发出地址的片名和接收交易的智能合约的片名必须相同。智能合约可以调用另一个具有相同片值的智能合同(这种情况需要提供另一个智能合约的recipient。EVM中的地址,EVM的代码中的地址都需要能向后兼容性)。如果智能合约处于不同的片中调用将失败,这种调用动作相当于使用如下的代码访问一个智能合约:

PUSH 0x0

DUP1

REVERT

无论系统状态是如何划分的,具有相同的片值的智能合约将总是被划分到相同的片中,智能合约的功能(进行读/写操作)将能保持一致。(如果想了解这个部分的更多细节,请关注我们的后续文章)。

四.QuarkChain再分片

再分片操作会将每个分片再分成两个片,因此分片的数目会增加一倍。片的数目增加之后,帐号/智能合约的片名中将会增加额外的标识字符用于区别。假设用户帐户/智能合约的片值是呈现均匀分布的,那么一半的帐户/智能合约将会被划分到新分出的1号片中,剩下的一半在2号片中。此外,一个新生的片可能包含另一个新分出的片的智能合约,这种情况将通过使用REVERT命令替换原有的代码并清空其存储内容。这些操作确保新分片中的智能合约即使他们处于相同的片中,如果片值不同,也不能彼此调用。

如果现有的节点没有足够的能力来处理新增分片的事务,新的节点可以加入网络。新增的分片可以迁移到新增加的节点上,从而系统整体容量可以随着分片和节点数目的增加而不断增加。我们后续也将有专门文章来讨论集群的设计。

五.QuarkChain中如何选择片值

在QuarkChain的设计中,确保负载均衡的一个关键是把所有智能合约均匀的分布到所有片中。由于在创建智能合约之后片值是不可变的,所以创建过程中的片值的选择非常重要。

如果要创建的智能合约需要调用其他智能合约,则片值必须与调用的智能合约的片值相同。如果一个智能合约不依赖于任何其他合约,用户则可以自由选择片值,或者采用一些简单规则来生成片值,比如:

随机生成;

采用发出地址的Recipient中的任意32位字符;

或者钱包的IP地址。

前两个情况应该会使得片值的分布趋于均衡。假设网络中有成百上千片,则会产生一些问题。这会使得调用智能合约的用户可能需要频繁的使用跨片交易,或是在多个片中保有余额。这样一来就降低了网络的工作效率,牺牲了用户体验。

通过将一类智能合约根据地理信息分组,使用钱包的IP地址来作为片值,可以避免这个问题。当用户调用智能合约的场景是与地理信息相关的(例如,经常到某个实体商家购物),用户可以在需要高频发生交易行为的商家相关的片中保留余额,从而避免了频繁的跨片交易、简化帐户管理、提升使用体验。

六.QuarkChain与谷歌Big Table的比较

QuarkChain的分片设计受到了谷歌BigTable项目的启发。两者有很多相似之处,因为它们都是对key-value进行存储,我们列出一个表格进行详细的对比:

QuarkChain技术揭秘 第三话:状态分割

除了上面提到的相似性之外,QuarkChain与BigTable的主要区别如下:

(1)QuarkChain在设计之初就支持跨片交易,可以将一个片中的帐户余额快速的转移到位于另一个片中的帐户中,而BigTable并不支持跨行事务。

(2)如果BigTable中的表格很小,则可以将两个相邻的表格(类似我们说的片的概念)合并成一个格。但类似合并操作很少用于区块链中,QuarkChain并不需要合并操作。这样也简化了我们的设计,避免了一些可能遇到的威胁和攻击(例如:重放攻击)。

总结

在现有可扩展系统的启发下,我们根据分片的思路提出了一种新的区块链模型,并把该模型与谷歌BigTable进行了比较。在下一篇文章中,我们将讨论如何选择合适的共识来帮助QuarkChain应对可能遇到的网络攻击。


文章声明:本文为火星财经专栏作者作品,版权归作者所有,不代表火星财经观点。


Disclaimer: The copyright of this article belongs to the original author and does not represent MyToken(www.mytokencap.com)Opinions and positions; please contact us if you have questions about content
Related Reading