이더리움에서 ERC20을 사용하여 코인을 만들 수 있다. (여기서 20은 어느 개발자가 이더리움에게 제안한 방법중 받아들여진 번호이다.)
ERC20을 사용하여 코인/토큰을 만들 때 중요한 2가지가 있다.
'누가' '얼마나'가지고 있나?(balances) => Transfer(누구에게, 얼마나 보내냐?)
'누가''누구에게''얼마나'허용하냐?(allowed) => TransferFrom(누가, 누구에게, 얼마를 보내냐?)
balaces는 1차원 배열인 반면, allowed는 2차원 배열(테이블)이다.
approve(_spender, _value)함수를 사용하여 msg.sender(실행자)가 _spender에게 _value만큼 허용한다.
allowed[msg.sender][_spender] = _value
그리고 이를 Approval() 함수를 사용해 블록체인에 기록한다.
테이블을 간단히 보면 A, B에게 700의 코인이 있다.
그 코인을 6명에게 표처럼 나누어준다.(approve())
누가 | 누구에게 | 얼마나 |
A | A_1 | 100 |
A | A_2 | 200 |
A | A_3 | 300 |
누가 | 누구에게 | 얼마나 |
B | B_1 | 100 |
B | B_2 | 200 |
B | B_3 | 300 |
만약 A_1이 B_3에게 100개의 코인을 보낼려고 한다면 보통 A_1에서 B_3로 바로 보낸다고 생각할 수 있다.
하지만 여기서 그렇게 생각하면 안 된다. 그 이유는 바로 A_1은 그 코인을 가지고 실제로 가지고 있지 않다.
그저 A가 가진 코인 중 100개를 A가 A_1에게 허용한 것일 뿐이다.
따라서 A가 balances[_from].sub(_value)과 balances[_to].add(_value)함수를 사용하여 B에게 코인을 보낸 후 allowed[_from][msg.sender].sub(_value)을 사용해 A_1에서 보낸 코인만큼 허용된 코인양을 줄인다.
토큰의 이동이 발생하여 ERC20규약에 따라 이벤트를 호출하여 블록체인에 기록된다. (Transfer())(대문자 함수는 이벤트 함수이다.)
여기서 msg.sender는 A_1으로 보내는 사람 _spender는 B_3로 받는사람으로 sender가 호출하는 순간 sender가 가스비를 내고 함수를 실행한다.
하지만 allowed와 balances는 다른 변수이므로, TransferFrom()함수에서 B_3의 허용 코인수를 늘려주진 않는다.
*아직 공부하는 중이라 틀린부분이 있을 수 있습니다. 틀린부분은 댓글로 알려주세요.*
*코인을 홍보하는 댓글은 정중히 사양하고, 그러한 댓글은 삭제조치 될 수 있음을 알립니다.*
'개발일지 > 블록체인' 카테고리의 다른 글
ERC721을 사용한 NFT 코드 이해 (0) | 2022.01.05 |
---|---|
블록 체인은 무엇인가? (0) | 2021.11.30 |