ForExchange
이 문서는 IOST 블록체인을 간단히 소개합니다. 대상 독자는 거래소 개발자이며, 주요 내용은 IOST 퍼블릭 체인의 경제 모델, 계정 생성 방법, 트랜잭션 송신, 트랜잭션 확정 입니다.
이 데모는 IOST의 JavaScript SDK를 기반으로 작성되었습니다. JavaScript SDK 문서 JavaScript SDK
메인넷의 기본 특성
- 네트워크는 0.5초마다 한 블록을 생성하며, 한 노드가 6 블록을 연속해서 생성합니다.
- 블록 생성 위원회는 17석으로 구성되며 10분마다 갱신됩니다. 매번 Servi 값이 가장 높은 17개의 노드가 위원회에 선출되어 순서대로 블록을 패킹합니다.
- 블록은 2/3 + 1 의 생성 노드가 확정한 뒤 약 40초 정도 후에 불가역(irreversible)이 됩니다.
- IOST 토큰의 최소 단위는 소수점 이하 8자리입니다.
- 시스템은 계정 모델을 사용합니다.
- 실패한 트랜잭션도 블록에 포함되며 Gas 수수료가 차감됩니다.
계정 생성 절차
새 IOST 계정은 반드시 기존 계정으로부터 생성되어야 합니다. 계정 생성 시 Gas를 위해 최소 10 IOST가 새 계정을 위해 스테이킹됩니다.
첫 계정을 얻는 방법:
아직 계정이 없다면 계정 생성 서비스를 사용해 첫 계정을 만들 수 있습니다.
기존 계정이 있는 경우, SDK로 새 계정 생성:
- 우선 기존 계정을 SDK에 import 합니다. 이 계정은 충분한 토큰을 보유하고 있어야 합니다.
- 새 계정용 공개키/개인키 쌍을 생성합니다. 키는 바이트 배열로 저장되며 출력은 base58로 인코딩됩니다.
- 계정 생성 트랜잭션을 만들고 서명합니다.
- rpc를 통해 메인넷 노드로 트랜잭션을 전송하고, 응답을 보고 생성 성공 여부를 판단합니다.
IOST 송금 트랜잭션 절차
송금 트랜잭션은 계정 간에서만 가능하며, 공개키 주소로 직접 보낼 수 없습니다.
송금 단계:
- 트랜잭션을 보낼 계정을 import 합니다.
- 송금 트랜잭션을 만들고 서명합니다.
- rpc를 통해 트랜잭션을 전송하고, 응답을 보고 실행 성공 여부를 판단 합니다.
송금 성공 여부 확인
송금 트랜잭션의 불가역성과 실행 성공 여부를 판단하는 방법은 거래소에 매우 중요합니다. 트랜잭션 확정 문서를 자세히 읽어주세요.
IOST 입출금
IOST는 계정 모델을 사용합니다. 계정을 만들 때는 Token과 Gas가 필요하므로, 거래소가 사용자마다 다른 계정을 만드는 것은 권장하지 않습니다. MEMO를 활용해 입출금을 관리할 수 있습니다.
IOST 송금 트랜잭션 전송에는 RAM 구매가 필요하지 않습니다. Gas를 얻기 위해 IOST를 스테이킹만 하면 됩니다. 트랜잭션 하나는 대략 9000 Gas를 소모합니다. 추가로 IOST 1을 스테이킹할 때마다 매일 추가로 100,000 GAS가 생성됩니다. 모든 IOST 계정은 최소 10 IOST가 스테이킹되어 있으므로, 어떤 IOST 계정이든 하루에 약 100건의 송금을 처리할 수 있습니다. 더 많은 송금이 필요하다면 GAS를 더 얻기 위해 IOST를 추가로 스테이킹해야 합니다.
권장 입금 절차:
- 사용자가 입금 요청을 제출하면, 거래소는 해당 사용자와 연결된 전역적으로 유일한 memo를 찾거나(없으면 생성) 발급합니다.
- 거래소는 IOST 블록체인을 모니터링하여 해당 계정과 memo를 찾습니다.
- 트랜잭션 확정.
권장 출금 절차:
사용자가 IOST 메인넷 계정을 제공하면, 거래소는 위의 IOST 송금 트랜잭션 절차를 참조하여 출금 트랜잭션을 전송합니다.
iost.js SDK의 txHandler를 활용하면 체인 상의 정보를 편리하게 폴링할 수 있고, 체인 확정 후 출금 작업을 완료할 수 있습니다.
IRC20, IRC21 토큰
irc20, irc21 토큰 소개
irc20 과 irc21 은 iost 체인에서 토큰을 발행하는 두 가지 표준입니다.
irc20은 컨트랙트를 작성할 필요 없이 단순히 트랜잭션을 전송하여 시스템 컨트랙트 token.iost의 create 를 호출합니다. irc21 토큰은 irc21 표준의 모든 인터페이스를 구현하는 컨트랙트를 작성해야 합니다. 따라서 irc21 토큰은 토큰 송금, 동결, 소각 등에 대한 개발자의 맞춤 요구를 충족할 수 있습니다. irc21 토큰도 내부적으로는 token.iost 시스템 컨트랙트의 create 메서드로 생성됩니다.
irc20과 irc21 토큰의 고유 식별자는 토큰 심볼입니다. 토큰 심볼은 토큰 시스템 내에서 전역적으로 유일합니다. 예를 들어 토큰 심볼 iet로 irc21 토큰이 있다면, 다른 사람은 같은 심볼 iet로 irc20 또는 irc21 토큰을 생성할 수 없습니다.
irc20 토큰의 송금은 token.iost의 transfer 메서드를 직접 호출하여 수행할 수 있습니다. irc21 토큰의 송금은 해당 토큰 컨트랙트 주소의 transfer 메서드를 호출합니다. irc20과 irc21 토큰의 송금은 RAM을 소모할 수 있습니다. 이미 해당 토큰을 보유한 계정으로 송금하면 RAM이 소모되지 않습니다. 해당 토큰을 한 번도 보유한 적 없는 계정으로 송금하면 약 60 바이트의 RAM이 소모됩니다.
체인 상의 토큰 정보는 getTokenInfo API를 호출해 확인할 수 있습니다. 예시:
curl https://api.iost.io/getTokenInfo/iet/1
{
"symbol": "iet", // 토큰 심볼. 전역적으로 유일
"full_name": "endless token", // 전체 이름. 표시용
"issuer": "Contract8Hkb1ErxyBsHDYf3YHB7Ex9zuPkEQyNwSq1v4xEhzTqE", // 발행자. 계정 또는 컨트랙트
"decimal": 4, // 소수점 자릿수
"current_supply": "529508805248513", // 최소 자릿수 기준 수량. 실제 양은 529508805248513 / 10000
"total_supply": "1000000000000000", // 공급 상한. 최소 자릿수 기준. 보통 매우 큰 값으로 설정됨
"can_transfer": true, //
"only_issuer_can_transfer": false, // 토큰을 토큰 컨트랙트를 통해서만 송금할 수 있는지. ERC20은 모두 false. ERC21은 대부분 true. 발행자가 토큰 컨트랙트를 통해 송금 로직을 관리해야 할 때, 시스템 컨트랙트를 통한 직접 송금을 금지하는 경우.
"total_supply_float": 100000000000, // 공급 상한
"current_supply_float": 52950880524.8513
}
계정 잔액은 getTokenBalance API를 호출해 확인할 수 있습니다. 예시:
curl https://api.iost.io/getTokenBalance/onblockp1/iet/1
{
"balance": 4292197.5628, // 사용 가능 잔액
"frozen_balances": [] // 동결된 잔액 목록
}
irc20, irc21 토큰 송금 예제
IRC 20 JS SDK 샘플 코드 IRC 21 JS SDK 샘플 코드
IOST, IRC20, IRC21 토큰 비교
| IOST | IRC20 토큰 | IRC21 토큰 | |
|---|---|---|---|
| 생성 방식 | 제네시스 블록 내부 | 사용자가 token.iost의 create 호출 | 사용자가 커스텀 컨트랙트를 배포하고, 그 안에서 token.iost의 create 메서드를 호출 |
| 고유 식별자 | 토큰 심볼 | 토큰 심볼 | 토큰 심볼 |
| 송금 방식 | token.iost의 transfer | token.iost의 transfer | 해당 토큰 커스텀 컨트랙트의 transfer |
| 송금 시 자원 소모 | gas | gas와 ram | gas와 ram |
| 송금 판정 | 문서 | 문서 | 문서 |