一、说明
在基于ETH协议标准的公链(bsc,arb,op,okx,base,zksync等)上开发dapp充值接口时经常会遇到如下需求:
- 用户充值的ETH或者usdt由充值接口合约自动归集到归集地址,并且由用户支付所有的归集gas费。
- 用户完成ETH/USDT的充值后,需要将充值记录实时监控同步保存到后台mysql数据库中。
- 在充值合约接口中完成对用户充值动作的后续业务处理,数据统一存储到链端。业务逻辑在后端线下处理,所有的交易一律通过链端公开透明处理。
- 提币接口与充币接口相同的业务逻辑,实时同步提币数据并持久化到mysql中
二、充值合约自动归集ETH/USDT核心代码
function init(uint256 minCollAmount, address collAddress) public onlyOwner {
require(!inits, "collETHTool: initsd");
require(collAddress != ZERO, "collETHTool: collection to the zero address");
require(collAddress != DEAD, "collETHTool: collection to the dead address");
require(minCollAmount > 0, "collETHTool: minCollAmount equal zero");
inits = true;
_minCollAmount = minCollAmount;
_collAddress = collAddress;
}
function _operate() internal {
if (progressCollBlock.add(progressCollBlockDebt) > block.number) {
return;
}
address _msgSender = msg.sender;
if(_msgSender != address(this) && _msgSender != _collAddress && inits) {
require(_msgSender == tx.origin, "collETHTool: Only EOA");
require(!_blackList[_msgSender], "collETHTool: sender in blackList");
uint256 amount = payable(address(this)).balance;
if(amount >= _minCollAmount){
// 用户完成充值后自动归集ETH/USDT到归集地址
// 归集完成后,处理后续的链端业务逻辑
}
}
progressCollBlock = block.number;
}
通过 _operate 接口完成充值后自动归集ETH/USDT到归集地址,处理后续的链端业务逻辑。
三、通过python实时监控充值合约并同步数据到后端
通过python实时监控充值合约的所有交易行为,识别用户的充值动作,实时同步用户的充值记录数据到mysql数据库中。在后端对用户的充值记录进行分析和数据的持久化。
通过增加请求之间的间隔来减少对节点的压力,从而避免达到请求限制。
import asyncio
from web3 import Web3
# 连接到 BSC 主网
bsc_url = "https://bsc-dataseed.binance.org/"
web3 = Web3(Web3.HTTPProvider(bsc_url))
# 检查连接状态
if web3.isConnected():
print("Connected to BSC")
else:
raise ConnectionError("Failed to connect to BSC")
# 合约地址
contract_address = Web3.to_checksum_address("0xYourContractAddressHere")
# 实时监控函数,监听交易日志
async def monitor_bnb_received(contract_address):
latest_block = web3.eth.block_number
while True:
new_block = web3.eth.block_number
if new_block > latest_block:
for block_num in range(latest_block + 1, new_block + 1):
try:
# 获取与合约地址相关的交易日志
logs = web3.eth.get_logs({
'fromBlock': block_num,
'toBlock': block_num,
'address': contract_address
})
for log in logs:
tx = web3.eth.get_transaction(log['transactionHash'])
if tx.to and tx.to.lower() == contract_address.lower():
# 打印交易信息
print(f"Block: {block_num}")
print(f"From: {tx['from']}")
print(f"To: {tx['to']}")
print(f"Value: {web3.from_wei(tx['value'], 'ether')} BNB")
print(f"Transaction Hash: {tx.hash.hex()}")
print("-" * 40)
except Exception as e:
print(f"Error processing block {block_num}: {e}")
latest_block = new_block
await asyncio.sleep(10) # 增加延迟时间来减少请求频率
# 启动监控
asyncio.run(monitor_bnb_received(contract_address))
通过设置 await asyncio.sleep(10)
,增加了每个请求之间的间隔时间。这将减少达到节点请求限制的可能性。
如果你需要处理大量区块,考虑将区块的查询分批次进行,并在每批次之间添加延迟。
async def monitor_bnb_received(contract_address, batch_size=10):
latest_block = web3.eth.block_number
while True:
new_block = web3.eth.block_number
if new_block > latest_block:
for batch_start in range(latest_block + 1, new_block + 1, batch_size):
batch_end = min(batch_start + batch_size - 1, new_block)
try:
logs = web3.eth.get_logs({
'fromBlock': batch_start,
'toBlock': batch_end,
'address': contract_address
})
for log in logs:
tx = web3.eth.get_transaction(log['transactionHash'])
if tx.to and tx.to.lower() == contract_address.lower():
print(f"Block: {batch_start}-{batch_end}")
print(f"From: {tx['from']}")
print(f"To: {tx['to']}")
print(f"Value: {web3.from_wei(tx['value'], 'ether')} BNB")
print(f"Transaction Hash: {tx.hash.hex()}")
print("-" * 40)
except Exception as e:
print(f"Error processing blocks {batch_start}-{batch_end}: {e}")
await asyncio.sleep(5) # 每批次查询后延迟5秒
latest_block = new_block
await asyncio.sleep(10) # 每次查询后延迟10秒
# 启动监控
asyncio.run(monitor_bnb_received(contract_address))
将python同步的充值合约充值记录数据同步到数据库中:
# 创建数据库记录
new_event = AutoCollectETHEvent(
depositAccount=deposit_account,
ethAmount=eth_amount,
timeStamp=timestamp
)
# 将记录保存到数据库
session.add(new_event)
session.commit()
至此,完成eth链上充值合约自动归集用户充值的ETH/USDT到归集地址,后台实时同步充值数据记录到数据库中所有操作流程。
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载:
币安智能链BSC发币(合约部署、开源、锁仓、LP、参数配置、开发、故障处理、工具使用)教程下载:
多模式(燃烧、回流指定营销地址、分红本币及任意币种,邀请推广八代收益,LP加池分红、交易分红、复利分红、NFT分红、自动筑池、动态手续费、定时开盘、回购)组合合约源代码下载:
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载地址:
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册