重新构思方案
昨天开完会发现,其实思路非常不清晰……我看到那个文件是个本科生用AI瞎写的……我还搁那理解上了……
任务期望
-
备注:不强制要求落地可行,让论文自圆其说,并看起来有一定工作量即可。
-
任务目标:用于监管区块链上非法交易。通过发污点币的方式,标记一些可以的账户地址。还要有风险继承机制:这个非法账户地址后续发生交易的时候(例如给别人转账,可能涉及洗钱),就自动把转账接收方也标记为非法账户(但是风险评分略低一点,限制一下这个递归深度)。
整理后专业表述:设计并实现一种可用于区块链监管的智能合约机制,通过向目标地址“强制铸造”特殊标记代币(如监管标签币、污点币)的方法,对涉嫌非法交易的链上账户进行风险标记。当被标记账户后续发生转账(如向其他地址转账资金、资产),系统自动检测该行为,并按预设规则将“风险标签”继承给接收方,实现链上风险传播和追踪。同时,为防止标签泛滥,风险评分应根据传播路径逐步递减,并限制最大递归深度或生命周期,确保监管传播的合理性和可控性。
- 不明确的问题:
- 污点币用什么标准?得有一个令人信服的理由。原来说用ERC-1155,但是发现并没有独特优势,本质上和在合约里记录一个黑名单数组一致。这个过程得说得通。
- 如何实现风险继承?理论上应该不可能控制标记账户在发生转账时,通知我们的合约吧?这种方式有实现的可能吗?或者有其他可行的方案实现这种风险标记的病毒式传播吗?
风险继承的功能,无法通过只部署一个监管智能合约完成。
风险地址进行交易时,绝对不会主动通知我们的监管合约,智能合约也无权监控其他账户的交易信息。
EVM合约只能直接读取当前区块、自己管理的状态(变量、mapping、event等),无法访问链上所有历史交易。
- 不能“遍历链上所有账户的历史转账记录”。
- block对象和msg.sender只能看当前块、当前交易上下文。
你无法在合约内查某个地址的完整资金流入/来源,除非这些信息在合约里有显式记录。
以太坊全节点本身可以回溯任何交易,但EVM合约内不提供“全链交易遍历”接口,否则极易被滥用为拒绝服务攻击(DoS)。
存储、运算费用(Gas)限制,无法在链上原子查全历史。
所以要实现风险继承功能只有两种方案:
-
只监管我们自己发行的货币/商品。
例子:
- 平台发行了一批游戏装备道具,作为NFT(基于ERC-1155)资产。所有装备的转让、买卖都必须通过平台的智能合约。
- 某个玩家A被平台判定为“外挂/黑产账户”。
- 管理员调用合约,将A的地址标记为高风险,并在其账户上强制铸造“风险标签NFT”。A并不知情,且无法销毁风险标签。
- 玩家A将装备NFT转让或出售给玩家B(这个过程一定会经过平台的智能合约)
- 合约在每次NFT转账前,会检查“from”地址是否有风险标签。
- 如果有,则自动把风险标签NFT(或降低风险等级的新标签)铸造给B,并递减风险等级、更新继承深度等元数据。
- 如果达到最大传播深度或过期,继承停止。
-
要监管整个以太坊上的交易,必须链上链下合作。链下溯源 + 链上标记
链上标记的意义:
- 数据公开、可验证、不可篡改(去中心化基础意义)
- 可与其他智能合约联动:其他平台的智能合约可以申请加入我们的监管合约,实时查询某个账户的风险等级。
- 还可以说统一标准、跨平台联动风险处置等等……
简要流程:
- 人工(或AI自动监管程序)调用监管智能合约,标记风险地址存于链上
- 链下监控以太坊交易数据,将风险地址的下游自动标记为风险地址
- 调用监管智能合约,将风险地址存于链上
其他平台想查询某个地址的风险等级,只需要调用监管智能合约的
queryRisk(address)函数即可**问题:**这样看起来似乎完全没有创新点,只不过是把风险地址存到了区块链上而已?核心工作都在如何识别风险地址、如何评估风险等级。
明确一下昨天说的,铸造污点币完全等价于链上黑名单:
- 区块链中的货币、NFT,并不是分散在各个私人钱包里的,而是记录在智能合约里的
- 以ERC-1155为例,其智能合约里有一个私有变量,
_balances[代币ID][address] = amount - 例如
_balance[1][0x1234....] = 100表示0x1234… 这个账户里有 100 个1号代币。 - 我们所谓的“用代币做风险标记”,就是:
_balances[风险代币ID][0x1234...] = 1表示0x1234…这个账户被标记为有风险,或者风险等级为1。 - 这和在链上存一个黑名单变量:
_blacklist[0x1234....] = 1是完全等价的。
方案
contract RLSToken:
owner: address
controller: Map[address, bool]
rlsTokens: Map[address, int256]
function setController(address addr, bool authorized):
assert msg.sender == owner
controller[addr] = authorized
function forceMint(address target, int256 amount):
assert msg.sender in controller
rlsTokens[target] = amount
function onTransfer(from, to):
if rlsTokens[from] and not rlsTokens[to]:
rlsTokens[to] = _calculateRiskScore(from, to)
function queryRisk(address target) -> int256:
assert msg.sender in controller
return rlsTokens[target]
contract Stablecoin:
_RLSToken: RLSToken
function transfer(to, amount):
_RLSToken.onTransfer(msg.sender, to)
_transfer(msg.sender, to, amount)
function transferFrom(from, to, amount):
_RLSToken.onTransfer(from, to)
_transfer(from, to, amount)