Trong bài viết hôm nay, chúng ta sẽ tìm hiểu về Solidity event , thường được gọi là nhật ký trong Ethereum và EVM. Chúng ta sẽ xem cách sử dụng chúng, định nghĩa của chúng cũng như cách sử dụng hàm băm và chữ ký của chủ đề sự kiện để lọc nhật ký, cũng như một số lời khuyên về thời điểm bạn nên sử dụng chúng.
Chúng tôi cũng sẽ đề cập đến việc kiểm tra-các sự kiện-tương tác mẫu, mẫu nổi tiếng này thường được áp dụng cho việc quay lại các biến trạng thái, nhưng chúng ta sẽ hiểu tại sao mẫu như vậy cũng nên được áp dụng để kích hoạt các sự kiện cũng như các rủi ro tiềm ẩn và lỗ hổng bảo mật liên quan.
Làm cách nào để xác định các sự kiện trong Solidity?
Có thể sử dụng đượceventTừ khóa xác định các sự kiện trong Solidity như hình bên dưới.
giao diện ILight { event SwitchedON(); event SwitchedOFF(); event BulbReplaced();
Bạn có thể truy cập vào tên hợp đồng bằng cách xác định đầy đủ tên hợp đồng đó, tuân theo bởi /span>. và tên sự kiện từ một hợp đồng khác Sự kiện truy cập, như hiển thị bên dưới:
sự kiện Đã đăng ký thành công(địa chỉ người dùng)
Chữ ký sự kiện sẽ là:
span >sự kiện Đã đăng ký thành công(địa chỉ người dùng)
Băm chủ đề sự kiện sẽ là:
byte32 topicHash = Đã đăng ký thành công.selector;
Xin lưu ý rằng chỉ sau Solidity v0.8.15, các sự kiện.selector Chỉ thành viên mới có thể sử dụng nó.
Nếu bạn xem bất kỳ nhật ký blockchain nào được phát hành, bạn sẽ thấy rằng chỉ mục nhật ký của chủ đề0 (đầu tiên) Mục nhập tương ứng băm chủ đề sự kiện. Vì chủ đề là nội dung có thể tìm kiếm được trong nhật ký nên chúng tôi có thể lọc bằng hàm băm chủ đề sự kiện:
Tìm kiếm một sự kiện cụ thể trong hợp đồng thông minh tại một địa chỉ cụ thể.
Trong khu vực Tìm kiếm tất cả các hợp đồng trên blockchain cho một sự kiện cụ thể.
chúng tôi Như sẽ thấy rõ hơn bên dưới, ẩn danhẩn danh Sự kiện là ngoại lệ cho quy tắc này. Từ khóa ẩn danh làm cho chúng không thể tìm kiếm được và do đó Sử dụng thuật ngữ "ẩn danh".
Dựa trên thực tế này, chúng ta cũng có thể suy ra rằng Solidity The sự kiện đơn giản nhất được xác định, không có tham số, chẳng hạn như sự kiện được xác định ở trênBulbReplacedhoặcSwitchedON , sẽ sử dụng mã opcode LOG1 ẩn sâu bên trong. Kích hoạt các chủ đề trong nhật ký vì bản thân các sự kiện đều có thể tìm kiếm được.
Có thể thêm nhiều chủ đề hơn, các chủ đề khác sẽ được sử dụng< code>LOG2, LOG3, LOG4vàLOG5< /code>, miễn là các thông số này được đánh dấu là được lập chỉ mục code>. Chúng ta hãy xem các tham số chỉ mục trong phần tiếp theo.
Thông số sự kiện và thông số chỉ mục
Sự kiện có thể chấp nhận tham số thuộc bất kỳ loại nào, bao gồm cả loại giá trị (uintN, bytesN< /span>, bool, địa chỉ...),struct, enum và do người dùng xác định loại giá trị.
Dựa trên nghiên cứu của tôi khi viết bài này, những loại duy nhất không được phép là loại chức năng nội bộ. Các loại chức năng bên ngoài được phép, nhưng các loại chức năng bên trong thì không. Ví dụ: đoạn mã sau sẽ không biên dịch.
// SPDX-Mã nhận dạng giấy phép: KHÔNG ĐƯỢC CẤP PHÉP độ vững chắc pragma ^0.8.0;
hợp đồng AnonymousEvents { event SecretPasswordHashUpdated(bytes32 secretPasswordHash)ẩn danh;
Nếu sự kiện được khai báo là span>ẩn danh, trong hợp đồng ABI, sự kiện"anonymous"Trường này sẽ được đánh dấu là true.
Một lợi thế của sự kiện ẩn danh là nó giúp cho hợp đồng của bạn triển khai rẻ hơn và cũng rẻ hơn về gas khi được kích hoạt.
Trường hợp sử dụng tốt cho sự kiện ẩn danh là dành cho hợp đồng chỉ với một sự kiện. Việc lắng nghe tất cả các sự kiện trong hợp đồng là điều hợp lý vì chỉ một sự kiện này sẽ xuất hiện trong nhật ký sự kiện. Đăng ký tên của nó là không liên quan vì chỉ có một sự kiện duy nhất được xác định là sẽ được phát ra trong hợp đồng. Do đó, bạn có thể xác định các sự kiện là ẩn danh và đăng ký tất cả nhật ký sự kiện từ hợp đồng cũng như xác nhận rằng tất cả chúng đều là cùng một sự kiện.
Xem ví dụ về các sự kiện ẩn danh đang được sử dụng trong các thư viện mã phổ biến, chẳng hạn như trên DappHub Hợp đồng DS-Note [7].
Chúng ta có thể Như đã thấy trong đoạn mã, vì sự kiện được khai báo ẩn danh nên điều này giúp xác định thông số "được lập chỉ mục" thứ tư.
Xin lưu ý rằng vì các sự kiện ẩn danh không có hàm băm chủ đề bytes32 nên các sự kiện ẩn danh không hỗ trợ thành viên .selector.
Sử dụng mã opcode LOG để kích hoạt các sự kiện trong tập hợp
< span style="font-size: 18px;">Có thể kích hoạt các sự kiện trong tập hợp, sử dụng mã logN Lệnh >, tương ứng với opcode trong tập lệnh EVM.
Để kích hoạt một sự kiện trong tập hợp, bạn phải bao gồm tất cả dữ liệu được phát ra bởi sự kiện Được lưu trữ tại một vị trí cụ thể trong bộ nhớ.
Khi bạn có dữ liệu được phát ra bởi sự kiện được lưu trữ trong bộ nhớ, bạn sau đó có thể Các tham số sau được chỉ định cho lệnh logN:
p = Vị trí bộ nhớ để bắt đầu tìm nạp dữ liệu từ đó. Về cơ bản đây là một con trỏ bộ nhớ, hay "offset" hay "chỉ mục bộ nhớ", tùy thuộc vào cách bạn gọi nó.
s = bạn muốn bắt đầu từ p in sự kiện Số byte được phát ra trong .
Tất cả các tham số kháct1, t2, t3 và t4 code> là tất cả các thông số sự kiện mà bạn muốn lập chỉ mục. Xin lưu ý rằng có hai điều quan trọng ở đây: 1) các tham số này phải giống với các tham số được xác định trong định nghĩa sự kiện của bạn theo cùng một thứ tự, 2) các tham số này phải được đặt trong bộ nhớ để lấy dữ liệu.
Đoạn mã bên dưới cho biết cách Thực hiện điều này trong hội đồng.
<span ) 10px 10px / 40px không lặp lại ;height: 30px; chiều rộng: 100%;margin-bottom: -7px;bán kính đường viền: 5px;'>sự kiện Ví dụEventAsm(bytes32 tokenId);
assembly { let freeMemoryPointer := mload(0x40) mstore(freeMemoryPointer, topicHash) mstore(add(freeMemoryPointer, 32), tokenId) < br> // phát ra sự kiện `ExampleEventAsm` với 2 chủ đề log2( freeMemoryPointer , // `p` = offset bắt đầu trong bộ nhớ 64, // `s` = số byte trong bộ nhớ từ `p` để đưa vào dữ liệu sự kiện< br> topicHash, // chủ đề để lọc chính sự kiện tokenId // Tham số được lập chỉ mục thứ 1 )
Chi phí gas của sự kiện
Tất cả các mã hoạt động bản ghi (LOG0, LOG1, LOG2, LOG3, LOG4) đều cần tiêu tốn gas. Càng có nhiều thông số (chủ đề) thì càng tiêu tốn nhiều gas.
Ngoài ra , Các yếu tố khác như lập chỉ mục hoặc kích thước dữ liệu cũng có thể khiến việc phát sự kiện tiêu tốn nhiều gas hơn.
Chế độ tương tác kiểm tra sự kiện
Kiểm tra hợp lệ - Chế độ tương tác [9] cũng hoạt động cho các sự kiện.
Một cách để phát hiện các mẫu này là sử dụng công cụ phân tích tĩnh Remix .
Mẫu này cũng có thể được Slither phát hiện. Khi chạy trợt theo hợp đồng kích hoạt sự kiện sau lệnh gọi bên ngoài, bạn sẽ nhận được thông báo có nội dung "Sự kiện đăng ký lại".
Vì vậy, đối với dApp, thứ tự rất quan trọng để bạn có thể thực hiện đúng xem sự kiện nào được phát ra đầu tiên, tiếp theo và cuối cùng. Điều này đặc biệt quan trọng trong trường hợp các cuộc gọi đệ quy hoặc gửi lại. Nếu sự kiện được kích hoạt sau lệnh gọi bên ngoài và lệnh gọi bên ngoài này thực hiện lệnh gọi được gửi lại thì:
Sự kiện đầu tiên được phát ra là sự kiện sau khi lệnh gọi lại thứ hai hoàn tất.
Sự kiện thứ hai được phát ra là sự kiện giao dịch ban đầu phát ra sau này.
Hiểu được điều này cũng giúp A có thể dấu vết kiểm tra rõ ràng được cung cấp ngoài chuỗi để giám sát các cuộc gọi hợp đồng. Bạn có thể xem chức năng nào được gọi đầu tiên và cuối cùng cũng như thứ tự chạy từng quy trình trong khi thực hiện giao dịch.
Tài liệu về máy dò trượt[10] - Tính chắc chắn và Máy phân tích tĩnh của Vyper.
Lỗ hổng tiềm ẩn này cũng xuất hiện trong Trail of Bits chống lại Liquity[ 11] Được tìm thấy và báo cáo trong quá trình kiểm tra hợp đồng thông minh.
Khi nào sự kiện nên được kích hoạt?
Có thể có một số tình huống trong hợp đồng của bạn mà việc kích hoạt một sự kiện có thể quan trọng và hữu ích.
Khi Khi người dùng và địa chỉ bị hạn chế thực hiện một số hành động nhất định (ví dụ: chủ sở hữu hoặc quản trị viên hợp đồng). Ví dụ: điều này bao gồm chuyển quyền sở hữu (địa chỉ) Chức năng chỉ có thể được gọi bởi chủ sở hữu để thay đổi chủ sở hữu hợp đồng.
Thay đổi một số biến chính hoặc tham số số học chịu trách nhiệm về logic cốt lõi của hợp đồng. Điều này đặc biệt quan trọng trong bối cảnh giao thức DeFi.
Thông tin thêm về những tình huống này được mô tả trong tài liệu về máy dò Slither [12].
Điều này cũng được mô tả trong báo cáo kiểm tra của Trail về LookRare.
Giám sát các hợp đồng được triển khai trong sản xuất để phát hiện những điểm bất thường.
Xem chi tiết về 0xprotocol[13] để biết các vấn đề liên quan đến bảo mật xung quanh sự cố.
Tham khảo
Sử dụng sự kiện ẩn danh Thiếu tài liệu cho mục đích (biết lý do)[14]
< span style="text-align: left;">[Ưu điểm của sự kiện ẩn danh]
Preview
Có được sự hiểu biết rộng hơn về ngành công nghiệp tiền điện tử thông qua các báo cáo thông tin và tham gia vào các cuộc thảo luận chuyên sâu với các tác giả và độc giả cùng chí hướng khác. Chúng tôi hoan nghênh bạn tham gia vào cộng đồng Coinlive đang phát triển của chúng tôi:https://t.me/CoinliveSG