이더리움은 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도 이 문제에 대해 설명하고 있으니 관심 있으신 분은 읽어보시기 바랍니다.