본문으로 건너뛰기

트랜잭션

트랜잭션은 비트코인을 옮겨 달라고 요청하는 지시문입니다. 보내는 사람이 어느 돈을 사용할지 정하고, 받을 주소와 금액을 적은 뒤, 해당 개인키로 만든 전자 서명을 붙여 네트워크에 전달합니다.

비트코인에서는 은행이 송금 내용을 대신 기록해 주지 않습니다. 따라서 보내는 사람이 직접 요청서를 만들고, 여러 컴퓨터가 그 요청이 규칙에 맞는지 확인합니다.

트랜잭션은 무엇을 담고 있을까요?

트랜잭션은 편지 봉투 한 장과 비슷합니다. 봉투 앞면에는 받을 주소와 금액이 적히고, 뒷면에는 어느 돈에서 꺼내 보내는지가 들어갑니다. 여기에 보내는 사람이 직접 만들었다는 전자 서명이 붙습니다.

전자 서명은 트랜잭션에서 보호할 내용에 맞춰 만들어집니다. 일반 송금에 통상 사용하는 방식에서는 모든 출력의 금액과 받는 주소가 보호 범위에 들어갑니다. 서명 후 이 항목을 바꾸면 기존 서명의 검증에 실패합니다. 서명이 보호하는 범위는 서명 방식에 따라 달라질 수 있습니다. 비트코인 개발자 가이드의 서명 범위 설명

은행 송금에서는 은행 전산이 보내는 사람의 계좌에서 금액을 빼고 받는 사람의 계좌에 더합니다. 비트코인에는 그 일을 맡은 중앙 기관이 없으므로, 트랜잭션이 어떤 돈을 사용해 누구에게 얼마를 보낼지 직접 지정합니다.

송금은 어떤 순서로 진행될까요?

1. 사용할 돈을 고릅니다

서명 장치는 개인키를 관리하고 거래에 서명하는 도구입니다. 서명 장치 앱은 내가 사용할 수 있는 돈 가운데 보낼 금액과 수수료를 채울 만큼을 고릅니다. 지폐 몇 장을 주머니에서 꺼내는 것과 비슷합니다. 비트코인의 이 단위는 UTXO라고 부릅니다.

거래에 선택한 UTXO는 통째로 사용해야 합니다. 만 원짜리 지폐로 7,000원을 낼 때 지폐를 찢어 쓸 수 없는 것과 같습니다. 그래서 0.5비트코인짜리 UTXO를 사용해 0.2비트코인을 보내면, 0.5비트코인 전체를 사용하고 남은 금액에서 수수료를 뺀 나머지를 잔돈으로 나에게 돌려보내는 항목을 함께 만듭니다. 즉 입력 합계는 출력 합계와 수수료의 합계가 됩니다. 비트코인 개발자 문서도 사용하지 않은 출력과 잔돈 출력을 설명합니다.

2. 주소와 금액을 적습니다

받는 사람의 주소와 보낼 금액을 트랜잭션에 넣습니다. 잔돈이 있다면 잔돈을 받을 주소와 금액도 출력 항목으로 추가합니다. 하나의 트랜잭션에 여러 받는 사람을 적는 다중 전송도 가능합니다. 여러 건을 따로 보내는 대신 한 봉투에 여러 주소와 금액을 담는 방식이므로, 상황에 따라 차지하는 공간과 수수료를 줄일 수 있습니다.

다중 전송과 다중 서명은 이름이 비슷하지만 다른 개념입니다. 다중 전송은 받는 사람이 여러 명인 것이고, 다중 서명은 돈을 사용하기 위해 여러 개의 서명이 필요하도록 잠그는 방식입니다.

3. 전자 서명을 붙입니다

서명 장치는 개인키를 이용해 트랜잭션에 전자 서명을 붙입니다. 네트워크는 이 서명이 해당 비트코인을 사용할 조건에 맞는지 검사합니다. 개인키는 장치 안에서 관리되며, 서명할 때 개인키 자체가 네트워크에 공개되는 것은 아닙니다.

4. 네트워크에 전파합니다

서명된 트랜잭션은 서로 연결된 컴퓨터들에 전달됩니다. 각 컴퓨터는 규칙에 맞는지 검사한 뒤 이웃에게 다시 전달합니다. 검사를 통과한 트랜잭션은 아직 블록에 기록되기 전까지 대기 중인 상태로 네트워크에 남습니다.

채굴자가 트랜잭션을 블록에 포함하고, 그 블록이 장부에 기록되면 첫 번째 확인이 생깁니다. 이후 블록이 더 쌓일수록 확인 수가 늘어납니다.

송금 전에 무엇을 확인해야 할까요?

비트코인 송금에는 은행에 반환을 요청하는 창구가 없습니다. 주소를 잘못 입력하면 그 주소의 소유자에게 전달됩니다. 소유자가 없는 주소라면 누구도 사용할 수 없고, 금액을 잘못 입력한 경우에도 되돌리기 어렵습니다.

처음 송금한다면 큰 금액을 바로 보내기보다 아주 적은 금액으로 먼저 과정을 확인하는 방법을 생각해 볼 수 있습니다. 송금할 때는 다음 항목을 차례로 살펴보는 것이 좋습니다.

  • 주소는 임의의 메시지나 신뢰하기 어려운 화면에서 가져오지 말고, 신뢰할 수 있는 경로로 받은 주소 전체를 대조합니다.
  • 하드웨어 서명 장치를 사용한다면 서명하기 전에 장치 화면에 표시된 실제 목적지 주소와 금액도 확인합니다.
  • 비트코인 단위와 사토시 단위를 확인하고, 소수점 자리를 잘못 보지 않았는지 살핍니다.
  • 원화 표시가 함께 나온다면 두 금액이 서로 맞는지 비교합니다.
  • 수수료율과 총수수료, 예상 처리 속도를 확인합니다. 수수료율은 보통 sat/vB로 표시하며, 가상 바이트당 사토시를 뜻합니다. 총수수료는 수수료율뿐 아니라 거래의 가상 크기에도 좌우되고, 예상 처리 시간은 보장되지 않습니다.

수수료가 낮으면 거래가 오래 대기할 수 있습니다. 그렇다고 대기 중이라는 이유만으로 같은 금액을 다시 보내면 이중으로 송금할 수 있으므로 먼저 거래 상태를 확인해야 합니다. 서명 장치 앱이 지원한다면 수수료를 조정해 다시 처리하는 방법이 제공되기도 합니다.

대기 중인 거래와 확인 수

보내기 버튼을 누르면 트랜잭션이 네트워크에 퍼지고, 화면에는 대기 중이라는 표시가 나타날 수 있습니다. 이는 반드시 실패했다는 뜻이 아니라 아직 블록에 포함되지 않았다는 뜻입니다.

블록에 실리면 확인 하나가 붙고, 그 뒤에 블록이 추가될 때마다 확인 수가 늘어납니다. 거래 아이디를 블록 탐색기에 입력하면 확인 수, 포함된 블록, 실제 수수료 등을 확인할 수 있습니다. 다만 거래 내역과 주소는 공개 장부에서 누구나 볼 수 있으므로 주소를 불필요하게 공개하지 않는 편이 좋습니다.

잔액이 잠시 달라 보이는 이유

송금 직후에는 잔액이 예상보다 많이 줄어든 것처럼 보일 수 있습니다. 선택한 UTXO 전체를 소비하고 잔돈 출력을 만드는 거래가 앱 화면에 반영되는 방식 때문입니다. 비트코인이 장치 안에서 빠져나가는 것은 아닙니다. 잔돈을 잔액에 반영하는 시점과 대기 중인 금액의 표시는 앱에 따라 다를 수 있습니다.

받는 쪽에서는 다른 사람이 알려 준 주소를 임의로 사용하기보다 자신의 서명 장치 앱이 내어 준 주소를 그대로 사용해야 합니다. 같은 주소를 반복해서 사용하기보다 앱이 새로 내어 주는 주소를 사용하는 방식은 거래 내역이 한 주소에 계속 묶이는 것을 줄이는 데 도움이 됩니다.

비트코인 자체가 이동하는 것은 아닙니다

송금할 때 비트코인이라는 동전이나 파일이 인터넷을 타고 상대방에게 날아가는 것은 아닙니다. 네트워크에 전달되는 것은 사용할 UTXO, 받을 금액과 조건, 서명 등이 담긴 트랜잭션이라는 지시문입니다.

이 지시문이 전체장부에 반영되면 사용한 출력과 새로 만든 출력이 기록됩니다. 서명 장치 앱의 잔액도 장부를 읽어 내가 사용할 수 있는 금액을 계산해 보여 주는 값입니다. 등기부에서 집주인의 이름이 바뀔 뿐 집 자체가 다른 곳으로 옮겨 가지 않는 것과 비슷합니다.

결국 송금 버튼을 누르면 트랜잭션이 만들어지고, 서명된 요청이 네트워크에 전파된 뒤 블록에 기록됩니다. 움직이는 것은 비트코인 파일이 아니라 소유권을 바꾸는 지시문입니다.

링크 복사하기X에 공유페이스북에 공유쓰레드에 공유