name: 撤销批准 description: 撤销高风险令牌批准以保护钱包安全 version: 1.0.0 author: BlockChain-Copilot Team tags: [安全, 批准, trc20, 保护]
撤销批准技能
何时使用此技能
使用此技能以:
- 撤销高风险令牌批准,由批准扫描器识别
- 取消对未知合约的无限制批准
- 清理旧/未使用的批准
- 保护钱包免受恶意合约利用
- 完成安全审计循环:检测 → 撤销
为什么这很重要
安全风险: 当您批准一个合约(例如,用于交换)时,您授予其花费您令牌的权限。如果:
- 合约被攻破
- 批准是无限制的(
2^256-1) - 合约不再使用
→ 您的令牌处于风险中!此技能撤销这些权限。
工作原理
用户钱包
↓ 步骤 1
scanApprovals() → 查找高风险批准
↓ 步骤 2
revokeApproval(contract, token) → 将批准量设置为 0
↓ 步骤 3
交易确认 → 批准移除 ✅
先决条件
- 有效的TRON钱包地址
- 访问TronGrid API
- 目标令牌合约地址
- 要撤销的支出者合约地址
使用方式
方法 1:撤销特定批准
from skills.revoke_approval.scripts.revoke import build_revoke_transaction
# 撤销一个特定批准
result = await build_revoke_transaction(
owner_address="TYourAddress...",
token_address="TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", # USDT
spender_address="TMaliciousContract..."
)
print(result['unsigned_tx']) # 返回要签名的交易
方法 2:批量从扫描结果撤销
# 1. 扫描高风险批准
from skills.approval_scanner.scripts.scan_approvals import scan_approvals
scan_result = await scan_approvals("TYourAddress...")
# 2. 撤销所有关键风险
for risky in scan_result['risky_approvals']:
tx = await build_revoke_transaction(
owner_address="TYourAddress...",
token_address=risky['token_address'],
spender_address=risky['spender']
)
# 签名并广播交易
示例输出
{
"success": true,
"message": "撤销批准交易创建成功",
"data": {
"owner": "TYourAddress...",
"token": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
"token_symbol": "USDT",
"spender": "TMaliciousContract...",
"old_allowance": "115792089237316195423570985008687907853269984665640564039457584007913129639935",
"new_allowance": "0",
"unsigned_tx": {
"txID": "...",
"raw_data": {...},
"visible": true
},
"estimated_energy": 15000,
"estimated_bandwidth": 345
},
"warnings": [
"⚠️ 这将阻止合约花费您的USDT",
"如果您想再次使用此合约,需要重新批准"
]
}
安全流程集成
完整安全工作流程:
1. scan_approvals() # 检测风险
↓
2. 用户审查结果 # 决策点
↓
3. revoke_approval() # 采取行动
↓
4. 签名和广播 # 执行
↓
5. 钱包受保护 ✅
错误处理
常见错误和解决方案:
NoApprovalFound
错误:未找到此令牌/支出者组合的批准
解决方案:批准可能已被撤销或从未存在
InsufficientEnergy
错误:没有足够的能量执行交易
解决方案:首先使用能量租赁技能租赁能量
InvalidAddress
错误:令牌或支出者地址无效
解决方案:验证地址是有效的TRON地址
实现细节
如何撤销工作:
- 调用TRC20
approve(spender, 0)函数 - 将批准量设置为 0(撤销权限)
- 返回未签名的交易供用户签名
能量成本: ~15,000 能量(~0.5 TRX 或租赁)
可逆: 是的,您可以随时重新批准
与MCP集成
# MCP工具包装器
@mcp.tool()
async def revoke_token_approval(
owner_address: str,
token_address: str,
spender_address: str
) -> str:
"""
撤销令牌批准以保护钱包安全。
参数:
owner_address: 您的钱包地址
token_address: 令牌合约(例如,USDT)
spender_address: 要撤销批准的合约
"""
result = await build_revoke_transaction(
owner_address, token_address, spender_address
)
return format_for_agent(result)
最佳实践
- ✅ 始终先扫描:在撤销前使用
批准扫描器 - ✅ 验证合约:确保您撤销的是正确的合约
- ✅ 明智地批量处理:按顺序撤销多个批准
- ✅ 节省能量:如果撤销许多批准,租赁能量
- ⚠️ 重新批准:如果您想再次使用合约,记住重新批准
演示脚本
用于黑客马拉松演示:
用户: "帮我检查钱包安全"
代理:
1. [调用批准扫描器]
"发现3个风险授权:
- SunSwap: 无限授权 USDT (1年前)
- Unknown Contract: 无限授权 USDC (高风险)"
2. [推荐行动]
"建议撤销这2个高风险授权"
3. 用户: "好的,撤销吧"
4. [调用撤销批准]
"已生成撤销交易,请在钱包中签名确认"
5. [交易签名]
"✅ 授权已撤销,钱包安全等级提升!"
这完成了 数据 → 洞察 → 行动 循环! 🔐
技术说明
- 使用TronGrid
triggersmartcontract端点 - 调用TRC20标准
approve(address,uint256)函数 - 将批准量设置为
0以撤销 - 返回未签名交易(从不接触私钥)
- 兼容所有TRC20令牌