跳至內容

Trust Score Snap:用顏色代碼簡化交易

ETHLisbon 黑客松得獎者

8 分鐘閱讀
Trust Score Snap:用顏色代碼簡化交易

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,
}) => {
  // call all the insights criteria
  // they all return a ScoreResult
}
複製

這些函式通常會呼叫 API 並處理結果。讓我們深入了解其中一個函式。

根據整體互動次數決定信任評分

讓我們深入了解根據合約收到的交易總量來給出評分的函式。我們在此使用 Etherscan API,但任何其他 API 都可以用來驗證相同的數據。

/**
 * Gets a trust score for a contract based on the overall tx count
 * 3 -> the contract had overall >=100 txs
 * 2 -> the contract had overall 50 <= tx < 99
 * 1 -> the contract had overall tx < 50
 *
 *@param options0
 * @param options0.chainId - the chain id to call the api with
 * @param options0.contractAddress - the contract address to check
 * @returns the score and a description
 */
export async function getContractTransactionCountScore({
  chainId,
  contractAddress,
}: IContractTransactionCountScore): Promise<ScoreResult> {
  // get the api url asking for the 100th transaction
  // it will return undefined if there is none
  const url100 = getEtherscanContractTxsUrl({
    txNumber: 100,
    chainId,
    contractAddress,
  });
  const { result: result100 } = await fetchUrl<EtherscanResponse>(url100);

  // if there is a 100th tx it means the contract
  // has received at least 100 txs. We have all we need
  // we can return with the best score of 3
  if (result100.length === 1) {
    return {
      score: 3,
      description: 'more than 100 txs',
    };
  }

  // this will be call if there are less than 100 txs
  // we check if there is a 50th tx.
  const url50 = getEtherscanContractTxsUrl({
    txNumber: 50,
    chainId,
    contractAddress,
  });
  const { result: result50 } = await fetchUrl<EtherscanResponse>(url50);

  // if there is a 50th tx we can return with a score of 2
  if (result50.length === 1) {
    return {
      score: 2,
      description: 'more than 50 txs',
    };
  }

  // otherwise, return with the lowest score
  return {
    score: 1,
    description: 'fewer than 50 txs',
  };
}
複製

並非所有評分的權重都相同

現在我們已為每個評估標準取得 TrustResult,接下來要套用權重。事實上,並非所有評估標準的信任評分都應具有相同的權重。舉例來說,過去與合約的交易次數是有成本的。如果詐騙者想要操控這個指標,他們需要花費一些 ETH 作為 gas 費用。因此,這個標準被認為較難被操控,也因此更為重要,我給予它 3 的權重。

同樣地,合約的建立時間無法被攻擊者規避——他們必須先部署合約,然後等待一段時間才能發動攻擊,以便獲得較高的信任評分。我給予它 2 的權重。

其他評估標準被認為較弱,權重為 1。

// arbitrary weight for each score
const Weights = {
  contractTransactionCountScore: 3,
  contractAgeScore: 2,
  contractVerificationScore: 1,
  contractUserTransactionScore: 1,
};

// calculate the overall trust score after applying the weights
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:

  1. 查閱開發者文件

  2. 安裝 MetaMask Flask

  3. 查看 MetaMask Snaps 指南

  4. 在 Twitter、GitHub discussions 和 Discord 上與我們保持聯繫

請留意我們的團隊將出現在您附近的下一場黑客松!祝 BUIDL 愉快 ⚒️

免責聲明:MetaMask Snaps 通常由 Consensys Software 以外的第三方開發。使用第三方開發的 MetaMask Snaps 須由您自行判斷與承擔風險,並同意您將對因此類活動所造成的任何損失或損害負全部責任。Consensys 對第三方開發的 MetaMask Snaps 不提供任何明示或暗示的保證,並對第三方開發的 Snaps 免除一切責任。使用區塊鏈相關軟體存在風險,使用 MetaMask Snaps 即表示您完全承擔這些風險。

AI 翻譯。可能包含錯誤。請務必核實資訊。

評價此翻譯

本文作者:

  • MetaMask

    MetaMask,前身為 Consensys Software Inc,是全球最大的自託管金融平台,讓用戶能在單一平台上持有、消費、儲蓄並增值其資產,涵蓋加密貨幣與傳統資產。公司正致力於打造實現上述目標的消費者平台,將支付、儲蓄、投資與數位資產整合於一個無縫的使用體驗中。MetaMask 從全球使用最廣泛的自託管錢包發展而來,讓用戶直接掌控自己的資金與資產,服務範圍遍及約 190 個國家。自 2016 年起,MetaMask 在以太坊的發展歷程中扮演了奠基性的角色。時至今日,MetaMask 位居區塊鏈經濟的核心,致力於構建「開放金融」的作業系統,讓每個人都能全面掌握自己的財務生活。

    閱讀所有文章