---
# System prepended metadata

title: Solana

---

# 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/)