Ethereum 이벤트 로그 이해
创宇区块链安全实验室
2022-11-17 06:19
本文约3606字,阅读全文需要约14分钟
이벤트 로그가 바다에 떨어지는 것입니까? 반대로 이벤트 로깅은 개발자뿐만 아니라 사용자에게도 매우 중요합니다. 이 문서에서는 이벤트 로그가 무엇이며 해커가 피싱을 위해 이벤트 로그

첫 번째 레벨 제목

머리말

블록체인 탐색기에서 트랜잭션을 조회할 때 개요 및 내부 트랜잭션만 보고 있습니까? 이벤트 로그는 어떻습니까? 눈에 띄지 않는 구석에서 당신이 무시하는지 여부.

다음으로 이더리움의 이벤트 로그에 대한 자세한 이해와 이에 대한 기본적인 지식을 알려드리겠습니다.

첫 번째 레벨 제목

이벤트

2.1 이벤트란?

Event는 Ethereum Virtual Machine의 로깅 기능을 편리하게 호출할 수 있는 인터페이스입니다.

Solidity 이벤트는 EVM의 로깅 기능 위의 추상화입니다. 애플리케이션은 이더리움 클라이언트의 RPC 인터페이스를 통해 이러한 이벤트를 구독하고 수신할 수 있으므로 블록체인에 정보를 인쇄할 수 있습니다.

  • 따라서 Solidity 이벤트를 통해 다음을 수행할 수 있습니다.

  • 스마트 계약에서 특정 변수 테스트

  • 저장된 상태를 재구성하기 위한 인덱스 변수

  • 수신 이벤트는 프런트 엔드의 상태를 변경하는 데 사용됩니다.

데이터를 더 빨리 읽을 수 있도록 하위 그래프 만들기

2.2 선언 및 트리거 이벤트

공식 ERC20 계약 코드를 예로 들어 IERC20.sol 파일의 event 키워드를 통해 선언해 보겠습니다.

ERC20.sol의 _transfer 함수에서 emit 키워드에 의해 해당 이벤트가 트리거됩니다(이전 버전은 emit을 사용할 필요가 없습니다).

첫 번째 레벨 제목

통나무

3.1 로그란?

Ethereum에서 로그는 이벤트를 저장하는 데 사용됩니다. 이벤트가 호출되면 트리거 매개변수가 트랜잭션 로그에 저장됩니다. 스마트 계약으로 액세스할 수 없지만 트랜잭션에 대한 정보를 제공하고 블록으로 보낼 수 있습니다.

마음대로 트랜잭션(0x477ed7208127bea597142622d52df46d3e4967835bd3609995581eb5aaeeec3e)을 열어 로그를 봅니다.

로그를 통해 로그를 네 부분으로 나눌 수 있습니다.

1. 주소: 주소. 즉, 이벤트를 발행한 계약 또는 계정의 주소입니다.

2. 이름: 이름. 즉, 트리거된 이벤트의 이름과 해당 매개변수입니다.

3. 주제: 테마. 즉, 이벤트에 인덱싱된 매개변수가 있습니다.

4. 데이터: 데이터. 즉, 이벤트에 인덱스가 없는 매개변수입니다.

3.2 로깅 주제

위에서 주제(Topics)에 대해 언급한 후 주제에 대해 자세히 이야기하겠습니다.

각 로그 레코드에는 "주제" 및 "데이터"가 포함됩니다. 주제는 32바이트(256비트)이며 이벤트에서 발생한 내용을 설명합니다. 다른 opcode(LOG0 LOG1 LOG2 LOG3 LOG4)는 로그 레코드에 포함되어야 하는 항목 수를 설명하는 데 사용됩니다.

이벤트 로그를 트리거하고 로그 레코드를 생성하는 데 사용되는 EVM에는 토큰 전송, 소유권 변경 등과 같은 스마트 계약의 이벤트를 설명하는 데 사용되는 LOG0, LOG1, LOG2, LOG3 및 LOG4와 같은 5개의 opcode가 있습니다. LOG1은 하나의 주제를 담고 있으며 단일 로그 레코드에 포함될 수 있는 최대 주제 수는 LOG4의 4개 주제입니다.

Topics0은 일반적으로 매개변수 유형(address, uint256 등)을 포함하는 이벤트 이름(keccak256 해시 값)의 서명이고 Topics1은 첫 번째 색인 매개변수의 값이고 Topics2는 두 번째 색인 매개변수의 값입니다. .

이 항목에서 Topics0의 값은 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef이고 해당 이벤트는 Name의 이전 줄 내용입니다.

그러나 우리는 이벤트 Transfer(address, address, uint256)를 keccak256으로 암호화하고 그 결과는 Name의 값과 동일하여 Name의 값이 실제로 이벤트 이름의 서명임을 나타냅니다. 물론 이벤트 서명이 없는 한 가지 예외가 있습니다. 바로 "익명 이벤트"가 트리거되는 경우입니다.

Topics1은 첫 번째 인덱스 매개변수의 값, 즉 양식 주소의 값입니다. Topics2는 두 번째 인덱스 매개변수의 값, 즉 to 주소의 값입니다. 내부 통화 분석에서도 이것이 사실임을 알 수 있습니다.

주제는 32바이트의 데이터만 포함할 수 있으므로 32바이트를 초과할 수 있는 배열, 문자열 등과 같은 항목은 주제로 사용할 수 없습니다. 32바이트보다 큰 데이터를 포함하려는 경우 주제는 해시로 계산되었으므로 32바이트를 초과하면 로그 레코드에 데이터로 포함하는 것이 좋습니다.

3.3 로그 기록의 데이터

로그 기록의 일부는 제목 외에 데이터이며, 데이터는 ABI 코드 또는 이벤트의 비인덱스 매개변수의 해시 값입니다. Dec 또는 Hex를 사용하여 데이터 데이터의 값을 볼 수 있습니다.

  • 데이터와 주제 모두 장단점이 있습니다.

  • 주제는 검색 가능하지만 데이터는 검색할 수 없습니다.

데이터는 주제보다 적은 가스를 필요로 합니다.

주제는 인덱스가 있는 매개변수이므로 로그에서 직접 검색할 수 있지만 데이터는 ABI 코드 또는 해시 값이므로 직접 검색할 수 없습니다.

Yellow Paper에 따르면 로그의 관련 가스 비용을 알 수 있는데 로그의 기본 비용은 375가스, 각 주제도 375가스, 데이터 바이트 비용은 8가스입니다.

우리는 Yellow Paper에서 로그의 가스 비용이 매우 저렴하다는 것을 알 수 있습니다.ERC20 토큰 전송 이벤트 비용은 최대 1756 가스(로그 기준으로 375 가스, 375 * 3 = 3가지 주제에 대해 1125 가스)입니다. 전송 이벤트의 가장 큰 데이터 바이트 32바이트는 8 * 32 = 256 가스) 반면 표준 에테르 전송에는 21000 가스가 필요합니다. 물론 위에서 말씀드린 것은 로그기록 운영 자체의 비용일 뿐이며, 스마트 컨트랙트 개발에서 로그기록 운영 비용은 단순하게 계산할 수 없지만, 개발에서는 스마트 컨트랙트에 필요한 데이터만 저장할 수 있습니다. state 변수에 컨트랙트가 있고, 다른 Event들이 처리에 사용되어 많은 가스 비용을 절약할 수 있습니다.

트리거 이벤트

다음으로 트리거 이벤트를 설명하기 위해 예제를 사용합니다.다음 코드는 ERC20 표준을 준수하는 토큰 계약에서 사용하는 전송 이벤트를 구현합니다.

위는 "익명 이벤트"가 아니므로 첫 번째 주제에는 이벤트의 서명이 포함됩니다(서명에는 매개 변수의 유형만 필요함).

그런 다음 from 및 _to 주소가 인덱싱되고 value 값이 인덱싱되지 않은 이벤트의 매개 변수를 살펴봅니다. 따라서 _from 및 _to 주소는 주제로 취급되고 _value 값은 데이터로 취급됩니다.

3.3절에서 주제는 조회가 가능하나 데이터는 조회가 불가능하다고 언급하였으므로 로그에서 from address, _to address 값과 관련된 이체로그는 조회가 가능하나 이체금액이 다음과 같은 이체로그는 조회가 불가능하다. _value 값 . 이벤트에는 3개의 주제(이벤트 서명, from, _to)가 있으므로 이 로깅 작업은 LOG3 opcode를 사용합니다.

그렇다면 데이터의 내용을 찾으려면 어떻게 해야 할까요? 여기에서 EVM의 opcode 매개변수를 알아야 합니다. LOG3에는 3개의 주제가 있지만 EVM에는 5개의 매개변수가 있습니다.

데이터의 내용을 읽으려면 다음과 같은 방법으로 메모리에서 이벤트 데이터를 읽을 수 있습니다.

어업

5.1 피싱에서 이벤트 사용

이전에 너무 많은 로그 이벤트가 소개되었는데 낚시와 어떤 관련이 있습니까? 공격자는 보통 로그 이벤트를 이용해 거래소나 유명인사를 사칭해 코인을 피해자에게 전달하고(코인은 실제 거래가치가 없는 피싱토큰임), 피해자는 코인이 거래소나 유명인사로부터 이체되는 것을 보고 경계를 늦춘다. 이때 공격자는 피해자를 피싱 토큰으로 풀로 유인하게 되고 피해자는 토큰의 높은 거래 가치를 확인한 즉시 거래를 승인하게 되는데 이때 공격자가 설정한 함정에 빠지게 된다. 피해자가 피해자의 지갑에 있는 돈을 승인하고 훔칠 수 있도록 허용합니다.

아래 사진은 이전에 발생한 피싱 사건으로, 공격자는 바이낸스 핫월렛을 사칭하여 피싱 토큰을 타인에게 양도하였습니다.

BSC 브라우저의 탭을 통해 공식 주소를 찾을 수 있습니다.

쿼리를 통해 Binance Hot Wallet 6의 주소는 정확히 0x8894e0a0c962cb723c1976a4421c95949be2d4e3임을 알 수 있습니다.

브라우저 기록은 이벤트를 기반으로 하므로, topic1의 값, 즉 sender의 값은 0x8894e0a0c962cb723c1976a4421c95949be2d4e3입니다.

5.2 재발

다음은 BEP20의 유사 코드로, BNB Chain 메인 네트워크를 재현하는 예로 공격자가 "Phishing Token"이라는 피싱 토큰을 생성합니다. .

아래 그림과 같이 새로운 바이낸스 매개변수의 값은 0x8894E0a0c962CB723c1976a4421c95949bE2D4E3입니다.

배치계약계약

그런 다음 전송 함수를 호출하여 피싱 토큰을 피해자에게 전달합니다.

첫 번째 레벨 제목

요약하다

첫 번째 레벨 제목

참조

创宇区块链安全实验室
作者文库