알쓸신블-2-pending 상태의 transaction을 삭제할 수 있을까?

김선태
김선태
Sep 1, 2018 · 5 min read

pending 상태의 transaction을 삭제할 수 있을까?

질문함에서 가장 마음에 드는 질문 중 하나다.

답부터 말하자면

삭제는 못하지만 무효화는 가능하다.

‘왜?’ 라는 물음에 완벽하게 답하기 위해서는 아래와 같은 지식이 요구된다

트랜잭션 싸인과 검증 with accounts’ nonce in ethereum

replay attack

채굴

pending / confirm 차이

수수료 정책

나는 위의 질문을 보고 이런 방법이 떠올랐다

pending중인 트랜잭션과 동일한 넌스값을 가진 빈 트랜잭션을 보내고, 그게 블록에 포함된다면?

기존 트랜잭션은 비정상 트랜잭션으로 인식되어 블록에 포함되지 못할것이다.

그러나 그러려면 먼저 전파된 트랜잭션보다 빨리 블록에 포함돼야한다. 비트코인이나 이더리움이나 대부분의 코인은 트랜잭션 우선 순위를 “지연시간”과 “수수료”의 크기로 결정하고, 지연 시간은 역전될 수 없으니 수수료를 더 높게 해서 보내면 되겠구나!

그러나 기존 트랜잭션 보다 항상 빨리 처리되는것은 아닐테니, 실패 확률도 있겠다.

이더리움 기준으로 위의 생각에 사용된 배경 지식

여기서 이해하고 넘어갈 것은 ‘동일한 넌스값’ 부분이다. 아주 단순하게 설명해서 “A가 B에게 1코인을 전송한다.” 라는 내용의 트랜잭션이 정상임을 증명하기 위해 트랜잭션의 내용을 A(송신자)의 개인키로 서명한것을 덧붙인다. 이것을 시그니쳐라고 한다.

트랜잭션을 수신하고 블록에 담는 채굴자는, 이 시그니쳐를 A의 공유키로 해석해보고 트랜잭션 데이터와 비교했을 때 동일하다면, 트랜잭션이 정상적이라고 처리한다. 그러나 이 경우엔 replay attack에 취약해진다. replay attack이란 동일한 트랜잭션을 수차례 발생시켜도 정상적이라 판단되는 경우 가능한 공격이다. 가령 B가 이익을 목적으로 A가 1코인을 송금할 때 만든 시그니쳐를 이용해 [A — (1 coin) →B] 이라는 트랜잭션을 계속 발생 시킬 수 있다. 그렇기 때문에 하나의 시그니쳐는 한번만 사용이 가능해야하고, 이래서 생긴것이 account nonce이다. (이것은 채굴에서 사용되는 그 nonce값과는 전혀 다른것이다.) nonce값은 시그니쳐 생성에 포함되며, 트랜잭션이 컨펌되는 경우 송신자 계정의 nonce값이 1씩 올라간다.

그 결과 [nonce 1, A — (1 coin) →B] 라는 트랜잭션에 사용된 시그니쳐를 이용해 replay attack 을 하려해도, 이미 앞서 처리된 트랜잭션으로 인해 계정의 nonce값은 2 이상이 되기 때문에 시그니쳐를 재활용할 수 없게되는것이다. (비트코인의 경우 송금할 때 사용된 utxo가 소멸되기 때문에 account nonce가 필요없다.)

sha256([nonce 1, A — (1 coin) →B] ) != sha256([nonce 2, A — (1 coin) →B])

쉬운 이해를 위해 대칭키 암호화가 아닌 해쉬 함수를 예제로 들었다.

여기까지 이해했다면, 하기 질문에 답할 수 있을것이다.

.

.

쉽다. 일단 블록에 포함되기 전엔(pending) 둘 다 정상 트랜잭션이다. 그러나 둘 중에 한 트랜잭션이 블록에 포함(confirm)되면 이 계정의 nonce값이 변하기 때문에, 이전의 nonce값을 이용해 생성된 트랜잭션은 비정상 트랜잭션이 된다. 즉, 무시 당한다.

이더리움의 경우에는 초당 처리량이 높지 않고, pending 상태에 걸리는 경우가 흔한데, 위의 내용을 이용하면 pending 트랜잭션을 삭제(무시하게 만들기)가 가능하다.

마무리

블록에는 포함 가능한 트랜잭션 수가 정해져있다. 그러니 당연히 모든 트랜잭션을 블록에 항상 다 넣지는 못하고, 수수료와 지연 시간으로 가중치를 측정하여 블록에 포함하게 된다.

pending중인 경우 지연 시간과 수수료의 가중치가 상대적으로 높지 않다는 의미이다. 만약 동일한 넌스값을 가진 빈 트랜잭션을 더 높은 수수료로 발생시키는 경우, 높은 확률로 블록에 먼저 포함되어 account nonce값을 변경 시킬것이다. 그러면 지연중이던 기존의 트랜잭션은 비정상 트랜잭션이 되어 무시된다.

끝!

알쓸신블

알아두면 쓸데있는 신나는 블록체인

김선태

Written by

김선태

Blockchain lover

알쓸신블

알아두면 쓸데있는 신나는 블록체인

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade