본문 바로가기

BlockChain

Wallet 호환 Token 만들기

지갑에서 확인 가능한 토큰

예제코드를 리믹스에 작성했다.

 

 

작성후 compile ⇒ deploy하려는데 함수 이름과 contract이름이 WalletVisibleToken으로 동일하여 함수를 배포하려고 인식했다.

 

 

그래서 함수 뒤에는 f를 한자 더 하여 이름을 구분해주니 제대로 배포되는걸 확인할 수 있었다.

배포된 각 함수를 사용해 보자.

 

1. transfer : 인자값으로 수신자주소와, 보낼 값을 입력한다.

 

 

2. WalletVisible Token : wallet에 보이는 기본 토큰 개수를 정해준다.

 

 

3. balanceOf : 내 계정의 value(balance)를 확인할 수 있다.

 

 

처음에는 확인할 수 없던 transfer함수를 사용해서 다른계정으로 value를 옮겨보자

remix에서 제공하는 EOA하나에 5만큼 보내본다.

 

 

그리고 balanceOf를 사용하여 call해보면?

 

 

5가 들어있는걸 확인할 수 있다. 거래가 잘 이루어졌다고 볼 수 있다.

 

Wallet 호환 토큰 만들기

이번에는 토큰의 이름, 심볼, decimal을 미리 설정해두고 확인해보자

위의 코드와 동일하지만 기본 값을 포함해준다.

 

    string public constant name = "Wallet Compatible Token";
  string public constant symbol = "WCTKs";
  uint8 public constant decimals = 18;

 

배포 후 decimals, name, symbol이 맞게 배포되었는지 확인할 수 있다.

 

 

지갑호환 토큰이기 때문에 배포를 할때 메타마스크에서 ropsten네트워크와 연결하고 배포해보았다.

배포 후 나온 컨트랙트 주소를 복사 후 메타마스크에 추가 하니

 

 

토큰 심볼과 decimal이 잘 들어가 있다.

토큰 발행 개수를 지정해준뒤 한번더 transaction을 일으켰다.

 

 

wei기준이라는 걸 까먹고 100개랍시고 100을 넣은 자의 최후였다.

다시 wei기준으로 100개를 넣어봤다.

 

 

잘 들어왔군!

일반화된 지갑 호환 토큰 만들기

토큰 이름, 심볼, 기본 값을 하드코딩해서 정하지 않는 코드이다.

 

 

배포 후 각 값을 정해주고

 

 

트랜잭션 주소를 메타마스크에 추가하면

 

 

값들이 잘 들어간걸 확인할 수 있다.

안전한 토큰 만들기

1. 송신자가 자신이 보유한 금액보다 더 많은 금액을 보내려고 하는지 체크

if(balanceOf[msg.sender] < _value) return;

2. 오버플로우 방지를 위해 보유금액 + 송금금액 이 원래 보유금액보다 작아지는지 체크

if(balanceOf[_to] + _value < balanceOf[_to]) return;

 

UnsercureGeneralWalletCompatibleToken2

 

 

UnsercureGeneralWalletCompatibleToken3

→ 2와 같지만 조건문을 함수 초반에 배치함.

 

 

security확인을 해보기 위해서 generalWalletCompatibleToken에서 토큰을 배포하고 가지고 있는 토큰 개수를 확인했다. 여기서 토큰 개수를 확인할때는 wei계산을 따로 안해줘서 그냥 보기 쉽게 만개를 배포했다고 치고 배포하였다.

 

 

다른 계정에 토큰의 개수를 확인해본다. 당연히 0이 나옴

 

 

개수가 0인 계정에 500개를 보내본다.

 

 

다시 밸런스를 확인해보면?

 

 

500개가 잘 들어왔다.

여기서 확인하고 싶은건 사실 내가 가지고 있는 현재량보다 더 많이 송금할 수 있냐 이니까 현재 9500개가 남은 원래계정에서 다른계정으로 10000개를 보내보겠다.

 

 

원래는 9500개 밖에없는 내가 10000개를 전송할 수 없어야 하지만 아주 잘 전송된 모습을 볼 수 있다. 그럼 새로 배포한 Unsecure~3 컨트랙트에서는 이런 상황에 코드가 종료되는지 살펴보자

일달 토큰 배포, 확인

 

 

그 후 다른 계정에 20000개를 보내보자

 

 

그 후 같은 계정의 balance를 확인해 보면?

 

 

들어가기 전에 코드가 종료되어 거래가 체결되지 않은 걸 확인할 수 있다.

이제 if문을 return으로 끝내는게 아니라 revert로 끝내준다.

그렇게 하면 트랜잭션이 실패했을때 변경내용 전부가 트랜잭션 전으로 돌아가기 때문에 데이터 충돌 에러현상들을 막을 수 있다.

 

 

이렇게 배포 후 transfer로 위와 같은 오류를 일으켜 주면 거래가 더이상 진행되지 않고 에러가 발생되는 모습을 확인할 수 있다.

 

 

이 if + revert() 조합을 하나로 옮겨놓은 것이 require()이다.

그럼 위 두 조건문을 require로 간결하게 작성하여 발전시킨다.

require(balanceOf[msg.sender] < _value);
require(balanceOf[_to] + _value < balanceOf[_to]);

'BlockChain' 카테고리의 다른 글

콜, 트랜잭션, 윈도우 geth사용하기  (0) 2022.09.05
부트스트랩 노드  (1) 2022.03.28
[EVM] 이더리움 가상머신  (0) 2022.03.21
머클 패트리시아 트리  (0) 2022.03.14
openethereum 메인넷 구축  (1) 2021.11.30