我們很高興地宣布我們最受歡迎的開發者入門套件的新版本:Chainlink 安全帽入門套件現在支持Typescript!繼續閱讀以了解所有新功能的細分。
複習——Chainlink 安全帽入門套件
Hardhat 是一個基於JavaScript 和TypeScript 的開發環境,使開發人員能夠編譯、部署、測試和調試與EVM 兼容的智能合約。一年前,我們發布了Chainlink Hardhat Starter Kit,這是一個單一的存儲庫,包含開發人員開始使用Chainlink 構建所需的一切,包括智能合約、測試、高級任務和部署腳本。你可以閱讀更多關於它 我們的博客.
一年後,這個項目帶來了一個全新的Typescript 版本。要使用初始JavaScript 版本,請打開終端並輸入
git clone https://github.com/smartcontractkit/hardhat-starter-kit.git
要切換到TypeScript 版本,您需要簽出到 typescript
分支。
git checkout typescript
裡面有什麼?
打字稿
TypeScript 是一種面向對象的編碼語言,是JavaScript 的超集,旨在克服大型項目的代碼複雜性。這意味著所有TypeScript 代碼都是有效的JavaScript 代碼,但反之則不然。 TypeScript 的主要優勢之一是它是強類型的,這意味著編譯器會提醒用戶任何與類型相關的錯誤,從而導致早期的錯誤檢測。用TypeScript 編寫的代碼比JavaScript 代碼結構更好、更簡潔。
測試
測試已經真正升級到這個新版本。測試文件分為兩個獨立的類別——單元測試和分段測試。在等待來自oracle 網絡的回調時,每個測試都會偵聽特定事件。
每個單元測試都是獨立的,來自預言機網絡的回調響應是使用來自 官方Chainlink存儲庫. 這意味著您可以通過使用以下命令並行運行它們來節省時間:
yarn test --parallel
另一方面,分階段測試在偵聽事件時使用已在各種測試網絡上部署的合約實例。沒有模擬合同或模擬回調。您可以通過防止ts-node 在每次運行時重新編譯和類型檢查項目來加速Hardhat TS_NODE_TRANSPILE_ONLY
環境變量為1。
此外,在測試中,您可以通過取消註釋Hardhat 配置文件中的“分叉”屬性並將“啟用”設置為true,在具體塊中分叉主網。為此,您將需要一個存檔節點或JSON RPC 提供程序,例如Alchemy。
類型鏈
TypeChain 為您的Solidity 智能合約生成TypeScript 類型(d.ts) 文件。使用JavaScript,您不僅需要記住給定智能合約方法或事件的名稱,還需要記住其完整簽名。這會浪費時間,並且可能會引入僅在運行時觸發的錯誤。 TypeChain 支持更精確、更高效的測試、任務和腳本。
國家規範
以太坊自然語言規範格式,或簡稱NatSpec,是一種評論形式,旨在為Solidity 智能合約提供豐富的文檔。這些評論使用標籤,例如 @notice
, @params
, @return
等,並且可以用來描述從合約本身到函數的幾乎任何東西,包括變量、事件甚至修飾符。但不僅如此,NatSpec 生成的消息直接用於在最終用戶與您的合約功能交互時顯示給他們,即簽署交易。
代碼覆蓋率
在智能合約開發中,理解代碼覆蓋率是一項被低估的技能,尤其是當你練習測試驅動開發時。它是運行特定測試套件時智能合約源代碼執行程度的百分比度量。 與測試覆蓋率低的項目相比,測試覆蓋率高的項目包含未檢測到的錯誤的機會較低。 要開發安全的dApp,您應該至少達到90% 的代碼覆蓋率。但是,不要試圖不惜一切代價追求100% 的覆蓋率,因為這可能會導致意想不到的副作用。
要運行它,請輸入:
yarn coverage
一些Solidity 文件,例如僅用作測試助手的模擬合約,將顯示低覆蓋率。要從檢查中排除它們,請更新“.solcover.js”文件。
估算氣體
為與EVM 兼容的鏈編寫智能合約意味著使用有限的資源進行編程。出於這個原因,開發人員傾向於盡可能優化他們的代碼。 Gas 優化可能很棘手,Mocha 報告器已添加到測試套件中,顯示每個單元測試的Gas 使用情況以及方法調用和部署的各種指標。
要估算氣體,只需設置一個 REPORT_GAS
環境變量為true,然後運行:
yarn hardhat test
輸出將存儲在“gas-report.txt”文件中。如果您想以美元或其他貨幣查看汽油價格,請添加 COINMARKETCAP_API_KEY
從 代幣市值.
查看合約規模
曾經花費數週時間構建智能合約,卻在部署過程中遇到“超出最大代碼大小”錯誤?這意味著您達到了智能合約代碼大小限制(以太坊測試網為24,576 字節),並且您需要在部署之前減小合約的大小,或者將其拆分為幾個較小的合約和庫。為了避免在開發過程結束時進行大規模重構,添加了一個簡單的命令來顯示項目中每個智能合約的大小,以便您可以更早地意識到這種限制並採取相應的行動。
要查看合約大小,請運行:
yarn run hardhat size-contracts
模糊測試
由於智能合約的不可變特性,您總是希望確保在部署到區塊鏈之前測試所有可能的場景。這就是為什麼Chainlink Hardhat Starter Kit 的TypeScript 版本帶有一個fuzzer 來查找使用單元測試或分段測試無法找到的邊緣情況。模糊測試是一種生成大量隨機場景以發現產生意外結果的值的技術。
Echidna 已作為模糊測試工具包含在此入門工具包中。你需要有 碼頭工人 安裝時分配了至少8GB 的虛擬內存。要更新此參數,請轉到 設置-> 資源-> 高級-> 內存.
您還可以從源代碼運行Echidna。欲了解更多信息,請訪問 針鼴公共存儲庫.
要啟動Echidna 實例,請從項目根目錄運行以下命令
yarn fuzzing
如果是第一次使用,需要等待Docker 下載 eth-安全工具箱 圖片。可能還要等一下。前面的命令會將項目目錄的內容複製到Docker 容器內的“/src”目錄中。
模糊測試僅針對與Keeper 兼容的智能合約示例實施,但您可以隨意嘗試並添加更多內容。該測試的主要重點是實現塊時間戳的模糊測試。這個想法是,無論如何, performUpkeep
功能無法更新 counter
在設定的時間間隔之前的狀態變量。
要開始模糊測試,請運行
echidna-test /src/contracts/test/fuzzing/KeepersCounterEchidnaTest.sol --contract KeepersCounterEchidnaTest --config /src/contracts/test/fuzzing/config.yaml
幾分鐘後,您將在控制台中看到測試結果。要退出Echidna,請鍵入
exit
VRF v2
最後添加的當然是新版本的Chainlink Verifiable Random Function! Chainlink VRF v2 對您為智能合約提供資金和請求隨機性的方式進行了多項改進。您將找到有關如何編寫VRF v2 兼容合約、如何部署它們、訂閱管理如何工作以及如何正確測試和使用它們的完整演練。
首先,導航到 VRF 訂閱頁面,選擇網絡,連接你的錢包,然後點擊“創建訂閱”。然後將您的“subscriptionId”保存為 VRF_SUBSCRIPTION_ID
環境變量。部署後,返回VRF 訂閱頁面,導航到您的訂閱,單擊“添加消費者”按鈕,並粘貼最近部署的VRF 消費者合約的地址。完成後,您可以使用 request-random-number
任務:
yarn hardhat request-random-number --contract insert-contract-address-here --network network
成功請求隨機數後,您可以通過 read-random-number
任務:
yarn hardhat read-random-number --contract insert-contract-address-here --network network
如果遇到錯誤,請在VRF 訂閱頁面上查看請求是否已完成,然後重試。
概括
可以理解,TypeScript 是開發大型或複雜應用程序的流行選擇,而JavaScript 通常更適合小型項目。前往 Chainlink 公共存儲庫 並開始試驗這個和其他可用的入門工具包。
通過訪問了解有關Chainlink 的更多信息 鏈環 或閱讀文檔 docs.chain.link. 要討論集成,請聯繫專家。