Nếu bạn từng thực hiện giao dịch trên Ethereum (hoặc bất kỳ blockchain nào có khả năng hợp đồng thông minh), thì bạn có thể đã tìm kiếm nó trên trình duyệt khối như etherscan.io và thấy một đống thông tin này:
Tab Tổng quan giao dịch
Và nếu bạn đã cố gắng xem các nhật ký hoặc dấu vết (giao dịch nội bộ), bạn có thể đã thấy những trang này gây nhầm lẫn:
Tab Nhật ký (bạn may mắn nếu chúng được giải mã đẹp như thế này)
Tab Traces (đúng vậy, nó trông giống như một đống vô nghĩa)
Học cách đọc chi tiết giao dịch trên trình duyệt khối sẽ là nền tảng cho tất cả việc phân tích dữ liệu và kiến thức về Ethereum của bạn, vì vậy hãy bao quát tất cả các phần và cách làm việc với chúng trong SQL.
Tôi chỉ đi qua cách hiểu những khái niệm này ở mức cao; nếu bạn muốn học cách giải mã chúng bằng tay, thì bạn sẽ cần phải làm quen với cáchdữ liệu được mã hóa (điều này cũng áp dụng cho giao dịch/đoạn mã/nhật ký) và cách sử dụng Các chức năng bytearray/hex của Duneđể chuyển đổi giữa các loại khác nhau.
Đến cuối hướng dẫn này, bạn sẽ có khả năng hiểu và điều hướng bảng dữ liệu cho bất kỳ hợp đồng nào bằng cách sử dụng truy vấn tìm bảng giao dịch này:
Liên kết truy vấn(Thêm bất kỳ mã giao dịch nào, chuỗi và số khối nào)
Sau khi bạn đã học các khái niệm trong hướng dẫn này, bạn cũng nên học cách sử dụng của tôi Bảng điều khiển khởi động nhanh EVMđể bắt đầu phân tích bất kỳ hợp đồng nào.
·
30 tháng 12 năm 2022
Các giao dịch chỉ là phần nổi của tảng dữ liệu, tất cả các dấu vết và nhật ký được gọi sau khi dữ liệu đầu vào ban đầu kích hoạt chức năng cấp cao nhất. Hãy đầu tiên gắn nhãn cho tất cả các trường bạn sẽ thấy trong trang giao dịch của trình duyệt khối:
Đây là các trường giống như khi bạn truy vấn “ethereum.transactions” trên Dune. Mục chính cần phải học để xác định ở đây là nếu “to” là một hợp đồng hay không. Thông thường, hợp đồng sẽ được đánh dấu rõ ràng. Nếu nó là một hợp đồng, nó nên có “dữ liệu đầu vào” chứa một cuộc gọi hàm.
Trong tất cả những khái niệm này, điều quan trọng nhất cần học kỹ là một EOA so với một địa chỉ hợp đồng. Hợp đồng được triển khai bởi EOA, và có thể được gọi trong trường “to” của một giao dịch. Nếu bạn nhấp vào một địa chỉ, các trình duyệt sẽ hiển thị ở phía trên bên trái nếu đó là một hợp đồng hoặc một tài khoản. Trên dune, bạn có thể tham gia vào bảng ethereum.creation_traces để kiểm tra xem đó có phải là một hợp đồng không. Lưu ý rằng chỉ có EOAs mới có thể là người ký “from” của giao dịch.
Học cách phân biệt dữ liệu trực tiếp từ onchain và dữ liệu được thêm vào bởi explorer/frontends. Mọi thứ trong blockchain đều được biểu thị dưới dạng hex (đôi khi được gọi là nhị phân hoặc byte), vì vậy gọi swap 1inch sẽ có chuỗi dữ liệu đầu vào này:
4 byte đầu tiên (8 ký tự) là “function signature”, làbăm keccakcủa tên chức năng và loại đầu vào. Etherscan có một nút “giải mã” tốt cho một số hợp đồng, cho bạn dạng đọc này:
Như bạn có thể thấy, có rất nhiều biến được đóng gói cùng nhau vào chuỗi hex dài đó từ trước đó. Cách mà chúng được mã hóa tuân theo đặc tả giao diện nhị phân ứng dụng (ABI) của hợp đồng thông minh.
ABI giống như tài liệu API cho các hợp đồng thông minh (như thông số kỹ thuật OpenAPI), bạn có thể đọc thêm về chi tiết kỹ thuật ở đây. Hầu hết các nhà phát triển sẽ xác minh rằng ABI của họ phù hợp với hợp đồng và tải lên ABI để mọi người tham khảo khi giải mã. Nhiều hợp đồng có thể liên quan đến MEV/giao dịch, nơi mà nhà phát triển muốn giữ mọi thứ kín đáo và riêng tư - vì vậy chúng ta không nhận được bất kỳ giải mã nào từ họ.
Trong Dune, chúng tôi đã giải mã các bảngdựa trên các ABI hợp đồng được gửiđể bảng hợp đồng (tức là ethereum.contracts), các hàm và sự kiện được chuyển đổi thành chữ ký bytes (ethereum.signatures), sau đó chúng được so khớp với các dấu vết và nhật ký để cung cấp cho bạn các bảng được giải mã như uniswap_v2_ethereum.Pair_evt_Swap lưu trữ tất cả các giao dịch trao đổi cho tất cả các hợp đồng cặp được tạo bởi nhà máy cặp Uniswap v2. Bạn có thể lọc các giao dịch trao đổi trên một cặp cụ thể bằng cách xem bảng địa chỉ hợp đồng cho sự kiện.
Trên Dune, bạn muốn truy vấn bảng này cho cuộc gọi chức năng này oneinch_ethereum.AggregationRouterV6_call_swap. Bạn sẽ thấy tên bảng này ở đầu kết quả truy vấn trong bảng tìm kiếm ở đầu hướng dẫn.
Đối với các phần sau về các dấu vết và nhật ký, chúng tôi sẽ sử dụnggiao dịch trao đổi tổng hợp 1inch tương tự. Đây là một ví dụ tốt vì một bộ định tuyến sẽ hoán đổi token qua nhiều hợp đồng DEX, vì vậy chúng ta sẽ có một sự đa dạng tốt của các dấu vết và nhật ký để điều traGate.
Tiếp theo, chúng ta hãy nói về nhật ký sự kiện. Nhật ký có thể được phát ra tại bất kỳ điểm nào trong một cuộc gọi hàm. Các nhà phát triển thường sẽ phát ra một nhật ký vào cuối một hàm, sau khi tất cả các giao dịch / logic được hoàn thành mà không có lỗi. Hãy xem sự kiện hoán đổi uniswap v3 được phát ra từ giao dịch trước đó:
Bạn sẽ thấy có một chủ đề0, chủ đề1, chủ đề2 và trường dữ liệu. Chủ đề0 tương tự như chữ ký hàm, ngoại trừ nó có 32 byte thay vì chỉ 4 byte (vẫn băm cách tương tự). Sự kiện có thể có các trường “được lập chỉ mục” để tăng tốc việc lọc dữ liệu, có thể xuất hiện trong chủ đề1, chủ đề2 hoặc chủ đề3. Tất cả các trường khác được mã hóa cùng nhau trong đối tượng “dữ liệu”. Một lần nữa, chúng tuân theo cùng các quy tắc mã hóa như giao dịch và theo dõi. Số “28” là chỉ mục của sự kiện trong toàn bộ khối. Đôi khi nó có thể hữu ích khi bạn muốn tham gia vào khi bạn muốn giao dịch swap hoặc chuyển trong một giao dịch.
Để tìm logic đằng sau việc phát ra sự kiện này, tôi sẽ cần phải đào sâu vào mã Solidity. Tôi sẽ nhấp vào địa chỉ được liên kết của sự kiện, đi đến tab hợp đồng, và tìm kiếm từ khóa “emit swap” vì tôi biết rằng tất cả các sự kiện đều có từ khóa “emit” ngay trước khi được gọi trong mã.
Đây là hợp đồng uniswapv3poolđược tạo ra nhà máy cho mỗi cặp.
Tôi có thể thấy rằng điều này được phát ra ở dòng 786 của hợp đồng, như là một phần của chức năng “swap”.
Có khả năng điều hướng các chức năng và sự kiện trong dòng tổ tiên của các hợp đồng sẽ là một kỹ năng chính mà bạn cần phải nắm được để hiểu chính xác dòng tổ tiên của dữ liệu mà bạn đang truy vấn. Bạn không cần phải học solidity sâu để điều hướng các tệp này, chỉ cần biết cách hiểu.giao diện hợp đồngvà khi các hàm/sự kiện được gọi (function và emit là từ khóa của bạn).
Để có ví dụ chi tiết về việc điều tra mã cho các hàm và sự kiện,Hãy xem bảng phân tích này về hợp đồng và dữ liệu Sudoswap.
Sử dụng truy vấn bảng từ trước, tôi có thể thấy rằng bảng tôi nên truy vấn cho việc đổi này là uniswap_v3_ethereum.Pair_evt_Swap và nó được phát ra sau khi hàm swap() được gọi.
Dấu vết có thể nhanh chóng trở nên rất khó điều hướng, vì cách các cuộc gọi lồng nhau giữa các hợp đồng khác nhau nhận được. Trước tiên chúng ta hãy hiểu các loại dấu vết:
Bạn cũng cần hiểu cột / chỉ mục trace_address. Đây là mẫu [0,1,1,1,1] mà bạn thường thấy. Hãy tưởng tượng nó giống như các dấu đầu dòng, trong đó số lượng số trong mảng cho biết độ sâu và thứ tự của các cuộc gọi hàm.
Một (null) - giao dịch đầu tiên có trace_address của []
CALLs B (0)
CALLs C (0,0)
CALLs D (1)
CALLs E (1,0) CALLs F (1,0,0)CALLs G (1,1)
CALLs H (2)
Như bạn có thể thấy từ bức ảnh chụp các giao dịch nội bộ (dấu vết) trước đó của chúng tôi, etherscan không phải là một nơi thân thiện để xem dấu vết. Tôi thích sử dụng phalcon blocksec thay vì, nó giải mã giao dịch như sau:
Điều này có vẻ quá sức, nhưng nó thực sự là một cách siêu dễ dàng để khám phá tất cả các chức năng, sự kiện và đối số trong luồng giao dịch. Khi bạn có thể hiểu điều này, thì bạn có thể nói rằng bạn hiểu tất cả dữ liệu trong một giao dịch một cách an toàn. Lưu ý rằng tìm bảng truy vấn là một bản sao gần như chính xác của bố cục này, tôi phần lớn được truyền cảm hứng từ chúng!
Lưu ý rằng trên Dune, chúng tôi tự động giải mã cả cuộc gọi giao dịch và các dấu vết của cùng tên chức năng vào cùng một bảng. Bạn có thể đang tự hỏi liệu bạn có thể dễ dàng kết hợp sự kiện và các dấu vết/giao dịch theo thứ tự đẹp như trong phalcon. Trên Dune, bạn có thể kết hợp theo mã giao dịch để tổng hợp dữ liệu chung, nhưng bạn không thể kết hợp theo bất kỳ chỉ số nào để tái tạo thứ tự tương tác chính xác. Điều này là một hạn chế không may ở thời điểm này đòi hỏi một bộ chỉ mục tùy chỉnh.
Nếu bạn hiểu các khái niệm mà tôi đã đề cập trong hướng dẫn này, thì bạn sẵn sàng đào sâu hơn và viết các truy vấn phức tạp hơn. Điều hướng dữ liệu qua các giao dịch bằng cách sử dụng nhiều công cụ khác nhau sẽ là một trong những kỹ năng chính mà bạn cần để xuất sắc trong lĩnh vực này.
Có lẽ có 10 nhà thám hiểm khác nhau mà tôi thấy mình sử dụng mỗi tuần và số lượng công cụ gấp 10 lần số tiền đó. Tôi viết một hướng dẫn hàng năm bao gồm cách ngăn xếp công cụ dữ liệu tiếp tục phát triển và bạn nên sử dụng từng công cụ để làm gì:
Nếu bạn từng thực hiện giao dịch trên Ethereum (hoặc bất kỳ blockchain nào có khả năng hợp đồng thông minh), thì bạn có thể đã tìm kiếm nó trên trình duyệt khối như etherscan.io và thấy một đống thông tin này:
Tab Tổng quan giao dịch
Và nếu bạn đã cố gắng xem các nhật ký hoặc dấu vết (giao dịch nội bộ), bạn có thể đã thấy những trang này gây nhầm lẫn:
Tab Nhật ký (bạn may mắn nếu chúng được giải mã đẹp như thế này)
Tab Traces (đúng vậy, nó trông giống như một đống vô nghĩa)
Học cách đọc chi tiết giao dịch trên trình duyệt khối sẽ là nền tảng cho tất cả việc phân tích dữ liệu và kiến thức về Ethereum của bạn, vì vậy hãy bao quát tất cả các phần và cách làm việc với chúng trong SQL.
Tôi chỉ đi qua cách hiểu những khái niệm này ở mức cao; nếu bạn muốn học cách giải mã chúng bằng tay, thì bạn sẽ cần phải làm quen với cáchdữ liệu được mã hóa (điều này cũng áp dụng cho giao dịch/đoạn mã/nhật ký) và cách sử dụng Các chức năng bytearray/hex của Duneđể chuyển đổi giữa các loại khác nhau.
Đến cuối hướng dẫn này, bạn sẽ có khả năng hiểu và điều hướng bảng dữ liệu cho bất kỳ hợp đồng nào bằng cách sử dụng truy vấn tìm bảng giao dịch này:
Liên kết truy vấn(Thêm bất kỳ mã giao dịch nào, chuỗi và số khối nào)
Sau khi bạn đã học các khái niệm trong hướng dẫn này, bạn cũng nên học cách sử dụng của tôi Bảng điều khiển khởi động nhanh EVMđể bắt đầu phân tích bất kỳ hợp đồng nào.
·
30 tháng 12 năm 2022
Các giao dịch chỉ là phần nổi của tảng dữ liệu, tất cả các dấu vết và nhật ký được gọi sau khi dữ liệu đầu vào ban đầu kích hoạt chức năng cấp cao nhất. Hãy đầu tiên gắn nhãn cho tất cả các trường bạn sẽ thấy trong trang giao dịch của trình duyệt khối:
Đây là các trường giống như khi bạn truy vấn “ethereum.transactions” trên Dune. Mục chính cần phải học để xác định ở đây là nếu “to” là một hợp đồng hay không. Thông thường, hợp đồng sẽ được đánh dấu rõ ràng. Nếu nó là một hợp đồng, nó nên có “dữ liệu đầu vào” chứa một cuộc gọi hàm.
Trong tất cả những khái niệm này, điều quan trọng nhất cần học kỹ là một EOA so với một địa chỉ hợp đồng. Hợp đồng được triển khai bởi EOA, và có thể được gọi trong trường “to” của một giao dịch. Nếu bạn nhấp vào một địa chỉ, các trình duyệt sẽ hiển thị ở phía trên bên trái nếu đó là một hợp đồng hoặc một tài khoản. Trên dune, bạn có thể tham gia vào bảng ethereum.creation_traces để kiểm tra xem đó có phải là một hợp đồng không. Lưu ý rằng chỉ có EOAs mới có thể là người ký “from” của giao dịch.
Học cách phân biệt dữ liệu trực tiếp từ onchain và dữ liệu được thêm vào bởi explorer/frontends. Mọi thứ trong blockchain đều được biểu thị dưới dạng hex (đôi khi được gọi là nhị phân hoặc byte), vì vậy gọi swap 1inch sẽ có chuỗi dữ liệu đầu vào này:
4 byte đầu tiên (8 ký tự) là “function signature”, làbăm keccakcủa tên chức năng và loại đầu vào. Etherscan có một nút “giải mã” tốt cho một số hợp đồng, cho bạn dạng đọc này:
Như bạn có thể thấy, có rất nhiều biến được đóng gói cùng nhau vào chuỗi hex dài đó từ trước đó. Cách mà chúng được mã hóa tuân theo đặc tả giao diện nhị phân ứng dụng (ABI) của hợp đồng thông minh.
ABI giống như tài liệu API cho các hợp đồng thông minh (như thông số kỹ thuật OpenAPI), bạn có thể đọc thêm về chi tiết kỹ thuật ở đây. Hầu hết các nhà phát triển sẽ xác minh rằng ABI của họ phù hợp với hợp đồng và tải lên ABI để mọi người tham khảo khi giải mã. Nhiều hợp đồng có thể liên quan đến MEV/giao dịch, nơi mà nhà phát triển muốn giữ mọi thứ kín đáo và riêng tư - vì vậy chúng ta không nhận được bất kỳ giải mã nào từ họ.
Trong Dune, chúng tôi đã giải mã các bảngdựa trên các ABI hợp đồng được gửiđể bảng hợp đồng (tức là ethereum.contracts), các hàm và sự kiện được chuyển đổi thành chữ ký bytes (ethereum.signatures), sau đó chúng được so khớp với các dấu vết và nhật ký để cung cấp cho bạn các bảng được giải mã như uniswap_v2_ethereum.Pair_evt_Swap lưu trữ tất cả các giao dịch trao đổi cho tất cả các hợp đồng cặp được tạo bởi nhà máy cặp Uniswap v2. Bạn có thể lọc các giao dịch trao đổi trên một cặp cụ thể bằng cách xem bảng địa chỉ hợp đồng cho sự kiện.
Trên Dune, bạn muốn truy vấn bảng này cho cuộc gọi chức năng này oneinch_ethereum.AggregationRouterV6_call_swap. Bạn sẽ thấy tên bảng này ở đầu kết quả truy vấn trong bảng tìm kiếm ở đầu hướng dẫn.
Đối với các phần sau về các dấu vết và nhật ký, chúng tôi sẽ sử dụnggiao dịch trao đổi tổng hợp 1inch tương tự. Đây là một ví dụ tốt vì một bộ định tuyến sẽ hoán đổi token qua nhiều hợp đồng DEX, vì vậy chúng ta sẽ có một sự đa dạng tốt của các dấu vết và nhật ký để điều traGate.
Tiếp theo, chúng ta hãy nói về nhật ký sự kiện. Nhật ký có thể được phát ra tại bất kỳ điểm nào trong một cuộc gọi hàm. Các nhà phát triển thường sẽ phát ra một nhật ký vào cuối một hàm, sau khi tất cả các giao dịch / logic được hoàn thành mà không có lỗi. Hãy xem sự kiện hoán đổi uniswap v3 được phát ra từ giao dịch trước đó:
Bạn sẽ thấy có một chủ đề0, chủ đề1, chủ đề2 và trường dữ liệu. Chủ đề0 tương tự như chữ ký hàm, ngoại trừ nó có 32 byte thay vì chỉ 4 byte (vẫn băm cách tương tự). Sự kiện có thể có các trường “được lập chỉ mục” để tăng tốc việc lọc dữ liệu, có thể xuất hiện trong chủ đề1, chủ đề2 hoặc chủ đề3. Tất cả các trường khác được mã hóa cùng nhau trong đối tượng “dữ liệu”. Một lần nữa, chúng tuân theo cùng các quy tắc mã hóa như giao dịch và theo dõi. Số “28” là chỉ mục của sự kiện trong toàn bộ khối. Đôi khi nó có thể hữu ích khi bạn muốn tham gia vào khi bạn muốn giao dịch swap hoặc chuyển trong một giao dịch.
Để tìm logic đằng sau việc phát ra sự kiện này, tôi sẽ cần phải đào sâu vào mã Solidity. Tôi sẽ nhấp vào địa chỉ được liên kết của sự kiện, đi đến tab hợp đồng, và tìm kiếm từ khóa “emit swap” vì tôi biết rằng tất cả các sự kiện đều có từ khóa “emit” ngay trước khi được gọi trong mã.
Đây là hợp đồng uniswapv3poolđược tạo ra nhà máy cho mỗi cặp.
Tôi có thể thấy rằng điều này được phát ra ở dòng 786 của hợp đồng, như là một phần của chức năng “swap”.
Có khả năng điều hướng các chức năng và sự kiện trong dòng tổ tiên của các hợp đồng sẽ là một kỹ năng chính mà bạn cần phải nắm được để hiểu chính xác dòng tổ tiên của dữ liệu mà bạn đang truy vấn. Bạn không cần phải học solidity sâu để điều hướng các tệp này, chỉ cần biết cách hiểu.giao diện hợp đồngvà khi các hàm/sự kiện được gọi (function và emit là từ khóa của bạn).
Để có ví dụ chi tiết về việc điều tra mã cho các hàm và sự kiện,Hãy xem bảng phân tích này về hợp đồng và dữ liệu Sudoswap.
Sử dụng truy vấn bảng từ trước, tôi có thể thấy rằng bảng tôi nên truy vấn cho việc đổi này là uniswap_v3_ethereum.Pair_evt_Swap và nó được phát ra sau khi hàm swap() được gọi.
Dấu vết có thể nhanh chóng trở nên rất khó điều hướng, vì cách các cuộc gọi lồng nhau giữa các hợp đồng khác nhau nhận được. Trước tiên chúng ta hãy hiểu các loại dấu vết:
Bạn cũng cần hiểu cột / chỉ mục trace_address. Đây là mẫu [0,1,1,1,1] mà bạn thường thấy. Hãy tưởng tượng nó giống như các dấu đầu dòng, trong đó số lượng số trong mảng cho biết độ sâu và thứ tự của các cuộc gọi hàm.
Một (null) - giao dịch đầu tiên có trace_address của []
CALLs B (0)
CALLs C (0,0)
CALLs D (1)
CALLs E (1,0) CALLs F (1,0,0)CALLs G (1,1)
CALLs H (2)
Như bạn có thể thấy từ bức ảnh chụp các giao dịch nội bộ (dấu vết) trước đó của chúng tôi, etherscan không phải là một nơi thân thiện để xem dấu vết. Tôi thích sử dụng phalcon blocksec thay vì, nó giải mã giao dịch như sau:
Điều này có vẻ quá sức, nhưng nó thực sự là một cách siêu dễ dàng để khám phá tất cả các chức năng, sự kiện và đối số trong luồng giao dịch. Khi bạn có thể hiểu điều này, thì bạn có thể nói rằng bạn hiểu tất cả dữ liệu trong một giao dịch một cách an toàn. Lưu ý rằng tìm bảng truy vấn là một bản sao gần như chính xác của bố cục này, tôi phần lớn được truyền cảm hứng từ chúng!
Lưu ý rằng trên Dune, chúng tôi tự động giải mã cả cuộc gọi giao dịch và các dấu vết của cùng tên chức năng vào cùng một bảng. Bạn có thể đang tự hỏi liệu bạn có thể dễ dàng kết hợp sự kiện và các dấu vết/giao dịch theo thứ tự đẹp như trong phalcon. Trên Dune, bạn có thể kết hợp theo mã giao dịch để tổng hợp dữ liệu chung, nhưng bạn không thể kết hợp theo bất kỳ chỉ số nào để tái tạo thứ tự tương tác chính xác. Điều này là một hạn chế không may ở thời điểm này đòi hỏi một bộ chỉ mục tùy chỉnh.
Nếu bạn hiểu các khái niệm mà tôi đã đề cập trong hướng dẫn này, thì bạn sẵn sàng đào sâu hơn và viết các truy vấn phức tạp hơn. Điều hướng dữ liệu qua các giao dịch bằng cách sử dụng nhiều công cụ khác nhau sẽ là một trong những kỹ năng chính mà bạn cần để xuất sắc trong lĩnh vực này.
Có lẽ có 10 nhà thám hiểm khác nhau mà tôi thấy mình sử dụng mỗi tuần và số lượng công cụ gấp 10 lần số tiền đó. Tôi viết một hướng dẫn hàng năm bao gồm cách ngăn xếp công cụ dữ liệu tiếp tục phát triển và bạn nên sử dụng từng công cụ để làm gì: