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 客戶端的用戶的手機秘密完成的呢? 或者,杜羅夫團隊可能會放棄去中心化的想法,他們的服務器會以老式的方式來做?

事實上,無論是哪一個答案都不正確。 但本文的篇幅很快就耗盡了,因此我們將在下一部分中討論節點的各種角色(您可能已經註意到其中提到了其中一些角色)以及它們的工作機制。

來源: www.habr.com

添加評論