스왑이 남긴 MEV를 사용자에게 돌려줄 수 있을까
2022년, DeFi에서 스왑은 몇 초 안에 끝났지만 그 거래의 경제적 여파는 거기서 끝나지 않았다.
한 사용자가 AMM, 즉 토큰 준비금으로 가격이 정해지는 거래 풀에서 큰 수량을 스왑한다. 준비금 비율이 움직이고 다른 탈중앙화 거래소(DEX)와 가격 차이가 벌어진다. 차익 기회를 찾는 참여자인 searcher는 뒤따르는 거래로 그 차이를 줄이며 이익을 얻는다. 이런 뒤따르기를 backrun이라고 한다.
사용자는 가격 영향과 가스비를 부담했는데, 거래 뒤에 남은 차익은 다른 누군가의 몫이 된다. 2022년 말 우리가 던졌던 질문은 여기서 시작했다.
그 차익거래를 사용자의 트랜잭션 안에서 실행하고, 비용을 뺀 나머지를 사용자에게 돌려줄 수는 없을까?
MEV는 거래의 포함·제외·순서 등을 이용해 얻는 가치를 넓게 가리킨다. 이 글은 그중 사용자 스왑 뒤에 남는 일부 교차 DEX 차익을 내부화하는 설계를 돌아본다. 차익거래를 누가 실행하고 그 결과를 누가 가져가는지 바꾸려던 시도이며, 현재 제품의 검증된 실행 성능을 소개하는 글은 아니다.
4.2 A를 빌리면 무엇이 남는가
사용자가 토큰 A를 B로 바꿨다고 하자. 아래는 그 직후 관찰한 두 풀의 상태다. 원래 주문 전체의 체결가격이 아니라, 이 상태에서 뒤따르는 차익거래만 계산한다. 풀 이름은 1·2, 토큰 이름은 A·B로 구분한다.
| 풀 | A 준비금 | B 준비금 | 1 A의 한계가격 |
|---|---|---|---|
| 풀 1 | 100 | 100 | 1.0 B |
| 풀 2 | 100 | 120 | 1.2 B |
풀 2에서 A가 상대적으로 비싸다. A를 빌려 풀 2에서 B로 바꾸고, 받은 B로 풀 1에서 A를 되사면 빌린 것보다 많은 A를 얻을 수 있다. 다만 실제로 사고팔면 각 풀의 가격도 움직이므로 20%의 가격 차이를 그대로 수익률로 쓸 수는 없다.
두 풀의 스왑 수수료는 각각 0.3%, 별도 플래시론 제공자의 대출 프리미엄은 0.05%로 가정한다. 프로토콜이 내부화 때문에 늘어난 가스비를 부담하고, 그 환산액 0.01 A를 차익에서 정산한다고 하자. 기본 사용자 스왑의 가스비는 이 추가 비용과 별개이며, 별도 프로토콜 수수료는 없다.
| 단계 | 계산 결과 |
|---|---|
| 빌린 원금 | 4.200000 A |
| 풀 2: A를 B로 교환 | 4.822925 B |
| 풀 1: B를 A로 교환 | 4.587851 A |
| 원금 상환 뒤 잔액 증가 | 0.387851 A |
| 대출 프리미엄 차감 | −0.002100 A |
| 추가 실행비용 정산 | −0.010000 A |
| 사용자에게 돌릴 잉여 | 0.375751 A |
두 번의 DEX 수수료는 이미 교환 출력량에 반영돼 있다. 잔액 증가에서 다시 빼지 않는다. 따라서 비용의 기준은 “실제 교환 후 잔액 증가에서 대출료와 추가 실행비용을 뺀 금액”으로 통일한다. 사용자가 원래 받으려던 토큰은 B지만, 이 예제의 환급은 A다. 환급까지 B로 통일하려면 마지막 변환의 수수료와 가격 영향도 계산해야 한다.
계산에 사용한 식도 짧다. 입력 토큰 준비금을 , 출력 토큰 준비금을 , 입력량을 라고 하면, 수수료를 반영한 입력 비율 에서 출력량은 다음과 같다.
풀 2의 출력량을 풀 1의 입력량으로 넣으면 위 표가 나온다. Uniswap v2 공식 계산 코드의 수수료 반영 방식과 같지만, 여기서는 이해를 위해 실수로 계산하고 소수 여섯 자리로 반올림했다. 토큰 최소단위의 정수 나눗셈까지 재현한 컨트랙트 실행 결과는 아니다.
거래 뒤 1 A의 한계가격은 풀 1에서 약 1.0986 B, 풀 2에서 약 1.1053 B가 된다. 정확히 같지 않아도 이상하지 않다. 수수료가 있는 시장에서는 작은 가격 차이가 남아도 추가 거래의 비용을 만회하지 못한다. 그래서 실제 목표는 모든 풀의 비율을 같게 만드는 것보다 비용을 뺀 잉여를 크게 만드는 것에 가깝다.
대출부터 환급까지 한 트랜잭션으로 묶기
이 흐름을 둘 이상의 DEX를 연결하는 aggregator가 사용자 스왑 직후에 실행하는 것이 설계의 중심이다. 플래시론은 한 트랜잭션 안에서 빌리고 갚는 유동성 수단이다. 이미 존재하는 가격 차이를 이용할 자금을 제공할 뿐, 없는 차익을 만들어내지는 않는다.
Uniswap v2의 flash swap도 이런 유동성을 이용한 차익거래 사례를 설명한다. 다만 flash swap과 별도 제공자의 플래시론은 상환 규칙이 다를 수 있으며, 위의 0.05%는 설명용 가정이다.
실행은 다음 세 경우로 나누면 이해하기 쉽다.
| 언제 | 처리 |
|---|---|
| 실행 전 계산에서 비용을 넘는 차익이 없음 | 기본 사용자 스왑 경로를 선택 |
| 실제 실행에서도 출력·상환·잉여 조건을 충족 | 사용자 스왑, 교차 거래, 상환과 환급을 함께 완료 |
| 내부화 실행 중 조건이 깨짐 | 사용자 스왑을 포함한 해당 경로 전체를 되돌림 |
여기서 원자성은 “전부 성공하거나 상태 변경을 전부 되돌린다”는 뜻이다. 대출 제공자의 callback 안에서 교차 거래와 상환을 처리하는 등 여러 함수 호출을 사용해도 하나의 트랜잭션일 수 있다. 실패 후 기본 스왑만 다시 실행하는 기능은 별도 설계가 필요하며 자동으로 따라오지 않는다. 실패한 트랜잭션도 가스는 소비할 수 있다.
사용자 보호의 기준도 두 개로 나눠야 한다. minOut은 사용자가 받아야 할 최소 토큰 수량이고, 기본
경로와의 출력량 비교는 토큰 수령량 기준의 검사다. 가스까지 포함한 순경제효과는 누가 가스를 내는지,
얼마나 추가되는지, 어떤 가격으로 환산하는지를 함께 계산해야 한다. 출력량 검사 하나가 이 모두를
보장하지는 않는다.
원자성이 지키는 범위
외부 참여자는 한 트랜잭션의 내부 호출 사이에 자기 트랜잭션을 끼워 넣을 수 없다. 하지만 블록을 구성하는 builder는 전체 트랜잭션 앞뒤에 다른 거래를 배치할 수 있다. 공개된 주문을 먼저 보고 거래하는 frontrun이나, 앞뒤 거래로 사용자의 체결에 영향을 주는 sandwich는 여전히 별도 문제다.
| 경계 | 필요한 검토 |
|---|---|
| 사용자 스왑 뒤 잔여 차익 | 비용을 넘는 부분을 내부에서 포착하고 환원 |
| 전체 트랜잭션 앞뒤의 순서 | 주문 전달 경로, 유효기간과 가격 한도; 내부 원자성만으로 해결되지 않음 |
| 조작되거나 바뀐 풀 상태 | 유동성·가격 편차 기준과 실행 시 재검증 |
| 악성 adapter·비표준 토큰 | 허용 대상 제한, 실제 잔액 변화 회계, callback·재진입 방어 |
| 차익의 최종 귀속 | 원금·대출료·비용·환급·소액 잔여분을 빠짐없이 정산 |
따라서 liquidation이나 oracle manipulation을 포함한 모든 MEV, 거래 포함 지연·검열까지 해결한다는 주장은 할 수 없다. 이 설계가 바꾸려는 것은 특정 스왑 뒤 차익의 실행 주체와 귀속이다.
유동성 공급자(LP)의 관점도 남는다. Loss-Versus-Rebalancing 연구는 AMM의 차익거래와 LP 성과의 관계를 분석한다. 차익을 사용자에게 돌려준다고 그 가치의 원천까지 사라지는 것은 아니다. 이 예제의 모든 잉여를 곧바로 LVR와 동일시할 수는 없으며, LP를 포함해 누가 비용을 부담했는지는 별도로 측정해야 한다.
2022년 수식을 다시 읽기
당시 내부 스프레드시트에는 같은 토큰 쌍을 가진 네 개의 단순한 constant-product 풀이 있었다. 각 풀에서 두 준비금의 곱을 일정하게 유지하면서, 사용자 스왑 뒤 달라진 비율을 다시 맞추려 했다.
풀 의 A 준비금을 , B 준비금을 라고 하자. 곱 와 합산 준비금의 목표 비율 는 다음과 같다.
의 단위는 A/B다. 앞 예제의 “1 A가 몇 B인가”라는 가격 방향과 반대이며, 목표 가격을 B/A로 쓰면 가 된다. 각 풀의 곱을 유지하면서 준비금 비를 로 맞춘 목표점은 다음처럼 계산했다.
루트가 등장하는 이유는 두 조건 와 를 함께 풀기 때문이다. 가 양수면 A를 풀에 넣는 방향, 음수면 A를 꺼내는 방향의 거래다.
이 모델은 수수료가 없는 풀을 가정한다. 수수료를 넣은 앞의 4.2 A 예제는 그 한계를 설명하기 위한 별도 계산이다. 집중 유동성, 서로 다른 수수료 등급, stable-swap 곡선까지 이 목표식으로 최적화할 수는 없다. 합산 비율은 선택한 풀에서 만든 내부 기준이며 외부 시장의 공정가격도 아니다. 풀 선택이나 준비금 조작에 민감하고, 각 풀의 곱을 맞췄다는 사실만으로 전체 경로의 상환·토큰 보존이 보장되지는 않는다.
구현을 생각한다면: 실행 경계와 검증 조건
아래는 실행 순서를 설명하는 의사코드다. 수치 예제의 A 환급과 달리 잉여를 주문의 출력 토큰으로 변환하는 경우를 나타내므로 변환 비용까지 후보의 수익 계산에 포함해야 한다. callback·상환 승인·실패 복구를 구현한 배포용 코드는 아니다. 마지막 검사도 같은 최상위 트랜잭션 안에서 수행한다.
function swapWithInternalizedArbitrage(order):
snapshot = readEligiblePools(order.pair)
baseline = simulateBestUserRoute(order, snapshot)
candidate = optimizeCrossDexTrade(baseline.postSwapState)
if candidate.netSurplus <= MIN_PROFIT:
return executeBaselineSwap(order, baseline)
result = atomicExecute([
validateQuotes(snapshot, order.deadline),
executeUserSwap(order, baseline.route),
flashBorrow(candidate.borrowToken, candidate.amount),
executeCrossDexTrade(candidate.route),
repayFlashLoan(),
convertSurplusTo(order.tokenOut),
refundSurplus(order.owner),
])
require(result.totalUserOut >= order.minOut)
require(result.totalUserOut >= baseline.userOut)
require(result.flashLoanRepaid)
require(result.netSurplus > MIN_PROFIT)
require(result.unaccountedBalance <= DUST_LIMIT)
baseline.userOut의 시점과 견적 유효기간을 고정하고 실행 시 상태를 재검증해야 한다. 시뮬레이션 때의
가격을 아무 조건 없이 보장하면 블록 포함 전에 상태가 바뀌었을 때 지킬 수 없는 약속이 된다.
netSurplus에는 비용 환산·부담 정책을, DUST_LIMIT에는 소액 잔여 토큰의 처리 규칙을 연결해야 한다.
앞 예제에서 추가 비용을 고정한 실수 모델의 순환 출력은 다음과 같다.
환원 가능 잉여는 이다. 이를 최대화하는 대출량은 약 4.196063 A여서 표에서는 4.2 A로 반올림했다. 실제 토큰 단위·가스 변화·변환 경로가 추가되면 최적량도 다시 구해야 한다.
같은 질문을 한 설계들
2022년 8월 WOWMAX의 공개 설명은 스왑과 뒤따르는 가격 리밸런싱을 하나의 원자적 트랜잭션으로 묶는 구상을 소개했다. 2023년 UniswapX whitepaper는 주문 실행 경쟁과 경로 선택·일괄 처리를 통해 잉여를 가격 개선으로 돌려주는 방향을 제시했다.
CoW Protocol의 batch auction은 여러 주문을 함께 해결하는 방식을, Flashbots Protect는 비공개 주문 전달과 MEV 환급을 다룬다. 실행 방식은 다르지만 차익의 배분과 주문 보호를 프로토콜의 설계 대상으로 삼는다는 공통점이 있다. 우리의 아이디어를 최초라고 부를 수 없는 이유이기도 하다.
이 글의 설계는 뱅크웨어글로벌 주식회사의 대한민국 등록특허 제10-2564770호 「거래 왜곡을 방지하기 위한 탈중앙화 거래소를 통한 토큰 스왑 시스템 및 방법」으로 정리됐다 (출원 2023-01-12, 등록 2023-08-03). 이는 설계의 출처와 이력이며, 기술적 완전성의 증거나 실시허락·권리 불행사 선언은 아니다. 공개 코드와 권리 사용 조건은 각각 별도로 정해야 한다.
스왑 뒤 가격 차이를 닫는 일은 남는다. 그 과정에서 생긴 잉여를 외부 searcher에게 남길지, 실행 안에서 회수해 사용자에게 돌릴지는 다른 선택이다. 2022년의 작은 모델이 열어준 질문은 바로 그 선택에 관한 것이었다.