solidity 이 더 리 움 의 ERC 20 의 approve 와 transfer From 의 진정한 의 미 는 무엇 입 니까?
2480 단어 이 더 리 움 솔 리 디 티
위탁 이체 원리 분석:
가설: 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);
}
}