ERC865 指南:让代币转账不再依赖 ETH Gas 的“一键”方案

·

什么是 ERC865?

ERC865 是一类 信息性 ERC 提案,其核心目标只有一个:让用户用支付“代币交易费”来代替传统的 ETH Gas 费,一次性完成转账
一句话总结:“区块链买单”不再由终端用户承担,而由第三方代付,收益以代币形式结算。

解决什么痛点?

关键词:ERC865、Gas 抽象、代币转账、免手续费钱包、Web3 UX

全流程拆解

以下 A、B、D、X、Y、T、N 的含义请务必记住:

一、离线阶段:生成预签名

  1. A 询价 D,确认本次服务费率 Y 折合人民币 ¥0.3(举例)。
  2. A 用私钥对 sha3(N,A,B,D,X,Y,T) 进行签名,得到 {V,R,S}。
  3. A 将 {V,R,S} 和原始 Payload 通过任意加密通道交付 D。

二、链上阶段:Delegate 提交

D 调用:

T.delegatedTransfer({
  signature: {V,R,S},
  nonce: N,
  from: A,
  to: B,
  value: X,
  fee: Y
})

合约内部校验后,发生两笔转账:

👉 想立即体验零 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);

延伸场景与案例研究

关键词:元宇宙 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 汇率 佣金倍数” 实时返回报价。


开发提示 & 风险清单

  1. 客户端要精确对齐 keccak256(abi.encodePacked(...)),最后字节不可多 0。
  2. 给 Delegate 留足够利润,否则无人接单。
  3. 高危:默认 transfertransferPreSigned 可用同一账本,切勿写死“仅限 delegate” 以避免权限误判。
  4. 钱包 UI 需要向用户清晰展示 “你将多付 10 枚 XYZ 代币,免去 0.00021 ETH Gas”
👉 立即锁定实时 Gas 节省收益表,给自己算笔账

总结

ERC865 用最通俗的方式把 Gas & 代币费用隔离,既保护了新手用户的体验,又给第三方创造了 套利补贴 空间。
一句话:“让区块链好玩,不用先交学费。”

关键词回顾:代币转账、Gas 抽象、ERC865、区块链 UX、DeFi 入门