# 解析 DeFi 交易

## **I. 什麼是 ABI ？**

ABI（應用程式二進位接口）是獲取兩個二進位程式模組之間資訊的。 在以太坊生態系統中，ABI 就好比是解析 DeFi 交易的 “工具” 。

瞭解更多相關資訊，請訪問我們的[ blog](https://blog.keyst.one/are-you-at-risk-using-defi-with-your-hardware-wallet-8a3d81a27572)。

## **II. 為什麼我們要開發此項功能？**

Keystone 的願景和使命是讓交易更安全可靠。

針對 DeFi 項目的需求以及[盲簽](https://blog.keyst.one/blind-signing-a-security-black-hole-for-the-ethereum-community-13f909b848b6)的潛在後果，Keystone 開發了通過外置 ABI 數據來解析 DeFi 交易的功能。 我們的[ blog](https://blog.keyst.one/are-you-at-risk-using-defi-with-your-hardware-wallet-8a3d81a27572) 中詳細解釋了此項功能，其中也包含了我們對功能後續的開發計畫。

## **III. 解析 DeFi 交易**

Keystone 錢包的 V1.3.0 (多幣種) 及以上多幣種固件版本已支持解析 DeFi 交易。本教程將以 MetaMask 為例，展示如何使用 Keystone 解析 DeFi 交易。

### A. 准备

1\. Keystone 錢包的固件版本升級到 [V1.3.0 (Multi-Coin) 或以上版本](https://keyst.one/firmware)。

（有關更多詳情，請閱讀[如何升級固件](https://support.keyst.one/v/traditional-chinese/kai-shi-shi-yong/ru-he-sheng-ji-gu-jian)）

{% hint style="warning" %}
**重要事項：**

請注意 V1.3.0（多幣種）已经將二維碼編碼/解碼升級為新格式。您需要將您的 MetaMask [ Chrome 擴展程式](https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn)升級至最新版本。
{% endhint %}

2\. 綁定 “MetaMask Extension”。（[如何綁定 Metamask？](https://support.keyst.one/v/traditional-chinese/di-san-fang-qian-bao/eth-web3-qian-bao/metamask-eth)）

3\. MicroSD 記憶卡（要求：默認 FAT32 格式，且**不超過** 512GB，否則無法被 Keystone 識別）。

{% hint style="info" %}
提示：Keystone可以將Micro SD卡格式化為FAT32。（[教程](https://support.keyst.one/v/traditional-chinese/kai-shi-shi-yong/ru-he-sheng-ji-gu-jian/jiang-tf-ka-ge-shi-hua-cheng-fat32-ge-shi)）
{% endhint %}

4\. MicroSD 記憶卡讀卡器（如果電腦支持直接插入 MicroSD 記憶卡，則無需準備）。

### **B. 操作**

1\. Keystone 綁定 “MetaMask Extension”（[如何綁定？](https://support.keyst.one/v/traditional-chinese/di-san-fang-qian-bao/eth-web3-qian-bao/metamask-eth)）。

2\. 將 microSD 記憶卡插入電腦，[下載 ABI SQLite](https://github.com/KeystoneHQ/contracts-meta-repo/releases/download/V1.0.1/contracts.zip) 資料庫。下載完成後，解壓文檔，將解壓文檔內的 “contracts.zip” 文檔拷貝到 microSD 記憶卡的根目錄。

{% hint style="info" %}
**小貼士：**&#x60A8;可以使用開源工小貼士具驗證該 ABI SQLite 中的數據。[點擊此處](https://github.com/sqlitebrowser/sqlitebrowser)在 “GitHub > REDEME” 中下載開源工具。
{% endhint %}

![](https://37182324-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MVozfoQsxc6YFPQfVTB%2F-Mi62K7Ak63y6Z2HFzFr%2F-Mi62eq4PCpi6I2IBRHo%2F1.jpg?alt=media\&token=21432781-dbc8-4ae9-855d-9569370c03e8)

![](https://37182324-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MVozfoQsxc6YFPQfVTB%2F-Mi62K7Ak63y6Z2HFzFr%2F-Mi62jdevXCCIXIRNQxC%2F2.jpg?alt=media\&token=5b5d8148-61d1-4b1d-a77a-17cd7bcaa06a)

3\. 將 MicroSD 記憶卡插入 Keystone 錢包設備。

![](https://37182324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MVozfoQsxc6YFPQfVTB-3369173170%2Fuploads%2Fk72FShdB81c4AyWXycg7%2FTF%E6%8F%92%E5%85%A5KV.jpg?alt=media\&token=dfdab374-5cc2-4a26-85a8-39bc14cdc4a3)

4\. 創建一筆 DeFi 交易，生成待簽名交易二維碼（本教程用 MetaMask 創建交易舉例）。

（Keystone [如何綁定](https://support.keyst.one/v/traditional-chinese/di-san-fang-qian-bao/eth-web3-qian-bao/metamask-eth) "MetaMask Extension" ？）

![](https://37182324-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MVozfoQsxc6YFPQfVTB%2F-Mi62K7Ak63y6Z2HFzFr%2F-Mi62mzB5M-jXUQ1je4d%2F3.jpg?alt=media\&token=2ffd89fb-1320-4d7a-8ef3-2a7908678c73)

5\. Keystone 端：點擊【菜單】> 【選擇觀察錢包】>【Web3】>【確認】，進入 Web3 模式。在【Web3】模式下，點擊主頁右上角 “掃描” 按鈕，攝像頭打開後對準 "MetaMask Extension" 展示待簽名交易二維碼進行掃描。

![](https://37182324-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MVozfoQsxc6YFPQfVTB%2F-Mi62K7Ak63y6Z2HFzFr%2F-Mi62wyzMbE1dK57Di_p%2F4.jpg?alt=media\&token=fd0db75d-c97b-4445-9086-0a0678cff621)

6\. Keystone 將讀取到microSD 記憶卡中匹配的 ABI 數據，解析該筆 DeFi 交易的資訊並展示所有交易資訊。

![](https://37182324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MVozfoQsxc6YFPQfVTB-3369173170%2Fuploads%2FQbgPXaDAvnDcUB7pNQFO%2F5-%E7%BC%A9%E5%B0%8F55%25.jpg?alt=media\&token=80f04bdd-93b9-438e-9a9a-fa1699f079a8)

{% hint style="info" %}
**注意事項：**

1\. 簽名交易時，需保持含有 ABI 資料庫的 microSD 記憶卡始終插在 Keystone 錢包中，不可中途將 microSD 記憶卡拔出，否則會導致交易無法解析。

2\. Keystone 錢包設備對之前已經讀取過的 ABI 不會有記憶，因此每一次簽名交易時，都需要將含有 ABI 資料庫的 microSD 記憶卡插入 Keystone 錢包設備中，直到不需要再做任何簽名時方可拔出 microSD 記憶卡。
{% endhint %}

7\. 如果交易無法被解析（如下圖所示），則說明 Keystone 錢包設備沒有在外置 ABI 資料庫中讀取到相匹配的 ABI 數據。此時，用戶可以通過自定義 ABI 的途徑，自主添加相關的 ABI 數據 到 microSD 記憶卡中，即可解析交易（請下拉至第 IV 章節查看如何操作自定義 ABI ）。

![](https://37182324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MVozfoQsxc6YFPQfVTB-3369173170%2Fuploads%2FrXklPl8YHs64OfGMDQ7s%2F6-%E7%BC%A9%E5%B0%8F70%25.jpg?alt=media\&token=1ff35b15-886e-43c0-8130-303b3d5ae046)

## IV. **高級功能（自定義 ABI）**

Keystone 錢包支持用戶根據個人需求添加自定義 ABI 至 microSD 記憶卡，具體操作如下：

{% hint style="info" %}
**請注意：**&#x81EA;定義 ABI 是一個高級功能，請普通用戶謹慎使用這個功能。
{% endhint %}

1\. 每個合約都有一個以合約地址命名的 json 文檔，而每個 json 文檔，都包含以下字段：

```
{
    "address":"",
    "name":"",
    "metadata":{
        "output":{
            "abi":[]
        }
    }
}
```

2\. 按照以上所示格式及層級關係編輯您的 json 文檔，請注意：

1\) “address” 和 “abi” 是兩個必填字段。合約地址遵守[ EIP 55 address checksum format](https://github.com/ethereum/EIPs/issues/55)

2）“name” 為選填字段。如果您使用的智能合約沒有名稱，您可以選擇不填或刪除該字段。

{% hint style="warning" %}
**請注意:**

1\. "address" 字段內有所有字母必須是小寫。

2\. “abi” 字段必須嚴格按照下圖的層級關係進行編輯：

```aspnet
"metadata":{
        "output":{
            "abi":[]
        }
    }
```
{% endhint %}

如下編輯舉例供參考：

```aspnet
{
    "address":"0x28f886Fa1751e623ff4D8422A230d8B49879Bf61",
    "name":"instaDApp",
    "metadata":{
        "output":{
            "abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"erc20","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"getId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"setId","type":"uint256"}],"name":"LogDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"erc20","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmt","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"getId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"setId","type":"uint256"}],"name":"LogWithdraw","type":"event"},{"inputs":[],"name":"connectorID","outputs":[{"internalType":"uint256","name":"_type","type":"uint256"},{"internalType":"uint256","name":"_id","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"erc20","type":"address"},{"internalType":"uint256","name":"tokenAmt","type":"uint256"},{"internalType":"uint256","name":"getId","type":"uint256"},{"internalType":"uint256","name":"setId","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getEthAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getEventAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMemoryAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"erc20","type":"address"},{"internalType":"uint256","name":"tokenAmt","type":"uint256"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"getId","type":"uint256"},{"internalType":"uint256","name":"setId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
        }
    }
}
```

3\. 進行必要的編輯後，保存文檔，確保文件名為“合約地址.json” (例如：0x28f886fa1751e623ff4d8422a230d8b49879bf61.json)。

{% hint style="warning" %}
**請注意:**

1\. 合約地址中的所有字母必須是小寫。

2\. 確保文檔的保存格式為 json 格式。
{% endhint %}

保存 json 文檔至 microSD 記憶卡中，保存路徑為 "contracts > self\_define"。

![](https://37182324-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MVozfoQsxc6YFPQfVTB-3369173170%2Fuploads%2FvBXpVjWge5Q6UyquZwzZ%2F10-1.png?alt=media\&token=72f07bd6-4614-452d-adb0-e21d8ff8c1ba)

推薦教程：

[如何將Uniswap與Keystone一起使用](https://support.keyst.one/v/traditional-chinese/di-san-fang-qian-bao/eth-web3-qian-bao/metamask-eth/metamask-and-defi)？
