# Solana
**基於 PoH +PoS 的共識機制**
## PoH (Proof of History, 歷史證明)
一種基於時間排序交易的技術, 用於快速確認交易

### 前情提要
- 時間的制定在區塊鏈網路尤為重要, 特別是影響打包到區塊中每筆交易的順序
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鏈切片去並行驗證,提高驗證速度,
如圖:

## 為什麼 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幣)

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