167 lines
5.3 KiB
Python
167 lines
5.3 KiB
Python
import asyncio
|
||
import inspect
|
||
from datetime import datetime
|
||
|
||
from public.times import Times
|
||
from init import Init
|
||
|
||
|
||
class Report(Init):
|
||
def __init__(self, coin):
|
||
super().__init__(coin, "report")
|
||
|
||
async def query_mysql_last_height(self):
|
||
sql = f"SELECT MAX(height) AS max_height FROM {self.coin}_blkreportprofitv2;"
|
||
data = await self.distribution.exec(sql)
|
||
if not data or data[0]["max_height"] is None:
|
||
raise ValueError(f"{self.coin}当前无报块记录")
|
||
return data[0]["max_height"]
|
||
|
||
async def query_redis_last_height(self):
|
||
data = await self.redis.get(f"{self.coin}:last_check")
|
||
if not data:
|
||
result = await self.query_mysql_last_height()
|
||
await self.redis.set(f"{self.coin}:last_check", result)
|
||
print(f"redis中无{self.coin} last_check数据,采用最后一个报块高度!")
|
||
return result
|
||
return int(data)
|
||
|
||
async def query_chain_last_height(self):
|
||
return int(await self.node.getblockcount())
|
||
|
||
async def insert_blkreportprofit(self, data):
|
||
sql = f"""
|
||
INSERT INTO {self.coin}_blkreportprofitv2
|
||
(date, height, hash, reward, fees, state)
|
||
VALUES
|
||
"""
|
||
values = []
|
||
for item in data:
|
||
sql += "(?,?,?,?,?,?),"
|
||
values.extend([
|
||
item["date"],
|
||
item["height"],
|
||
item["hash"],
|
||
item["reward"],
|
||
item["fees"],
|
||
0
|
||
])
|
||
sql = sql.rstrip(",")
|
||
await self.distribution.exec_transaction(sql, values)
|
||
|
||
async def main(self):
|
||
redis_height, chain_height = await asyncio.gather(
|
||
self.query_redis_last_height(),
|
||
self.query_chain_last_height()
|
||
)
|
||
|
||
if chain_height < redis_height:
|
||
print(f"{self.coin}节点同步出错,节点高度{chain_height},last_check{redis_height}")
|
||
return
|
||
|
||
if chain_height == redis_height:
|
||
print(f"{self.coin}当前节点和last_check高度一致,无需校验")
|
||
return
|
||
|
||
suc_data = []
|
||
|
||
for height in range(redis_height + 1, chain_height + 1):
|
||
check_result = await self.node.verify_block(height, self.REPORT_ADDRESS)
|
||
if not check_result:
|
||
continue
|
||
|
||
block_ret = self.node.block(check_result)
|
||
if inspect.isawaitable(block_ret):
|
||
block = await block_ret
|
||
else:
|
||
block = block_ret
|
||
|
||
suc_data.append({
|
||
"date": Times.utcTime(block["time"] * 1000),
|
||
"height": block["height"],
|
||
"hash": block["hash"],
|
||
"reward": str(block["block_reward"]),
|
||
"fees": block["block_fees"]
|
||
})
|
||
|
||
if not suc_data:
|
||
print(f"{redis_height} - {chain_height} 无报块")
|
||
await self.redis.set(f"{self.coin}:last_check", chain_height)
|
||
return
|
||
|
||
await self.insert_blkreportprofit(suc_data)
|
||
await self.redis.set(f"{self.coin}:last_check", chain_height)
|
||
|
||
|
||
class ReportEnx(Report):
|
||
async def query_blkstats(self, height):
|
||
yesterday = Times.utcTime(
|
||
int(datetime.now().timestamp() * 1000) - 86400000
|
||
).split(" ")[0].replace("-", "")
|
||
|
||
table1 = "enx_pool_blkstats"
|
||
table2 = f"enx_pool_blkstats_{yesterday}"
|
||
|
||
exist_sql = "SHOW TABLES LIKE %s;"
|
||
exist = await self.pooldb.exec(exist_sql, [table2])
|
||
|
||
if not exist:
|
||
sql = f"SELECT date, height, hash FROM {table1} WHERE height > %s;"
|
||
return await self.pooldb.exec(sql, [height])
|
||
|
||
sql = f"""
|
||
SELECT date, height, hash FROM {table1} WHERE height > %s
|
||
UNION ALL
|
||
SELECT date, height, hash FROM {table2} WHERE height > %s;
|
||
"""
|
||
return await self.pooldb.exec(sql, [height, height])
|
||
|
||
async def query_blkreportprofit(self):
|
||
sql = f"SELECT MAX(height) AS max_height FROM {self.coin}_blkreportprofitv2;"
|
||
data = await self.distribution.exec(sql)
|
||
if not data or data[0]["max_height"] is None:
|
||
return 0
|
||
return data[0]["max_height"]
|
||
|
||
async def insertinto_blkreportprofit(self, data):
|
||
sql = f"""
|
||
INSERT INTO {self.coin}_blkreportprofitv2
|
||
(date, height, hash, reward, fees, state)
|
||
VALUES
|
||
"""
|
||
values = []
|
||
for item in data:
|
||
sql += "(?,?,?,?,?,?),"
|
||
values.extend([
|
||
item["date"],
|
||
item["height"],
|
||
item["hash"],
|
||
item["reward"],
|
||
0,
|
||
1
|
||
])
|
||
sql = sql.rstrip(",")
|
||
await self.distribution.exec_transaction(sql, values)
|
||
|
||
async def main(self):
|
||
last_height = await self.query_blkreportprofit()
|
||
data = await self.query_blkstats(last_height)
|
||
|
||
if not data:
|
||
print(f"{self.coin} 无报块")
|
||
return
|
||
|
||
block_data = [
|
||
{
|
||
"date": item["date"],
|
||
"height": item["height"],
|
||
"hash": item["hash"],
|
||
"reward": 333
|
||
}
|
||
for item in data
|
||
]
|
||
|
||
await self.insertinto_blkreportprofit(block_data)
|
||
|
||
|
||
__all__ = ["Report", "ReportEnx"] |