0%

Crypto-Raca Nft市场实时交易记录

Pre:

20220512174618

朋友有需求,想要监控Raca NFT市场在BSC链上的实时交易记录特别是某几类物品挂的卖单,比如药水等,方便他可以买到较便宜的物品。

要获取Raca NFT市场的实时交易记录,有两个数据来源:

  1. 官方网站爬虫、API

  2. 读取bsc每个块的数据

第一种延时严重,存在几分钟的延时,所以采取第二种

读取Bsc Block Data

快速读取block数据

bsc链上约3s左右出一个块,出块的频率很高。

20220512174907

一开始是简单使用time.sleep()去停顿几秒,避免对节点发起过多的请求,但是这样会出现漏块的问题。

后来想到是,配置多个节点地址,每次查询前随机选用一个节点,这样既可以减少漏块的几率,也不会因为查询频率过高被节点ban.

经过多次测试,此类大量查询的情况下,官方给的节点相比商用的有限制次数的节点会更好用。

1
2
3
4
5
6
7
8
# 官方给的节点列表
RPC_List = ['https://bsc-dataseed.binance.org/', 'https://bsc-dataseed1.defibit.io/',
'https://bsc-dataseed1.ninicoin.io/', 'https://bsc-dataseed2.defibit.io/',
'https://bsc-dataseed3.defibit.io/', 'https://bsc-dataseed4.defibit.io/',
'https://bsc-dataseed2.ninicoin.io/', 'https://bsc-dataseed3.ninicoin.io/',
'https://bsc-dataseed4.ninicoin.io/', 'https://bsc-dataseed1.binance.org/',
'https://bsc-dataseed2.binance.org/', 'https://bsc-dataseed3.binance.org/',
'https://bsc-dataseed4.binance.org/']

能稳定、快速的获取到block的数据后,接下来就要过滤出跟Raca NFT市场相关的交易记录

过滤相关记录:

相关的交易记录:tx的to地址指向raca市场合约

1
2
3
4
5
6
list_of_block_transactions = block.transactions

for transaction in list_of_block_transactions:
to_account = transaction['to']
if to_account == self.contract_addr: # 与raca市场合约交互的记录
self.parse_transaction(transaction, block_timestamp)

过滤出相关记录后,就要进行对记录进行解析了。

解析:

input data的前八位为方法名,找出买卖两类函数的hash,就可以再次过滤出raca市场有关的买卖交易记录了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def parse_transaction(self, transaction, block_timestamp):
# logger.debug("parse transaction. hash:{}".format(hash_info["hash"]))
transaction_info = {}
transaction_info["tx"] = transaction["hash"].hex()
transaction_info["from"] = transaction["from"]
transaction_info["time"] = timestamp2date(int(block_timestamp))

input_data = transaction["input"]
four_byte = input_data[0:10]

if four_byte == "0x467f963d": # sell的函数选择器
transaction_info["type"] = "SELL"
nft_token, token_id, num, per_price = self.parse_sell_input_data(input_data)
transaction_info["token"] = Web3.toChecksumAddress(nft_token)
transaction_info["tokenId"] = token_id
transaction_info["count"] = num
transaction_info["amount"] = str(per_price)
# 。。。。

剩下的部分,就是对各个参数进行解析了。

data组成规则:
关于data,前八位为方法名以及参数类型的hash,只要方法名,参数个数,参数顺序以及参数类型确定,方法名hash就确定

hash往后64位进行分割,每一段就是方法的参数,不足64前面补零凑64位

参数中对于数组类型要注意,解析会有点特殊,一般会先以位数序号进行占位,然后到指定位序才是真正数组数据的起点,数组数据起点会先表明下面数据有多少位,然后才是数组数据的依次排列

小结:

至此,通过以下几个步骤

  • 读取block数据

  • 过滤出raca市场合约相关交易

  • 过滤出买卖相关的交易

就基本可以完成对Raca NFT市场实时交易记录的监控了。


在开发的过程中,也发现了一些有趣的点。

有趣的点:

科学家抢购:

比如该tx13151047区块挂了元兽蛋的卖单,每个以86.5raca售出

在接下来的几个区块,都有人发单去抢最快是之后的第二个区块:block_num: 13151049

1
2
3
4
5
6
# 抢购的tx列表
0x62ab3cb23f62459154b652dfb855d4f6f9df4b6fa27363ce69484909f695b94c
0x6e8e06710565fd9cd5f4d8223ed172d817f2e50b5f0aa4f297bf9738bab5b541
0xfd1bee48d470f8bf9b3f4134ea5de7fc323f20b3de2ccd6d8658f02378d97649
0x65ec96412cd5632b8e29225cb8ce96bb76429cc4da68a28ad394643c75a2c8b7
0x094b419c95790a8514193a79e2835db42e7ccc0313a5d6511a486853c06508d3

第三个区块:block_num: 13151050

1
2
3
4
# 抢购的tx列表
0x23b210a6e49dc724ad7d36ca89c57ca187d6e179d568bfe1f0acba77ab09fbc3
0xfa8327cbd2e3e5d92cc6e23e1b1e0d3d1f40e17976d76047d91da6385396de3f
0x4a93d2d696df10b78a5b69b095a134a6f12642aa76f92239cf0efcc660ab114b

第六个区块:block_num: 13151053

1
2
# 抢购的tx列表
0xc4373dd6aac99ecb046c581f8006c34bda520111b4e575d400241eb59d889e85

奇怪的是大家都抢购失败了,Fail with error 'Auction: auction not OnAuction'但能在卖单的之后的第二个区块,能检测并发起买单的这些科学家的实力都是挺厉害的。

市场活跃度&差价

在比较火的那段时间里,raca nft市场的交易量是特别大的,流动性很足,基本上很多商品只要挂最低价上去,就会被立刻买走。另外,raca nft市场可以批量10个或100个卖出,一般批量的价格会比单个的价格更低,存在一些差价,这当中有套利的机会。