Leveraging knowledge to transition between blockchain stacks | Jonatas Martines - DSS 101 2024
三句話摘要
Ethereum開發者如何快速遷移至Solana生態,透過系統化開發思維與駭客思維的迭代循環學習Rust和Solana智能合約編程。 不必完全掌握即可開始,透過快速掌握架構、反覆在真實專案中邊讀邊查,即使業餘時間也能在一兩週內快速跨越技術棧遷移並積累審計能力。 架構差異決定思維轉變,不只是語法轉換:Ethereum的單一合約模式完全改為程序+帳戶分離,每筆使用者操作都需建立獨立資料帳戶(如Token Airdrop中每次claim建立claim status帳戶),這意味著初始化邏輯、帳戶所有權驗證、帳戶生命週期管理都要重新設計。
重點整理
重點- 1
架構差異決定思維轉變,不只是語法轉換:Ethereum的單一合約模式完全改為程序+帳戶分離,每筆使用者操作都需建立獨立資料帳戶(如Token Airdrop中每次claim建立claim status帳戶),這意味著初始化邏輯、帳戶所有權驗證、帳戶生命週期管理都要重新設計。
- 2
實戰優於教學的核心原因是架構差異:講者指出花30小時看Rust教學後到實際專案時完全不同,因此策略應是快速掌握基礎概念(變數宣告、函式語法),立即進入真實專案程式碼,邊讀邊在Google查詢不懂的部分,形成「讀程式碼→查文檔→理解邏輯→繼續讀」的反饋迴圈。
- 3
安全審計的知識可跨棧複用但需擴展:Ethereum時代已知的漏洞(存取控制缺陷、underflow/overflow、邏輯漏洞)在Solana中仍存在且模式相同,但需額外學習Solana特有的10項常見漏洞(帳戶未正確關閉導致重開、帳戶型別驗證缺失、型別交叉污染)。
- 4
視覺化和模式識別加速理解的效果:透過繪製資料流圖、標記每個函式的帳戶互動、對比多個lending協議找共同模式,能快速從「完全陌生」進展到「能識別邏輯漏洞」的程度,且一週內就能在競賽中發現他人遺漏的安全問題。
實用技巧與重點
乾貨- Ethereum vs Solana核心差異表
- 貨幣單位:ETH(18小數) vs SOL(9小數,稱為Lamports)
- 程式模式:單一智能合約 vs 程序(邏輯) + 帳戶(資料)分離
- 交易函式:單一函式調用 vs 同筆交易多函式調用+多簽署者
- 程式庫:precompiled contracts vs Solana Program Library (SPL)
- 帳戶清理:selfdestruct vs 正確的close account操作
- 地址推導:create2 vs PDA (Program Derived Address)
- Rust語言基礎清單
- 原始型別:u8/u16/u32/u64/u128、i8到i128、bool、bytes、String
- 變數宣告:`let mut name: type = value;`(mut表示可變)
- 陣列:`let mut arr: [u8; 3] = [1, 2, 3];`訪問用索引
- 結構體:`struct User { active: bool, username: String }`
- 列舉:`enum Transaction { Deposit, Withdrawal }`
- 函式:`pub fn add(a: u64, b: u64) -> u64 { a + b }`
- 控制流:if/else if/else、match(如switch case)、for迴圈(`for i in 0..10`)、while迴圈
- Anchor框架專案結構
- ```
- programs/program_name/
- ├── src/lib.rs (程序宣告declare_id、巨集、入口點)
- ├── instructions/ (各函式邏輯分離)
- │ ├── initialize.rs
- │ ├── claim.rs
- │ └── lock.rs
- ├── state/ (資料帳戶結構定義)
- │ ├── distributor.rs
- │ └── claim_status.rs
- └── error.rs (自訂錯誤)
- ```
- Token Airdrop程式案例(真實競賽程式)
- new_distributor:初始化Merkle樹分配器,設定版本、根雜湊、鑄幣權限、代幣程式
- claim:使用者傳入proof和allocation數額,驗證Merkle proof、檢查claim status、轉帳代幣
- lock_claims:管理員鎖定後續領取
- set_admin:轉移管理員權限
- 發現的邏輯漏洞:claim函式未檢查distributor帳戶是否已關閉,導致可重開帳戶重複領取
- Solana常見10大漏洞清單
- Account closure attack:未正確關閉帳戶導致重開
- Account type mismatch:未驗證帳戶型別、讀取錯誤值
- Type confusion/crossplay:帳戶型別交叉污染
- Reinitialization attack:未防止帳戶重初始化
- Underflow/overflow:數值計算溢位(需型別轉換+檢查)
- Missing access control:缺少簽署者或所有者驗證
- Incorrect calculations:利息、罰款等計算邏輯錯誤
- Bad liquidation logic:清算價格設定過高或過低
結論
結論“不必完全掌握即可開始,透過快速掌握架構、反覆在真實專案中邊讀邊查,即使業餘時間也能在一兩週內快速跨越技術棧遷移並積累審計能力。”
完整解析
詳細講者Jatas擁有五年網頁和行動應用開發經驗,現職Spearb安全公司的安全研究員。他特別提及從React Native轉向Flutter的一個月轉換經驗,啟發他開發一套可用於任何技術棧遷移的學習方法。這個方法分為開發者思維和駭客思維兩個階段。
開發者思維的第一步是理解Ethereum和Solana的根本架構差異,不能只視為語言轉換。在Ethereum中,貨幣單位是ETH(最小單位wei),擁有18位小數;一筆交易只能調用單一函式;所有邏輯和資料存儲在同一智能合約。Solana則使用SOL(最小單位Lamports、9位小數),採用程序加帳戶架構——程序是無狀態的邏輯容器,資料儲存在獨立的帳戶中;一筆交易可調用多個函式,甚至多個簽署者;透過PDA(程序衍生地址)而非create2預測帳戶地址;帳戶需要正確關閉而非自毀。
第二步是掌握Rust語言基礎,但講者強調不需要精通,只需快速理解語法。Rust的原始型別包括u8到u128的無符號整數、對應的有符號整數、布林值、字節和字串。變數宣告使用let關鍵字,與Solidity不同的是型別置於變數名後,使用mut修飾符表示可變。陣列、結構體、列舉的宣告遵循相同邏輯但語法不同。函式使用fn開頭,輸入參數的型別也是後置,返回值用->標記。控制流使用if/else if/else進行條件判斷,match類似Solidity的switch但更強大,for迴圈用`for i in range`,while迴圈語法相似。
第三步是理解Anchor框架結構。與Foundry的簡潔(scripts、tests、source三個資料夾)相比,Anchor看似複雜,但核心相同:programs資料夾下的src目錄包含lib.rs(入口點)、instructions資料夾分離各函式邏輯、state資料夾定義資料帳戶結構。lib.rs包含declare_id宣告程序地址和各種巨集(如program巨集);instructions資料夾按功能分檔,如initialize.rs、claim.rs;state資料夾定義結構體,如distributor和claim_status。關鍵是巨集隱藏了許多驗證邏輯(如account巨集驗證帳戶所有者),初學者不需完全理解巨集,只需知道它們的作用。
講者展示了Token Airdrop和Staking兩個真實競賽專案的代碼分析。Token Airdrop使用Merkle樹驗證使用者合法性,流程為:(1)管理員初始化分配器,儲存Merkle根雜湊;(2)使用者調用claim,傳入Merkle proof和分配額度;(3)程式驗證proof有效性,建立獨立的claim_status帳戶記錄該使用者已領取,並轉帳代幣;(4)管理員可lock_claims防止後續領取;(5)可轉移管理員權限。每個操作涉及多個帳戶——分配器帳戶存儲全域狀態、claim_status帳戶追蹤個別使用者狀態、SPL代幣程式執行轉帳。講者在審視該程式碼時發現邏輯漏洞:claim函式未檢查distributor帳戶是否已關閉,使用者可利用Solana帳戶租賃機制重新開啟已關閉的分配器並重複領取。
Staking程式更複雜,涉及獎勵池和質押狀態。使用者存入代幣並鎖定一段時間(一天到數週不等),系統根據鎖定期限計算有效質押量和獎勵。每筆使用者存入都建立獨立帳戶記錄該存入的詳細資訊(所有者、池子、金額、鎖定時長、時間戳)。管理員可執行slash懲罰違規質押者。
講者強調實戰學習的必要性。他指出花30小時看Rust教學後,進入真實專案時架構完全不同,導致之前的學習低效。他的策略是:(1)快速學習語言基礎(一兩天);(2)找出Anchor專案的入口點(lib.rs和instructions);(3)直接閱讀真實程式碼,每行逐行理解;(4)遇到不懂的部分(如macro、CPI調用、Solana-specific函式),立即Google查詢或查閱官方文檔,然後返回程式碼繼續;(5)重複此迴圈直至全部理解。這種循環比連續學習更有效,因為實踐中的背景讓新概念更易記憶。
駭客思維階段將Ethereum的安全知識遷移到Solana。Ethereum中的已知漏洞模式(缺少存取控制、underflow/overflow、邏輯漏洞)在Solana中仍然存在。例如landing協議在Ethereum中常見的清算邏輯錯誤,Solana的staking程式中也會出現獎勵計算或slash邏輯不當。此外,Solana有特有的10大漏洞:帳戶未正確關閉導致重開、帳戶型別驗證缺失、型別交叉污染、重初始化攻擊等。講者建議透過繪製資料流圖、對比多個landing或staking協議實現找出共同模式、查閱以往審計報告尋找已知漏洞模式,來加速漏洞尋找。
講者坦言PoC(概念驗證程式碼)在Solana比Ethereum困難。Ethereum可用Foundry fork主網狀態並在特定區塊重現漏洞;Solana無此功能,必須從零建構整個狀態測試。儘管困難,透過手工編寫測試狀態仍可驗證邏輯漏洞。最重要的建議是持續實踐。講者在競賽中提交一個漏洞獲得15個反饋漏洞,這反應式學習使他快速認識自己的知識盲點,進而改進審計方法。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

