区块链之链
本文档中,“智能合约”、“账户”和“Actor”这几个术语可互换使用,用以描述区块链实体。
单一Actor
让我们考虑一个智能合约。
在TON中,它是一个拥有地址
、代码
、数据
、余额
等属性的_事物_。换句话说,它是一个拥有一定_存储_和_行为_的对象。
行为会遵循以下模式:
- 发生某事(最常见的情况是合约收到一条消息)
- 合约根据自身属性通过在TON虚拟机中执行其
代码
来处理该事件。 - 合约修改自身属性(
代码
、数据
等) - 合约可选地生成传出消息
- 合约进入待机模式,直到下一个事件发生
这些步骤的组合被称为一次交易。重要的是,事件是依次处理的,因此_交易_是严格有序的,不能相互打断。
这种行为模式众所周知,被称为“Actor”。
最低层级:账户链
一系列的_交易_ Tx1 -> Tx2 -> Tx3 -> ....
可以被称为一条链。在这个例子下,它被称为账户链 (AccountChain),以强调这是单个账户的_交易链_。
现在,由于处理交易的节点时不时需要协调智能合约的状态(达成关于状态的_共识_),这些_交易_被批量处理:
[Tx1 -> Tx2] -> [Tx3 -> Tx4 -> Tx5] -> [] -> [Tx6]
。
批处理不干预排序,每个交易仍然只有一个“前一交易”和至多一个“下一交易”,但现在这个序列被切割成了区块。
将传入和传出消息的队列也包含在_区块_中是有益的。在这样的情况下,一个_区块_将包含决定和描述智能合约在该区块期间所发生的全部信息。
账户链的集合:分片链
现在让我们考虑有许多账户的情况。我们得到一些_账户链_并将它们存储在一起,这样的一组_账户链_被称为分片链 (ShardChain)。同样地,我们可以将分片链切割成分片区块,这些区块是个别_账户区块_的聚合。
分片链的动态拆分与合并
请注意,由于_分片链_由容易区分的_账户链_组成,我们可以轻松地将其分割。这样,如果我们有1个_分片链_,描述了100万个账户的事件,且每秒交易量过多,无法由一个节点处理和存储,那么我们就将该链分割(或拆分)为两个较小的_分片链_,每条链处理50万个账户,每条链在一组独立的节点上处理。
同样地,如果某些分片变得过于空闲,它们可以被合并为一个更大的分片。
显然有两个极限情况:分片只包含一个账户(因此无法进一步分割)以及当分片包含所有账户。
账户可以通过发送消息相互交互。这里会有一种特殊的路由机制,将消息从传出队列移动到相应的传入队列,并确保1) 所有消息都将被送达 2) 消息将连续送达(较早发送的消息将更早到达目的地)。
为了使分割和合并具有确定性,将账户链聚合成分片是基于账户地址的位表示。例如,地址会看起来像(分片前缀, 地址)
这种形式。这样,分片链中的所有账户将具有完全相同的二进制前缀(例如所有地址都以0b00101
开头)。
区块链
包含所有账户并按照一套规则运行的所有分片的集合被称为区块链