跳至主要內容

如何在Blast上建構自動收益合約

更新於
Aug 07, 2026

閱讀時間 16 分鐘

概覽

目前大多數區塊鏈都要求使用者質押其代幣或運行驗證節點,才能從該協議中獲得原生收益。 Blast 是一個第二層(L2)區塊鏈專案,以其為存入的 ETH 和穩定幣提供原生收益的創新方法而聞名。在本指南中,您將進一步了解Blast 學習如何Blast HardhatBlast 上建立、部署及與自動收益金庫合約進行互動。

您需要準備的物品


您將負責的工作內容


  • 了解Blast
  • 建立一個具備自動收益功能的金庫智慧合約
  • 在Blast 上部署智慧合約
  • 與您已部署的 Vault 合約進行互動

什麼是Blast?

Blast 與 EVM 相容、採用樂觀捲積(optimistic rollup)技術的 L2 區塊鏈。其獨特之處在於原生整合了 ETH 質押收益及實物資產(RWA)協議的收益,為 ETH 提供 4% 的基準收益率,並為穩定幣提供 5% 的基準收益率。此收益整合機制旨在抵銷通膨造成的損失,並支援其他 L2 層無法實現的 DApp 新商業模式。

讓我們深入探討Blast 的Blast 原理,以及是什麼原因讓它成為開發者和投資者的首選。

Blast的獨特功能

  1. 自動重定基:Blast 在其 L2 平台上針對 ETH、WETH(Wrapped ETH)及 USDB(Blast的原生穩定幣)Blast 自動重定基功能。此重定基機制使這些資產能夠讓外部擁有帳戶(EOA)和智慧合約無縫受益於收益產生。 與 ETH 不同的是,在 ETH 中合約預設會停用收益功能,而 WETH 和 USDB 帳戶則預設會為 EOA 和智慧合約自動產生收益。

  2. L1 質押收益:隨著Ethereum 升級的實施,Blast 來自 L1 質押的 ETH 收益(初期透過 Lido 實現),並透過在 L2 上對 ETH 進行重新定價,將收益轉移給用戶。

  3. 穩定幣的短期國庫券收益率:橋接至Blast 的穩定幣Blast 轉換為 USDB,並透過 MakerDAO 的短期國庫券協議獲取收益。此機制使穩定幣能夠產生收益。

  4. Gas 收益分享:與其他 L2 層不同Blast DApp 開發者Blast 淨 Gas 收益,為開發者提供額外的收入來源,或讓他們有能力補貼用戶的 Gas 費用。

開發者設定

您需要一個 APIendpoint 與Blast 進行通訊。在此方面,像Quicknode 這樣的服務Quicknode RPC 連線,比公開的 API 端點更快且更可靠。請在此免費註冊endpoint Blast Testnet建立一個endpoint 。

Quicknode Endpoint

請保留HTTP 提供者網址,以便日後在合約部署時使用。

Quicknode 龍頭

在本指南中,我們將使用Blast Testnet。因此,您需要取得一些測試用 ETH。


  • 前往Quicknode Blast 水龍頭
  • 請輸入您的錢包地址或連接您的錢包
  • 請點擊「繼續」,並依照指示操作

若您使用Quicknode 登入或發送推文,即可獲得額外的 ETH 獎勵。

在下一節中,我們將開始使用 Hardhat 開發我們的自動收益金庫合約。

智慧合約開發

專案設定

建立一個名為Vault的目錄,並安裝所需的依賴項:

mkdir Vault && cd Vault
npm init -y
npm install --save-dev hardhat
npm install dotenv @nomicfoundation/hardhat-verify
npx hardhat init

當 Hardhat 提示時,請選擇「建立 TypeScript 專案」。此外,當系統詢問是否要安裝@nomicfoundation/hardhat-toolbox 時,請選擇「是」

建立一個 .env 位於您的專案目錄中的檔案。

環境變數用於儲存敏感資料,例如密碼、API 憑證,以及其他不應直接寫入程式碼的資訊。

echo > .env

修改您的 .env 檔案如下所示。

請將佔位符YOUR_PRIVATE_KEYYOUR_QUICKNODE_BLAST_SEPOLIA_ENDPOINT_URL替換為您的錢包私鑰以及您的Quicknode Blast endpoint URL。

PRIVATE_KEY="YOUR_PRIVATE_KEY"
QUICKNODE_ENDPOINT="YOUR_QUICKNODE_BLAST_SEPOLIA_ENDPOINT_URL"
如果您不知道如何取得您的私鑰,請點擊此處。

本說明是針對 MetaMask 所編寫的。

要取得您的私鑰;


  • 請點擊瀏覽器上的 MetaMask 圖示(一個風格化的狐狸頭)。如果看不到該圖示,請檢查瀏覽器的「擴充功能」頁面。
  • 點擊圖示,然後選擇「帳戶詳細資訊」。
  • 接著,點擊「顯示私密金鑰」,並依照指示操作。

MetaMask 私鑰

接著,請設定您的 hardhat.config.ts 如下所示的檔案。所有與 Hardhat 相關的設定,例如網路、帳戶及 Solidity 版本,皆在此檔案中定義。

若要閱讀程式碼的說明(強烈建議),請點擊此處

此程式碼是針對Blast 量身打造的 Hardhat 專案配置設定。

  1. 網路設定:`networks` 屬性定義了兩個環境——blast` 用於 Sepoliatestnet `hardhat`用於透過分叉建立的本地開發環境。Sepolia 的設定包含Quicknode endpoint 及用於交易的私鑰,並指定了 gas 價格。本地環境設定(hardhat)則設定從特定區塊號開始進行分叉,並使用相同的Quicknode endpoint。

  2. Etherscan 整合:在Etherscan 設定下,雖然不需要唯一的 API 金鑰,但該欄位必須填入值。因此,將blast網路的 API 金鑰設為佔位符。customChains陣列包含針對blast網路的自訂設定,其中指定了該網路的鏈 ID 以及 API 與區塊瀏覽器的網址。 具體而言,customChains中的apiURL指定了 APIendpoint (此處為https://api.routescan.io),Hardhat 可透過此端點與指定網路(此處為blast testnet)進行互動。這testnet Hardhat 與區塊鏈進行無縫互動,並在Blast testnet 驗證合約成為可能。

hardhat.config.ts
import { HardhatUserConfig } from 'hardhat/config'
import '@nomicfoundation/hardhat-toolbox'
import '@nomicfoundation/hardhat-verify'
require('dotenv').config()

const config: HardhatUserConfig = {
solidity: '0.8.20',
networks: {
// for Sepolia testnet
blast_sepolia: {
url: process.env.QUICKNODE_ENDPOINT as string,
accounts: [process.env.PRIVATE_KEY as string],
gasPrice: 1000000000,
},
// for local dev environment
hardhat: {
forking: {
enabled: true,
url: process.env.QUICKNODE_ENDPOINT as string,
blockNumber: 423000,
},
},
},
etherscan: {
apiKey: {
blast_sepolia: 'blast_sepolia', // although a unique API key is not required, it must have a value, so just set a placeholder
},
customChains: [
{
network: 'blast_sepolia',
chainId: 168587773,
urls: {
apiURL:
'https://api.routescan.io/v2/network/testnet/evm/168587773/etherscan',
browserURL: 'https://testnet.blastscan.io',
},
},
],
},
}

export default config

在Blast上建置智慧合約

既然已經掌握了基礎知識,讓我們開始為Blast 建構自動生息的金庫智慧合約吧。如果您是 Solidity 的新手,請參閱我們這份全面且適合初學者的 Solidity 指南

雖然使用者的 ETH 餘額會自動獲得 ETH 收益,但智慧合約針對重新定基設有三種收益模式。


  • Void(預設值):ETH 餘額永遠不會改變;不會獲得任何收益
  • 自動模式:原生 ETH 餘額重新調整(僅增加)
  • 可申領:ETH 餘額永不變動;收益則另行累積

在本指南中,我們將把mode 自動 mode 。因此,由於收益會自動加入,合約的 ETH 餘額也將隨之自動增加。

智慧合約必須與位於以下位置的Blast 合約進行互動: 0x4300000000000000000000000000000000000002 以變更其產出mode來源]. 由於我們與該 Blast 智慧合約,我們需要定義該 Blast 智慧合約作為一種 介面. 為此,讓我們建立一個資料夾, 介面, 在 合約 一個目錄和一個檔案, IBlast.sol, 在裡面。

Solidity中,前綴用於標示 Solidity 檔案為介面。因此,IBlast檔案是 Blast 合約的介面檔案。

mkdir contracts/interfaces
echo > contracts/interfaces/IBlast.sol

開啟 IBlast.sol 開啟該檔案並依下述方式進行修改。

contracts/interfaces/IBlast.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

enum YieldMode {
AUTOMATIC,
VOID,
CLAIMABLE
}

enum GasMode {
VOID,
CLAIMABLE
}

interface IBlast{
// configure
function configureContract(address contractAddress, YieldMode _yield, GasMode gasMode, address governor) external;
function configure(YieldMode _yield, GasMode gasMode, address governor) external;

// base configuration options
function configureClaimableYield() external;
function configureClaimableYieldOnBehalf(address contractAddress) external;
function configureAutomaticYield() external;
function configureAutomaticYieldOnBehalf(address contractAddress) external;
function configureVoidYield() external;
function configureVoidYieldOnBehalf(address contractAddress) external;
function configureClaimableGas() external;
function configureClaimableGasOnBehalf(address contractAddress) external;
function configureVoidGas() external;
function configureVoidGasOnBehalf(address contractAddress) external;
function configureGovernor(address _governor) external;
function configureGovernorOnBehalf(address _newGovernor, address contractAddress) external;

// claim yield
function claimYield(address contractAddress, address recipientOfYield, uint256 amount) external returns (uint256);
function claimAllYield(address contractAddress, address recipientOfYield) external returns (uint256);

// claim gas
function claimAllGas(address contractAddress, address recipientOfGas) external returns (uint256);
function claimGasAtMinClaimRate(address contractAddress, address recipientOfGas, uint256 minClaimRateBips) external returns (uint256);
function claimMaxGas(address contractAddress, address recipientOfGas) external returns (uint256);
function claimGas(address contractAddress, address recipientOfGas, uint256 gasToClaim, uint256 gasSecondsToConsume) external returns (uint256);

// read functions
function readClaimableYield(address contractAddress) external view returns (uint256);
function readYieldConfiguration(address contractAddress) external view returns (uint8);
function readGasParams(address contractAddress) external view returns (uint256 etherSeconds, uint256 etherBalance, uint256 lastUpdated, GasMode);
}

請在您的 合約 名為 Vault.sol:

echo > contracts/Vault.sol

contracts」資料夾中可能還有其他自動生成的檔案;請隨意刪除它們。

開啟 Vault.sol 開啟該檔案並依下述方式進行修改。

若要閱讀程式碼的說明(強烈建議),請點擊此處

這段程式碼定義了一個名為「Vault」的智慧合約,其設計目的是在善用Blast 自動收益功能的同时,管理 ETH 的存入與提領。

  1. 合約初始化:建構函式接受Blast 位址(_blast),並對其進行初始化。它使用IBlast介面來設定自動收益分配。

  2. 發行與銷毀股份_mint_burn這兩項內部函式負責管理合約的股份代幣。當使用者存入 ETH 時,系統會發行股份;當使用者提領時,則會銷毀股份。此機制有助於追蹤每位使用者在合約總 ETH 池中所佔的股份比例。

  3. ETH 存入與提領存入功能允許使用者將 ETH 轉入合約,並根據當前的 ETH 餘額及股份總供應量,換取相應的股份;反之,提領功能則讓使用者能將其股份贖回為相應比例的 ETH,從而減少其在總池中的股份比例。

  4. 查詢餘額與備用機制getBalance函式會以「股份」為單位,提供特定地址的餘額。該合約還包含一個備用函式(receive),用於處理直接的 ETH 轉帳;當 ETH 直接轉帳至合約地址時,該函式會自動呼叫deposit函式。

本合約是Blast 的核心組成部分,讓使用者能夠存入 ETH、自動獲取收益,並根據總資產的公平份額提取資金。

contracts/Vault.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;

import "./interfaces/IBlast.sol";

// Custom errors for better readability and debugging
error InsufficientShares();
error AmountMustBePositive();
error FailedToSendEther();
error InvalidYieldMode();

contract Vault {
uint256 public totalSupply;
mapping(address => uint256) public balanceOf;

// IBlast interface for enabling automatic yield collection
constructor(address _blast) {
// Initialize the IBlast contract
IBlast blast = IBlast(_blast);
// The contract balance will grow automatically over time due to yield collection
blast.configureAutomaticYield();
}

// Internal function to mint shares
function _mint(address _to, uint256 _shares) private {
totalSupply += _shares;
balanceOf[_to] += _shares;
}

// Internal function to burn shares
function _burn(address _from, uint256 _shares) private {
totalSupply -= _shares;
balanceOf[_from] -= _shares;
}

// Function to deposit ETH into the contract
function deposit() public payable {
if (msg.value == 0) {
revert AmountMustBePositive();
}

uint256 shares;
if (totalSupply == 0) {
shares = msg.value;
} else {
shares = (msg.value * totalSupply) / address(this).balance;
}

_mint(msg.sender, shares);
}

// Function to withdraw ETH from the contract
function withdraw(uint256 _shares) public {
if (balanceOf[msg.sender] < _shares) {
revert InsufficientShares();
}

uint256 amount = (_shares * address(this).balance) / totalSupply;
_burn(msg.sender, _shares);

(bool sent,) = payable(msg.sender).call{value: amount}("");
if (!sent) {
revert FailedToSendEther();
}
}

// Function to get the balance of a specific address
function getBalance(address _address) public view returns (uint256) {
return balanceOf[_address];
}

// Fallback function to allow direct ETH transfers to the contract
receive() external payable {
deposit();
}
}

在Blast上部署智慧合約

現在,讓我們將合約部署到Blast Testnet。

建立一個名為 deploy.ts 在您的 腳本 資料夾:

echo > scripts/deploy.ts

請按以下方式進行修改。

若要閱讀程式碼的說明(強烈建議),請點擊此處

此 TypeScript 腳本旨在透過 Hardhat 框架部署並驗證Vault智慧合約。

  1. Vault 合約的部署: 該腳本首先定義Blast 地址,接著部署該 Vault 合約,並將Blast 作為構造函式參數傳入。該 await vault.waitForDeployment() 此呼叫可確保在繼續執行之前,部署程序已完整完成。

  2. 主控台記錄與合約驗證:部署完成後,該腳本會記錄已部署Vault合約的地址。接著,它會利用 Hardhat 的run函式及verify:verify任務,在區塊鏈上驗證該合約,以確保合約的原始碼與部署參數皆可公開存取且可驗證。

  3. 讀取與記錄收益配置:該腳本透過擷取新部署之Vault合約的收益配置,與已部署的Blast 進行互動。此步驟至關重要,旨在確認Vault合約已正確設定,以便與Blast 收益生成功能進行互動。

  4. 錯誤處理:此腳本包含一個用於錯誤處理的 catch 區塊,確保執行過程中拋出的任何例外都會被記錄,且程序會以適當的錯誤代碼結束。

總體而言,此腳本可自動化處理 Vault 合約在Blast 上的部署與驗證流程,並確認其與Blast 收益配置的整合。此自動化流程不僅能簡化開發工作流程,更能確保智慧合約部署的透明度與可靠性。

scripts/deploy.ts
import { ethers, run } from "hardhat";

async function main() {
const blastAddress: string = "0x4300000000000000000000000000000000000002";

const vault = await ethers.deployContract("Vault", [
blastAddress,
]);

await vault.waitForDeployment();

console.log(`Vault contract deployed to ${vault.target}`);

await run("verify:verify", {
address: vault.target,
constructorArguments: [blastAddress],
});

const blast = await ethers.getContractAt("IBlast", blastAddress);

const configuration = await blast.readYieldConfiguration(
vault.target
);

console.log(`Yield Configuration for Vault (${vault.target})`);
console.log(configuration);
}

// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});

請執行以下指令來部署合約:

npx hardhat run --networkblast scripts/deploy.ts

需要說明的是,我們使用 blast 由於我們將Blast Testnet blast網路 設定 hardhat.config.ts.

部署成功後,您將在輸出結果中看到合約的地址。

Vault contract deployed to 0xB2b68B2ad7cc81841D92f721104E6FdB5dbB78F3
Successfully submitted source code for contract
contracts/Vault.sol:Vault at 0xB2b68B2ad7cc81841D92f721104E6FdB5dbB78F3
for verification on the block explorer. Waiting for verification result...

Successfully verified contract Vault on the block explorer.
https://testnet.blastscan.io/address/0xB2b68B2ad7cc81841D92f721104E6FdB5dbB78F3#code

Yield Configuration for Vault (0xB2b68B2ad7cc81841D92f721104E6FdB5dbB78F3)
0n

Vault 合約的收益配置值若為 0,則表示處於「自動」mode 合約中對 YieldMode 的定義如下,這表示系統會自動產生原生收益,無需人工干預。

YieldMode 枚舉
enum YieldMode {
AUTOMATIC, // 0
VOID, // 1
CLAIMABLE // 2
}

請前往Blast Testnet 區塊瀏覽器,輸入上述部署腳本所回傳的地址,以驗證智慧合約是否已成功部署。

請注意,由於部署腳本中的驗證步驟,該智慧合約已在區塊鏈瀏覽器上完成驗證。

在 Explorer 上已驗證的合約

在Blast上與智慧合約進行互動

若要與合約進行互動,請在您的scripts目錄中建立一個名為depositEth.ts 的新腳本:

echo > scripts/depositEth.ts

接著,開啟該檔案並輸入以下程式碼。

請記得將YOUR_VAULT_CONTRACT_ADDRESS這個佔位符替換為您的 Vault 合約地址。

此外,此腳本檔案是用來向 Vault 合約存入 0.001 ETH 的。若您想變更要存入的 ETH 數量,請修改高亮顯示的那行中的數值。

若要閱讀程式碼的說明(強烈建議),請點擊此處

此 TypeScript 腳本旨在利用 Hardhat 框架,將 ETH 存入Blast Vault智慧合約中。

  1. 設定合約互動:腳本首先會指定已部署的Vault合約地址。使用者需將「YOUR_VAULT_CONTRACT_ADDRESS」替換為實際的合約地址。

  2. 設定存款金額:透過ethers.parseEther('0.001'),將變數ethAmountToDeposit設定為特定的 ETH 金額。此操作會將 ETH 金額的字串表示形式轉換為Ethereum 可識別的格式,本例中即為 0.001 ETH。

  3. 存款的合約互動:該腳本使用getContractAt並指定合約地址來取得Vault合約實例。接著,它會呼叫Vault合約的deposit函式,並傳入待存入的 ETH 數量。這筆交易將觸發智慧合約中的存款操作。

  4. 交易確認與記錄: 傳送交易後,該腳本會等待交易被挖礦,方法是使用 tx.wait(). 一旦完成挖礦,系統便會記錄一條包含交易哈希的訊息,並提供一個連結,供使用者在Blast 瀏覽器上查看交易狀態。

  5. 錯誤處理:採用標準的錯誤處理模式,用以擷取腳本執行期間發生的任何例外狀況、記錄錯誤,並設定退出代碼以標示失敗。

此腳本是供使用者或開發者與Vault合約進行互動的實用工具,讓他們能夠輕鬆存入 ETH,並參與Blast 的收益生成機制。

scripts/depositEth.ts
import { ethers } from 'hardhat'

async function main() {
const vaultAddress: string = 'YOUR_VAULT_CONTRACT_ADDRESS' // 👈 UPDATE HERE

const ethAmountToDeposit: bigint = ethers.parseEther('0.001')

const vault = await ethers.getContractAt(
"Vault",
vaultAddress
);

const tx = await vault.deposit({ value: ethAmountToDeposit });

tx.wait();

console.log(
`Transaction to deposit ETH is sent to the blockchain. Check your transaction status: https://testnet.blastscan.io/tx/${tx.hash}`
);
}

// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});

要執行此腳本,請使用以下 hardhat 指令:

npx hardhat run scripts/depositEth.ts --networkblast

主控台的輸出應如下所示。

存入 ETH 的交易已發送至區塊鏈。請查看您的交易狀態:testnet

您可以點擊該連結查看交易明細。

區塊鏈瀏覽器上的交易結果

透過區塊鏈瀏覽器與智慧合約互動

作為另一種方法,由於我們的合約已獲批准,因此可透過區塊鏈瀏覽器與其進行互動。


  • 前往「Blast Explorer」。
  • 搜尋您的 Vault 合約地址,並前往該合約的頁面。
  • 點選「合約」索引標籤,並選擇「讀取合約」或「撰寫合約」索引標籤。
  • 連接錢包後,您即可呼叫這些函式。

就是這樣!您剛剛已Testnet Hardhat 和Quicknode Testnet 在Blast Testnet 創建了一個金庫智慧合約。此外,您還設定了收益mode 執行腳本存入了一些 ETH。

檢查自動收益機制

為了驗證自動收益機制,我們可以監測合約隨時間變化的 ETH 餘額。若在未進行額外存入的情況下餘額增加,即表示原生自動收益生成已成功。此驗證可確保自動收益機制的正常運作。

最簡單的方法是透過Blast 區塊鏈瀏覽器的合約頁面查詢餘額。如您所見,雖然總存入金額為 0.001 ETH,但 Vault 合約的 ETH 餘額卻比這個數字略高一些。

Explorer 上的自動收益檢查

因收益而導致的餘額更新頻率為何?

在mainnet,ETH 餘額約每日更新一次。在testnet,ETH 餘額每小時更新一次,每日更新率約為 0.01%。

來源:Blast

其他資源

若您想進一步了解Blast 智慧合約,請參考以下資源:


結論

🎉 恭喜!在這段旅程中,您已經了解了Blast部署了智慧合約,並編寫了腳本來與該智慧合約進行互動。

If you have any questions or need further assistance, feel free to join our Discord server or share feedback in the feedback section at the end of this page. Stay up to date with the latest by following us on Twitter (@Quicknode) and Telegram announcement channel.