🌱 花園
身為 Web3 開發者,我怎麼使用 AI 工具
November 8, 2024
距離我開始認真把 AI 工具融入開發工作流程,大概已經一年了。我抵抗了比應該更長的時間——一部分是懷疑,一部分是那種「這個我自己應該搞得定」的開發者自尊心。最後還是投降了,然後有些想法想記下來。
真的有用的地方 樣板程式碼與腳手架。 請 AI 生成一個基本的 ERC-721 合約,或標準的 API handler,真的很有用。不是因為我不會寫,而是從一個骨架開始修改,比每次面對空白檔案快多了。生成的程式碼通常夠好,足以作為起點。
解釋不熟悉的程式碼。 我工作中會接觸到很多不是我寫的程式碼——開源合約、舊系統、別人的 ABI。把一個函式貼進去問「這在做什麼,有什麼要注意的?」,省了很多在文件分頁之間跳來跳去的時間。
寫測試。 我不喜歡為那些行為很明顯的函式寫測試。AI 很擅長生成單元測試案例,包括一些我可能會略過的邊緣情況。我還是會全部看過,但覆蓋率明顯提高了。
效果不好的地方 任何很新或很小眾的東西。 如果你在用六個月前才發布的協議,或文件很少的新 L2,AI 會很有自信地給你過時或是幻覺出來的資訊。在 Web3 裡這很危險——一個錯誤的地址或合約 ABI 會導致真實的資金損失。任何跟鏈相關的東西,我都一定會對照官方文件確認。
智能合約審計。 我看過有開發者把 Solidity 貼給 AI,然後把回應當成安全審查的結果。請不要這樣做。AI 可以抓到明顯的模式,但它會漏掉微妙的重入攻擊(re-entrancy)漏洞、商業邏輯錯誤,以及特定協議的邊緣情況。用正規的審計工具,如果要放真實資金,就找真正的審計。
架構決策。 戰術問題問得很好,策略問題問得不太行。「這個函式怎麼實作」有用,「這整個系統應該怎麼設計」得到的往往是通用建議,沒辦法考慮你的具體限制。
我現在的工具組合 我主要用 Claude 來解釋程式碼和生成 Go/Solidity,用 GitHub Copilot 在打字的時候自動補全。它們服務不同的目的,搭配起來效果不錯。Copilot 我有時候會關掉,在「深度思考」模式的時候——因為自動補全開始感覺像是在引導我的思路,而不是跟著我走。
更大的圖景 說實在的:AI 工具讓開發裡那些無聊的部分變快了,這釋放出時間來處理真正需要思考的部分。對 Web3 來說,「需要思考的部分」並不簡單——攻擊面很大,犯錯的代價很高。所以我的做法是,在低風險的事情上用 AI 加速,在任何碰到使用者資金或敏感邏輯的地方保持謹慎。
這是個工具,一個相當有用的工具。但它不能取代對你在建構什麼的理解。
為什麼我做 Web3 後端都選 Go?
May 2, 2023
我現在用 Go 寫後端已經超過一年了,主要是為 Web3 產品開發後端服務。在這之前,我大部分時候都在用 JavaScript 和 Python。想把這些心得寫下來,說說 Go 是怎麼成為我 Web3 後端開發的預設選擇——因為我希望有人早點跟我說這件事。
並發(Concurrency)真的很重要 當你在做監聽區塊鏈事件的東西——索引交易、監聽合約事件、同步狀態——你需要一種不會讓你抓狂的並發機制。Go 的 goroutine 跟 JavaScript 的 async/await 巢狀結構,或 Python 的 asyncio 相比,真的容易用多了。
一個簡單的例子:同時監聽多個智能合約事件並寫入資料庫。在 Go 裡,幾個 goroutine 加上幾個 channel 就搞定了,程式碼乾淨又好讀。
go-ethereum 非常好用 go-ethereum 函式庫(也就是 geth)是以太坊的參考用戶端,用 Go 撰寫。從 Go 直接呼叫它,有一種原生的感覺,是其他語言比不上的。你可以訂閱事件、呼叫合約函式、簽名並發送交易——全部都有完整的型別,不像 TypeScript 那樣到處是 any 和型別轉換的混亂。
client, err := ethclient.Dial("wss://mainnet.infura.io/ws/v3/YOUR_KEY") if err != nil { log.Fatal(err) } query := ethereum.FilterQuery{ Addresses: []common.Address{contractAddress}, } logs := make(chan types.Log) sub, err := client.
用 Circom 寫出我的第一個零知識電路
June 18, 2022
現在的加密貨幣市場跌得很慘 📉。但說實話?熊市是我最喜歡學習的時候。沒有 FOMO,沒有 Twitter 的喧囂,只有我、筆電和一份超長的閱讀清單。
我已經聊了好一陣子零知識證明的話題了(可以看看我之前關於 STARK 的文章)。這次我終於不只是讀,而是從頭寫了一個實際的電路。
為什麼選 Circom? 我選擇從 Circom 入手,因為它是為 Solidity 開發者設計的,而且配套工具(snarkjs)的文件相當完整。雖然也有 Noir、Halo2 等選擇,但對於剛入門的我,Circom 感覺是最容易上手的起點。
讓我終於搞懂的心智模型是這樣的:ZK 電路就像一個函式,你可以證明自己知道產生某個特定輸出的輸入值,卻不需要透露那些輸入值本身。驗證者只知道「這個人確實知道答案」,但完全不知道答案是什麼。
我的第一個電路 我從經典範例開始:證明你知道兩個數字 a 和 b,它們相乘等於公開的值 c。聽起來很簡單,但親手看到它跑起來之後,一切都變得具體了。
pragma circom 2.0.0; template Multiply() { signal input a; signal input b; signal output c; c <== a * b; } component main = Multiply(); 用 Circom 編譯之後,透過 snarkjs 生成證明金鑰與驗證金鑰,最後把 Solidity 驗證合約部署到測試網——成功了。驗證者確認了我的證明,但完全不知道 a 和 b 是什麼。
第一次看到這個運作的時候,真的有點神奇 🤯
讓我踩到坑的地方 最難的部分是搞清楚 Circom 中「信號(signal)」和「變數(variable)」的差異。信號是受約束的,構成電路的一部分;變數則不受約束。如果搞混了,會出現很難察覺的錯誤——程式能編譯通過,但產生的證明是錯的。
另外,snarkjs 的可信設置(trusted setup)階段需要下載相當大的檔案(Powers of Tau 儀式的輸出)。文件有提醒,但我還是坐在那邊想說網路為什麼突然這麼慢。