• Solidity迁移Flow Cadence指南13-Flow 1000+合约大数据分析


    熟读唐诗三百首,不会做诗也会吟,Flow合约哪里读?自然是链上了,Flow的链上合约都是开源的,只要知道合约地址,都可以直接使用API获得具体的合约代码。本节就把flow链上的主要合约下载下来,然后分析,哪些可以读,哪些可以抄@#¥@#¥

    数据来源

    本文主要分析合约账号数据,在以太坊中,可以通过地址的code类型来判断是否为合约地址,Flow中也是类似的,Flow账号的数据结构如下所示:

    message Account {

      bytes address

      uint64 balance

      bytes code

      repeated AccountKey keys

      map<string, bytes> contracts

    }

    因此,我们也可以通过获取account.contracts或者account.code(新版逐步取消),看是否包含合约代码即可。但有个问题是, Flow中的账号已有800+万,遍历会比较慢,而且获取账号地址列表也较为困难。因此,我们综合采用了多个方法,尽可能获得更多的合约地址。

    首先是搜索网上已有的合约地址列表,如alchemy就收集了不少:

    https://github.com/alchemyplatform/alchemy-flow-contracts

    再者就是要遍历区块了,flow区块的数据结构大致是这样的:

     

    图 1 flow 区块的数据结构

    以太坊的区块中,就是交易一层数据结构,而flow链上,多了一个Collection层,其下包含了交易数据。我们可以从交易中获得发送方等三个地址,以及交易参数中的地址类型,来收集flow的地址,然后判断是否包含合约代码即可。

     

    图2 从交易数据中收集flow地址

    另外,我们可以搜索或监听合约创建事件(event),来收集合约地址,在flow的API中,可以通过GetEventsForHeightRange来获得合约的事件信息,flow中合约创建的事件为flow.AccountContractAdded,事件的数据结构如下:

    message Event {

      string type

      bytes transaction_id

      uint32 transaction_index

      uint32 event_index

      bytes payload

    }

    一个具体的合约创建事件如下所示:

     

    图3 合约创建事件

    我们只需要通过上述方式,收集尽可能多的合约账号,就可以通过合约账号的contracts/code属性来获得合约代码。

    我们把目前收集到的合约,都放到了flow.study上。

    本节到此结束。。。。。。。。。

    但。。。。。。。笔者是做大数据的,应该是会flow cadence的码农里面,大数据学的最好的之一:)这里就show一下技能,用大数据算法分析flow的合约生态,让大家更清楚的看看什么值得抄,flow的应用生态还缺少啥,等等。

    Flow合约生态分析

    分析一个区块链的应用生态,最直接的方法,就是分析其中的用户交互关系,一般都使用网络分析方法,整体可视化的展示用户之间,以及应用和用户的交互情况。

    在以太坊的世界里,不管是以太坊转账,还是合约调用,都是From地址到to地址的“交易”进行的。而flow的世界里,交易并没有明确的From地址和To地址关系对,因此,做网络化分析相对麻烦一点点。

    以太坊的交易数据和flow的交易数据对比图如下所示:

     

     

    图4 以太坊的交易数据和flow的交易数据对比

    https://flowscan.org/transaction/5bad75980b70b2f239b3dc255a9e08952685d80714a0620bcc865dfcada1eb17

    网络分析,只需要两个点的连接关系即可,以太坊的中,只需要分析用户to地址到from地址的转账交易,或者所有to地址为合约地址的调用交易即可。

    但面向资源的flow中,所有的操作都是账号之间的“资源转移”操作,交易中的合约引用只是起到一个数据规范的作用,其实和部署的合约账号已经没有关系了。但为了分析flow的用户行为,我们也按照以太坊的两种模式进行数据分析:

    一种是仿照以太坊的转账关系,分析用户之间的关系。我们对应的分析flow token的转账行为关系,只需忽略合约交易通道,直接用转账的源地址和目标地址构建一条连接即可。具体通过搜索监听A.1654653399040a61.FlowToken合约的TokensWithdrawn和TokensDeposited事件即可,其中TokensWithdrawn的数据中地址为源地址,TokensDeposited数据中的地址为目标地址,从一个交易id中发出的一对TokensWithdrawn和TokensDeposited事件就构成一个交易对。具体如上图1中的两个地址关系图。

    一种是分析用户和合约的关系。我们只考虑主动发起调用的用户(Proposer)地址和合约地址的关系即可。但有一个问题,就是我们上面提到的,flow的交易中数据中是没有明确的To地址的,以太坊的交易数据和flow的交易详细数据结构对比如下图所示:

     

    图5 以太坊交易数据结构和flow交易数据结构详细对比

    如上图所示,以太坊交易中有明确的交易目标地址,如果是合约调用,目标地址就是合约地址,但在flow的交易数据中,并没有这个数据。

    因此,如果要获取用户和合约的交互关系,还是需要基于事件进行分析,我们还是搜索监听合约相关的事件,因为监听事件输入type要求的格式为

    type: A.{contract address}.{contract name}.{event name}

    我们有了contract address和contract name,就需要从合约代码中正则匹配所有的event name即可。

    获得事件后,事件的数据结构中是包含交易id/transaction_id的,因此, 可以根据交易id获得交易发起的地址(Proposer)即可,具体流程如下:

     

    图6 建立合约和用户的连接

    之所以这样曲折一些,主要是因为flow的交易没有明确的To地址,交易数据中也不包含对应的event事件信息,只能通过合约event包含的交易id,倒推出调用合约的用户地址,从而建立起合约和调用者地址的关联关系。这也是flow交易和以太坊交易最明显的不同之处。

    上述两类分析都使用无向连接,也就是不考虑连接的方向。

    我们截取了了2022年6月12日之前60万个区块的数据,也就是一周左右的区块数据进行分析,在此期间flow token的交易对共有约90万个,用户调用合约共有约1000万(包括引用的合约)。具体分析的时候,我们各自随机抽取5 万个连接,进行分析处理。

    基于flow token的用户行为网络图如下所示:

     

    图7 基于flow token的转账行为构建网络关系图(基于Force Atlas算法/Gephi构建)

    从上图中可以看到,Flow token发送行为,集中在4个主要的地址上,最多的就是0x34ac358b9819f79d,这个是合约NFTKred的地址。

    基于合约的调用行为网络图如下所示:

     

    图8 基于合约调用交互的用户为行为网络关系图(基于Force Atlas算法/Gephi构建)

    可以发现,合约的交互,也是集中于几个主要的合约,最主要的就是下面最大的一个关联组,大家也可以猜猜具体是哪个合约。这个其实就是NFT标准合约0x1d7e57aa55817448(MetadataViews/NonFungibleToken), 其他几个大的分组也是以几个知名NFT合约为中心的。

    从上面两个图可以发现,目前flow的应用生态相对还是比较中心化,基本上Top5的合约,就占了大部分的交易量。因此,Flow生态还是大有可为的。

    类别分析

    除了对合约的调用关系进行分析外,我们还对合约的文本进行了分析。

    首先是基本的分类情况,主要基于合约的继承关系相关的关键词进行分析,具体如下图所示:

     

    图9 Flow cadence合约分类

    可以看到,目前flow线上合约中,有38%都是明确的NFT合约(继承NonFungibleToken),48%则是基于NFT/Token合约更复杂的应用。

    我们还对合约的文本内容进行了分析,也就是分析合约的每一个单词,看看合约的“语义”组成大致是样的,也就是大数据领域中的“聚类”算法。相应的分析结果如下所示:

     

    图10 flow cadence线上合约聚类分析图

    从上图中可以看到,合约代码被大数据算法自动分成了2个类别,而左上的类别,从其对应的词云图可以看到,明显就是NFT类别,而右下的类别,则就是一般的Token类别。这也进一步说明了,Flow上的应用生态目前还相对比较单一,主要还是集中于NFT的应用。

    什么值得抄

    根据合约调用关系图,可以很方面的计算每个合约的Pagerank影响力排名值,Pagerank主要用来计算互联网上网站的影响力,用于计算合约的影响力也是类似的原理,具体的Top 10排名合约如下表所示:

    地址

    包含合约

    连接数

    pageranks值

    0x1d7e57aa55817448

    MetadataViews/NonFungibleToken

    2236

    0.155469

    0xecfad18ba9582d4f

    JoyrideAccounts/JoyrideMultiToken

    1332

    0.093722

    0x058ab2d5d9808702

    BLUES

    356

    0.024977

    0x34ac358b9819f79d

    NFTKred

    348

    0.02441

    0x8f3e345219de6fed

    NFL

    341

    0.023987

    0x1e3c78c6d580273b

    LNVCT

    348

    0.023852

    0xa8d1a60acba12a20

    TMNFT

    336

    0.023018

    0xe3ac5e6a6b6c63db

    TMB2B

    317

    0.022325

    0xf233dcee88fe0abe

    FungibleToken

    243

    0.015557

    0xc1e4f4f4c4257510

    TopShotMarketV2/TopShotMarketV3

    172

    0.011008

    好吧,多看看这些合约就行啦。看合约代码的方式为:

    Flow View Source

    其中0xecfad18ba9582d4f就是合约地址

  • 相关阅读:
    01 概率论的基本概念
    「滚雪球学Java」:方法函数(章节汇总)
    JZ2440笔记:热插拔驱动
    零基础转行次世代3D建模,这3点看了再转
    centos7搭建git服务器
    linux系统在init阶段lightDM之前进行密码校验
    Java学习笔记 --- 枚举类
    【专栏】基础篇03| Redis 花样的数据结构
    Spring第二讲:Spring基础 - Spring和Spring框架组成
    C# 图解教程 第5版 —— 第7章 深入理解类
  • 原文地址:https://blog.csdn.net/wangliang_f/article/details/125436265