# 链上数据分析—NFT 项目质量评估

By [Untitled](https://paragraph.com/@0x61f11506a892bf79ca2a3252e9f7e283cec593f5) · 2021-12-29

---

一、分析背景
------

2021年已经接近尾声，回顾今年的 crypto currency 市场，在大洋彼岸，NFT 无疑是最具热点的话题和方向。随着 OpenSea 等平台的崛起，市面上的 NFT 项目也层出不穷。

![卫报：NFT市值突破220亿美金](https://storage.googleapis.com/papyrus_images/6784b952ecb6b23dd870fdfbf52f6da1305ee6f134421a54a7497847eed3105e.webp)

卫报：NFT市值突破220亿美金

众所周知，NFT 项目强依赖于社区与热点，那么我们如何评估一个 NFT 项目的优劣，如何才能为投资行为提供强有力的支撑依据呢？

在本文中，笔者分享一下前段时间与加密货币行业某一级市场 VC 合作的 NFT 相关的数据分析实践。

二、评估指标介绍
--------

评估一个NFT项目的好坏无疑是看这个项目的活跃程度、大众接受程度、社区的繁荣程度，如果这些直观的标准都是 high level，那么无疑是一个较好的 NFT 项目。

依赖直观标准的缺点是无法对其进行有效量化，我们试图通过链上数据分析寻找更有数据支撑与说服力的评估指标。在本文中，我们介绍其中一个 NFT 评估指标实例——玩家重合度指标，该评估指标基于以下假设：

我们希望这个指标可以给定一个 NFT 项目的合约地址，输出该 NFT 项目玩家中，NFT 熟练玩家（或者说是活跃玩家）的占比，从而模糊评估该项目在整个 NFT 市场上的社区、参与质量。

在下面的章节，笔者会 step by step 介绍如何从链上数据获取到该指标的整个过程。

三、需要关注哪些交易？
-----------

首先我们应该知道需要关注哪些交易才能定位到 NFT 的交易者。以 Ape 为例，该项目是基于 ERC-721 代币标准构建的：

![](https://storage.googleapis.com/papyrus_images/b902205951d4e8574664e01ddf9327858cbb2a0d68e530441620da97fef0d8b9.webp)

因此，我们需要关注 ERC721 代币每次转账的发送方和接收方，这两个地址就是我们可以认定的 “NFT交易者”。具体一点，我们需要关注 transferFrom 合约方法的调用，并将 transferFrom 的 from 和 to 地址抽取出来。

为了实现这个需求，我们需要考虑两种情况：一种是交易者直接与 Ape 合约进行交互，一种是通过合约 call 的方式与 Ape 合约进行交互。

### 3.1 直接与 Ape 合约交互

如交易：

0xff9a1b806e26ca45b4ce45a05929aa1759c913162b4a98b16ddc12db015002a1，可以看到用户直接和 Ape 合约进行交互：

![](https://storage.googleapis.com/papyrus_images/c2087170ddbc2ae6e17fe2275397626c3bb3d2a6dfe802eebaa6fe38a9407054.webp)

这种场景下，我们只需要利用 ABI 解析出交易中的 input data 即可，利用 [web3.py](http://web3.py) 可以很容易做到这一点：

    contract = w3.eth.contract(address=nft_addr, abi=abi)
    txs = get_all_transactions(nft_addr)
    
    # 0x23b872dd => transferFrom
    if tx['tx']['input'].startswith("0x23b872dd"):
    func_obj, func_params = contract.decode_function_input(tx['tx']["input"])
    nft_traders.append({
      'sender': func_params['from'],
      'receiver': func_params['to'],
    })
    

### 3.2 合约 call 调用与 Ape 交互

除了直接与 Ape 交互，实际上很多交易行为是通过其他合约调用 Ape 相关方法实现的，比如在 OpenSea 中交易 Ape NFT，交易id：0x0000c29cdda9857072510fc52adf701d4cc7d769f3d00704c062fc399d731bb4

![](https://storage.googleapis.com/papyrus_images/8d8d591789c275f207a91c9a28c2d0390f8b07f4e2cf19adb910cefd54a2185a.webp)

可以看到，用户通过和 OpenSea 合约进行交互来交易 Ape NFT，而在以太坊交易中不会存储合约之间的调用关系与相关细节，对于这种合约调用分析，我们需要依赖 trace 节点获取 call tracing 数据，进而分析调用关系：

从 tracing 结果来看，最终 OpenSea 合约还是调用了 Ape 合约的 ERC-721 标准方法来完成 NFT 转移：

![](https://storage.googleapis.com/papyrus_images/25b33ab57a5b453e3e2cee6838bfbb270bf8592c0229043889df11dbe8fbac17.webp)

对于这种合约调用的交易，我们可以分析该交易的 event log 来获取 NFT 交易者信息，如 ERC-721 约定了 Transfer 事件，在每次 NFT 换手时均会被 emit，因此我们就不需要对交易进行 trace 也能通过 event 获取交易者信息。

通过 [web3.py](http://web3.py) 也可以轻松完成解析：

    tx_receipt = w3.eth.get_transaction_receipt(txid)
    logs = tx_receipt['logs']
    logs = tx_receipt['logs']
    logs_num = len(logs)
    for i in range(logs_num):
        ret = contract.events.Transfer().processLog(logs[i])
        # parse the logs
        try:
            ret = contract.events.Transfer().processLog(logs[i])
            nft_traders.append({
                'sender': ret['args']['from'],
                'receiver': ret['args']['to']
            })
        except Exception as e:
            continue
    

四、基础数据建设
--------

在我们内部，需要经常应对这种类型的数据分析需求，从而满足传统的资金溯源、普通 ERC-20 转账，到 Dex、NFT 交易分析等需求。

在建设基础数据层时，我们需要对主网每个交易进行解析、tracing 出 call stack、对合约交易的 input data 进行 ABI 解码、对event进行ABI解码，再进行清洗、格式化等操作，最终将以上数据入库。

![](https://storage.googleapis.com/papyrus_images/f4522153f727284bbbc641fa3adc30f9717f40eced0fc5a079d0b60d3c01e75e.webp)

有了基础数据层建设，我们可以直接执行查询定位到相关交易，不需要临时性遍历全部区块中的交易。

五、NFT项目评估
---------

通过对蓝筹 NFT 项目、待评估 NFT 项目进行交易分析，我们获取到了两个数据集：

该列表保存三个字段：sender、receiver、txid 即可。

有了以上数据，我们不仅可以获得玩家重合度数据，也可以回答出以下问题：

利用这些基础数据，与链上资金溯源、链上真人地址识别等技术相结合，我们甚至可以反推出 NFT 项目的市值管理策略，从而从更深层次去评估目标项目的优劣。

六、总结
----

本文介绍了如何通过链上数据分析目标 NFT 项目，包括基础数据、交易解析、指标分析思路等。区块链有透明化、交易活动公开化等特点，通过定制化的数据分析的方式，我们可以快速发现加密货币市场的潜流，从而为我们的决策提供更有力的佐证。

---

*Originally published on [Untitled](https://paragraph.com/@0x61f11506a892bf79ca2a3252e9f7e283cec593f5/nft)*
