이더리움 트랜잭션 malleability 문제

이더리움은 ECDSA 이용하여 트랜잭션을 서명하고 서명값(r, s, v)를 트랜잭션에 붙여서 보냅니다. 트랜잭션 해시는 서명을 포함하기 때문에 서명값에 따라 트랜잭션의 해시 값도 달라집니다.

이더리움 블록 헤더의 transactions root 필드는 각 블록 내의 트랜잭션 인덱스를 키로 각 트랜잭션의 해시를 저장해서 만든 merkle patricia tree 루트입니다. 블록을 검증할 때 헤더의 transactions root가 실제 트랜잭션으로 계산한 transactions root와 같은지 확인하는 방법으로 트랜잭션의 위변조 여부를 검사하고 있습니다.

그런데 서명 데이터 중 하나인 s는 타원곡선 상의 점이기 때문에 x축에 대칭인 타원곡선의 특징상 하나의 서명에 대해 high s, low s 두 개의 값이 모두 유효한 서명이 됩니다. 따라서 트랜잭션을 받아서 low s를 high s로 바꾸는 것만으로 서명의 유효성을 해치지 않고 트랜잭션의 해시 값을 바꿀 수 있게 됩니다.

이러한 문제를 트랜잭션 malleability라고 부르는데, 이더리움에서는 이 문제를 해결하기 위해 두 개의 s 값 중에 low_s만을 유효한 서명으로 인정하고 있습니다. 비트코인에서도 같이 같은 이유로 트랜잭션 malleability 문제가 있었고 역시 low_s만 유효한 서명으로 인정하는 방법으로 문제를 해결하였습니다.

비트코인의 BIP-62도 이 문제에 대해 설명하고 있으니 관심 있으신 분은 읽어보시기 바랍니다.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s