什么是 ERC865?
ERC865 是一类 信息性 ERC 提案,其核心目标只有一个:让用户用支付“代币交易费”来代替传统的 ETH Gas 费,一次性完成转账。
一句话总结:“区块链买单”不再由终端用户承担,而由第三方代付,收益以代币形式结算。
解决什么痛点?
- 用户体验:新手无需理解“先有 ETH,才能转代币”的尴尬循环。
- 商业场景:游戏内 NFT、会员积分、DApp 空投等皆可 零门槛触达。
- 手续费波动:第三方可将 Gas 风险自行对冲,终端用户只看 稳定代币价格。
关键词:ERC865、Gas 抽象、代币转账、免手续费钱包、Web3 UX
全流程拆解
以下 A、B、D、X、Y、T、N 的含义请务必记住:
- A=付款人
- B=收款人
- D=代付人(Delegate)
- X=转账代币数量
- Y=代币支付给小费数量
- T=代币合约地址
- N=唯一 Nonce,防重放攻击
一、离线阶段:生成预签名
- A 询价 D,确认本次服务费率 Y 折合人民币 ¥0.3(举例)。
- A 用私钥对
sha3(N,A,B,D,X,Y,T)进行签名,得到 {V,R,S}。 - A 将 {V,R,S} 和原始 Payload 通过任意加密通道交付 D。
二、链上阶段:Delegate 提交
D 调用:
T.delegatedTransfer({
signature: {V,R,S},
nonce: N,
from: A,
to: B,
value: X,
fee: Y
})合约内部校验后,发生两笔转账:
- X 枚代币:A → B
- Y 枚代币:A → D(自动化“跑腿费”)
👉 想立即体验零 Gas 转账,点此查看实战 Demo
标准接口速查
| 函数 | 说明 |
|---|---|
transferPreSigned(bytes _signature, address _to, uint256 _value, uint256 _fee, uint256 _nonce) | Delegate 调用的主入口 |
TransferPreSigned(from,to,delegate,amount,fee) | 提醒钱包、浏览器监控链上成功事件 |
注:接口内已使用recover+ecrecover双重校验,确保 A 签名合法且 Nonce 无重用。
代码实现精要
链端(Solidity 简化)
function transferPreSigned(
bytes memory _signature,
address _to,
uint256 _value,
uint256 _fee,
uint256 _nonce
) public returns (bool) {
bytes32 hashed = keccak256(abi.encodePacked(
bytes4(0x48664c16), address(this), _to, _value, _fee, _nonce
));
address signer = recover(hashed, _signature);
require(signer != address(0), "Invalid sig");
bytes32 txHash = keccak256(abi.encodePacked(signer, hashed));
require(!usedHashes[txHash], "Nonce reused");
balances[signer] -= _value + _fee;
balances[_to] += _value;
balances[msg.sender] += _fee;
usedHashes[txHash] = true;
emit TransferPreSigned(signer, _to, msg.sender, _value, _fee);
return true;
}客户端(JavaScript 示例)
const components = [
// 0x48664c16 = 方法选择器
Buffer.from('48664c16', 'hex'),
... formattedAddress(tokenAddr),
... formattedAddress(to),
... formattedInt(amount),
... formattedInt(fee),
... formattedInt(nonce)
];
const hashed = web3.utils.keccak256(Buffer.concat(components));
const sig = ethUtil.ecsign(Buffer.from(hashed.slice(2), 'hex'), pk);延伸场景与案例研究
- 游戏空投:玩家只需举起手机扫二维码,后台 Delegate 默默替付,整个过程 <3 秒。
- DeFi 一起冲:新用户无需先有 ETH 才能参与流动性挖矿,平台直接补贴。
- 订阅制应用:App 内购游戏月卡,手续费早就折算进订阅费里,用户 “0 感知”。
关键词:元宇宙 Gas 代理、零门槛 DeFi、区块链 DeFi UX
FAQ:三分钟解惑
Q1:Delegate 作恶怎么办?
A:D 无法伪造签名,故无法挪动 A 的金额;最大损失是刻意高报价,而 A 可在链上比价拒绝。
Q2:交易失败会扣代币吗?
A:不会。合约先验证签名和 Nonce,若任何检查失败交易会 revert,A 的资产始终安全。
Q3:Nonce 如何防止重复使用?
A:合约把每个 (signer, hash) 标记为已用,重放会触发 require(!usedHashes) 报错。
Q4:兼容 ERC-20 吗?
A:完全向下兼容,部署额外函数即可,旧 DApp 不升级仍能正常转账。
Q5:代币合约必须升级才能用吗?
A:是的,必须新写或继承 transferPreSigned 方法,一层代理无法绕过。
Q6:Gas 价格波动时,Y 如何实时定价?
A:Delegate 可监听链上 Gas oracles,按 “Gas ETH/Token 汇率 佣金倍数” 实时返回报价。
开发提示 & 风险清单
- 客户端要精确对齐
keccak256(abi.encodePacked(...)),最后字节不可多 0。 - 给 Delegate 留足够利润,否则无人接单。
- 高危:默认
transfer与transferPreSigned可用同一账本,切勿写死“仅限 delegate” 以避免权限误判。 - 钱包 UI 需要向用户清晰展示 “你将多付 10 枚 XYZ 代币,免去 0.00021 ETH Gas”。
👉 立即锁定实时 Gas 节省收益表,给自己算笔账
总结
ERC865 用最通俗的方式把 Gas & 代币费用隔离,既保护了新手用户的体验,又给第三方创造了 套利 与 补贴 空间。
一句话:“让区块链好玩,不用先交学费。”
关键词回顾:代币转账、Gas 抽象、ERC865、区块链 UX、DeFi 入门