# kmtdz-block-chain **Repository Path**: sun_zhengxun/kmtdz-block-chain ## Basic Information - **Project Name**: kmtdz-block-chain - **Description**: 电子钱包第一版 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-04-02 - **Last Updated**: 2022-03-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: 区块链 ## README gloom foot odor rose range coin soon whip tired labor few then 假设:A账号有10000个token代币,B账号没有token代币,C账号也没有token代币!     那么:A账号 委托 B账号 转给C账号 100个token代币 怎么来实现呢?     首先:A账号 和 B账号建立一种委托关联,登录A账户执行approve(b,100)方法结果为:结果:_allowed[A][B] = 100token     然后:在执行登录B账户执行transferFrom(A,C,100),这里的B就是委托账号发送者,gas从B扣,必须确保token数量小于_allowed[A][B]     总结:其实就是A转入C,但是要经过B的账号来发送交易! 委托转账原理分析: 假设:A账号有10000个token代币,B账号没有token代币,C账号也没有token代币! 那么:A账号 委托 B账号 转给C账号 100个token代币 怎么来实现呢? 首先:A账号 和 B账号建立一种委托关联,登录A账户执行approve(b,100)方法结果为:结果:_allowed[A][B] = 100token 然后:在执行登录B账户执行transferFrom(A,C,100),这里的B就是委托账号发送者,gas从B扣,必须确保token数量小于_allowed[A][B] 总结:其实就是A转入C,但是要经过B的账号来发送交易! contract ERC20 { using SafeMath for uint256; mapping (address => uint256) internal _balances; mapping (address => mapping (address => uint256)) internal _allowed; // 执行这个方法之前必须先执行approve建立委托关联数据加入_allowed中 function transferFrom(address from, address to, uint256 value) public returns (bool) { // 这里是自己添加的,方便调试和优化代码 uint allower_value = _allowed[from][msg.sender]; require(allower_value >= value,"实际转账数量超过了委托数量"); // 这里是ERC20自己实现的! _transfer(from, to, value); _approve(from, msg.sender, _allowed[from][msg.sender].sub(value)); return true; } // 建立一种委托关联(这个方法也就是在maping对象_allowed中) // 添加【需要发送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(spender != address(0)); require(owner != address(0)); _allowed[owner][spender] = value; emit Approval(owner, spender, value); } // 转账交易执行的逻辑! function _transfer(address from, address to, uint256 value) internal { require(to != address(0)); _balances[from] = _balances[from].sub(value); _balances[to] = _balances[to].add(value); emit Transfer(from, to, value); } }