如何高效提取和应用链上交易的语义信息

链上的每一笔交易不仅仅只是简单的资金转移,还承载了大量等待挖掘的语义信息。

嘉宾:吴志颖,中山大学博士生
整理:aididiaojp.eth,Foresight News

本文为 Web3 青年学者计划中山大学博士生志颖视频分享的文字整理。Web3 青年学者计划由 DRK Lab 联合 imToken 和 Cryptape 共同发起,会邀请加密领域中知名的青年学者面向华语社区分享一些最新的研究成果。

大家好,我是中山大学博士一年级研究生吴志颖,也是 XBlock.pro 区块链数据网站技术负责人之一,主要研究方向是区块链交易数据挖掘。我们今天的主题是《区块链交易语义分析与应用》,主要讨论交易语义和区块链交易追踪,后面会对区块链交易语义的下游应用做一些简单介绍。

标题中有一个关键词叫做区块链交易语义,那么什么是区块链交易语义呢?这是我们认为一个比较新的概念。大量 Web3 应用出现在区块链平台中支撑着 DeFi、GameFi 等业务场景,用户可以发起大量链上交易与 Web3 应用交互来达到行为目的,而这些链上交易承载了大量的语义信息。

区块链系统中的交易可以承载很多的语义信息,而不仅仅是完成一个简单的资金转移,上图中 transfer 是做一笔很简单的资金转移,从一个账户向另一个账户转移一笔 USDT。它也可以完成更复杂的业务逻辑,类似于代币兑换。比如说一个账户可以向去中心化交易所发送了一笔 USDT 来兑换 0.2 个以太币,而这个交易的逻辑是比较复杂的。我们这里给区块链交易下一个定义,它指的是区块链交易本身及其执行过程中体现的一些意图信息。右下角这一张图展示我们从爬取的 2021 年交易类型的分布。我们发现有超过 30% 的交易已经不是做很简单的资金转移,我们可以预测在未来会有更多这样的交易出现,因此我们去研究交易的语义信息就会变得非常必要。

区块链交易语义提取是存在一定挑战的。这里我列了三点,首先相比于传统的金融系统,区块链账户是没有身份信息的,或者说很难获取它的身份信息,所以很难通过身份信息来推断交易意图,那么有一些攻击欺诈等行为就可以隐藏在区块链交易里面。第二点是区块链交易提取需要具有高效性。我们需要保证区块链交易语义提取要快于区块链出块速度,否则就很难去访问到最新交易的信息,那么很多的下游任务比如攻击交易检测就很难及时发挥作用了。另一个是通用性,现在 Web3 生态环境发展的比较快,每年都有新的概念出现。我们的语义信息提取方案需要应对新出现的业务,这也是一个挑战。

我们的一个设想是能否将交易表示为一个比较通用的向量。处理成向量以后,我们就会有很多下游模型可以采用,比如说类似于传统机器学习领域的随机森林,或者说是一些更先进的神经网络,就可以应用在交易语义下游任务当中,特别是攻击检测之类的任务,或者说账户分类。我们可以用来检测一些欺诈者以及交易区块链交易平台的生态分析,并且发现一些新的热点。

我们提出了一套解决方案大概分为三个步骤,首先我们通过区块链的客户端并行请求 IPC 数据接口加速工作流的效率。获取交易模块提升效率以后,对于整个实施性有比较大的提升。接着我们将获取到的交易数据构建成网络,然后通过网络模体概念去将交易语义信息表示为向量来实现交易语义的提取。表述成向量以后,就可以应用到各类的下游任务中,比如说交易分类账户的分类,以及对一些生态分析等。

第一个部分是交易数据的获取,我们选的是 RPC 方案,RPC 方案是我们通过区块链客户端提供的远程调用接口来获取链上数据,但是通常这种网络请求会比较慢,这是目前存在的主要缺陷。第二类方案是有一些区块链浏览器提供了一些数据接口,我们可以通过数据接口来轻松地访问到交易数据。但是这一些网站通常都有反爬虫机制,如果大规模提取交易数据可能会导致 IP 被封,所以这不是一个可扩展的方案。还有一类方案,就是大家比较常用的魔改全节点,我们去构建一些节点,然后去修改启动代码,特别是插装一些代码然后来获取这些交易数据。这种方案可能会比较需要资源,如果节点版本有比较大的更新,那也可能需要重新去写插入代码,所以我们选择的是第一种方案。

网络请求速度来保证数据获取是比较高效的。那么我们的方法是并行请求 RPC 接口来提升数据获取的效率。并行请求有两种方案,一种是同时请求多个 RPC 接口直到所有的请求都执行完成,再去请求下一个区块里的交易数据。从图中可以看出,不同的线程之间是有很多无效等待时间,这导致比较严重的资源浪费。我们想要改进就只需要去掉无效等待时间就可以了。所以我们去选择第二种并行方案就是右下角这张图,我们在不同的线程之间并行请求多个接口,但是不用去等待其他请求也完成。为了想知道我已经请求了哪一个步骤,或者说进度如何,我们就可以设计额外的同步组件来知道我们的数据采集的进度。这样可以提升整个交易数据获取的效率。

在第二部分,我们讨论如何通过已经获取的交易数据来提取交易语义信息。在此之前,其实也有一些工具,如这个文献中讨论说通过一些专家经验或者说是规则来提取语义信息,但是这类方法可能没有办法很好的应对未来出现的新业务模式。例如类似于左下角的例子。它其实是在浏览器里面提供了理解交易意图的能力,我们可以看到它说明交易正在执行的 SWAP 操作。如果基于规则的话,会有一些交易是没有办法识别语义信息。比如第二条如果识别不出语义信息的话,有可能会展示一个字符串,字符串其实是外部交易的函数签名,函数签名对于不是特别专业的区块链用户来说是比较难理解的,也不太利于计算机处理。当然后来也有一些工作也提出了一些适用于 DeFi 领域的交易与提取方案。

我们怎样去做一个比较通用的交易语义提取技术呢?我们假设交易会触发一系列的低级语义,那么在这些低级语义组合以后,它就会涌现出高级语义信息。我这里对低级语义下了一个定义,由区块链系统以及智能合约定义的行为,比如资金转移就是一种很典型的低级语义。资金转移语义通常由区块链系统或智能合约协议定义,例如 ERC20 代币转移。我们认为资金转移它是一个很经典的低级语义,右边这一张图中展示的是代币兑换的代码和读解。我们看到发起代币兑换的人首先发起一笔外部交易,然后 rooter 会要求他打一笔资产给 pair,再 pair 将兑换后的资产还给他。通过对这一种资金转移关系的建模,我们会发现图中三个节点构成的子结构其实就体现了代币兑换的语义信息。我们考虑将资金转移过程建模为图,我们去挖掘图中的高阶结构,其实就能体现出交易中的高级语义信息了。我们参考了网络模体的方法。具体来说就是将交易的语义信息表示为一个向量,我们称它为语义向量,其中的第 i 个元素表示第 i 种网络模体的出现频次,我们其实是用到了 16 种网络模体,它其实是由少数几个节点和连构成的一些网络子结构。

为什么选择 16 种模体呢,这跟参考文献中引用的一篇文章有关系。这篇文章认为这 16 种网络模体能够比较好地揭示多种复杂系统里面的高阶信息。比如这种 M16 经常出现在神经网络里,在一些航空网络领域也经常出现这种三角形的网络模体网络子结构,包括在一些蛋白质的网络结构里面也会出现各种其他类别的。那么这 16 类模体是对于各种系统而言比较有利的。所以我们也选择了这 16 种模体,右边我放出了前九种的计算方式,那么后面几种计算方式太复杂。

如果我们用网络模体的方法来计算区块链的交易语义,计算代价是怎么样?我们用 gb/gl 表示区块中资金转移次数。我们按照最坏的情况估计资金转移数量足够多时,能不能仍然实现高效?区块中的资金转移需要消耗 Gas 费用,我们选择比较节约的日志转移方案,并且假设所有资金转移都是以日志的形式来呈现,这里以 gl 来表示日志的 Gas 消耗,我们得到了一个最坏的情况。在一个区块内所有交易的语义向量满足上图中的约束的条件下,我们根据以太坊黄皮书将这两个数字填进去,最后得出结论,大多数 CPU 在一秒之内都可以完成计算。

接下来通过实验来展示数据获取的效率以及实验结论。首先看左下角这一张图。横坐标表示的是采用不同方法时,每一个区块数据获取的平均时间成本;纵坐标表示的是不同类别的方法。从图中可以看出全节点的速度是最快的,而我们方法已经比较接近全节点的速度,但我们内存消耗就相对少很多。一些比较知名的区块链平台出块速度是 2.3 秒。如果时间代价超过 2.3 秒,由于无法获取到最新的数据,那么基于 RPC 方案就不能运行了。 中间这张图评估了语义向量提取的代价,我们用了一个比较取巧的方式,横坐标表示的是工具并发量,从左到右并发量一次递增,纵坐标表示提取工具的时间代价。我们分别画了两条线,一条是只用这个数据获取,另一条是用数据获取后再接上一个语义向量计算的模块。当并发数量越来越高的时候,ETL 的时间成本是越来越低的。但是如果接上语义向量计算模块,时间会慢慢趋于收敛。收敛后的结果就是两条线的交易向量计算的时间成本。我们通过加并发量的方式估计出了语义向量计算的代价。右边这张图其实是语义向量的低维可视化,我们选取了前九种比较有名的交易标签,然后看不同标签下向量的 T-SNE 降维可视化以后的图形,我们发现有部分语义其实存在比较清晰的边界,当然也有一些重叠在,但至少说明我们所采用的模体的案提取交易语义还是有比较好的区分度。

接下来我们讨论交易的下游应用,主要分为交易分类和账户分类。我们将交易语义向量作为交易的特征,然后用一些简单的或者典型的机器学习方法来对交易做分类。横表展示了五种常见的交易分类。除此之外,我们在论文中展示了如何将交易信息用在账户分类中,特别是假冒代币的合约账户分类。我们在数据构建上是将合约及其创建者账户视为节点,`账户之间的交易视为连边。对于这些交易,我们计算语义向量,并执行合约节点分类。我们会用到一些传统模型包括一些神经网络模型,并将这些交易语义特征放在合约节点特征里。对于每个合约节点,我们都将它关联的交易取一个语义向量集合,然后通过语义向量集合再去计算语义向量的特征值,比如说最大值、最小值、均值和方差等,最后将这些统计特性拼接到合约节点本身的特征里。我们也用一些传统机器学习方法,比如说随机森林或者 MLP 做了合约节点的分类实验,也做了一些利用图神经网络的方法实验。我们发现这些方法都有不同程度的一些提升。接着我们还将交易语义应用到一些区块链的生态分析里面,具体做法是观测 2021 年向量中不同元素对应的网络模体随时间变化的趋势。

左下角三张图就是几个比较有特点的模体变化趋势。首先是智能合约的使用频率越来越高,对应 M1 和 M11 这两个图。在将资金转移过程建模为网络之后,如果有一笔交易触发的资金转移活动不止外部交易的话,那说明其他的资金转移活动很有可能就是由智能合约触发的。M1 单向连边越来越多,那它很有可能就是因为智能合约触发了额外的资金转移活动。第二是在 2022 年之前,NFT 日渐流行,当然现在市场惨淡。它跟 M3 是有关系的,M3 它在 2021 年其实是涨幅比较大。右图展示的其实是 NFT 买卖的底层逻辑。我们将所有的资金转移活动都建模为图后发现图中有一个环状的结构有三个节点构成的,这个库进一步证明我们的猜想。我们将 M3 变化趋势和 NFT 日均市场交易量做相关系数分析,最后我们发现相关系数达到 0.82,它已经就是一个比较强相关的状态。另外一个下游应用是交易追踪,它其实是事后的监管手段。事前比如预警和审计不一定总是起效的,那么在事后盗窃或欺诈已经发生了,我们交易追踪最终任务其实就是在通过搜索不同交易之间的资金关联,希望能发现黑客洗钱去向。如果发现洗到交易所,那么我们就可以去向交易所提出申请,然后通过一些在链外的方法定位到资金追逃方式。对于交易追踪任务而言,它的核心思想是说通过少数账户出发,比如说一个受害者节点,或者说两个受害者节点出发寻找黑客的交易地址,然后我通过黑客交易地址搜索关联交易。

现在交易追踪方法存在一些痛点,由于现在交易网络规模很大,处理数据的速度受限。有一些系统需要依赖专家来交互,但是人工介入也会导致实时响应能力比较弱。它第二个痛点是现有的追踪范围不够精确,账户具有假名性,导致追踪方案不得不扩大搜索范围来保证追踪结果能够覆盖黑产现金流。另外现在的交易方法可能会忽略交易的语义信息,最终导致偏离真实资金流。

我们通过交易语义设计了一种足够快且精确的追踪方案。我们把链上交易分为两种模式,第一种模式是 Xfer 模式,资产从一个账户转移到另一个账户;第二种模式是 Swap,将一种代币兑换成另一种代币,经常出现在添加流动性、质押和代币铸造等。通过识别这两种模式,我们其实可以设计出一些更精确的交易最终方案。如上图假如要追踪 S 到 U 这一笔资产最终流向,如果我们采用一些比较传统的方法,他可能最终追踪到 hash2 交易,这显然是不对的。我们会注意到,在输出交易中,hash2 交易过程中同时出现了输入资金和输出的资金,那么我们可以断定它是一个代币兑换的过程,本质上是将 2.5KUSDC 换成了 0.8ETH,所以 2.5kUSDC 最终是转移到这两个橙色的节点上了。这种提高交易追踪精确度的方式,我们称它为代币重定向。

我们也做了一些相关实验,比如这里提到的消融实验。如果我们将识别语义信息模块去掉,精准度直接降了 12%,这也说明识别交易追踪过程中易语义信息是非常有帮助的。在 Cryptopia 被黑案实际案例中,我们的方案不仅发现了专家报告中 32% 资金流,还发现了剩余 1032 多万美元的资产流向了另外两个没有被发现的交易所,这就使得我们整个追溯的准确率提升到了 97%。

目前交易语义的工作还处于探索阶段,这两篇论文相当于抛砖引玉。我们发现交易语义应用对多种下游任务还是比较有益的,但现在的方案还是存在一些局限性。例如我们只考虑了资金转移这一种低级语义,此外我们也没有考虑对智能合约执行过程的分析。在后续的工作中,我们可能会关注更多模态交易数据,比如日志以及执行过程的 trace 信息。除此之外,我们也会去做更多的下游任务,比如说攻击检测和大规模账户分类等。

Subscribe to Foresight News
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.