TON:电报开放网络。 第 2 部分:区块链、分片

TON:电报开放网络。 第 2 部分:区块链、分片

本文是一系列文章的延续,在这些文章中,我研究了(可能是)分布式网络 Telegram Open Network (TON) 的结构,该网络正准备于今年发布。 在 上一节 我描述了它最基本的层面——节点之间交互的方式。

以防万一,让我提醒您,我与该网络的开发无关,所有材料都是从开放(尽管未经验证)来源收集的 - 文件 (还有一个附带的 小册,简要概述了要点),去年年底出现。 在我看来,这份文件中的信息量表明了其真实性,尽管没有得到官方证实。

今天我们来看看 TON 的主要组成部分——区块链。

基本概念

帐户 (帐户)。 由256位数字标识的一组数据 帐户ID (通常这是帐户所有者的公钥)。 在基本情况下(见下文 零工作链),该数据指的是用户的余额。 “占领”具体 帐户ID 任何人都可以,但它的值只能根据一定的规则改变。

智能合约 (智能合约)。 本质上,它是账户的一种特殊情况,辅以智能合约代码和变量存储。 如果在“钱包”的情况下,您可以根据相对简单且预先确定的规则从中存入和取出资金,那么在智能合约的情况下,这些规则将以代码的形式编写(以某种图灵完备的形式)编程语言)。

区块链状态 (区块链的状态)。 所有账户/智能合约的状态集合(抽象意义上是一个哈希表,其中键是账户标识符,值是账户中存储的数据)。

信息 (的话)。 上面我使用了“贷方和借方货币”这一表达方式——这是消息的一个特定示例(“转账 N克 从帐户 帐户_1 每个账户 帐户_2”)。 显然,只有拥有账户私钥的节点才能发送这样的消息 帐户_1 - 并能够通过签名确认这一点。 将此类消息传递到常规帐户的结果是其余额增加,而智能合约的结果是执行其代码(它将处理消息的接收)。 当然,其他消息也是可能的(不是传输货币金额,而是在智能合约之间传输任意数据)。

交易 (交易)。 消息传递的事实称为事务。 交易改变了区块链的状态。 构成区块链中区块的是交易(消息传递记录)。 在这方面,您可以将区块链的状态视为增量数据库 - 所有块都是“差异”,需要顺序应用以获得数据库的当前状态。 打包这些“差异”(并从中恢复完整状态)的细节将在下一篇文章中讨论。

TON 中的区块链:它是什么以及为什么?

正如上一篇文章中提到的, 区块链是一种数据结构,其元素(块)被排序成一条“链”,链中的每个后续块都包含前一个块的哈希值。 评论提出了一个问题:当我们已经有了 DHT(分布式哈希表)时,为什么还需要这样的数据结构? 显然,有些数据可以存储在DHT中,但这只适合不太“敏感”的信息。 加密货币余额无法存储在 DHT 中 - 主要是由于缺乏对 DHT 的检查 廉正。 实际上,区块链结构的整体复杂性不断增加,以防止存储在其中的数据受到干扰。

然而,TON 中的区块链看起来比大多数其他分布式系统中的区块链更加复杂 - 这有两个原因。 首先是希望尽量减少对 叉子。 在传统加密货币中,所有参数都是在初始阶段设定的,任何改变它们的尝试实际上都会导致“另类加密货币宇宙”的出现。 第二个原因是支持压榨(分片, 分片)区块链。 区块链是一种不会随着时间的推移而变小的结构; 通常每个负责网络运行的节点都被迫完整地存储它。 在传统(集中式)系统中,分片用于解决这样的问题:数据库中的一些记录位于一台服务器上,一些位于另一台服务器上,等等。 就加密货币而言,这种功能仍然相当罕见,特别是因为很难将分片添加到最初计划之外的系统中。

TON 计划如何解决上述两个问题?

区块链内容。 工作链。

TON:电报开放网络。 第 2 部分:区块链、分片

首先,我们来谈谈区块链中计划存储什么。 账户(基本情况下的“钱包”)和智能合约的状态将存储在那里(为简单起见,我们假设这与账户相同)。 本质上,这将是一个常规哈希表 - 其中的键将是标识符 帐户ID和值是包含以下内容的数据结构:

  • 平衡;
  • 智能合约代码(仅适用于智能合约);
  • 智能合约数据存储(仅适用于智能合约);
  • 统计数据;
  • (可选) 账户转账的公钥,默认为account_id;
  • 传出消息队列(此处输入消息以转发给收件人);
  • 发送到此帐户的最新消息的列表。

如上所述,块本身由交易组成 - 传递到各个 account_id 帐户的消息。 然而,除了account_id之外,消息还包含一个32位字段 工作链id ——所谓的标识符 工作链 (工作链, 工作区块链)。 这允许您拥有多个具有不同配置且彼此独立的区块链。 在这种情况下,workchain_id = 0被认为是一种特殊情况, 零工作链 — 其中的余额将对应于 TON(克)加密货币。 最有可能的是,一开始其他工作链根本不存在。

分片链。 无限分片范式。

但区块链数量的增长并不止于此。 让我们来处理分片。 让我们想象一下,每个帐户 (account_id) 都分配有自己的区块链 - 它包含发送到它的所有消息 - 并且所有此类区块链的状态都存储在单独的节点上。

当然,这是非常浪费的:最有可能的是,在每一个 分片链 (分片链, 分片区块链)交易将很少到达,并且将需要许多强大的节点(展望未来,我注意到我们不仅仅是在谈论移动电话上的客户端 - 而是在谈论严肃的服务器)。

因此,分片链通过标识符的二进制前缀来组合账户:如果分片链的前缀为 0110,那么它将包含以这些数字开头的所有 account_id 的交易。 这 分片前缀 长度可以从 0 到 60 位 - 最主要的是它可以动态改变。

TON:电报开放网络。 第 2 部分:区块链、分片

一旦其中一个分片链开始接收太多交易,在其上工作的节点就会根据预先确定的规则,将其“拆分”为两个子链——它们的前缀将长一点(对于其中一个分片链来说,该位将是等于 0,其他为 - 1)。 例如, 分片前缀 = 0110b 将分裂成 01100b 和 01101b. 反过来,如果两个“相邻”分片链开始感到足够自在(一段时间内),它们将再次合并。

因此,分片是“自下而上”完成的——我们假设每个帐户都有自己的分片,但目前它们通过前缀“粘合在一起”。 这就是它的意思 无限分片范式 (无限分片范式).

另外,我想强调的是,工作链只是虚拟存在的——事实上, 工作链id 它是特定分片链标识符的一部分。 用正式术语来说,每个分片链都由一对数字定义(工作链id, 分片前缀).

纠错。 垂直区块链。

传统上,区块链上的任何交易都被认为是“一成不变的”。 然而,就 TON 而言,“重写历史”是可能的——以防有人(所谓的。 渔夫结)将证明其中一个区块的签名不正确。 在这种情况下,一个特殊的校正块会被添加到相应的分片链中,其中包含被校正的块本身的哈希值(而不是分片链中的最后一个块)。 将分片链视为水平布局的区块链,我们可以说,纠正区块不是从右侧而是从上方附加到错误区块上 - 因此它被认为成为小型“垂直区块链”的一部分。 因此,我们可以说分片链是 二维区块链.

TON:电报开放网络。 第 2 部分:区块链、分片

如果在错误块之后,后续块引用了它所做的更改(即,基于无效交易进行了新交易),则纠正性交易也会“在顶部”添加到这些块中。 如果这些区块没有影响“受影响”的信息,那么这些“修正波”就不适用于它们。 例如,在上图中,第一个区块增加账户 C 余额的交易被认为是不正确的 - 因此,第三个区块中减少该账户余额的交易也应该被取消,并进行纠正区块应该在块本身之上提交。

应该注意的是,虽然纠正块被描述为位于原始块的“上方”,但实际上它们将被添加到相应区块链的末尾(它们应该按时间顺序排列)。 二维位置仅显示它们将“链接”到区块链中的哪个点(通过位于其中的原始块的哈希值)。

你可以单独思考“改变过去”的决定有多好。 看来,如果我们承认分片链中出现错误区块的可能性,那么我们就无法避免出现错误纠正区块的可能性。 据我所知,区别在于必须就新区块达成共识的节点数量——每个分片链上工作的人数相对较少。”工作小组» 节点(经常改变其组成),并且引入纠正块将需要每个人的同意 验证节点。 我将在下一篇文章中详细讨论验证者、工作组和其他节点角色。

一个区块链统治一切

上面列出了很多关于不同类型区块链的信息,这些信息本身也应该存储在某个地方。 我们特别讨论以下信息:

  • 关于工作链的数量和配置;
  • 关于分片链的数量及其前缀;
  • 关于哪些节点当前负责哪些分片链;
  • 添加到所有分片链的最后一个块的哈希值。

正如你可能已经猜到的,所有这些东西都记录在另一个区块链存储中 - 主链 (主链, 主区块链)。 由于其区块中存在来自所有分片链的区块的哈希值,使得系统高度连接。 这意味着,除其他外,主链中的新块的生成将在分片链中的块生成之后立即发生——预计分片链中的块将几乎每 5 秒同时出现,并且分片链中的下一个块将几乎同时出现。 masterchain - 之后一秒钟。

但是谁将负责执行所有这些艰巨的工作——发送消息、执行智能合约、在分片链和主链中形成区块,甚至检查区块是否有错误? 这一切会不会是由数百万安装了 Telegram 客户端的用户的手机秘密完成的呢? 或者,杜罗夫团队可能会放弃去中心化的想法,他们的服务器会以老式的方式来做?

事实上,无论是哪一个答案都不正确。 但本文的篇幅很快就耗尽了,因此我们将在下一部分中讨论节点的各种角色(您可能已经注意到其中提到了其中一些角色)以及它们的工作机制。

来源: habr.com

添加评论