# Solana **基於 PoH +PoS 的共識機制** ## PoH (Proof of History, 歷史證明) 一種基於時間排序交易的技術, 用於快速確認交易 ![Screenshot 2024-12-25 at 3.01.38 AM](https://hackmd.io/_uploads/HyllDYdH1e.png) ### 前情提要 - 時間的制定在區塊鏈網路尤為重要, 特別是影響打包到區塊中每筆交易的順序 Ethereum使用的也是PoS, 在一個slot裡,以[RANDAO](https://eth2book.info/capella/part2/building_blocks/randomness/)隨機選出validator 去提交區塊到鏈上, 這時區塊上的timestamp是來自於該validator的local time,並非由共識機制確定, 是來自外部 **Note:** slot是區塊鏈網路的時間單位, 在ethereum為12秒 validator是ethereum中已質押32顆ETH的節點 ### PoH說明 **網路中的角色:** - **Leader** : 是 PoH 生成器, 用來執行PoH, 為每筆交易生成時間戳記並且排序, 並將排序完的交易打包到區塊, 廣播到網路由 多個verifier進行驗證, 超過全網2/3的verifier簽名同意, 該區塊被視為已確認, 那區塊內交易的順序才會固定, 並且該區塊會提交到鏈上, 在每個時間點, 網路中只有一個Leader進行排序, 這個Leader是用PoS與Tower BFT從 verifier們中選出, 完成任務後以 gossip 協議廣播區塊出去, 下個Leader交接前就會得知上個區塊的時間戳, 藉此PoH提供全網統一的時間軸, 確保交易順序一致, 這些執行都會在一個slot完成 (一個slot是 400ms), 沒打包完的交易會由下個Leader繼續打包 -- 那誰負責選出下個Leader? 所有參與質押的verifier會根據PoS的投票機制, 提前決定未來的Leader順序 (Beacon chain, Leader計劃表), 所以每個verifier都知道下個slot會由哪個擔任Leader - **Verifier** : 負責驗證區塊, 驗證完對該區塊進行簽名產生signature, 並將這個signature廣播到網路中, 當2/3的verifier們產生的signature一致即這個區塊完成確認, 裡面的交易們也會訂下順序, 2/3這個數字是從Tower BFT來的 **驗證流程要從 PoH產生交易順序講起:** - 一個PoH生成器(Leader), 會在一個slot裡面不停用sha256為基底的函數(VDF)產生hash值, 產生的方式是用上個hash值作為下個hash的input,VDF是不可逆的, 而且只能在單核心上進行, 因為多核心無法並行計算出環環相扣的hash值, 每個hash類似時間戳記. 當第一筆交易送到Leader時, Leader會拿著當前hash值與這個交易上的metadata進行hash,產生新的hash值 `hash_1 = sha256(hash_0 + transaction_A_data)` 第二筆交易送到Leader時, 就用上個hash去生成 `hash_2 = sha256(hash_1 + transaction_B_data)` 以此類推, 藉此生成交易序列的hash鏈 - verifier 逐步檢查區塊中每個hash是否正確地從上個hash生成,驗證時可以用多核心去並行處理, 因為可以把 hash鏈切片去並行驗證,提高驗證速度, 如圖: ![Screenshot 2024-12-25 at 7.19.14 AM](https://hackmd.io/_uploads/BJ75W6uHJx.png) ## 為什麼 Solana 的 TPS 比 Ethereum 多很多 | chain | ETH | Solana | | ----- | ----| -------| | TPS | 12 | 4000 up| | 區塊產出時間 | 12 s | 400 ms| 因為ETH是由全網節點們重新執行該區塊上的所有交易, 驗證最終結果 (自己的計算結果和區塊提供的數據是否一致), 但Solana則是由PoH生成器先對交易們進行排序(有點像發號碼牌), 其他節點們可用並行處理驗證區塊中的交易, 不用重新執行交易, 所以交易順序在進入網路前就已經定下, 不用達到全網共識, 因此產出區塊的時間比ETH少, Solana的吞吐量比較高. ## Solana 網路運作粗略流程 - User發起交易給節點, 放在 mem pool, 透過gossip協議把交易分發到Leader - Leader執行PoH, 基於時間戳決定交易們的排序 (發號碼牌) - Leader打包交易們到區塊, 並且將區塊廣播到網路讓其他節點知道 - Verifier驗證區塊裡的交易, 即檢查每個hash是否正確, 確定正確後進行簽名並將其廣播出去 - 當全網2/3的節點都對這個區塊驗證正確, 那區塊將會被確認 ## Solana的帳戶模型 以key-value形式儲存, value可以存10MB資料, 可以發送交易也可以儲存程式, 和 eth的 EOA有很大的不同(EOA只能發起交易, 不能儲存), 而且按照儲存的容量在地址存入租金(Sol幣) ![Screenshot 2024-12-25 at 9.00.48 AM](https://hackmd.io/_uploads/H1aSYAur1x.png) solana的智能合約是一種無狀態帳戶 (未完待續..) ## 參考資料 [Solana white paper](https://solana.com/solana-whitepaper.pdf) [Solana Doc](https://solana.com/docs/core/accounts) [Ethereum PoS](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/)