前言

以以太坊(ethereum)為例,當你註冊交易所成為會員,交易所會分配一組地址讓你做充值,其中不管你是充值以太幣(ETH)或是erc20 token的USDT都是相同的地址,也代表交易所會生成大量的以太坊地址提供給會員,如果有100個會員充值都充值USDT,交易所就會有100個地址都有零碎的USDT,本篇就是將這些零碎地址的USDT都收集到同一個錢包地址。

方法1 HD Wallet分層確定性(Hierarchical Deterministic)錢包

交易所這裡使用一組Seed生成root key,再進一步生成大量sub key和地址供會員充值使用,也就是會員的充值地址是一個普通的地址,會員充值USDT後交易所若要將其轉出,這時候會遇到一個問題,該地址內沒有任何以太幣可以付手續費將USDT轉出,所以必須先轉入少量的以太幣能夠支付手續費,使得會員地址裡面的USDT得以轉出,這是一個常見的做法。

normal address

方法2 開發合約地址

由於方法1做一次需要付2次手續費以及部份的以太幣會留在會員地址中,做一次歸集交易的成本不低,所以多半交易所會把提幣手續費升高轉價成本於會員,這時候可以考慮自行開發合約地址來完成實現歸集交易以降低成本。

contract address

如上圖,首先當會員註冊時,交易所使用A82e金鑰透過合約腳本的方式創建一個新的合約,合約中有個withdrawToken(address)function,而以太坊合約也是以地址的方式呈現,所以直接將該地址Cbec分配給會員供充值使用。當需要歸集時候,使用A82e金鑰呼叫合約地址Cbec中的withdrawToken,並帶入轉出地址將所有token轉出(一般來說轉出地址常會是該交易所的出款地址之一),合約地址Cbec是A82e金鑰創建的,所以是有權限可以執行withdrawToken,而以太坊交易都是發動方付手續費,所以這個歸集交易統一由A82e金鑰付手續費,透過這種作法,就可以大大降低歸集交易的成本。

小結

一般來說觸發歸集交易都會設定一個金額門檻,例如地址內USDT達到500才會執行。今天所提到的兩種方法都是最簡單的實做流程,不論是哪個方法都可以完成token歸集,而進階版可以加入權限管控流程以及白名單機制讓交易更加安全。