리믹스(Remix)
https://remix.ethereum.org
브라우저에서 솔리디티를 실행할 수 있는 통합 개발 환경
1. ERC20 호환 Token의 스마트 컨트랙트 생성
ERC20 (Ethereum Request For Comments 20)
이더리움의 표준 토큰 규격
- ERC20 호환 토큰 : ERC20 규격을 준수하는 토큰
→ ERC20 규격을 준수하면 다른 토큰 사이의 교환을 단순하는 ERC20 대응 지갑 개발 가능
1) ERC20 인터페이스
https://eips.ethereum.org/EIPS/eip-20
//Methods
function name() public view returns (string)
function symbol() public view returns (string)
function decimals() public view returns (uint8)
function totalSupply() public view returns (uint256)
function balanceOf(address _owner) public view returns (uint256 balance)
function transfer(address _to, uint256 _value) public returns (bool success)
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
function approve(address _spender, uint256 _value) public returns (bool success)
function allowance(address _owner, address _spender) public view returns (uint256 remaining)
//Events
event Transfer(address indexed _from, address indexed _to, uint256 _value)
event Approval(address indexed _owner, address indexed _spender, uint256 _value)
2) 실습 예제
pragma solidity 0.5.7;
// ERC20 functions
contract ERC20 {
uint256 public _max_supply;
constructor (uint256 max_supply) public {
_max_supply = max_supply;
}
function _mint(address account, uint256 value) internal {
}
}
// Token main contract
contract token is ERC20 {
string public constant name = "rayOshow";
string public constant symbol = "ray";
uint8 public constant decimals = 4;
uint256 public constant initial_supply = 10000 * (10 ** uint256(decimals));
uint256 public constant max_supply = 20000 * (10 ** uint256(decimals));
constructor () public ERC20(max_supply){
_mint(msg.sender, initial_supply);
}
}
https://github.com/OpenZeppelin/openzeppelin-solidity/blob/9b3710465583284b8c4c5d2245749246bb2e0094/contracts/token/ERC20/ERC20.sol
1) 컴파일러 버전 지정
pragma solidity 0.5.7;
pragma 키워드
컴파일러에 소스코드를 처리하는 방법을 정의할 때 사용
- ^0.5.7 : ^사용 시, 한 단계 위 버전(0.6.0 이상)에서는 동작하지 않는다는 뜻
- Remix에서 컴파일러 버전 설정하기
- Remix - Complie 탭
- 선언한 컴파일버전과 동일한 버전 선택
- 0.5.7+commit 선택
2) ERC20 계약 선언
// ERC20 functions
contract ERC20 {
uint256 public _max_supply;
constructor (uint256 max_supply) public {
_max_supply = max_supply;
}
function _mint(address account, uint256 value) internal {
}
}
contract ERC20 {
}
contract
= 객체지향언어의 클래스
uint256 public _max_supply; //최대 토큰 발행량 상태 선언
상태
= 객체지향언어에서 인스턴스변수
uint256 타입
256비트의 unsigned int 타입
- uint의 default 비트 수 : 256 bit
constructor (uint256 max_supply) public {
_max_supply = max_supply;
}
constructor 생성자
스마트 계약을 새로 만들 때 실행
- 이전 버전에서는 contract와 동일한 이름을 사용 : function ERC20(uint256 max_supply) public { }
function _mint(address account, uint256 value) internal {
}
address 주소타입
EOA나 CA 주소 20바이트의 값을 저장
연산자 외 맴버 함수도 있으며, 모든 계약의 핵심을 정의하는 기반
맴버 함수명 | 설명 |
balance | 계정주소에 있는 이더를 wei로 return |
transfer | 계정 주소에 있는 이더를 송금 |
send |
계정주소에 있는 이더를 송금 - 실패 시, false return |
call |
계정 주소에 있는 이더를 송금 - 실패 시, false reutrn
|
delegatecall | 다른 계약을 호출하는 메서드 |
접근제어자
- 변수 default 값 : internal
- 함수 default 값 : public
접근제어자 | 설명 |
external | 외부 계약 및 거래에서 호출 |
public | 계약 안 또는 메시지로 외부에서 호출 |
internal | 계약 안 또는 계약에서 파생한 계약에서 호출 |
private | 계약 안에서만 호출 |
3) 토큰 계약 생성
// Token main contract
contract token is ERC20 {
string public constant name = "rayOshow"; //토큰 이름 설정
string public constant symbol = "ray"; //토큰을 화폐 단위로 나타낼 때의 기호 설정
uint8 public constant decimals = 4; //토큰에서 허용할 소수점 자릿수 설정
uint256 public constant initial_supply = 10000 * (10 ** uint256(decimals)); //초기 토큰 발행량
uint256 public constant max_supply = 20000 * (10 ** uint256(decimals)); //최대 토큰 발행량
constructor () public ERC20(max_supply){
_mint(msg.sender, initial_supply);
}
}
// Token main contract
contract token is ERC20 {
}
is 키워드
상속의 개념을 표현
- 계약 token은 계약 ERC20를 상속한다.
string public constant name = "rayOshow"; //토큰 이름 설정
string public constant symbol = "ray"; //토큰을 화폐 단위로 나타낼 때의 기호 설정
uint8 public constant decimals = 4; //토큰에서 허용할 소수점 자릿수 설정
constant 키워드
상태를 변경하지 않을 때 사용
name, symbol, decimals은 반드시 public으로 선언되어야 한다.
uint256 public constant initial_supply = 10000 * (10 ** uint256(decimals)); //초기 토큰 발행량
uint256 public constant max_supply = 20000 * (10 ** uint256(decimals)); //최대 토큰 발행량
타입 캐스팅
컴파일러는 보통 자동으로 타입캐스팅 진행
타입을 명시하여 타입 캐스팅 진행
1) 작은 타입 값 → 큰 타입 값
2) 큰 타입 값 → 작은 타입 값 : 크기가 작은 타입 값에 맞춰지므로 원래 값을 보장하지 않음 (상위 비트값 삭제)
- uint8 → uint256 (O)
- int8 → int16 (O)
- int8 → uint8 (X) : 음수 표현 불가
- uint160 → address 타입으로 캐스팅 가능
constructor () public ERC20(max_supply){
_mint(msg.sender, initial_supply); //mint함수 설정
}
블록 및 거래 속성 변수
https://solidity.readthedocs.io/en/v0.5.9/units-and-global-variables.html
변수명 | 설명 |
blockhash(uint blockNumber) returns (bytes32) |
지정한 블록의 해시값 return - 현재 블록을 제외한 최신 256블록에만 사용가능 |
block.coinbase (address payable) | 현재 블록 채굴자의 주소 return |
block.difficulty (uint) | 현재 블록의 난이도 reutrn |
block.gaslimit (uint) | 현재 블록의 가스 제한량 return |
block.number (uint) | 현재 블록의 번호 return |
block.timestamp (uint) | 현재 블록의 타임스탬프를 as seconds since unix epoch로 return |
gasleft() returns (uint256) |
남아있는 가스 return (=msg.gas) |
msg.data (bytes calldata) | 완전한 호출 데이터 return |
msg.sender (address payable) | 메시지 보낸 사람을 return |
msg.sig (bytes4) | 호출데이터의 첫 4바이트를 return(함수 식별자) |
msg.value (uint) | 메시지와 함께 보낸 wei를 return |
now (uint) | 현재 블록의 타임스탬프 return (alias block.timestamp) |
tx.gasprice (uint) | 해당 가스의 거래 가격 |
tx.origin (address payable) | 거래 발신자를 return (full call chain) |
'Studynote > Blockchain' 카테고리의 다른 글
[솔리디티/Solidity] 비트코인과 이더리움의 차이 (0) | 2019.06.08 |
---|
댓글