BlockChain>코인간 거래

YU YU·2021년 9월 24일
1

경일_BlockChain

목록 보기
12/24
post-thumbnail

목표
터미널을 사용해 코인 거래를 한다.
준비물
저번에 5블록으로 고친걸로 빌드하고, 6개 이상의 블록을 만든다.

1. 코인거래의 조건

각각의 노드가 연결되어있어야 한다. (peers가 되어있어야 한다.)

코인을 거래하려면 같은 네트워크 상에 있어야 한다. 네트워크 연결이 되어있어야 한다. p2p나 웹소켓처럼 연결되어있으면 되는 것이다.

상대방의 주소를 알아야 한다.

상대방도 나의 주소를 알아야 한다.

2. conf파일 설정


이렇게 서버2개와 클라이언트 2개 즉, 터미널을 4개를 실행한다. 일단 먼저 내가 빌드한 코인의 폴더를 보여주도록 하겠다.

  • 서버2 데몬 실행

    💥data2폴더인것을 명심하자💥`
  • 서버2클라이언트 실행
  • 서버1 서버 실행
  • 서버1 클라이언트 실행

2-1. conf파일 설정하기

매번 저렇게 인라인 스타일로 쓰기엔 너무 힘들다. 간단하게 conf파일을 설정하면 저러한 인라인스타일을 피할 수 있다. 코인>bin폴더에 저장해주자.

pencoin1.conf

pencoin2.conf

  • rpcallowip:127.0.0.1일때만 요청에 응답을 줄거라는 내용
  • addnode: peers를 연결하는 역할.
    첫번째 데몬의 p2p서버에 연결하겠다는 내용임.
    저번 빌드하는 내용을 보면 9233으로 설정되어있는 부분이 보일 것이다.

위와 같이 메모장에 써서 저장해준 다음에 데몬파일을 실행해보자. 아까보다 명령어가 간단해진 것을 알 수 있을 것이다.

  • 서버1
    .\pencoind.exe -printtoconsole -conf=C:\Users\SH\pencoin\bin\pencoin1.conf -datadir="C:\Users\SH\pencoin\data1"
  • 서버2
    .\pencoind.exe -printtoconsole -conf=C:\Users\SH\pencoin\bin\pencoin2.conf -datadir="C:\Users\SH\pencoin\data1"

클라이언트를 실행할 때에도 간단하게 실행할 수 있다.

  • 클라이언트1
    ./pencoin-cli.exe -conf="C:\Users\SH\pencoin\bin\pencoin1.conf" getbalance

    ⁉ 200개가 100개가 되어버렸다!!!!!ㅇ0ㅇ!!!!
    conf파일 설정하고 채굴하자....ㅜㅜ

  • 클라이언트2
    ./pencoin-cli.exe -conf="C:\Users\SH\pencoin\bin\pencoin2.conf" getbalance

0코인이 있음을 확인할 수 있다.

data폴더의 역할
코인의 데이터를 저장한다.
conf파일의 역할
서버 접속의 내용들을 관리한다.

3. 두번째 노드에 주소 생성하기

클라이언트 2

클라이언트 2에서 진행을 하자. 먼저 코인을 입금받기 위한 지갑 주소를 생성하자.
👉 getnewaddress

./pencoin-cli.exe -conf="C:\Users\SH\pencoin\bin\pencoin2.conf" getnewaddress nodeB
위의 명령어를 터미널에 입력해보자. 그러면 다음과 같이 지갑의 주소가 반환된다.

아래와 같은 문자열이 주소가 되는 것이다.
p9ecZ64W4WdK32QT2PrFJrrGgR9PYuNFEx

만약 위의 주소값을 잃어버렸다고 걱정하지 말자. 계정명으로 주소값을 찾는 것이 가능하다.

👉 getaddressesbyaccount
getbalance는 계정이 없는거고, getbalance nodeB는 nodeB라는 이름의 계정의 코인을 반환하는 명령어이다.

지갑의 주소
nodeB라는 계정은 주소가 여러개일 수 있다.

아까와는 다른 pLfTT3sNMGN6z8AKpNff5a4jJ6qoQX7wuf라는 주소값이 또 생겼다.

주소값의 첫글자는 코인의 첫글자로 시작된다. 이건 우리가 저번에 코인의 첫글자에 해당하는 숫자로 바꾸어주었기 때문이다. (i:102)



4. litecoin API

https://litecoin.info/index.php/Litecoin_API
위 사이트에 들어가면 라이트코인의 API에 대해 알아볼 수 있다. 코인의 API가 무엇이냐 하면 우리가 여태껏 터미널창에 입력했던 getbalance 나 generate같은 명령어이다.

👉 getaccount
지갑의 주소값로 계정명을 알아볼 수도 있다.

👉 getblockchaininfo
블록체인의 정보를 알 수 있다.

👉 getpeerinfo
연결된 피어의 정보를 알 수 있다.

👉 getblockhash [블록의 index값]
매개변수로 받은 해당 블록의 해시값을 알 수 있다.

👉getconnectioncount
지금 연결된 노드의 갯수를 알 수 있다.

5. 코인 거래하기

5-1. 코인 보내기

드디어 이제 클라이언트 1에서 그동안 채굴했던 코인을 nodeB에게 보내보자.

클라이언트1

nodeB에 송금할 것이다. 송금할 nodeB의 지갑주소는 pLfTT3sNMGN6z8AKpNff5a4jJ6qoQX7wuf 라고 하자.

👉 sendtoaddress [상대방 지갑주소][보낼 코인 갯수]

b6cde4a3ecf1a89b14948e4d957604a79b1f158ac1ec86146661f2252d7093ba
라고 나온다. 이건 txid값이라 한다. 거래하나에 대한 정보를 담고있는 키값이다.

그 다음에 클라이언트 1에 getbalance를 입력해보면 100코인보다 더 줄어들었음을 알 수 있다. 소숫점단위의 코인이 더 나갔음을 알 수 있다.

소수점단위로 빠진 코인은 수수료의 개념이다. 수수료가 왜 발생되냐면 수수료가 발생되지 않는다면 무분별한 거래를 발생시킬 가능성이 충분하고, 이로 인해 엄청난 리소스를 발생하여 거래가 느려지거나 쓸데없이 많은 전력을 소모시킬 수 있다. 그러기에 무분별한 거래를 방지하기위해 각 거래마다 수수료가 발생된다.

5-2. 코인 받기

클라이언트 2

getbalance nodeB를 입력해봐도 아직은 0코인임을 알 수 있다. 분명 클라이언트1에서 지갑 주소까지 입력했음에도 불구하고 0코인이다. 이상하지 않은가?

그 이유는 거래 이후 클라이언트2가 블록을 생성하지 않았기 때문임을 알 수 있다. 블록을 만들어야지 블록의 히스토리를 가져와서 그제서야 비로소 코인이 nodeB라는 계정의 지갑에 코인이 온다. (사실은 거래가 되었는데 받지 못한 것 뿐이다.) 그렇기에 1블럭을 생성해준다.

👉gettransaction [txid]
하나의 거래 원장에 대한 히스토리를 알 수 있다.
클라이언트 1❗에서 다음과 같이 방금 입력했던 거래의 txid를 입력해보면 다음과 같이 나온다.

confirmation: 1은 반영이 된 것이고, 0은 반영이 안 된 것이다. 클라이언트2의 블록은 생성되고 있나보다. 거래소에선 txid를 DB에 저장한다.

기다리는 동안 드디어 클라이언트2의 블럭이 완성이 되었다.

다시 ❗클라이언트 1❗로 돌아가서 똑같은 명령어를 입력해보자.

그러면 confirmation이 1이 되었음을 알 수 있다. 그럼 노드B의 코인을 알아보자.

100개가 되었음을 알 수 있다. 즉, 거래가 성공했음을 알 수 있다.

profile
코딩 재밌어요!

0개의 댓글