Solana 中的非同步程式執行(APE)

作者:toly,Solana Labs 共同創作來源:X,@aeyakovenko 譯:善歐巴,金色財經

在Solana中,狀態組織為平坦的鍵值存儲,程式在此狀態上執行以更新值,包括用於共識的關鍵投票程序。非同步執行的主要目的是允許投票程序獨立於其他所有程式運行。為了始終如一地實現這一目標,我們需要確保幾個關鍵原則。

執行域

執行域是一組程式及其操作的鍵和值,這些程式在執行時彼此獨立。執行域可以在不同的執行緒和核心上運行,並且在各種機器上以不同的時間完成。重要的是,一個執行域(例如,域A)不能讀取或寫入另一個域(例如,域B)中的任何值。然而,域可以共享在任何一個域執行期間保持一致的狀態。需要一個協定來同步域之間的狀態,並促進鍵和值的移動。

交易費用支付者決定交易執行的網域。

關鍵域:VED和UED

在Solana中,我們主要關注兩個域:投票執行域(VED)和使用者執行域(UED)。目標是使驗證者能夠在所有使用者程式執行完成之前進行投票。

VED的組成部分

  • 系統程式:用於轉帳

  • 投票程序系統變數:用於投票的投票程序系統變數

  • 投票程序:核心投票程序。程式是靜態且一致的,必須在UED和VED中都有。

  • 投票權限:有權投票的帳戶

  • 投票費用支付者:支​​付與投票相關費用的帳戶

  • 費用支付者基金:可用於將sol移至VED的可更新帳戶

  • 所有其他帳戶放在UED中

計算VED狀態

在N-1和N的紀元邊界,運行時計算N+1域的VED狀態。此計算必須在紀元N結束前完成。 UED計算必須在紀元N-1完成後才能開始。

VED狀態的標準

  • 投票帳戶:質押超過5000 sol且處於活躍狀態的帳戶。

  • 費用支付者和投票權限,費用支付者基金:與上述投票帳戶關聯。

  • 新建立的投票帳戶最初設定為不活躍。用戶必須啟動這些帳戶,一旦激活,它們將在下次VED狀態計算中包含在內。使用者可以停用帳戶,該帳戶將在N+1紀元中從VED狀態移除。

在VED中移動資金

投票帳戶中聲明的費用支付者資金帳戶可用於在VED中移動資金。更新投票帳戶中的費用支付者資金帳戶後,目前的費用支付者基金將在下一個紀元結束前保持活躍。一旦重新計算的VED激活,新的費用支付者基金將進入VED狀態,並可用於向費用支付者添加額外的sol。舊的費用支付者基金將進入UED狀態,因此可以將資金轉回UED中的帳戶。

雖然可以將其與費用支付者合併,但為了最小化每次投票使用的簽名數量,費用支付者通常設定為與投票權限相同的值,因此需要一個單獨的帳戶在VED和UED之間轉移sol。

通用執行域

上述方法非常針對投票程序。更進一步可以將該方法推廣到任意數量的執行域。帳戶追蹤它們被映射到的執行域,就像作業系統管理程式追蹤實體頁面中的VMID一樣。對於這個特定項目,有一小部分映射是有用的:

  • RX-UED:在UED中唯讀和可執行

  • RX-UED-VED:在UED和VED中唯讀和可執行

  • RW-VED:在VED中讀寫

  • RW-UED:在UED中讀寫

由於帳戶不能在多個網域中同時讀寫,其他對應是無效的。

  • 程式:只能對應為RX-UED或RX-UED-VED,即在使用者或兩個網域中可讀和可執行,但不可寫入。任何將程式包含為可寫入的交易必須失敗。

  • 帳戶:只能對應為RW-VED或RW-UED。

系統快照將投票程序和系統程式配置為RX-UED-VED。系統程式提供將系統帳戶和投票程序帳戶移至VED和從VED移動的介面。實際更新仍需一個完整的紀元才能啟動。

只有當擁有者程式在目標網域中時,帳戶才能在網域之間重新對應。因此,只有投票程序和系統程式帳戶可以在VED和UED之間移動。

採用通用方法後,不再需要明確的費用支付者資金帳戶。開發人員可以在VED和UED之間重新映射任何系統帳戶,從而在網域之間移動資金。

計算VED哈希

在接收到區塊後,節點執行所有交易。過程如下:

  • 執行僅涉及VED帳戶的交易。

  • 含有VED費用支付者但混合帳戶的交易失敗。

  • 跳過所有其他交易。

產生的VED狀態更新用於計算銀行哈希,即VED哈希。驗證者現在可以使用VED哈希進行投票,而不是舊的銀行哈希。如果自上次對該分叉進行投票以來有UED哈希更新,則該哈希和插槽將包含在投票中。

計算UED哈希

在接收到區塊後,節點處理所有交易:

  • 不在VED中的帳戶被視為UED的一部分。

  • 執行僅涉及UED帳戶的交易。

  • 含有UED費用支付者但混合帳戶的交易失敗。

  • 跳過所有其他交易。

產生的UED狀態更新用於計算銀行哈希,即UED哈希。

最終性

最終性保持不變。

交易執行狀態代碼

非同步執行的副作用是非確定性可能不會在投票分叉時同步立即檢測到。如果1/3或更多驗證者提交不同的UED哈希,則所有節點必須停止確認和投票,並警告操作員。

要獲得狀態代碼,RPC API請求必須允許使用者指定計算相同UED哈希的觀察到的質押。執行狀態可以表示為ExecutionStatus(簽名,質押=X),其中X可以為0或某個預設值。在具有多個節點和客戶端的設定中,X值為0是可以接受的,這給使用者帶來了非確定性極不可能的信心。

非確定性是唯一需要在向用戶返回已確認交易的狀態代碼之前檢測的故障,因此X的預設值通常可以低至樂觀確認閾值或約5%。

領導者和區塊生成

領導者必須能夠在VED完成後立即開始創建區塊。這意味著領導者將對任何UED費用支付者的狀態有部分和不完整的資訊。

  • 領導者僅對其創建的區塊執行VED域

  • UED重播必須跳過無效的費用支付者

投票程序的功能激活

投票程序必須在假設VED投票可能在功能啟動時跨越紀元邊界的情況下設計,以不同於UED中接觸投票程序的其他交易的時間操作。

獎勵

只有處於VED狀態的投票帳戶才應獲得獎勵。

懲罰

所有投票帳戶無論處於活躍狀態或VED狀態,都有被懲罰的風險。

全域時鐘更新

時鐘系統變數由投票更新。應該使用替代方法。相反,每個區塊領導者可以將時鐘向前移動1秒。至少40%的網路需要惡意,時鐘才能比實際時間更快成長。時鐘也可以預設向前移動400毫秒。假設50毫秒的漂移,只有12.5%的領導者需要調整時鐘時間以保持同步。

Total
0
Shares
Related Posts