MetaMask Snaps 是讓 MetaMask 成為全球最具擴展性錢包的發展藍圖。身為開發者,您可以透過全新方式將您的功能與 API 帶入 MetaMask。Web3 開發者是這項成長的核心,本系列旨在展示當今正在建構的創新 MetaMask Snaps。
信任評分 Snap
Snap 程式庫: https://github.com/Tbaut/template-snap-monorepo
您為什麼要建構它?
談到以太坊上的交易簽署,最令人頭痛的問題在於,大多數使用者對自己所簽署的內容幾乎一無所知。解碼方法與參數是很好的第一步,但如果使用者與惡意合約互動,所顯示的資訊可能會造成誤導。為了平衡這個問題,我想到以非常簡單的方式呈現量化數據,並搭配色碼 🟥 🟧 🟩。這個概念是根據可從多個來源輕鬆驗證的數據來顯示信任評分。我選擇從 4 個評估標準開始:
整體上有多少使用者與該智能合約互動過。
目前帳戶與此合約互動的頻率。
此合約的建立時間。
此合約的程式碼是否已通過驗證。
您能帶我們了解技術實作的過程嗎?
insights 主要函式
這個 Snap 非常簡單,且易於擴展。以下是我們將逐步說明的完整程式碼。
當 MetaMask 上的 insights 分頁被點擊時,onTransaction 函式就會被呼叫。在其中,我們呼叫各個函式,取得我們決定納入考量的評估標準。
type ScoreResult = {
score: number;
description: string;
};
const onTransaction: OnTransactionHandler = async ({
transaction,
chainId,
}) => {
}
這些函式通常會呼叫 API 並處理結果。讓我們深入了解其中一個函式。
根據整體互動次數決定信任評分
讓我們深入了解根據合約收到的交易總量來給出評分的函式。我們在此使用 Etherscan API,但任何其他 API 都可以用來驗證相同的數據。
export async function getContractTransactionCountScore({
chainId,
contractAddress,
}: IContractTransactionCountScore): Promise<ScoreResult> {
const url100 = getEtherscanContractTxsUrl({
txNumber: 100,
chainId,
contractAddress,
});
const { result: result100 } = await fetchUrl<EtherscanResponse>(url100);
if (result100.length === 1) {
return {
score: 3,
description: 'more than 100 txs',
};
}
const url50 = getEtherscanContractTxsUrl({
txNumber: 50,
chainId,
contractAddress,
});
const { result: result50 } = await fetchUrl<EtherscanResponse>(url50);
if (result50.length === 1) {
return {
score: 2,
description: 'more than 50 txs',
};
}
return {
score: 1,
description: 'fewer than 50 txs',
};
}
並非所有評分的權重都相同
現在我們已為每個評估標準取得 TrustResult,接下來要套用權重。事實上,並非所有評估標準的信任評分都應具有相同的權重。舉例來說,過去與合約的交易次數是有成本的。如果詐騙者想要操控這個指標,他們需要花費一些 ETH 作為 gas 費用。因此,這個標準被認為較難被操控,也因此更為重要,我給予它 3 的權重。
同樣地,合約的建立時間無法被攻擊者規避——他們必須先部署合約,然後等待一段時間才能發動攻擊,以便獲得較高的信任評分。我給予它 2 的權重。
其他評估標準被認為較弱,權重為 1。
const Weights = {
contractTransactionCountScore: 3,
contractAgeScore: 2,
contractVerificationScore: 1,
contractUserTransactionScore: 1,
};
const calculateOverallScoreWithWeight = ({
contractTransactionCountScore,
contractUserTransactionScore,
contractAgeScore,
contractVerificationScore,
}: CalculateOverallScoreWithWeightArgs) => {
const totalWeitght = Object.values(Weights).reduce(
(acc: number, curr: number) => acc + curr,
0,
);
const overallScoreWithWeight =
(contractUserTransactionScore.score * Weights.contractUserTransactionScore +
contractTransactionCountScore.score *
Weights.contractTransactionCountScore +
contractAgeScore.score * Weights.contractAgeScore +
contractVerificationScore.score * Weights.contractVerificationScore) /
totalWeitght;
return Math.floor(overallScoreWithWeight);
};
呈現最終評分
最後,我們已取得智能合約的信任評分,需要以簡單的方式呈現它。MetaMask insights API 僅允許顯示鍵值對。鍵以粗體顯示,值則使用一般字重。我想到透過使用表情符號,可以建立一個對使用者不造成壓力的介面,同時仍能顯示所有收集到的資訊。
將信任評分轉換為表情符號的函式:
const getColor = (result: number) => {
switch (result) {
case 3:
return '🟩';
case 2:
return '🟧';
default:
return '🟥';
}
};
以及 onTransaction 函式的回傳部分,搭配一些技巧以美觀的方式顯示鍵值:
return {
insights: {
'': `Trust score: ${getColor(overallScore)}`,
' ': '-----------------------------',
'Contract popularity': `${getColor(
contractTransactionCountScore.score,
)} ${contractTransactionCountScore.description}`,
'Previous interactions': `${getColor(
contractUserTransactionScore.score,
)} ${contractUserTransactionScore.description}`,
'Contract age': `${getColor(contractAgeScore.score)} ${
contractAgeScore.description
}`,
'Contract verification': `${getColor(contractVerificationScore.score)} ${
contractVerificationScore.description
}`,
},
};
最後,我建立了一個非常簡單的介面來呼叫 2 種類型的合約:一個是廣為人知且被大量使用的 Uniswap 合約,另一個是非常近期部署的儲存合約,也就是 Remix 預設呈現的那個。如果您使用此 Snap 並與 Uniswap router 合約互動,您將會看到以下畫面:
如果您要實作這個功能,下一步是什麼?
這只是觸及了能夠給予使用者信心、或防止他們遭受網路釣魚攻擊的資訊冰山一角。最顯而易見的第一步是為我們的數據使用更多來源。合約驗證已使用 Sourcify 和 Etherscan,但最好能為每個評估標準使用多個來源。
接著,我們應該套用更進階的演算法,以防止詐騙者輕易操控評分。例如,我們應該計算與合約交易過的唯一帳戶數量。我們也可以對過去與合約互動的帳戶進行分析,以確保它們並非全部來自同一個來源。缺點是,使用多個真實來源進行所有這些分析會更加困難。
此外,也有一些關於智能合約詐騙偵測的有趣研究可以整合進來。更多資訊請見此處。
總體而言,我在這次黑客松中收到的大量正面回應表明,使用者確實需要更多資訊,而我相信易於理解這一點發揮了關鍵作用。
您能告訴我們一些關於您自己的事嗎?
我是 ChainSafe 的軟體工程師,過去曾在 Parity 工作。我熱愛打造注重良好使用者體驗的產品。Web3 對我來說是一個絕佳的試驗場,因為一切都如此複雜,嘗試讓盡可能多的人能夠理解它是一項很棒的挑戰。我進入這個領域將近 5 年,雖然參加過許多黑客松,但我通常是以志工、導師或評審的身分參與,而非駭客。主要原因是我是個完美主義者,通常不喜歡快速而粗糙的解決方案 :)。
您是什麼時候第一次接觸到 MetaMask Snaps 的,體驗如何?
有趣的是,我在 ChainSafe 的同事建構了有史以來最早的 Snap 之一——用於 Filecoin 的那個。我當時可能看過那份程式碼,但沒有深入研究。
在黑客松期間,insights API 實際上尚未開放給開發者使用。我在里斯本與 MetaMask 團隊交談時,並沒有預期能夠為 MetaMask 新增使用者介面。他們告訴我這個功能即將發布,而且我現在就可以在上面進行開發。事實上,這只能透過自訂版本取得,且相關文件尚未發布。
MetaMask Snaps 與其他錢包有何不同?
能夠在分頁中新增自訂程式碼,同時確保該程式碼可以安全執行,這為大量的功能增強開啟了大門。我非常期待未來將會出現什麼樣的成果。
請告訴我們您使用 MetaMask 建構 Snaps 的體驗如何?
範本 monorepo 讓入門變得輕而易舉。所有程式碼都可以在同一個程式庫中撰寫,只需一個指令就能同時啟動測試 dapp 和 Snap,兩者都支援自動重新整理,這帶來了絕佳的開發者體驗。
Snaps 對您來說意味著什麼?
它是擴充功能的擴充功能。沒有任何產品能夠滿足所有使用者的需求。新增這個可組合的層次,為任何希望某項功能的人提供了自行建構的絕佳機會。
您認為 MetaMask Snaps 為 Web3 領域帶來了哪些機遇與可能性?
我特別想談談 insights 功能,它根據不同需求解鎖了無限的客製化可能性。我相信未來將會開發出更多與安全相關的 insights 功能。
您有什麼建議想與有意嘗試 MetaMask Snaps 的開發者分享嗎?
Clone 這個 monorepo,享受極速的入門體驗。
使用 MetaMask Snaps 進行建構
開始使用 MetaMask Snaps:
查閱開發者文件
安裝 MetaMask Flask
查看 MetaMask Snaps 指南
在 Twitter、GitHub discussions 和 Discord 上與我們保持聯繫
請留意我們的團隊將出現在您附近的下一場黑客松!祝 BUIDL 愉快 ⚒️
免責聲明:MetaMask Snaps 通常由 Consensys Software 以外的第三方開發。使用第三方開發的 MetaMask Snaps 須由您自行判斷與承擔風險,並同意您將對因此類活動所造成的任何損失或損害負全部責任。Consensys 對第三方開發的 MetaMask Snaps 不提供任何明示或暗示的保證,並對第三方開發的 Snaps 免除一切責任。使用區塊鏈相關軟體存在風險,使用 MetaMask Snaps 即表示您完全承擔這些風險。