Hiểu Nhật ký sự kiện Ethereum
创宇区块链安全实验室
2022-11-17 06:19
本文约3606字,阅读全文需要约14分钟
Nhật ký sự kiện có phải là giọt nước trong đại dương không? Ngược lại, ghi nhật ký sự kiện rất quan trọng đối với người dùng cũng như nhà phát triển. Bài viết này sẽ giới thiệu cho bạn bi

tiêu đề cấp đầu tiên

lời tựa

Khi bạn tra cứu các giao dịch trên trình khám phá chuỗi khối, có phải bạn chỉ đang xem tổng quan và các giao dịch nội bộ không? Còn nhật ký sự kiện thì sao? Cho dù nó bị bạn bỏ qua ở một góc không dễ thấy.

Tiếp theo, tôi sẽ giúp bạn hiểu chi tiết về nhật ký sự kiện của Ethereum và một số kiến ​​thức cơ bản về nó.

tiêu đề cấp đầu tiên

sự kiện

2.1 Sự kiện là gì?

Sự kiện là một giao diện có thể gọi chức năng ghi nhật ký của Máy ảo Ethereum một cách thuận tiện.

Sự kiện Solidity là một phần trừu tượng bên trên chức năng ghi nhật ký của EVM. Các ứng dụng có thể đăng ký và lắng nghe các sự kiện này thông qua giao diện RPC của ứng dụng khách Ethereum, cho phép chúng tôi in thông tin trên chuỗi khối.

  • Vì vậy, thông qua các sự kiện của Solidity, chúng ta có thể làm:

  • Kiểm tra các biến cụ thể trong hợp đồng thông minh

  • Các biến chỉ mục để xây dựng lại trạng thái được lưu trữ

  • Các sự kiện lắng nghe được sử dụng để thay đổi trạng thái của giao diện người dùng

Tạo biểu đồ con để đọc dữ liệu nhanh hơn

2.2 Khai báo và kích hoạt sự kiện

Hãy lấy mã hợp đồng ERC20 chính thức làm ví dụ và khai báo mã đó thông qua từ khóa sự kiện trong tệp IERC20.sol.

Trong hàm _transfer của ERC20.sol, sự kiện tương ứng được kích hoạt bởi từ khóa phát ra (phiên bản trước không cần sử dụng phát ra).

tiêu đề cấp đầu tiên

đăng nhập

3.1 Nhật ký là gì?

Trong Ethereum, nhật ký được sử dụng để lưu trữ các sự kiện. Khi sự kiện được gọi, các tham số kích hoạt được lưu trong nhật ký của giao dịch. Nó không thể được truy cập bởi các hợp đồng thông minh, nhưng có thể cung cấp thông tin về các giao dịch và được gửi theo khối.

Hãy mở một giao dịch (0x477ed7208127bea597142622d52df46d3e4967835bd3609995581eb5aaeeec3e) tùy ý để xem nhật ký của nó.

Thông qua nhật ký, chúng ta có thể chia nhật ký thành bốn phần:

1. Địa chỉ: Địa chỉ. Đó là địa chỉ của hợp đồng hoặc tài khoản đã phát hành sự kiện.

2. Tên: tên. Đó là tên của sự kiện được kích hoạt và các tham số của nó.

3. Chủ đề: chủ đề. Đó là, có các tham số được lập chỉ mục trong sự kiện.

4. Dữ liệu: Dữ liệu. Đó là, các tham số không có chỉ mục trong sự kiện.

3.2 Các chủ đề trong nhật ký

Chúng tôi đã đề cập đến chủ đề (Topics) ở trên, và sau đó chúng tôi sẽ nói chi tiết về chủ đề này.

Mỗi bản ghi nhật ký chứa "chủ đề" và "dữ liệu". Một chủ đề là 32 byte (256 bit) và mô tả những gì đã xảy ra trong sự kiện. Các mã khác nhau (LOG0 LOG1 LOG2 LOG3 LOG4) được sử dụng để mô tả số lượng chủ đề cần được đưa vào bản ghi nhật ký.

Có 5 opcodes trong EVM được sử dụng để kích hoạt nhật ký sự kiện và tạo bản ghi nhật ký, cụ thể là LOG0, LOG1, LOG2, LOG3 và LOG4, được sử dụng để mô tả các sự kiện trong hợp đồng thông minh, chẳng hạn như chuyển mã thông báo, thay đổi quyền sở hữu, v.v. LOG1 chứa một chủ đề và số lượng chủ đề tối đa có thể được bao gồm trong một bản ghi nhật ký là bốn chủ đề của LOG4.

Topics0 thường là chữ ký của tên sự kiện (giá trị băm keccak256), bao gồm loại tham số của nó (địa chỉ, uint256, v.v.), Topics1 là giá trị của tham số chỉ mục đầu tiên và Topics2 là giá trị của tham số chỉ mục thứ hai .

Giá trị của Topics0 trong chủ đề này là 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef và sự kiện của nó là nội dung của dòng Tên trước đó.

Tuy nhiên, chúng tôi mã hóa Chuyển sự kiện(address,address,uint256) bằng keccak256 và kết quả giống với giá trị của Tên, cho biết rằng giá trị của Tên thực sự là chữ ký của tên sự kiện. Tất nhiên, có một ngoại lệ khi không có chữ ký sự kiện và đó là khi một "sự kiện ẩn danh" được kích hoạt.

Chủ đề1 là giá trị của tham số chỉ mục đầu tiên, tức là giá trị của địa chỉ biểu mẫu. Chủ đề2 là giá trị của tham số chỉ mục thứ hai, tức là giá trị của địa chỉ cần gửi. Cũng có thể thấy từ phân tích cuộc gọi nội bộ rằng đây thực sự là trường hợp.

Một chủ đề chỉ có thể chứa 32 byte dữ liệu, vì vậy những thứ như mảng, chuỗi, v.v. có thể lớn hơn 32 byte không thể được sử dụng làm chủ đề, nếu bạn đang cố chứa dữ liệu lớn hơn 32 byte, thì chủ đề phải có. đã được tính toán bằng hàm băm, vì vậy tốt hơn là đưa nó làm dữ liệu trong bản ghi nhật ký sau khi vượt quá 32 byte.

3.3 Dữ liệu trong bản ghi nhật ký

Ngoài chủ đề, một phần của bản ghi nhật ký là dữ liệu. Dữ liệu là mã ABI hoặc giá trị băm của tham số không phải chỉ mục của sự kiện. Chúng tôi có thể sử dụng Dec hoặc Hex để xem giá trị của dữ liệu.

  • Cả dữ liệu và chủ đề đều có ưu và nhược điểm:

  • Chủ đề có thể tìm kiếm được, dữ liệu thì không.

Dữ liệu yêu cầu ít gas hơn chủ đề.

Vì chủ đề là tham số có chỉ mục nên chúng tôi có thể tìm kiếm trực tiếp trong nhật ký, nhưng dữ liệu là mã ABI hoặc giá trị băm nên chúng tôi không thể tìm kiếm trực tiếp.

Theo Sách vàng, chúng ta có thể tìm thấy chi phí gas liên quan của nhật ký. Chi phí cơ bản của nhật ký là 375 gas, mỗi chủ đề cũng là 375 gas và chi phí byte dữ liệu là 8 gas.

Chúng ta có thể biết từ Sách vàng rằng chi phí gas của nhật ký rất rẻ. Chi phí cho một sự kiện chuyển mã thông báo ERC20 chỉ tốn tối đa 1756 gas (375 gas cho cơ sở nhật ký, 375 * 3 = 1125 gas cho 3 chủ đề của sự kiện truyền và byte dữ liệu lớn nhất 32 byte là 8 * 32 = 256 gas), trong khi việc truyền ether tiêu chuẩn cần 21000 gas. Tất nhiên, những gì tôi đã nói ở trên chỉ là chi phí của bản thân hoạt động ghi nhật ký. hợp đồng trong biến trạng thái và các Sự kiện khác được sử dụng để xử lý, điều này có thể tiết kiệm rất nhiều chi phí gas.

sự kiện kích hoạt

Tiếp theo, một ví dụ được sử dụng để minh họa sự kiện kích hoạt. Đoạn mã sau triển khai sự kiện chuyển nhượng được sử dụng bởi hợp đồng mã thông báo tuân theo tiêu chuẩn ERC20.

Vì ở trên không phải là "sự kiện ẩn danh", nên chủ đề đầu tiên sẽ chứa chữ ký của sự kiện (chỉ loại tham số là bắt buộc đối với chữ ký).

Sau đó, chúng tôi xem xét các tham số của sự kiện, trong đó địa chỉ from và _to được lập chỉ mục và giá trị value không được lập chỉ mục. Vì vậy, các địa chỉ _from và _to sẽ được coi là chủ đề và các giá trị _value sẽ được coi là dữ liệu.

Trong Phần 3.3, chúng tôi đã đề cập rằng chủ đề có thể được tìm kiếm, nhưng dữ liệu thì không thể, vì vậy chúng tôi có thể tìm kiếm nhật ký chuyển tiền liên quan đến giá trị từ địa chỉ và _đến địa chỉ trong nhật ký, nhưng chúng tôi không thể tìm kiếm nhật ký chuyển tiền với số tiền chuyển làm giá trị _value . Vì sự kiện có 3 đối tượng (chữ ký của sự kiện, từ, _to), thao tác ghi nhật ký này sẽ sử dụng opcode LOG3.

Vậy nếu chúng ta muốn tìm nội dung của dữ liệu thì làm thế nào? Ở đây bạn cần biết các tham số của opcode trong EVM. Mặc dù LOG3 chứa 3 chủ đề nhưng nó có 5 tham số trong EVM.

Nếu bạn muốn đọc nội dung của dữ liệu, bạn có thể đọc dữ liệu sự kiện từ bộ nhớ theo cách sau.

đánh bắt cá

5.1 Việc sử dụng các sự kiện trong lừa đảo

Rất nhiều sự kiện nhật ký đã được giới thiệu trước đó, vậy những sự kiện này liên quan như thế nào đến việc câu cá? Những kẻ tấn công thường sử dụng các sự kiện nhật ký để giả làm sàn giao dịch hoặc người nổi tiếng để chuyển tiền cho nạn nhân (đồng tiền không có giá trị giao dịch thực tế và là mã thông báo lừa đảo), và nạn nhân sẽ mất cảnh giác khi họ thấy rằng tiền được chuyển từ sàn giao dịch hoặc người nổi tiếng Tại thời điểm này Lúc này, kẻ tấn công sẽ dẫn nạn nhân đến pool chứa token lừa đảo, nạn nhân sẽ ngay lập tức ủy quyền giao dịch khi thấy giá trị giao dịch cao của token, lúc này sẽ rơi vào bẫy do kẻ tấn công giăng ra. cho phép nạn nhân ủy quyền rồi lấy trộm tiền trong ví của nạn nhân.

Hình bên dưới là một vụ lừa đảo đã xảy ra trước đó, kẻ tấn công đã giả làm ví nóng Binance và chuyển token lừa đảo cho người khác.

Chúng ta có thể tìm thấy địa chỉ chính thức thông qua tab trên trình duyệt BSC.

Qua truy vấn, người ta thấy rằng địa chỉ của Binance Hot Wallet 6 chính xác là 0x8894e0a0c962cb723c1976a4421c95949be2d4e3.

Vì các bản ghi của trình duyệt dựa trên các sự kiện nên giá trị của chủ đề1, nghĩa là giá trị của người gửi, là 0x8894e0a0c962cb723c1976a4421c95949be2d4e3.

5.2 Tái phát

Sau đây là mã giả của BEP20, lấy mạng chính BNB Chain làm ví dụ để tái tạo, kẻ tấn công tạo mã thông báo lừa đảo có tên là "Mã thông báo lừa đảo". .

Như trong hình bên dưới, giá trị của tham số Binance mới là 0x8894E0a0c962CB723c1976a4421c95949bE2D4E3.

triển khaihợp đồnghợp đồng

Sau đó, gọi chức năng chuyển giao để chuyển tiếp mã thông báo lừa đảo cho nạn nhân.

tiêu đề cấp đầu tiên

tóm tắt

tiêu đề cấp đầu tiên

người giới thiệu

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