Dữ liệu Ethereum trong Chainslake

- 9 mins

Trong bài viết trước các bạn đã được giới thiệu về tổ chức các bảng cũng như cách truy vấn dữ liệu hiệu quả trên nền tảng Chainslake. Ở bài viết này mình sẽ chia sẻ về dữ liệu của Ethereum trong Chainslake, hiểu rõ Ethereum sẽ giúp các bạn có thể khai thác dữ liệu từ tất cả các EVM blockchain khác.

Nội dung

  1. Dữ liệu thô trên Ethereum
  2. Giải mã dữ liệu, lấy thông tin từ contract
  3. Xây dựng các bảng insight
  4. Kết luận

Dữ liệu thô trên Ethereum

Dữ liệu thô trên Ethereum gồm 3 bảng transactions, logs, traces đặt trong thư mục ethereum.

Transactions

transactions

Đây là bảng chứa thông tin của tất cả các giao dịch trên Ethereum, mỗi giao dịch bao gồm:

Traces

traces

Khi contract thực thi một giao dịch sẽ bao gồm nhiều bước xử lý tuần tự, các bước xử lý này có thể gọi đến các function khác trong cùng contract hoặc của contract khác, đây được gọi là các internal transactions. Bảng traces lưu lại thông tin của toàn bộ các internal transaction trên Ethereum. Bao gồm các thông tin sau:

Logs

logs

Trong quá trình thực thi, một contract có thể emit ra event để ghi nhận việc dữ liệu bên trong contract đã thay đổi, dữ liệu từ các event này được lưu trong bảng logs. Bao gồm các thông tin sau:

Lưu ý: Trong bảng logs chỉ chứa các event của các giao dịch thành công

Giải mã dữ liệu, lấy thông tin từ contract

Giải mã dữ liệu

Dữ liệu trong các bảng transactions, traces, logs đều được mã hóa. VD:

Để giải mã những dữ liệu này thành dạng có thể đọc hiểu được, chúng ta cần ABI (Application Binary Interface) thường được cung cấp đi kèm với mã nguồn của contract. Hãy xem 1 ví dụ về ABI của contract ERC20:

[
    {
        "anonymous": false,
        "inputs": [
            {
                "indexed": true,
                "name": "from",
                "type": "address"
            },
            {
                "indexed": true,
                "name": "to",
                "type": "address"
            },
            {
                "indexed": false,
                "name": "value",
                "type": "uint256"
            }
        ],
        "name": "Transfer",
        "type": "event"
    }
]

Kết quả sau khi decode sẽ nhận được bảng ethereum_decoded.erc20_evt_transfer dưới đây:

erc20_evt_transfer

Bảng được decode từ bảng logs thông qua ABI, bạn có thể xem các bảng decode khác trong thư mục ethereum_decoded

erc20_evt_transfer_diagram

Lấy thông tin từ contract

Để thuận tiện cho việc sử dụng thì Chainslake cần lấy thêm thông tin từ các contract sau khi decode, các bảng thông tin này được đặt trong thư mục ethereum_contract. Ví dụ như bảng erc20_tokens dưới đây:

erc20_tokens

Bảng có các thông tin như tên, symbol, total supply của contract. Contract address được lấy từ bảng erc20_evt_transfer:

erc20_tokens_diagram

Xây dựng các bảng insight

Các bảng dữ liệu thô, bảng decoded và bảng contract là những nguyên liệu khi kết hợp lại theo một logic nhất định sẽ được bảng insight phù hợp với mục truy vấn dữ liệu. Mình sẽ lấy ví dụ với bảng ethereum_balances.token_transfer_hour:

token_transfer_hour

Đây là bảng chứa thông tin về sự thay đổi số dư của mọi ví, mọi token trên Ethereum mỗi giờ, bao gồm các thông tin:

Để xây dựng bảng này chúng ta cần dữ liệu từ các bảng transactions, traces, erc20_evt_transfer, erc20_tokens, sơ đồ như sau:

token_transfer_hour_diagram

Bạn có thể xem Source code của bảng này sau khi click vào hình trên, mình sẽ giải thích qua về logic của bảng này:

frequent_type=hour
list_input_tables=${chain_name}_decoded.erc20_evt_transfer,${chain_name}.traces,${chain_name}.transactions,${chain_name}_contract.erc20_tokens
output_table=${chain_name}_balances.token_transfer_hour
erc20_event_table=${chain_name}_decoded.erc20_evt_transfer
erc20_token_table=${chain_name}_contract.erc20_tokens
transactions_table=${chain_name}.transactions
traces_table=${chain_name}.traces
re_partition_by_range=block_date,key_partition
partition_by=block_date
write_mode=Append
number_index_columns=7

Ở phần header của Code chúng ta có các cấu hình của bảng bao gồm:

Trong phần body của Code là logic xây dựng bảng được viết bằng SQL. Dữ liệu transfer token được lấy từ bảng erc20_evt_transfer, kết hợp cùng erc20_tokens để lấy tên, symbol, decimals của token sau đó nhóm theo block_hour, wallet_address, token_address để tính ra số lượng token thay đổi theo giờ. Đối với Native ETH thì cần lấy từ bảng traces (chỉ lấy giao dịch thành công) và transactions (để lấy phí giao dịch).

Kết luận

Bài viết đến đây tuy đã khá dài, nhưng mình cũng đã giới thiệu được những phần quan trọng nhất về dữ liệu của Ethereum của Chainslake, hi vọng từ đây các bạn đã có thể tự mình khám phá và khai thác dữ liệu của Chainslake. Hẹn gặp lại!

comments powered by Disqus