블록체인
@켄타님이 위키 내용을 고쳤습니다.

ERC20

ERC20이란?

https://eips.ethereum.org/

이더리움의 표준안을 제안하는 곳에서 20번째로 제안된 글로

토큰에 관련된 표준안을 제안한 .

https://eips.ethereum.org/EIPS/eip-20

지갑 다른 어플리케이션에서 토큰의 전송 사용할 있게 하는 것이 표준안의 목적

 

구현해야 하는 함수들

선택

function name() view returns (string name)

function decimals() view returns (uint8 decimals)

function symbol() view returns (string symbol)

 

필수

function totalSupply() view returns (uint256 totalSupply)

function balanceOf(address _owner) view returns (uint256 balance)

function transfer(address _to, uint256 _value) returns (bool success)

function transferFrom(address _from, address _to, uint256 _value) returns (bool success)

function approve(address _spender, uint256 _value) returns (bool success)

function allowance(address _owner, address _spender) view returns (uint256 remaining)

 

이벤트

event Transfer(address indexed _from, address indexed _to, uint256 _value)

event Approval(address indexed _owner, address indexed _spender, uint256 _value)

 

구현방법

Implementation of adding the force to 0 before calling “approve” again:

- 리퍼런스

1.

https://medium.com/gocryptobot/gocryptobot-gcc%ED%86%A0%ED%81%B0%EC%9C%BC%EB%A1%9C-%EB%B0%B0%EC%9A%B0%EB%8A%94-erc20-%ED%91%9C%EC%A4%80-9fc75f8505ac

 

2.

https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC20/StandardToken.sol

 

 

-------------------------

2. 이더리움 보안 관련 알아보기

- approve 에 관련된 공격 알아보고 추가하기

spender의 allowance의 수치를 변경할 때는 approve를 호출해서 변경하도록 권고하고 있는데, 이 수치를 변경하려고 트랜잭션을 일으켰을 때

spender가 본인의 계좌로 이 전 수치만큼 인출 후 위의 트랜잭션이 통과되면 인출 수치 + 새로 변경된 수치 만큼 인출이 가능해짐.

반드시 수치를 변경할 때는 0으로 먼저 변경 후, 원하는 수치로 변경하기를 권고.

위의 상황을 변경할 때는

바로 변경하는 것이 아닌, increase, decrese로 변경하는 것을 구현하는 것이 좋음

 

- sageMath = overflow

overflow와 underflow문제.

이더리움에서는 오버플로우와 언더플로우 발생 시, 발생했다고 알려주지 않음

그래서 오버플로우로 수치는 0로 만들거나 언더플로우로 공격해서 수치를 맥스로 만들어 버릴 수 있음 

- 해결방안. 계산 한 수치에 대한 조건 추가

--------------------

pragma solidity ^0.4.22;
import 'zeppelin-solidity/contracts/ownership/Ownable.sol';
import 'zeppelin-solidity/contracts/math/SafeMath.sol';


contract ParksCoin is Ownable{

using SafeMath for uint256;

string public name;
string public symbol;
uint8 public decimals;
uint256 public totalSupply;


mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) private approve_;

event Transfer (address indexed _from, address indexed _to, uint256 value);
event Approval (address indexed _owner, address indexed _spender, uint256 _value);

constructor(string _name, string _symbol, uint8 _decimals, uint256 _totalSupply) public{
name = _name;
symbol = _symbol;
decimals = _decimals;
totalSupply = _totalSupply;
balanceOf[msg.sender] = 1000;
}

function transfer(address _to, uint256 _value) public returns (bool success){
_transfer(msg.sender, _to, _value);
return true;
}

function _transfer(address _from, address _to, uint256 _value) private returns (bool){
require(balanceOf[_from] >= _value);
balanceOf[_from] = balanceOf[_from].sub(_value);
balanceOf[_to] = balanceOf[_to].add(_value);
emit Transfer(_from, _to, _value);
}

function approve (address _spender, uint256 _value) public returns (bool){
approve_[msg.sender][_spender] = _value;
emit Approval(msg.sender, _spender, _value);
return true;
}

function transferFrom (address _from, address _to, uint256 _value) public returns (bool){
require(approve_[_from][msg.sender] >= _value);
_transfer(_from, _to, _value);
approve_[_from][msg.sender] = approve_[_from][msg.sender].sub(_value);
return true;
}

function allowance(address _owner, address _spender) public view returns (uint256){
return approve_[_owner][_spender];
}

function increaseApproval(address _spender, uint256 _increment) public {
approve_[msg.sender][_spender] = approve_[msg.sender][_spender].add(_increment);
emit Approval(msg.sender, _spender, allowance(msg.sender, _spender));
}

function decreaseApproval(address _spender, uint256 _decrement) public {
approve_[msg.sender][_spender] = approve_[msg.sender][_spender].sub(_decrement);
emit Approval(msg.sender, _spender, allowance(msg.sender, _spender));
}


}

작성
공감해요
기술 가이드 채널의 다른 게시글 더 보기
기술 가이드 채널의 다른 게시글 더 보기
기술 가이드 채널은? 자세히 보기
빠띠에 쓰이는 기술을 소개하고 그 기술을 익히기 위한 가이드를 모읍니다.
기술 가이드 채널에 가입해서 흥미진진한 소식을 받아보세요.
가입하기