Pre:
朋友有需求,想要监控Raca NFT
市场在BSC链上的实时交易记录特别是某几类物品挂的卖单,比如药水等,方便他可以买到较便宜的物品。
要获取Raca NFT市场的实时交易记录,有两个数据来源:
官方网站爬虫、API
读取bsc每个块的数据
第一种延时严重,存在几分钟的延时,所以采取第二种
读取Bsc Block Data
快速读取block数据
bsc链上约3s左右出一个块,出块的频率很高。
一开始是简单使用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: 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 ): 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" : 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
市场实时交易记录的监控了。
在开发的过程中,也发现了一些有趣的点。
有趣的点:
科学家抢购:
比如该tx 在13151047
区块挂了元兽蛋的卖单,每个以86.5raca
售出
在接下来的几个区块,都有人发单去抢最快是之后的第二个区块:block_num: 13151049
1 2 3 4 5 6 0x62ab3cb23f62459154b652dfb855d4f6f9df4b6fa27363ce69484909f695b94c 0x6e8e06710565fd9cd5f4d8223ed172d817f2e50b5f0aa4f297bf9738bab5b541 0xfd1bee48d470f8bf9b3f4134ea5de7fc323f20b3de2ccd6d8658f02378d97649 0x65ec96412cd5632b8e29225cb8ce96bb76429cc4da68a28ad394643c75a2c8b7 0x094b419c95790a8514193a79e2835db42e7ccc0313a5d6511a486853c06508d3
第三个区块:block_num: 13151050
1 2 3 4 0x23b210a6e49dc724ad7d36ca89c57ca187d6e179d568bfe1f0acba77ab09fbc3 0xfa8327cbd2e3e5d92cc6e23e1b1e0d3d1f40e17976d76047d91da6385396de3f 0x4a93d2d696df10b78a5b69b095a134a6f12642aa76f92239cf0efcc660ab114b
第六个区块:block_num: 13151053
1 2 0xc4373dd6aac99ecb046c581f8006c34bda520111b4e575d400241eb59d889e85
奇怪的是大家都抢购失败了,Fail with error 'Auction: auction not OnAuction'
但能在卖单的之后的第二个区块,能检测并发起买单的这些科学家的实力都是挺厉害的。
市场活跃度&差价
在比较火的那段时间里,raca nft市场的交易量是特别大的,流动性很足,基本上很多商品只要挂最低价上去,就会被立刻买走。另外,raca nft市场可以批量10个或100个卖出,一般批量的价格会比单个的价格更低,存在一些差价,这当中有套利的机会。