# 链上机器人的基本原理：以 FriendTech 为例

By [3P-Labs](https://paragraph.com/@3p-labs) · 2023-10-15

---

前言
--

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 事件，事件中包含了一系列的信息

![合约事件](https://storage.googleapis.com/papyrus_images/97aa491318ecc085103f2fa74dbc924c1e5a129827eb517bf94ab1aac39b1b0c.png)

合约事件

**Event** 是 DApp 中很重要的一部分，通过它们可以监听到合约的状态变更，例如 Friend.Tech 也会监听该合约来对数据库中的一系列数据进行调整，例如前端的显示价格，holding 数量等。

### 最简思路

那么，最为简单的一个打新机器人的逻辑是这样：监听 Friend.Tech 的合约事件，在发现一笔交易所触发的事件满足以下条件时就调用 Friend.Tech 的合约跟着买入

*   事件为购买（`isBuy` 值为真）
    
*   交易者和 owner 是同一个地址（`trader` == `subject`）
    
*   交易为创建 room 的交易 （`supply` 为 1）
    

下图为该过程的流程示意图

![最简 bot](https://storage.googleapis.com/papyrus_images/3aff843711e3d36cbea14b7ff5082d8ba9fb3cc42671f8d6e6f572ebbd679cb1.png)

最简 bot

### 合约？原子性！

这样的机器人存在一定的问题：

1.  不能保证打新一定能买到，其次是无法精确地给出能够购买 key 所需要花费的 eth 数量；
    
2.  也不能设置一个上限价格，比如在交易执行时到达多少 key 或者多少价格就不进行购买；
    
3.  容易被狙击，其他人可以通过新地址执行购买操作来吸引这样的机器人，以达到骗取手续费、卖出获利的目的；
    

首先考虑解决问题1、2，EVM 的一个好处就是可以原子性地在一个合约中调用其他合约，所以只需要部署一个合约去进行购买，并且设置一系列的条件即可，例如 Github 上开源的合约代码 [friendrekt](https://github.com/evmcheb/friendrekt/blob/main/friendrekt-contracts/src/Sniper.sol)，可以设置最高买入价格，以及数量。

对于问题3，最简单的方式就是利用官方的接口 `https://prod-api.kosetto.com/users/{address}`进行查询，得到对应地址的用户 Twitter 信息，然后查询 Twitter 粉丝数等信息来进行筛选，筛选后再判断是否购买，购买多少以及最高价格是多少。于此，机器人的操作流程变为如下图所示。

![引入代购合约](https://storage.googleapis.com/papyrus_images/4e8ac2e49f882e43e58b68fa02567054a2c4009941416f033e4430699d9ffeaa.png)

引入代购合约

### 技术爆炸

可以看到，这个过程增加了信息请求和智能合约调用，机器人在监听到合约事件后，经过简单的逻辑判断后确定为新的账号激活，再利用 api 查询到相关信息以进行过滤，最后利用部署的智能合约来完成购买。但是这样的机器人依然存在缺陷：

1.  无法判断钓鱼的推特账号，部分账号的粉丝数量较高，但都是僵尸粉，而且也没有任何的价值，买入有很大的风险；
    
2.  粉丝数量不便于判断一个推特用户是否有价值，一些 KOL 粉丝数量少，但是会运营，这样很容易过滤掉这些人；
    
3.  api 存在一定的延迟，这个接口只有在用户激活后一段时间（60s）内才能查询到，很容易错过很多的地址且有很高的延迟；
    

同样地，一一解决这些问题。先看问题3，得益于 [0xleo](https://twitter.com/0xleo0x) 的启发 [我是如何在 friend.tech 丢失 1万刀的 - 0xleo](https://twitter.com/0xleo0x/status/1702629470291833160)

![](https://storage.googleapis.com/papyrus_images/aac034a0ee821e2084c6c54b9ea10aa5eb6c15d63a1dbc69b56263db7f1d338b.png)

发现另外一个接口可以在用户注册后就可以查询到地址信息 `https://prod-api.kosetto.com/users/by-id/{id}`，那么可以持续递增地监控这个接口查找最新的 id，并且得到注册者的信息。如果判断为有价值的注册者就将地址存放到缓存中（为了保证重启持久化，还需要一个数据库），在链上事件监听并命中缓存后就进行购买。

其次是问题1、2，如何判断一个用户是否有价值？那么就需要一些第三方的 Twitter KOL 评分网站的辅助了，笔者在探索的过程中使用的是 Twiiterscan 来进行查询，由于可以预先得到注册信息，所以在激活前查询 Twiiterscan 所耗费的时间是没有太多的影响的。除此之外，还可以手动设置白名单以及买入价格来完成购买配置。

最后，我们所实现的 bot 的基本流程如下。由一个额外的“机器人”去拉取 api 的最新信息，并在判断后存放到数据库、缓存，专门负责购买的机器人则在收到事件后查询缓存信息，在命中缓存后进行购买。这个缓存中也可以存放白名单信息，选择一些有价值的 KOL 后设定价格、数量去买入。

![提前监听与影响力分析](https://storage.googleapis.com/papyrus_images/c86733a1be88a2f91dcbbba865374b7d03cdbda758b7fbe752e7a24177fb7974.png)

提前监听与影响力分析

由于笔者实现这个 bot 的时间比较晚了，所以盈利也不是很客观。9月底开始着手实现、优化，在10月3号左右达到最高1.2E的收益，在那几天没有及时出手后利润回撤，在加上一系列手续费开销后算是没有盈利也没有亏损。这样架构的机器人能够在注册者买入后的第一个区块实现买入，由于 base 上没有内存池扫描这样的骚操作，大多数跟随同一个区块买入的基本上是一种疯狂的玩法：**在监听到买入后一直执行买入，直到买入完成**，例如在这个过程中看到的另外一个机器人：[https://basescan.org/address/0x88e6aeb90795f586542b4062cb9f853a5582966c](https://basescan.org/address/0x88e6aeb90795f586542b4062cb9f853a5582966c)

它的策略很简单，在上面我们所介绍的架构的基础上，不存放数据库，直接开始进行买入，直到买入完成。在优化到这个程度后就是拼资金量的游戏了，烧得起 gas 就可以这样的玩法，并且在策略正确的情况下利润也特别可观。

结语
--

在前言部分中我们还提到了买卖、手续费欺骗的操作，在这里就随便介绍一下：

1.  买卖的是一种跟单机器人，跟踪到盈利较好的地址后可以跟随它的操作，原理也很简单，将监听的地址过滤一下，如果是目标地址就跟随操作；
    
2.  手续费欺骗分两种（笔者在开发过程中观察到的），一种是利用粉丝数较多的推特账号来完成的，直接购买并且很快就出售以完成收割。另外一种就是不停建立新地址，转账然后执行购买操作又很快卖出。第二种主要针对的是最简逻辑的bot，在初期应该也能有很好的盈利。
    

至此，我们完成了对链上机器人原理的介绍，具体的实现涉及到代码不再进行说明，想要了解的朋友也可以参考 [friendrekt](https://github.com/evmcheb/friendrekt) 的实现。

* * *

Twitter: [https://twitter.com/3PDAO](https://twitter.com/3PDAO)

Telegram: [https://t.me/Labs\_3P](https://t.me/Labs_3P)

Mirror: [https://mirror.xyz/3p-labs.eth](https://mirror.xyz/3p-labs.eth)

Medium: [https://medium.com/@3p-labs](https://medium.com/@3p-labs)

Followin: [https://followin.io/zh-Hans/kol/4075816318](https://followin.io/zh-Hans/kol/4075816318)

Foresight News: [https://foresightnews.pro/column/detail/873](https://foresightnews.pro/column/detail/873)

---

*Originally published on [3P-Labs](https://paragraph.com/@3p-labs/friendtech)*
