bitcoinj 로 내가 사용할 비트코인 지갑을 만들어보자 (5) - bitcoinj-dev

in #kr7 years ago (edited)

이제 지갑에 비트코인 약 1.23 BTC가 들어왔습니다.

이제 비트코인을 전송하는 코드를 프로그래밍 해봅니다.

#1. 전송 주소 선택하기

전송할 주소를 선택합니다. 미리 만들어 놓은 주소를 사용해도 좋고, 전에 비트코인을 무료로 제공한 테스트넷 샌드박스의 주소를 사용해도 됩니다. (테스트넷 샌드박스 주소 : 2N8hwP1WmJrFF5QWABn38y63uYLhnJYJYTF)

여기서는 테스트를 위해 미리 만들어 놓은 주소를 사용하겠습니다. (테스트를 위해 만든 주소이니 마음대로 사용하셔도 됩니다. )

n3F4HPZ6MmZZLTG11faas7joKm4fDLfQrh

주소를 입력받는 변수를 하나 만듭니다.

String sendAddress = "n3F4HPZ6MmZZLTG11faas7joKm4fDLfQrh";

#2. 비트코인 전송을 프로그래밍합니다.

모두 전에 작성한 main() 메소드 안에 프로그래밍합니다. (전에 프로그램에 이어서 작성합니다.)

Address address = Address.fromBase58(myWallet.getTestNetParam(), sendAddress);
Transaction tx = kit.wallet().createSend(address, Coin.parseCoin("0.01"));
final Peer peer = kit.peerGroup().getConnectedPeers().get(0);
peer.sendMessage(tx);

비트코인 전송을 위해서는 Transaction 객체를 만들어야 합니다. Transaction 객체는 WalletAppKit의 wallet 객체의 createSend() 메소드로 만들어집니다. 이때 전송할 주소 address와 보낼 코인의 양을 입력합니다. 여기서는 0.01 BTC를 보냅니다.

Transaction을 전송하기 위한 Peer를 선택합니다. 모든 peer를 선택해도 됩니다. 여기서는 첫번째 peer 인 kit.peerGroup().getConnectedPeers().get(0); 를 선택합니다.

그리고 peer로 Transaction을 전송합니다. peer.sendMessage(tx);

화면에 지갑 상태를 출력합니다.

System.out.println(kit.wallet().toString());

이제 10분만 기다리면 됩니다.

#3. 비트코인 전송 확인하기

비트코인 전송을 확인하는 방법은 2가지가 있습니다. 첫번째는 10분을 기다리는 것과, 두번째는 보내는 address 또는 tx id로 전송 상태를 확인하는 것입니다.

로그를 보면 다음과 같은 내용을 볼 수 있습니다.

첫번째 보이는 것은 PENDING이라는 문구 입니다. 이것은 아직 비트코인 Peer로 전송이 되기 전인 대기 상태라고 보시면 됩니다.

두번째는 전송되는 코인 정보입니다.
-0.010227 BTC total value (sends 0.68114603 BTC and receives 0.67091903 BTC)

0.010227 BTC가 사용되었습니다. 왜 0.01이 아닐까요?

네 맞습니다. 바로 수수료입니다. 수수료가 0.000227 BTC가 사용된 것입니다. 비트코인 수수료에 대해서는 다음에 다시 설명하겠습니다.

그리고 현재 Peer 상태를 보여줍니다.

confidence: Seen by 1 peer (most recently: 2018-05-07T23:54:02Z). Pending/unconfirmed. Source: NETWORK

1개의 peer에 전송 중이며, 현재 Pending 상태라고 알려줍니다.

그리고 바로 아래가 tx id 입니다.

a016f2821c413279a90b68b6be8d1e7732a28d1f06a72c38d2055aa47e17e66a

이제 전송 상태를 확인해 봅니다.

#3.1. Address로 확인

수신측 n3F4HPZ6MmZZLTG11faas7joKm4fDLfQrh 주소로 확인해 봅니다.

링크: https://live.blockcypher.com/btc-testnet/address/n3F4HPZ6MmZZLTG11faas7joKm4fDLfQrh/

현재 비트코인 전송 상태가 보이십니까? 1개의 Transaction이 전송되고 있음을 확인할 수 있습니다.
또한 0 Confirmations 상태입니다. 아직 어떤 노드도 승인을 하지 않았습니다.

하지만 제대로 전송은 되었습니다.

#3.2. tx id로 확인하기하기

tx id a016f2821c413279a90b68b6be8d1e7732a28d1f06a72c38d2055aa47e17e66a 로 확인해 봅니다.

링크 : https://live.blockcypher.com/btc-testnet/tx/a016f2821c413279a90b68b6be8d1e7732a28d1f06a72c38d2055aa47e17e66a/

글을 작성하면서 시간이 흘러 2 Confirmations 상태가 되었습니다. 2개의 노드가 승인을 했습니다.

Detail을 보시면 1개의 주소에서 2개의 주소로 Output이 되는 것을 확인할 수 있습니다. n2PiU3Nsp62sjBRHGiiWffvABDSEGHHWrn 주소에서 0.68114603 BTC 가 n3F4HPZ6MmZZLTG11faas7joKm4fDLfQrh 로 0.01BTC를 전송하고, 거스름돈을 n1wLjwuPHCbroxLjbYxrQieD4pXiekAFXj 0.67091903 BTC로 보냅니다.

무언가 이상한 것을 찾으셨나요?

보낸 돈의 주소와 거스름돈을 받은 받는 주소가 다르다는 것입니다. 왜 그럴까요?

이게 바로 HD 지갑입니다. HD 지갑은 보안성을 위해 보낸 주소를 재사용하지 않습니다. 사용한 주소는 잔돈을 0 BTC로 만들어 만약에라도 해킹이 되어도 안전하게 하기 위해서 입니다. 따라서 마지막 주소에만 잔돈이 있기 때문에 매우 안전합니다. 사용할 수 있는 주소도 약 40억개이므로 평생 비트코인으로 거래해도 다 못씁니다.

그리고 또 이상한 것을 찾으셨나요?

수수료입니다. 수수료에 대한 표시가 없습니다. 비트코인은 수수료를 별도로 표시하지 않습니다.

송신 n2PiU3Nsp62sjBRHGiiWffvABDSEGHHWrn 0.68114603 BTC
수신 n3F4HPZ6MmZZLTG11faas7joKm4fDLfQrh 0.01 BTC
잔금 n1wLjwuPHCbroxLjbYxrQieD4pXiekAFXj 0.67091903 BTC


수수료 0.000227 BTC
가 됩니다. 송신 - (수신 + 잔금) = 수수료 인 것입니다.

아마도 통신 데이터 량을 줄이기 위해 수수료를 별도로 표기하지 않은 것으로 보입니다. 수수료는 채굴자들이 가져갑니다.

다시 전송 상태를 한번 더 확인해 보겠습니다.

3/6 confirmations 이 진행되었습니다. 승인이 거의 되었다고 보시면 됩니다.

여기까지 비트코인 전송에 대해서 살펴보았습니다.

  • 다음에는 수수료 처리에 대해 알아 보겠습니다.
Sort:  

수신 주소 오타입니다. n2...가 아니라 n3...입니다.

수정했습니다. :)

pairplay 가 kr-dev 컨텐츠를 응원합니다! :)

감사합니다. kr-dev 가즈아~~~~♡