Transaction, private key
블록체인에서 자주 언급되는 '트랜잭션'이란 용어가 있다.
한국어로 딱히 용어를 대체하기 힘든 만큼 불친절한 용어인데, 이것에 대해서 용어간 꼬리를 물면서 나름 쉽게 한 번 설명해보려고 한다.
1. 트랜잭션이란 무엇일까?
트랜잭션은 블록체인에 어떤 상태(state)를 '쓰기' 하는 것을 의미한다.
2. 어떤 상태(state)를 쓴다는 것은 무엇일까?
1) 스팀잇의 예
블록체인에 관심있는 사람들은 스팀잇에 글을 올려보거나 읽는 등 활동을 해봤을 것이다.
스팀잇에 내가 쓴 글이 올라간다는 것은 사실 '상태의 변경' 이다.
???
스팀잇에 내가 글을 올렸다는 것은, 기존의 블록체인에 담겨있는 데이터에 '나의 글'이 새로 담긴다는 것을 의미한다.
즉,
이전 상태(기존의 상태): 내 글이 올라가지 않은 기존의 상태
이후 상태: 내 글이 쓰여진 때의 상태
라고 한다면, 내 글이 올라가지 않은 기존의 블록체인 데이터 상태에서, '내가 쓴 글이 올라간' 상태가 되게끔 블록체인에 '요청'하는 것이 결국 트랜잭션을 보내는 것(요청)의 의미이다.
2) 이더리움 전송의 예
국내 거래소나 국외 거래소를 잘 이용하는 사람들은 이 지갑에서 저 지갑으로 이더리움이나 기타 토큰들의 전송을 해봤을 것이다.
사실 이런 토큰들(ERC20)의 전송도 '상태의 변경'이다.
???
내가 가지고 있는 어떤 토큰, 예를 들어 QASH 토큰이라고 하자.
내가 가지고 있는 10 QASH 토큰을 내 친구에게 전송한다는 것은,
이전 상태(기존의 상태): 내 지갑에 10 QASH가 존재하던 상태
이후 상태: 내 지갑에 10 QASH가 없어진 상태, 친구 지갑에 10 QASH가 생긴 상태.
이렇게 이전 상태에서 이후 상태가 되게끔 블록체인에 '요청'하는 것을 의미한다.
이것에 대해서 코드레벨로 보게되면 더 명확하게 이해될 것 같아서 실제 ERC20 토큰의 전송 코드를 보면서 설명해보겠다.
아래의 코드는 QASH라는 ERC20 토큰 중 '토큰 전송' 코드이다.
프로그래밍을 모르더라도 세 가지 용어, 1) balances, 2)_value, 3) msg.sender, 4) _to 의 뜻 만 알면 쉽게 이해할 수 있다.
1) balances - 말 그대로 잔액을 의미한다.
2) _value - 토큰의 양을 의미한다.
3)msg.sender - 말 그대로 '송신자'를 의미한다.
4)_to - 말 그대로 '수신자'를 의미한다.
위에서 언급한 각 용어의 뜻을 알고나면,
balances[msg.sender] 는 "송신자의 잔액" 이고 balances[_to]는 "수신자의 잔액"을 의미한다는 것을 쉽게 파악할 수 있을 것이다.
드래그 된 첫 번 째 라인을 보면,
balances[msg.sender] 에 .sub(_value) 가 적혀있는데, sub은 뺄셈의 그 subtract를 의미한다.
_value에 적힌 토큰 양 만큼 "송신자의 잔액"에서 차감(subtract)하라는 뜻이다.
드래그 된 두 번 째 라인에는
balances[_to]에 .add(_value)가 적혀있는데, add는 덧셈의 그 addition을 의미한다.
_value에 적힌 토큰 양 만큼 "수신자의 잔액"에 더하라는 뜻이다.
위의 두 가지 예, 1)스팀잇에 글 쓰는 예, 2)ERC20 토큰 전송의 예를 보면서 결국 트랜잭션(transaction)이란 단순히 "상태 변경"을 요청을 의미한다는 것을 이해할 수 있을 것이다.
3. private key
그럼 여기서 의문이 생긴다. "상태 변경"을 누구나 요청할 수 있다면 어떻게 될까?
극단적인 예로, 누군가 내 지갑에 있는 QASH 토큰 전부를 자기 지갑으로 전송하는 "상태 변경"이 있을 수 있다.
balances[내 지갑] = balances[내 지갑] - 100,000 QASH
balances[해커 지갑] = balances[해커 지갑] + 100,000 QASH
위에서 봤던 코드를 생각해봤을 때, 이런 상태변경을 요청한다고 해보자. 이게 된다면, 하루 아침에 내 지갑에 있는 모든 토큰을 다 날릴 수 있다. 정말 황당할 것이다.
바로 이 지점이 'Private key' (개인 키)가 개입하는 지점이다.
누구나 '상태 변경'을 '요청'할 수 있다. 위와 같은 요청이 정말 블록체인에 갔다고 해보자.
그 때 블록체인을 유지하는 이더리움의 노드는 하나의 질문을 한다.
이더리움 노드(혹은 채굴자): 이 '상태 변경'을 요청한 사람이 정말 너가 맞냐?
요청자: 맞다.
이더리움 노드(혹은 채굴자): 증거대봐.
요청자: (private key를 통해 서명한 디지털 서명을 건네준다.)
이더리움 노드(혹은 채굴자): (건네받은 디지털 서명을 확인한다.)
위와 같이 트랜잭션 검증의 메커니즘을 요약하자면 결국,
이더리움 노드는 "보내는 사람(상태 변경을 요청한 사람)이 정말 너가 맞냐?" 라고 물어보는 것이고.
private key는 "내가 맞다"라고 인증하는 수단으로 쓰여진다.
바로 이런 점 때문에, private key를 잃어버리거나 다른 사람에게 알려진다는 것은 정말 무서운 일인 것이다. 내가 private key(개인 키)를 가지고 있지 않거나 잃어버렸다면, 이더리움 파운데이션에 비탈릭을 찾아가서 "이거 진짜 내 지갑인데, 내가 어디다 뒀는지 깜빡했는데 어떻게 안되겠니?" 라고 간절하게 부탁해도 못 찾아준다.
블록체인에서 "이게 진짜 내 지갑이 맞는데요" 라는 말을 대신 해주는 수단은 'private key' 외에 존재하지 않기 때문이다.