과학자들의 행동: 이더리움 다크 포레스트에서 선점 로봇 사냥하기
이 글은 2020년 12월 29일 암호화폐 지갑 Zengo 블로그에 게재되었으며, 저자는 Alex Manuskin입니다. 그리고 체인뉴스에서 번역하였습니다.
어두운 숲의 괴물들은 가벼운 농담이 아닙니다. 이들 선행 거래 로봇은 스마트 계약 지시와 이전에 한 번도 사용되지 않았던 함수들을 분석하여 잠재적인 수익을 추출할 수 있습니다.
이 로봇들을 더 잘 이해하기 위해, 본문에서는 이더리움의 어두운 숲을 탐험하는 여행을 제공합니다. 이 어두운 숲 속으로 더 깊이 들어가 이들이 얼마나 만연해 있는지 알아봅시다.
우리는 "함정"을 이용하여 몇 가지 일반적인 유형의 선행 거래 로봇을 포착하고 그들의 행동을 분석했습니다.
이 탐험 여행에서 우리는 이 선행 로봇의 효율성을 연구하고, 다양한 거래가 이들에 의해 추적될 가능성을 조사했습니다. 물론, 우리는 그들을 피하는 다양한 방법도 테스트했습니다.
아래에서 즐기세요.
선행 거래란 무엇인가?
일반적으로, 선행 거래는 알려진 미래 거래가 발생하기 전에 실행 대기열에서 앞서서 거래를 실행하는 행위를 의미합니다.
선행 거래의 간단한 예는 거래소의 입찰입니다. 누군가가 Uniswap에서 대량의 ETH를 구매할 예정이라면, ETH 가격을 상승시킬 수 있습니다. 이러한 상황에서 이익을 얻는 한 가지 방법은 대량 구매가 이루어지기 직전에 ETH를 미리 구매하는 것입니다. 이때 가격은 여전히 낮습니다. 그런 다음 ETH 가격이 급등한 후 즉시 판매하여 이익을 확보합니다.
이러한 차익 거래 사례 외에도 선행 거래를 이용해 가치를 추출하는 많은 방법이 존재합니다. 여기에는 청산, 희귀 NFT 구매, 또는 단순히 사용자 오류를 유도하는 것이 포함됩니다. (거래 또는 체결 순서에서 추출 가능한 가치는 "채굴자가 추출할 수 있는 가치 MEV"라고 불립니다.)
이더리움에서의 선행 거래는 정상 수준보다 약간 높은 가스 가격을 지불함으로써 이루어질 수 있으며, 이를 통해 채굴자가 블록을 구성할 때 거래를 우선 순위로 배치하도록 유도할 수 있습니다. 거래 수수료가 높을수록 실행 순서가 앞서게 됩니다. 따라서 두 개의 거래가 동일한 블록 내에서 동일한 호출 스마트 계약 지시로부터 이익을 얻을 경우, 먼저 체결된 거래만이 최종적으로 이익을 얻습니다.
동물 행동학
Dan Robinson과 Georgios Konstantopoulos는 공동 집필한 "이더리움은 어두운 숲이다" 블로그 글에서 이더리움의 스마트 계약에서 12,000 달러 가치의 토큰을 구출하려는 시도가 차익 거래 로봇에 의해 가로막힌 경험을 설명했습니다. 이들 슈퍼 포식자 로봇은 매우 정교하여 이더리움 거래 풀에서 가치 있는 거래를 추적하고, 선행 거래 수단을 통해 가로챕니다.
어두운 숲의 이야기는 "소름 끼친다"고 할 정도로, 처음 이 글을 읽었을 때 믿기 힘들었습니다. 실제로 이러한 슈퍼 포식자 로봇의 존재에 의문을 제기할 이유가 있습니다. 왜 누군가가 Uniswap 프로토콜에서 자금을 빼낼 수 있을까요? 이 플랫폼은 수많은 로봇들이 예의주시하고 있는데 말입니다. 이 로봇들이 단순한 "차익 거래자"일까요?
올해 초, 우리는 이들이 단순한 "차익 거래 로봇"이 아니라는 것을 입증하는 분석 기사를 발표했습니다. 우리가 아는 한, 이들은 이전에 호출된 적이 없는 스마트 계약 함수를 호출할 수 있습니다. 비록 거래가 대리 스마트 계약을 통해 모호하게 처리되더라도, 이 로봇들은 여전히 이러한 작업을 통해 자금을 빼낼 수 있습니다.
적어도 이렇게 말할 수 있습니다. 이는 충격적입니다. 거래 풀의 모든 거래를 모니터링할 수 있는 능력은 강력한 무기입니다. 불안한 것은 일부 서비스 제공업체가 "어두운 풀" 거래 레이어를 공개적으로 제공하기 시작했다는 것입니다.
"어두운 풀" 거래 레이어는 Infura와 같은 서비스를 사용하지 않으며, 심지어 개인 노드도 사용하지 않고, 거래를 채굴자에게 직접 전송합니다. 채굴자는 이를 네트워크의 나머지 노드에 방송하지 않겠다고 약속하여 거래가 포식자의 레이더를 피하도록 보장합니다.
유명한 화이트 해커 samczun은 여러 파트너와 함께 취약점이 있는 스마트 계약에서 960만 달러를 구출하는 작업에서 유사한 방법을 사용했습니다. 채굴자가 선행 거래 로봇을 조작하고, 추가 비용을 지불하는 거래자에게 안전한 경로를 제공하기 시작할 것이라는 것은 어렵지 않게 상상할 수 있습니다.
이 로봇들은 이더리움의 다른 요소들과는 다르게, 이더리움 메인넷에서만 활성화될 수 있으며, 스마트 계약은 개발 환경이나 테스트넷에서 테스트할 수 있습니다. 일부 초기 실험을 제외하고, 이러한 로봇들이 테스트넷에서 선행 거래를 시도하는 것은 재정적으로 의미가 없습니다. 또한, 논리가 숨겨져 있기 때문에 이러한 로봇의 작동 규칙은 각기 다를 수 있습니다.
우리는 이러한 선행 거래 포식자들이 공격을 시작하기로 결정하는 조건을 알지 못합니다. 따라서 어떤 면에서는 이러한 포식자를 추적하는 것이 희귀 동물을 추적하는 것과 유사합니다.
우리는 모든 선행 거래 로봇을 대상으로 하지 않고, 특정한, 즉 일반적인 유형의 이러한 로봇만을 대상으로 합니다.
우리가 잡으려는 선행 거래 로봇이 "진짜" 일반적인 선행 거래자임을 보장하기 위해서는 독특한 "함정"이 필요합니다. 함정은 새로 생성된 스마트 계약으로, SHA256 해시 값의 비밀 문자열로 시작되며, 일부 자금이 첨부됩니다. 누구든지 비밀 계약을 제공해야만 잠금된 자금을 인출할 수 있습니다. 자금은 인출 거래의 발신자에게 직접 전송됩니다.
이 함정의 구상은 올바른 비밀 계약을 제공하는 방식으로 "유인" 거래를 전송하여 누군가가 복사하여 비밀 계약을 제공하려고 시도하는지 확인하는 것입니다. 만약 누군가가 유인 거래 이전에 자금을 가로챈다면, 이는 누군가가 거래 풀에서 거래를 분석하고 관련 내용을 복사하여 스스로 비밀 계약을 제공할 수 있음을 의미합니다.
흥미로운 것은, 로봇들이 이전에 전혀 알지 못했던 비밀 계약을 통해 자금을 가로챌 수 있다는 것입니다. ------ 이들은 정말로 진정한 일반적인 선행 거래 로봇입니다.
일반 선행 거래 로봇의 작동 메커니즘
이 실험의 필수적인 부분은 일반 선행 거래 로봇의 작동 메커니즘을 이해하는 것입니다. 그러나 누군가가 돈을 벌 수 있는 기계를 만들었다면, 그들은 이를 Github에 공유하지 않을 것입니다. 따라서 우리는 포식자 로봇의 행동을 관찰하고 역설계할 수밖에 없습니다.
일반 선행 거래 로봇을 만드는 데는 일반적으로 두 가지 구성 요소가 필요합니다:
- 첫 번째 구성 요소는 이더리움 계정으로, 스마트 지갑 대리인이 있거나 없을 수 있으며, 이들이 변조한 거래는 이 지갑으로 전송됩니다.
- 두 번째는 "백엔드"로, 즉 작동의 두뇌로, 일반적으로 오프체인에서 발생합니다.
이 로봇의 운영자는 어떤 기술을 사용하여 거래 풀의 각 거래를 스캔하고, 이를 분석하여 매개변수(예: 거래 호출자)를 교체하고, 가로챌 경우 이익이 있는지를 판단합니다.
선행 거래 로봇의 작업 흐름
합리적인 로봇은 거래 수수료가 예상 이익을 초과하는 거래에 대해서는 선행 공격을 시작하지 않습니다. 총 거래 수수료는 특히 가스 가격이 비쌀 때 높을 수 있으므로, 선행 거래 로봇이 우리의 유인 거래를 공격하려면 일정한 최소 이익이 필요합니다.
또한 로봇이 거래 풀의 각 거래(많은 거래가 포함됨)를 분석해야 하므로 시간도 중요합니다. 이더리움은 평균적으로 12초마다 블록을 생성합니다. 거래의 가스 가격이 충분히 높다면, 다음 블록이 생성되기 전에 이를 분석하고 원래 거래를 충분히 빠르게 교체해야 합니다.
이는 일정한 확률이 있는 과정으로, 거래가 방송된 후 즉시 블록이 채굴될 수 있어 로봇이 해당 거래를 성공적으로 분석하고 선행 거래를 방송할 시간이 없을 수 있습니다.
이러한 요소들과 몇 가지 아이디어를 고려하여, 우리는 선행 거래 로봇이 유인 거래를 가로챌 조건을 테스트했습니다.
함정 설정
우리의 스마트 계약(지급자 Giver)의 초기 잔액은 0.035 ETH로, 당시 약 20달러의 가치가 있었습니다. 누구든지 계약에 저장된 해시에 올바른 비밀 계약을 제공하면 이 자금을 가져갈 수 있습니다. 이 자금을 가져가는 거래는 포식자의 선행 거래 행동을 촉발하며, 다른 계정(수령자 taker)은 자금을 인출하기 위해 적절한 비밀 계약을 제공하려고 시도합니다.
첫 번째 라운드: 계약 직접 호출
기준 함정이 정상적으로 작동하는지 확인하기 위해, 우리는 먼저 수령자 계정을 사용하여 계약을 호출했습니다. 첫 번째 시도에서 가스 가격이 상대적으로 높았고(이더 프레임워크에 의해 결정됨), 우리는 자금을 성공적으로 회수할 수 있었습니다.
우리가 성공할 수 있었던 이유는 선행 거래의 이익이 너무 낮아 포식자를 매료시키지 못했거나, 이 거래가 블록에 빠르게 기록되어 로봇이 행동할 시간이 없었기 때문일 수 있습니다. 분명히 이것은 우리가 기대했던 결과가 아니며, 우리의 목표는 포식자를 우리의 함정으로 유인하는 것이었습니다.
두 번째 라운드: 포식자에게 생각할 시간을 주다
이번 라운드에서는 이전에 겪었던 문제를 해결했습니다. 우리는 잠재적 이익을 증가시키고 가스 가격을 낮추어 거래가 너무 빨리 블록에 기록되지 않도록 하여 로봇이 이를 찾을 시간을 주었습니다. 해당 계약의 잔액은 0.04 ETH로 증가했습니다(잔액이 이전보다 0.005 ETH 증가했습니다).
이번에는 공격을 받았습니다. 해당 거래는 블록에 기록되기 전에 약 3분 동안 지체되었고, 결국 함정 스마트 계약에서 가치를 추출하지 못했습니다. 우리는 계약의 내부 거래를 검토한 결과, 자금이 다른 사람에 의해 가로채졌음을 발견했습니다.
이 선행 거래는 25.000001111 Gwei(우리가 사용한 Gwei 수보다 .000001111 Gwei 높음)를 소모했으며, 우리의 거래와 동일한 블록에 기록되었습니다. 이는 명백한 가로채기 행동입니다.
추적기 삽입
우리의 함정이 성공적으로 로봇을 포획했으므로(우리는 일정한 대가를 치렀습니다), 몇 가지 흥미로운 통찰을 추출할 수 있습니다.
첫째, 거래는 스마트 계약에 대한 직접 호출을 실행하지 않았습니다. 이 로봇은 거래를 복사하여 자신의 계정에서 맹목적으로 전송한 것이 아니라, 대리 스마트 계약을 통해 해당 거래를 전달했습니다. 이 대리 스마트 계약은 이러한 거래를 실행하는 스마트 지갑 역할을 했습니다.
이제 우리는 이전 및 미래의 거래를 추적할 수 있으며, 이 로봇이 얼마나 대단한 능력을 가지고 있는지, 그리고 어떻게 작동하는지 자세히 살펴볼 수 있습니다.
이 로봇은 자신의 대리 계약을 사용합니다
해당 계약을 역컴파일한 결과, 두 개의 주요 함수가 나타났습니다:
"Withdraw"는 주로 해당 계약의 모든 자금을 로봇 운영자에게 전송하는 기능입니다. 다른 함수는 일부 매개변수를 수용합니다: 호출할 계약, 매개변수 목록 및 가치 매개변수를 전달합니다.
이 함수 덕분에 이 대리 계약은 로봇 운영자의 스마트 지갑 역할을 합니다. 외부 함수 호출 기능을 수행할 수 있을 뿐만 아니라, 거래 시작 시 잔액이 종료 시 잔액보다 적어서는 안 되며, 그렇지 않을 경우 거래를 복원하여 미지의 계약 호출 시 발생할 수 있는 자금 손실을 피할 수 있습니다(물론 가스는 제외).
Dune Analytics 도구를 활용하여, 이 로봇이 2018년 5월부터 운영된 이후로 상당한 수익을 올렸음을 확인할 수 있습니다.
이 로봇이 동일한 스마트 대리인과 수령 주소를 사용하여 선행 거래를 시작했다고 가정할 경우, 우리는 그가 약 17 ETH를 벌었음을 추정할 수 있습니다.
이 로봇이 다양한 시간대에 벌어들인 자금 (ETH 단위)
세 번째 라운드: 이 로봇들은 얼마나 똑똑한가?
이 로봇 프로그램이 우리에게 공격을 시작했다는 것을 확신하게 되었으므로, 우리는 두 번째 계약(대리 계약)을 사용하여 계약 호출을 혼란스럽게 하여 계약에서 유인 자금을 성공적으로 추출할 수 있는지를 테스트하고자 했습니다. 이 대리는 유인 계약(giver)에서 유인 자금을 추출하기 위해 함수를 호출할 것입니다. (해당 계약에는 자금을 우리에게 반환하는 "수령" 함수도 있습니다).
우리는 ProxyTaker 계약을 배포하고, 적절한 함수를 호출하여 자금을 추출하려고 시도했습니다. 대리 행동의 비용이 이전보다 약간 높아졌기 때문에, giver 계약의 잔액은 0.055 ETH로 조정되었습니다. 결과적으로 우리의 거래는 즉시 다른 로봇에 의해 선행 거래되었습니다.
이번에는 로봇의 수법이 더욱 놀라웠습니다. 이 로봇은 우리의 인출 거래를 감지할 수 있을 뿐만 아니라, 완전히 다른 스마트 계약의 내부 호출에서 해당 거래를 식별할 수 있었습니다! 그리고 이 모든 것이 기록적인 짧은 시간 내에 이루어졌습니다. 우리의 인출 거래는 몇 초 후에 새 블록에 기록되었고, 포식자의 선행 거래도 마찬가지였습니다.
이 로봇의 정체도 흥미롭습니다. 이 로봇의 스마트 계약은 주로 이 계정에 의해 운영됩니다. 이 계정은 Etherescan에 댓글을 남겼으며, 당시 그 댓글은 화이트 해커들이 취약한 Bancor 스마트 계약에서 자금을 구출하는 내용에 대한 것이었습니다.
운영자 계정의 정보 (출처: etherscan)
이 로봇의 유사한 행동 특성(계정 A를 사용하여 대리 호출, 자금을 계정 B로 전송)과 위 거래의 근접 특성을 고려할 때, 이 로봇이 위 사건에서도 화이트 해커의 자금 구출 작업에 대해 광범위한 선행 거래를 수행했을 가능성이 있습니다.
이 로봇은 우리가 이전에 만난 로봇보다 훨씬 더 똑똑합니다. 이 로봇은 ETH 거래를 겨냥할 뿐만 아니라 다양한 차익 거래를 수행합니다.
단순히 그 계정 잔액만으로 판단할 때, 그 수익도 훨씬 더 높습니다. 현재 해당 계정의 잔액은 약 300 ETH(시가 18만 달러)입니다. 우리는 또한 계약 주소에서 모든 유입 및 유출 자금을 계산하여 그 수익을 추정할 수 있으며, 총액은 약 900 ETH입니다.
이는 대략적인 추정치일 뿐이며, 해당 계정이 선행 거래 활동과 관련 없는 거래를 수행했을 가능성도 있습니다. 여기에서 이 로봇의 모든 수익 거래 목록을 확인할 수 있습니다.
도전을 더 자극적으로 만들기 위해, 우리는 더 모호한 시도를 했습니다. 이번에는 오직 우리가 사용할 수 있는 대리 계약 OwnedTaker를 사용했습니다.
이 함정은 세 번째 라운드와 매우 유사합니다. Giver 계약의 잔액은 0.05 ETH입니다. 동일한 거래에는 자금을 우리에게 반환하는 거래가 포함되어 있으며, 계약에 남기지 않습니다.
첫 번째 시도에서, OwnedTaker 계약으로 자금을 지불하는 해당 거래는 약 1분 후에 블록에 기록되었고, 우리는 결국 자금을 회수했습니다.
우리는 이 실험을 반복했으며, 이번에는 giver 계약의 잔액이 0.06 ETH로 증가했습니다. 이는 지금까지 사용한 잔액 중 가장 높은 금액으로, 너무 낮은 가치로 인해 선행 거래 로봇이 출동할 가치가 없다고 느끼지 않도록 했습니다.
가스 가치는 의도적으로 낮은 값으로 설정되었습니다. 해당 거래는 약 7분 동안 지체되었지만, 우리는 여전히 자금을 성공적으로 인출했습니다.
계약 소유자만 거래를 전송할 수 있는 Owned 대리 계약이 두 번의 거래에서 위의 두 개의 알려진 선행 거래 로봇이 데이터를 성공적으로 분석하고 가로채지 못하게 했습니다.
성공적인 인출
계약 소유자만 호출을 실행할 수 있는 요구 사항이거나, 자금이 호출 계약과 다른 목표 주소로 전송된 사실이 로봇의 선행 거래 시도를 피하는 데 도움이 되었을 가능성이 있습니다.
로봇은 아마도 먼저 자기 보호를 고려하도록 훈련되었을 것입니다. 결국 이들은 미지의 계약을 호출하고 있으며, 해당 계약은 임의의 코드를 실행할 수 있습니다. 이익을 보장할 수 없다면, 불필요한 위험이나 거래 수수료 손실을 피할 것입니다.
어떻게 보느냐에 따라 다릅니다. 우리는 새로운 계약을 사용했지만, 오직 우리가 이 비밀 계약을 알고 있었습니다. 분명히, 우리가 발견한 두 개의 선행 거래 로봇은 거래 풀에서 모든 거래를 수행하고 있으며, 그들의 수익을 보면 잘하고 있습니다.
우리가 마지막 시도에서 선행 거래의 재앙을 피한 이유는 무엇일까요?
구체적인 이유를 판단하기는 어렵습니다. 아마도 로봇이 검증된 계약과 통신하는 위험을 감수하고 싶지 않거나, 자금이 다른 주소로 이동된 사실이 예상치 못한 것일 수 있습니다.
이는 선행 거래를 피하는 완전한 방법이 아니라는 것을 의미하지 않습니다. 가장 가능성이 높은 것은, 이더리움 거래 풀에 더 복잡한 로봇들이 잠복하고 있으며, 그들은 단순히 이렇게 작은 이익을 얻기 위해 위험을 감수하고 싶지 않을 것입니다.
이 짧은 실험에서 우리는 일반 선행 거래 로봇의 존재와 그들의 높은 지능 수준을 보여줄 수 있었습니다.
물론, 우리는 우리의 실험이 완전하지도 않고 불확실하다는 것을 잘 알고 있습니다. 여전히 많은 다른 로봇들이 존재하며, 이들의 발동 메커니즘과 운영 방식은 전혀 다릅니다. 잠재적 이익, 통신 특성 및 최소 복잡도(예: gasLimit)와 같은 요소들이 이들의 운영 방식에 영향을 미칠 수 있습니다.
하지만 우리는 우리의 작업이 일반 선행 거래 로봇의 범죄 수법을 더 명확히 이해하는 데 도움이 되는 개념 증명을 제공한다고 확신합니다.
현재 충격적인 현실은, 누군가가 스마트 계약을 호출하여 이익을 얻을 수 있는 거래가 존재한다면, 그것이 매우 모호하더라도, 실제로 어떤 선행 거래 로봇이 자금을 가로챌 가능성이 매우 높다는 것입니다.
따라서 이러한 로봇과 그들의 작동 방식을 이해하는 것이 중요하며, 그래야만 현재와 미래에 더 안전한 시스템을 구축할 수 있습니다. Flashbots와 같은 프로젝트는 MEV 추출을 민주화하고 이를 공공 자원으로 만들기 위해 노력하고 있습니다. 우리는 이 연구가 이러한 목표를 달성하는 데 도움이 되기를 바랍니다.