首頁>技術>

幣安智慧鏈逐漸成為DeFi的一片熱土,越來越多的專案從以太坊移植到幣安BSC平臺。 在這個教程中,我們將學習如何開發一個應用Bsc Spider來嘗試發現幣安BSC上交易活躍的BEP20代幣, 從而幫助我們更好地洞察幣安BSC上的DeFi活動。

用自己熟悉的語言學習 以太坊開發 : Java | Php | Python | .Net / C# | Golang | Node.JS | Flutter / Dart

1、Bsc Spider原理概述

如你所知,DeFi運動的基礎是代幣,無論是以太坊DeFi中的ERC20代幣,還是BSC Defi 中的BEP20代幣,都是承載各種DeFi協議的基礎媒介。因此,透過觀察BSC上的BEP20的 交易,我們就可以直觀地瞭解哪些DeFi專案是真正受歡迎的。

BEP20和ERC20一樣,在轉賬時都會觸發一個事件,其原型定義如下:

1
Transfer(address from, address to, uint value);

因此,我們只要從BSC鏈上提取一定週期發生內的BEP20代幣的Transfer事件並按照代幣 合約地址進行分類統計,就可以知道在這個週期中的各種DeFi專案的真實活躍情況了。

在進入實際程式碼之前,讓我們先看一下要使用的開發工具:

Node.js:基礎執行環境,提供js執行時,在這個教程中,我們使用 Node 12 LTS版本ethers.js:輕量的js版本的web3訪問庫,在這個教程中,我們使用 Ethers.js 5.0 版本

BEP20一鍵發幣工具:BSC TokenDIY

2、建立Bsc Spider專案

首先建立一個新的目錄 bscspider,然後進入該目錄執行如下命令初始化:

~$ mkdir bscspider && cd bscspider~/bscspider$ npm init -y

輸出結果類似下面這樣:

接下來安裝我們要用到的主要工具ethers.js:

npm install --save ethers

輸出結果如下:

接下來我們就可以著手程式碼的編寫了。

3、編寫Bsc Spider程式碼框架

用你喜歡的編輯器開啟index.js檔案,複製如下程式碼:

const { ethers }  = require('ethers')async function main(){}  // todomain().then(() => console.log('done')).catch(e => console.error(e))

在上面的程式碼中,我們首先引入ethers庫,然後宣告一個非同步函式main, 注意這裡我們還沒有實現main()函式,只是佔位,在程式碼的最後,我們 呼叫main()函式並恰當地捕捉異常。

4、Bsc Spider:抓取最新區塊的Transfer事件

要抓取最新區塊的Transfer事件,首先需要建立一個Ethers的Provider物件:

const provider = new ethers.providers.JsonRpcProvider('https://bsc-dataseed1.binance.org')

當然如果你有自己的BSC節點,也可以把你的URL傳入JsonRpcProvider建構函式,我們這裡 簡單地使用幣安官方提供的節點URL。

在Ethers中,Provider物件是一個EventEmitter,當發現新的合約事件時,就會 觸發我們提供的監聽函式。不過我們首先需要定義一個filter物件來宣告感興趣的事件:

const filter = {  topics: [    ethers.utils.id('Transfer(address,address,uint256)')  ]}

接下來就可以監聽了。我們只對合約地址感興趣,因此每當看到一個合約地址, 就意味著這個合約發生了一次轉賬交易,簡單地累加交易並記錄在雜湊表counter中 就可以了:

const counter = {}provider.on(filter, async log => {  if(!counter[log.address]) counter[log.address] = 1  else counter[log.address] += 1}

下面就是抓取並處理最新區塊的Transfer事件的程式碼完成後main()函式的程式碼:

async function main(){  const provider = new ethers.providers.JsonRpcProvider('https://bsc-dataseed1.binance.org')  const filter = {    topics: [      ethers.utils.id('Transfer(address,address,uint256)')    ]  }  const counter = {}  provider.on(filter, async log => {    if(!counter[log.address]) counter[log.address] = 1    else counter[log.address] += 1  }    }
5、Bsc Spider:定時轉儲BEP20交易統計資料

為了便於後續分析,我們需要將counter記錄的資料定時轉儲到磁碟檔案,因此用 一個1分鐘的定時器來完成這一操作:

const fs = require('fs')const t1 = Date.now()setInterval(async () => {  const lines = []  for(let addr in counter){    const name = await getTokenName(addr)    lines.push([addr, name, counter[addr]])  }  lines.sort((a, b) => b[1] - a[1] )  fs.writeFile('./counter.csv', lines.join('\n'))  const elapsed = (Date.now() - t1 ) / (60*1000)  console.log(`saved after ${elapsed} minutes, tokens: ${lines.length}`)}, 60000)

在上面的程式碼中,我們使用getTokenName()函式來獲取代幣名稱,以便記錄到轉出 的CSV檔案中,其程式碼如下:

async function getTokenName(address){  const abi = [{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]  const token = new ethers.Contract(address, abi, provider)  return await token.name()}
6、完整的Bsc Spider程式碼
const { ethers }  = require('ethers')const fs = require('fs')async function main(){  const provider = new ethers.providers.JsonRpcProvider('https://bsc-dataseed1.binance.org')  const filter = {    topics: [      ethers.utils.id('Transfer(address,address,uint256)')    ]  }  const counter = {}  provider.on(filter, async log => {    if(!counter[log.address]) counter[log.address] = 1    else counter[log.address] += 1  }      async function getTokenName(address){    const abi = [{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]    const token = new ethers.Contract(address, abi, provider)    return await token.name()  }      const t1 = Date.now()  setInterval(async () => {    const lines = []    for(let addr in counter){      const name = await getTokenName(addr)      lines.push([addr, name, counter[addr]])    }    lines.sort((a, b) => b[1] - a[1] )    fs.writeFile('./counter.csv', lines.join('\n'))    const elapsed = (Date.now() - t1 ) / (60*1000)    console.log(`saved after ${elapsed} minutes, tokens: ${lines.length}`)  }, 60000)  }main().then(() => console.log('done')).catch(e => console.error(e))
7、分析Bsc Spider的轉儲資料

最簡單的方法是用Excel來開啟轉儲的CSV檔案,看起來是這樣:

然後利用excel的資料分析功能。例如繪製最活躍的50種代幣:

是不是和你想的一樣?

原文連結:http://blog.hubwiz.com/2021/03/01/bsc-spider/

9
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 階段一Python核心程式設計:註釋、變數、輸出002