BSC基础服务GAS Price Service实现

前言

“老板说,小杨,现在的ETH的Gas太贵了,把现在的合约业务都切换到BSC上吧。”, 小杨 – “ 收到,老板” 。。。。。。

开始了连续几周的加班中, 最近在用Metamask钱包上,对应BSC,然后开始修改合约,修改钱包,修改DAPP,俨然重来一遍啊。

本次记录下一些过程,修正BSC下的wallet的币种的价格,修复BSC下的GasPrice 获取服务,本次主要讲解Gas Price的获取, ETH的Gas价格是 BSC 的180x ,大家都切换到BSC吧,一样玩的很hi啊。

BSC Gas Price Service

正文

先讲结果, 通过将钱包的默认Gas价格服务修改到自己搭建的节点上,省下了180x的Gas,虽然没几个币,但是总量算起来还是蛮多的,所以有必要花时间来处理下.

Metamask ETH Gas Price: (单位Gwei)

1
2
3
4
5
6
7
curl https://api.metaswap.codefi.network/gasPrices

{
"SafeGasPrice": "227",
"ProposeGasPrice": "257",
"FastGasPrice": "282"
}

CoinPhD BSC Gas Price: (单位Gwei)

1
2
3
4
5
6
7
8
9
10
11
curl https://coinphd.com/api/bscgasprice

{
"health": true,
"block_number": 6735170,
"SafeGasPrice": 5.0,
"ProposeGasPrice": 5.0,
"FastGasPrice": 6.241,
"InstantGasPrice": 150.0,
"block_time": 3.857
}

从返回的结果来看,ETH 的Gas价格是BSC的 227/5 x 4 = 190 X , 在ETH上做操作的人,都是贼有钱。。。。。。

强烈推荐大家都来BSC上来玩

在Metamask上,使用修改过的Gas Price服务,看到Gas费用基本可以忽略了。

Metamask BSC Gas Price Service

在对BSC的tx进行分析后发现, 土豪很多,7000+ Gwei的gas也大有人在,看到最大的 42538.538, 所以在BSC上争抢交易的事情也在发生,接下来会在写一篇关于BSC上使用gas的土豪分析的文章。

BSC Gas Max / AVG

想想还是把Gas Price服务开源吧,都是学习的过程,进来留在Github上,希望对大家有帮助。

访问: https://github.com/xinqiyang/bscgasprice 下载最新的源码

实现用Python + Web3 实现的,实现了重连和同时获取多个备用节点的国内,BSC提供了3个主节点,但是第三个连不上,目前2个可用。

1
2
3
git clone https://github.com/xinqiyang/bscgasprice
# docker 对外提供服务 0.0.0.0:6669 提供gas price service
docker-compose up -d --build

核心代码:

拿到web3的实例,然后需要设定 poa middleware 之后即可去连BSC了, 在轮询获取 last block 并统计 tx.gasPrice 进行计算,得出gas price的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
    localw3 = web3_instance()
localw3.middleware_onion.inject(geth_poa_middleware, layer=0)
# print(localw3.clientVersion)
latest = localw3.eth.filter('latest')
# print('worker:', latest)
if not skip_warmup and not block_times:
warmup()

while True:
try:
for n in latest.get_new_entries():
process_block(localw3, n)
log.info(str(stats))
if not localw3.eth.syncing:
stats['health'] = True
except:
sleep(5)
localw3 = web3_instance()
latest = localw3.eth.filter('latest')
log.warning("do reconnect ------- {} {} {}".format(int(time.time()), str(localw3), str(latest)))
continue
sleep(2)



def process_block(w3i, n):
block = w3i.eth.getBlock(n, True)
stats['block_number'] = block.number

block_times.append(block.timestamp)
if len(block_times) > 1:
t = sorted(block_times)
stats['block_time'] = round(mean(b - a for a, b in zip(t, t[1:])), 3)

if block.transactions:
prices = []
for tx in block.transactions:
if int(tx.gasPrice) > 0:
prices.append(tx.gasPrice)
blocks_gwei.append(min(prices))
data = pd.Series(blocks_gwei)
for name, q in QUANTILES.items():
if name in ['FastGasPrice']:
stats[name] = round(float(w3i.fromWei(average(prices), 'gwei')), 3)
elif name in ['InstantGasPrice']:
stats[name] = round(float(w3i.fromWei(max(prices), 'gwei')), 3)
else:
price = data.quantile(q / 100)
stats[name] = round(float(w3i.fromWei(price, 'gwei')), 3)
print(stats)
return block

其实比较简单,就是网络有时候有问题, 需要重连,这个地方搞了2个小时,后面只能exception的时候,重新去创建web3连接。

BSC Gas Price Service

这个是跑起来的服务器的日志,发现连接次数太多,会被block一段时间,所以需要增加timeout。

返回的json,针对Metamask的格式进行优化过了,欢迎大家使用。

如果不想大家自己的GasPrice服务节点,可以使用CoinPhD BSC Gas Price Service :

https://coinphd.com/api/bscgasprice

这个api我会一直维护下去。

结语

提供免费的服务给大家,是CoinPhD接下来的方向,DEFI很有意思,BSC比起ETH来,确实更适合国人来用。

Gas Price只是简单的服务,但是之前不注意,还是相当贵的,所以BSC在基础服务上还是需要继续完善啊。

CoinPhD要复活了,接下来多开源一些有用的服务,为DEFI继续搬砖。。

坚持原创技术分享,您的支持将鼓励xinqiyang继续创作!