ERC20中的委托转账

委托转账原理分析:

假设:【A账号】有10000个token代币,【B账号】没有token代币,【C账号】也没有token代币

那么:【A账号】委托【B账号】转给【C账号】100个token代币,怎么来实现呢?

首先:【A账号】和【B账号】建立一种委托关联,登录【A账户】执行 approve(B, 100) 方法。

结果:_allowances[A][B] = 100token

然后:登录【B账户】执行 transferFrom(A, C, 100),这里的B就是委托账号发送者,gas从B扣,必须确保token数量小于_allowances[A][B]

总结:其实就是A转入C,但是要经过B的账号来发送交易

contract ERC20 {
    using SafeMath for uint256;
    mapping (address => uint256) internal _balances;
    mapping (address => mapping (address => uint256)) internal _allowances;
 
    // 委托转账,执行这个方法之前必须先执行approve建立委托关联数据加入_allowances中
    function transferFrom(address from, address to, uint256 amount) public returns (bool) {
        _transfer(from, to, amount);

        uint256 currentAllowance = _allowances[from][msg.sender];
        require(currentAllowance >= amount, "实际转账数量超过了委托数量");
        _approve(from, msg.sender, currentAllowance - amount);
        return true;
    }

    // 建立一种委托关联(这个方法也就是在maping对象_allowances中)
    // 添加【需要发送token的人】和委托者【实际转账的人】之间的关系(后续的委托操作会查询这个maping中的数据记录)
    function approve(address spender, uint256 value) public returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }
 
    // 委托关联执行的逻辑
    function _approve(address owner, address spender, uint256 value) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = value;
        emit Approval(owner, spender, value);
    }
 
    // 转账交易执行的逻辑
    function _transfer(address from, address to, uint256 value) internal {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        uint256 senderBalance = _balances[from];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        _balances[from] = senderBalance - value;
        _balances[to] += value;
        emit Transfer(from, to, value);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ERC20是以太坊上的代币标准,Java可以通过以太坊的API(如web3j)来与以太坊进行交互,实现授权转账的代码如下: 1. 授权 ```java //导入web3j相关的类 import org.web3j.abi.datatypes.Address; import org.web3j.abi.datatypes.generated.Uint256; import org.web3j.protocol.Web3j; import org.web3j.protocol.core.DefaultBlockParameterName; import org.web3j.protocol.core.methods.response.TransactionReceipt; import org.web3j.tx.Contract; import org.web3j.tx.ManagedTransaction; import org.web3j.tx.TransactionManager; import org.web3j.tx.gas.DefaultGasProvider; //代币合约地址 String contractAddress = "0x12345..."; //代币转账地址 String fromAddress = "0xabcdef..."; //代币接收地址 String toAddress = "0x123456..."; //代币授权数量 BigInteger tokenAmount = BigInteger.valueOf(10000); //创建web3j实例 Web3j web3j = Web3j.build(new HttpService("https://ropsten.infura.io/v3/your-project-id")); //创建交易管理器 TransactionManager transactionManager = new RawTransactionManager(web3j, credentials); //创建代币合约实例 ERC20Token contract = ERC20Token.load(contractAddress, web3j, transactionManager, DefaultGasProvider.GAS_PRICE, DefaultGasProvider.GAS_LIMIT); //授权代币合约 TransactionReceipt approveReceipt = contract.approve(new Address(toAddress), new Uint256(tokenAmount)).send(); ``` 2. 转账 ```java //代币转账数量 BigInteger transferAmount = BigInteger.valueOf(100); //调用代币合约的transferFrom方法实现转账 TransactionReceipt transferReceipt = contract.transferFrom(new Address(fromAddress), new Address(toAddress), new Uint256(transferAmount)).send(); ``` 以上代码,`ERC20Token`是自定义的Java类,用于与代币合约进行交互,需要根据代币合约的ABI文件生成。具体生成方法可以参考web3j的官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值