이더리움 다크 포레스트에서 살아남는 방법
앞장서서 실행하는 봇이 당신을 잡아먹지 않도록 하세요
Ethereum is a Dark Forest는 패러다임의 Dan과 Georgios가 암호에서 대중화한 용어입니다(포스트를 읽지 않았다면 강력히 추천합니다).
하지만 '다크 포레스트'는 사실 '어둠의 숲'이라는 개념을 도입한 공상과학 소설이다. 이 개념은 기본적으로 포식자가 감지되면 당신을 죽일 것임을 의미합니다.
자, 이것이 이더리움과 어떤 관련이 있습니까?
좀 더 정확히 말하면 이 문제는 거의 모든 체인에 적용되지만 지금까지 가장 큰 TVL을 가진 체인이기 때문에 이더리움에 초점을 맞출 것입니다.
어두운 숲의 비유에 따르면 포식자는 자신을 위해 이익을 얻을 수 있는 모든 기회를 찾는 봇입니다. 그들이 만드는 많은 시간(항상 그런 것은 아님)이 사용자의 희생이라는 점을 명심하십시오.
이 게시물의 목적은 이 포식자 봇이 어떻게 작동하고 어떻게 피하는지 높은 수준에서 이해하는 것입니다. 무슨 일이 일어나고 있는지 진정으로 이해하기 위해 우리는 첫 번째 원칙 접근 방식을 취하고 이더리움 메인넷에서 이 포식자 중 한 명과 실제로 상호 작용할 것입니다.
전제 조건
다음 기술이 있으면 모든 것을 완전히 이해할 수 있지만 그렇지 않은 경우에도 전반적인 아이디어를 이해할 수 있습니다.
- 일반적인 EVM이 작동하는 방식에 대한 이해.
- 솔리디티 / JS.
여행을 시작하기 전에 몇 가지 개념을 이해해야 합니다.
MEV는 이전에 광부 추출 가능한 가치 그리고 최근에는 최대 추출 가치 블록의 거래 순서를 포함, 제외, 변경하여 표준 블록 보상 및 가스 수수료를 초과하여 블록 생성에서 추출할 수 있는 최대 가치를 의미합니다.
너무 자세히 설명하지 않고 MEV가 의미하는 것은 특정 엔터티(채굴자, 검색자 등...)가 트랜잭션 순서에 대해 무언가를 변경하여 추출할 수 있는 금액입니다.
이 개념은 우리가 포식자와 상호 작용한 후에 완전히 명확해질 것입니다.
Mempool은 후보 트랜잭션이 채굴되기 전에 저장하는 Ethereum 노드 내부의 메모리 내 데이터 구조 세트를 나타냅니다.
이것은 무엇을 의미 하는가?
트랜잭션을 보낼 때 배후에서 무슨 일이 일어나는지 잠시 생각해 보십시오. 지갑에서 보내기를 누르면 어떻게 되나요?
짧은 대답은 당신이 어둠의 숲에 들어가고 있다는 것입니다.
트랜잭션을 보낼 때 일반적으로 다음과 같은 개체인 많은 데이터에 서명하게 됩니다.
* 표시된 개체보다 필드가 더 많습니다. 간단하게 하기 위함입니다.
{
to: "0x123.....,
value: 1000.....,
data: "0x123...,
gasPrice: 100....}
"보내기"를 누르는 순간 트랜잭션 의도에 서명하고 지갑 공급자가 노드(보통 go-Ethereum을 실행)로 전달합니다.
이것의 문제는 거래가 "안전 지대"라고도 불리는 블록체인 내부에 즉시 있지 않고, PUBLIC
멤풀.

맞습니다. 모든 사람이 보류 중인 모든 거래*를 볼 수 있습니다. 이것은 엄청난 의미를 갖습니다(앞으로 보게 될 것입니다).
아이디어를 얻기 위해 주어진 시간에 Ethereum에는 약 180,000개의 보류 중인 트랜잭션이 있으며(Mempool에서 대기 중) 블록에는 일반적으로 약 300개의 트랜잭션이 포함됩니다.
*FlashBot과 같은 서비스를 사용하지 않는 한(앞으로).
자, 이제 MEV와 Mempool이 무엇인지 전반적으로 이해했으므로 이 모든 것을 실제 행동으로 살펴보겠습니다.
주의: 당신이 무엇을 하고 있는지 정말로 알고 있지 않다면 이것을 해서는 안됩니다!!!
연구를 위해 우리는 포식자에게 약간의 ETH를 풀 것입니다.
시작하자!
노트: 모든 파일이 포함된 전체 리포지토리는 https://github.com/rodrigoherrerai/MEV-EXAMPLE에서 찾을 수 있습니다.
따라서 우리가 할 첫 번째 일은 매우 간단한 스마트 계약을 배포하는 것입니다.
이 계약은 3가지 기본 작업을 수행할 수 있습니다.
- ETH를 받습니다.
- 함수를 호출한 사람에게 계약 잔액을 이전합니다.
- 누군가 _transfer 함수를 호출하면 이벤트를 발생시킵니다.
계약을 진행하고 배포하겠습니다. 여기에 거래의 해시가 있고 여기에 계약이 있습니다.
이제 메인넷에서 계약을 실행하고 일부 ETH를 보낼 것입니다. 여기에 0.01 ETH에 대한 트랜잭션 해시가 있습니다.
다음에 일어날 일을 더 잘 이해하려면 다른 계약을 검색하고 방금 배포한 계약을 만난다고 상상해 보십시오.
Etherscan에서 코드를 확인하는 동안 계약이 완전히 취약하다는 것을 깨닫는 데 2초가 걸립니다. 전화만 하시면 됩니다 _transfer()
기능을 사용하면 모든 자금을 보낼 수 있습니다.

놀랍게도 계약에는 ETH가 있습니다!
여기에 나쁜 소식이 있습니다. 우리가 방금 말한 모든 것을 잘 알지 못하면 함정에 빠지게 됩니다.
누구든지 전화하는 것은 사실입니다. _transfer()
기능은 계약의 잔액을 받습니다. 문제는 당신이 그것을 처음으로 호출한 사람인지 확인하는 것입니다. 그렇다고 해서 서두르려는 것이 아니라 가능한 한 빨리 함수를 호출하는 것뿐입니다.
그렇다면 무엇이 문제인가?
이전 설명에서 기억하듯이 트랜잭션이 실제 블록에 들어가기 전에 공개 Mempool을 거칩니다.
진실을 들을 준비가 되셨습니까?
사용자가 공개 Mempool에 트랜잭션을 보낼 때마다 수천*의 봇이 트랜잭션을 검사하여 수익을 낼 수 있는지 확인합니다. 다양한 유형의 공격이 있으며 각각에 대해 설명하는 것은 이 게시물의 범위를 벗어납니다. 우리의 특별한 경우에는 일반화된 선두주자에 초점을 맞출 것입니다.
*더 많을 수도, 적을 수도 있지만 숫자는 큽니다.
일반화된 선두주자는 기본적으로 멤풀을 관찰하고, 각 거래를 시뮬레이션하고, 잠재적으로 수익성이 있는 거래의 코드를 복사하고, 주소를 선두주자의 주소로 바꾸고, 거래를 실행하는 봇입니다.

노트: 그림은 약간 오해의 소지가 있습니다. 실제로는 하나의 mempool이 없지만 각 노드에는 자체 보류 중인 트랜잭션이 있습니다. 전체적인 요점은 그대로 유지됩니다.
현실을 위한 시간.
우리는 전화를 시도 할 것입니다 _transfer()
우리가 배포한 스마트 계약의 기능. 주의를 기울였다면 지금쯤(적어도 이론상) 트랜잭션이 봇에 의해 선행 실행된다는 것을 알아야 합니다.
준비 되었나요?
스크립트는 기본적으로 계약의 "전송됨" 이벤트를 수신하고 호출될 때마다 지금 허용합니다. 리스너를 트리거한 직후에 _transfer()
기능.

다음은 트랜잭션의 해시입니다.
흥미롭게도 이것은 우리를 앞서가는 봇의 이름입니다.

어떻게 이런일이 일어 났습니까?
음, 꽤 간단합니다. 봇이 거래를 시뮬레이트했습니다. mempool
그것이 유익함을 보고, 우리 앞에서 그것을 행하였다.
지금쯤이면 이것의 심각성을 이해하셨기를 바랍니다.
좋은 소식은 해결책이 있다는 것입니다.
솔루션은 FlashBot입니다. FlashBot에는 다양한 도구와 서비스가 있지만 특정 사용 사례에서는 FlashBots Auction에 중점을 둘 것입니다.
FlashBots Auction이 하는 일은 채굴자들에게 개인 거래를 보낼 수 있게 해주는 것입니다. 이것은 우리의 거래가 공개적으로 진행되지 않는다는 것을 의미합니다. mempool
. 그러므로 포식자들은 우리를 먹지 않을 것입니다.

스크립트:

다음은 트랜잭션의 해시입니다.
봇이 이번에 우리를 망치지 않은 이유는 봇이 우리 거래의 존재를 몰랐기 때문입니다.
현재 기본 계층은 매우 적대적인 환경을 가지고 있습니다. 이를 완화할 수 있는 유일한 방법은 보안 시스템과 FlashBot과 같은 오픈 소스 프로젝트를 개발하는 것입니다.
사용자로서 함정에 빠지지 않도록 각별히 주의해야 합니다. 그러나 더 중요한 것은 그 책임이 실제로 dapp과 시스템 개발자에게 있다는 것입니다.
행운을 빕니다!
'Coding' 카테고리의 다른 글
Python 3의 비동기 프로그래밍에 대해 알아보자 (0) | 2022.04.19 |
---|---|
ViewInspector에서 @State를 포함하는 SwiftUI 보기를 테스트하는 방법 (0) | 2022.04.18 |
Pandas 데이터 프레임을 Snowflake로 업데이트하는 방법 (0) | 2022.04.16 |
Unity 프로덕션 패턴: 제네릭과의 일관된 연결하는 방법 (0) | 2022.04.15 |
Context-less Go — 쉽게 HTTP 서비스 작성하는 방법 (0) | 2022.04.14 |
댓글