解析 DeFi 交易

I. 什麼是 ABI ?

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

瞭解更多相關資訊,請訪問我們的 blog

II. 為什麼我們要開發此項功能?

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

針對 DeFi 項目的需求以及盲簽的潛在後果,Keystone 開發了通過外置 ABI 數據來解析 DeFi 交易的功能。 我們的 blog 中詳細解釋了此項功能,其中也包含了我們對功能後續的開發計畫。

III. 解析 DeFi 交易

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

A. 准备

1. Keystone 錢包的固件版本升級到 V1.3.0 (Multi-Coin) 或以上版本

(有關更多詳情,請閱讀如何升級固件

重要事項:

請注意 V1.3.0(多幣種)已经將二維碼編碼/解碼升級為新格式。您需要將您的 MetaMask Chrome 擴展程式升級至最新版本。

2. 綁定 “MetaMask Extension”。(如何綁定 Metamask?

3. MicroSD 記憶卡(要求:默認 FAT32 格式,且不超過 512GB,否則無法被 Keystone 識別)。

提示:Keystone可以將Micro SD卡格式化為FAT32。(教程

4. MicroSD 記憶卡讀卡器(如果電腦支持直接插入 MicroSD 記憶卡,則無需準備)。

B. 操作

1. Keystone 綁定 “MetaMask Extension”(如何綁定?)。

2. 將 microSD 記憶卡插入電腦,下載 ABI SQLite 資料庫。下載完成後,解壓文檔,將解壓文檔內的 “contracts.zip” 文檔拷貝到 microSD 記憶卡的根目錄。

小貼士:您可以使用開源工小貼士具驗證該 ABI SQLite 中的數據。點擊此處在 “GitHub > REDEME” 中下載開源工具。

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

4. 創建一筆 DeFi 交易,生成待簽名交易二維碼(本教程用 MetaMask 創建交易舉例)。

(Keystone 如何綁定 "MetaMask Extension" ?)

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

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

注意事項:

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

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

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

IV. 高級功能(自定義 ABI)

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

請注意:自定義 ABI 是一個高級功能,請普通用戶謹慎使用這個功能。

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

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

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

1) “address” 和 “abi” 是兩個必填字段。合約地址遵守 EIP 55 address checksum format

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

請注意:

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

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

"metadata":{
        "output":{
            "abi":[]
        }
    }

如下編輯舉例供參考:

{
    "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)。

請注意:

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

2. 確保文檔的保存格式為 json 格式。

保存 json 文檔至 microSD 記憶卡中,保存路徑為 "contracts > self_define"。

推薦教程:

如何將Uniswap與Keystone一起使用

最后更新于