熟读唐诗三百首,不会做诗也会吟,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 |
好吧,多看看这些合约就行啦。看合约代码的方式为:
其中0xecfad18ba9582d4f就是合约地址。