前言
Friend.Tech 是一個基於智能合約的社交平台,用戶需要連接自己的推特來進行註冊,並「發行」自己的key,擁有key 的用戶可以進入類似群聊的room 中和key 的owner 進行交流。它仍然是一種中心化的社交平台,只是依賴鏈上的智能合約實現了key 的購買、出售邏輯,而主要的功能是基於網頁所實現的IM 應用。而且出售、購買key 的過程中,會將價值的10% 劃分為兩個部分,一部分給Friend.Tech 開發者,另一部分給對應room 的owner。那麼,在這樣的key 可以繞過前端完成購買、出售的情況下,自然而然會產生鏈上的機器人來進行打新、買賣、手續費欺騙的操作。那麼,它們又是如何實現的呢?
淺談打新機器人
打新機器人在Friend.Tech 運作的前期能有很可觀的收益,因為這個時候鏈上的狙擊機器人還沒有進化到一定的程度,在進行簡單的信息判斷後就可以進行購買且能夠有很高的盈利期望。現在,先從最簡單的機器人實作邏輯開始,一步一步完成一個複雜的bot 邏輯。
當然,在此之前需要介紹**Event**,事件是在Solidity 程式語言下對EVM 中的日誌事件的抽象。通常會搭配一個emit 語句來**觸發事件**。對應在區塊鏈瀏覽器中就是交易的logs,例如下面一筆購買key 的交易,它觸發了一個Trade 事件,事件中包含了一系列的資訊。
合約時間
Event 是DApp 中很重要的一部分,透過它們可以監聽到合約的狀態變更,例如Friend.Tech 也會監聽該合約來對資料庫中的一系列資料進行調整,例如前端的顯示價格,holding 數量等。
最簡思路
那麼,最簡單的一個打新機器人的邏輯是這樣:監聽Friend.Tech 的合約事件,在發現一筆交易所觸發的事件滿足以下條件時就調用Friend.Tech 的合約跟著買入
* 事件為購買(`isBuy` 值為真)
* 交易者和owner 是同一個位址(`trader` == `subject`)
* 交易為創建room 的交易(`supply` 為1)
下圖為此過程的流程示意圖
最簡Bot
合約?原子性!
這樣的機器人有一定的問題:
1. 不能保證打新一定能買到,其次是無法精確地給出能夠購買key 所需要花費的eth 數量;
2. 也不能設定一個上限價格,例如在交易執行時到達多少key 或多少價格就不進行購買;
3. 容易被狙擊,其他人可以透過新地址執行購買操作來吸引這樣的機器人,以達到騙取手續費、賣出獲利的目的;
首先考慮解決問題1、2,EVM 的一個好處是可以原子性地在一個合約中調用其他合約,所以只需要部署一個合約去進行購買,並且設置一系列的條件即可,例如Github 上開源的合約程式碼 [friendrekt],可以設定最高買入價格,以及數量。
對於問題3,最簡單的方式就是利用官方的接口https://prod-api.kosetto.com/users/{address} 進行查詢,得到對應地址的用戶Twitter 信息,然後查詢Twitter 粉絲數等信息來進行篩選,篩選後再判斷是否購買,購買多少以及最高價格是多少。於此,機器人的操作流程變成如下圖。
引入代購合約
科技爆炸
可以看到,這個過程增加了資訊請求和智能合約調用,機器人在監聽到合約事件後,經過簡單的邏輯判斷後確定為新的帳號激活,再利用api 查詢到相關資訊以進行過濾,最後利用部署的智能合約來完成購買。但是這樣的機器人依然有缺陷:
1. 無法判斷釣魚的推特帳號,部分帳號的粉絲數量較高,但都是殭屍粉,而且也沒有任何的價值,買入有很大的風險;
2. 粉絲數量不便於判斷一個推特用戶是否有價值,一些KOL 粉絲數量少,但是會運營,這樣很容易過濾掉這些人;
3. api 存在一定的延遲,這個介面只有在使用者啟動後一段時間(60s)內才能查詢到,很容易錯過很多的位址且有很高的延遲;
同樣地,一一解決這些問題。先看問題3,得益於 0xleo 的提醒 [我是如何在 friend.tech 丢失 1万刀的 – 0xleo],發現另外一個介面可以在使用者註冊後就可以查詢到地址資訊`https://prod-api.kosetto.com/users/by-id/{id}`,那麼可以持續遞增地監控這個介面查找最新的id,並且得到註冊者的信息。如果判斷為有價值的註冊者就將位址存放到快取中(為了確保重啟持久化,還需要一個資料庫),在鏈上事件監聽並命中快取後就進行購買。
其次是問題1、2,如何判斷一個使用者是否有價值?那麼就需要一些第三方的Twitter KOL 評分網站的輔助了,筆者在探索的過程中使用的是Twiiterscan 來進行查詢,由於可以預先得到註冊信息,所以在激活前查詢Twiiterscan 所耗費的時間是沒有太多的影響的。除此之外,還可以手動設定白名單以及買入價格來完成購買配置。
最後,我們所實現的bot 的基本流程如下。由一個額外的「機器人」去拉取api 的最新信息,並在判斷後存放到數據庫、緩存,專門負責購買的機器人則在收到事件後查詢緩存信息,在命中緩存後進行購買。這個快取中也可以存放白名單信息,選擇一些有價值的KOL 後設定價格、數量去買入。
提前監聽與影響力分析
由於筆者實現這個bot 的時間比較晚了,所以獲利也不是很客觀。 9月底開始著手實現、優化,在10月3號左右達到最高1.2E的收益,在那幾天沒有及時出手後利潤回撤,在加上一系列手續費開銷後算是沒有盈利也沒有虧損。這樣架構的機器人能夠在註冊者買入後的第一個區塊實現買入,由於base 上沒有內存池掃描這樣的騷操作,大多數跟隨同一個區塊買入的基本上是一種瘋狂的玩法:在監聽到買入後一直執行買入,直到買入完成,例如在這個過程中看到的另一個機器人:https://basescan.org/address/0x88e6aeb90795f586542b4062cb9f853a5582966c 。
它的策略很簡單,在上面我們所介紹的架構的基礎上,不存放資料庫,直接開始進行買入,直到買入完成。在優化到這個程度後就是拼資金量的遊戲了,燒得起gas 就可以這樣的玩法,在策略正確的情況下利潤也特別可觀。
結語
在前言部分我們也提到了買賣、手續費欺騙的操作,在這裡就隨便介紹一下:
1. 買賣的是一種跟單機器人,追蹤到盈利較好的地址後可以跟隨它的操作,原理也很簡單,將監聽的地址過濾一下,如果是目標地址就跟隨操作;
2. 手續費欺騙分成兩種(筆者在開發過程中觀察到的),一種是利用粉絲數較多的推特帳號來完成的,直接購買並且很快就出售以完成收割。另外一種就是不停建立新地址,轉帳然後執行購買作業又很快賣出。第二種主要針對的是最簡邏輯的bot,在初期應該也能有很好的獲利。
至此,我們完成了對鏈上機器人原理的介紹,具體的實現涉及到程式碼不再說明,想要了解的朋友也可以參考 [friendrekt]的實現。