CryptoHouse: Dịch Vụ Phân Tích Blockchain Miễn Phí Được Hỗ Trợ Bởi ClickHouse và Goldsky

Chúng tôi vui mừng thông báo về CryptoHouse, có thể truy cập tại crypto.clickhouse.com, là một dịch vụ phân tích blockchain miễn phí được hỗ trợ bởi ClickHouse.

Các dịch vụ phân tích blockchain công cộng hiện tại thường yêu cầu các truy vấn được lập lịch, thực hiện không đồng bộ, trong khi ClickHouse cung cấp phân tích thời gian thực, phổ biến quyền truy cập thông qua phản hồi truy vấn tức thì. Người dùng có thể sử dụng SQL để truy vấn dữ liệu, được cập nhật theo thời gian thực nhờ sự hỗ trợ của Goldsky, và hoàn toàn miễn phí. Giao diện người dùng tùy chỉnh của chúng tôi cho phép lưu và chia sẻ truy vấn cũng như tạo biểu đồ cơ bản, và cung cấp các ví dụ để giúp người dùng bắt đầu. Chúng tôi chào đón các đóng góp từ bên ngoài vào các truy vấn mẫu để hỗ trợ nỗ lực này.

Từ hôm nay, người dùng CryptoHouse có thể truy vấn miễn phí các khối, giao dịch, chuyển token, phần thưởng khối, tài khoản và token của Solana. Cơ sở dữ liệu tương tự cũng được cung cấp cho Ethereum. Chúng tôi kế hoạch mở rộng dữ liệu có sẵn và công khai nhiều blockchain hơn trong vài tháng tới!

Nếu bạn quan tâm đến lý do và cách xây dựng dịch vụ này, hãy tiếp tục đọc…

Nhu cầu về phân tích blockchain

Blockchain là các thực thể phức tạp, có thể xử lý hàng nghìn giao dịch và thực hiện hợp đồng thông minh mỗi giây. Hiểu về sự thay đổi và trạng thái của chúng rất quan trọng đối với nhà đầu tư ra quyết định sáng suốt và nhà phát triển xây dựng các hợp đồng này.

SQL là ngôn ngữ tự nhiên để thực hiện các phân tích này, nhưng điều này đặt ra hai thách thức lớn: (1) chuyển đổi các thực thể blockchain sang định dạng có cấu trúc, theo hàng; (2) tìm thấy một cơ sở dữ liệu có thể xử lý thông lượng cao và lượng dữ liệu tiềm năng lên đến petabyte đồng thời đáp ứng nhu cầu truy vấn phân tích của người dùng.

ClickHouse là tiêu chuẩn cho phân tích blockchain

Là cơ sở dữ liệu OLAP mã nguồn mở, ClickHouse rất phù hợp để lưu trữ dữ liệu blockchain nhờ thiết kế theo cột và động thực thi song song cao. Điều này cho phép các truy vấn chạy trên hàng terabyte dữ liệu, thực hiện phân tích nhanh trên toàn bộ tập dữ liệu. Do đó, chúng tôi thấy ngày càng nhiều công ty (như Goldsky và Nansen) sử dụng ClickHouse làm cốt lõi trong các dịch vụ phân tích blockchain của họ.

Xây dựng dịch vụ công cộng

Bất kỳ ai theo dõi ClickHouse và biết về bản demo công khai của chúng tôi đều biết rằng chúng tôi thích xử lý các tập dữ liệu lớn và xây dựng dịch vụ xung quanh chúng. Đầu năm nay, chúng tôi đã phát hành ClickPy, cung cấp phân tích miễn phí về các gói Python được tải xuống. Gần đây, adsb.exposed đã gây ấn tượng mạnh mẽ cộng đồng với khả năng trực quan hóa dữ liệu bay ấn tượng.

Chúng tôi đã biết từ lâu rằng blockchain có tiềm năng đáp ứng nhu cầu của chúng tôi về các tập dữ liệu lớn và phức tạp. Trong các blockchain phổ biến, chúng tôi biết mạng Solana vừa lớn vừa phức tạp. Mặc dù đã có các giải pháp dịch vụ phân tích blockchain công cộng, nhưng người dùng thường cần lập lịch truy vấn và chờ chúng thực hiện không đồng bộ - lưu kết quả để truy xuất sau này. Với tư cách là người bảo trì ClickHouse, chúng tôi biết chúng tôi có thể giải quyết vấn đề này tốt hơn, cung cấp phân tích blockchain thời gian thực với chi phí cực thấp và phổ biến quyền truy cập dữ liệu bằng cách cho phép người dùng viết truy vấn và nhận phản hồi ngay lập tức.

Mặc dù chúng tôi tự tin về công việc của mình với ClickHouse, nhưng chúng tôi thừa nhận mình không phải là chuyên gia tiền điện tử. Việc chuyển đổi blockchain Solana sang định dạng có cấu trúc, theo hàng dường như cần một số kiến thức chuyên ngành nhất định. Vì vậy, "thách thức" này đã bị hoãn lại cho đến một số cuộc gặp mặt may mắn vào đầu năm nay.

Đến với Goldsky

Goldsky là một sản phẩm tập trung vào cơ sở hạ tầng dữ liệu tiền điện tử, cung cấp công cụ cho nhà phát triển, cho phép họ tận dụng dữ liệu từ mạng Solana và các blockchain khác để xây dựng các ứng dụng thời gian thực tuyệt vời. Nền tảng của họ cung cấp các dịch vụ như phát trực tiếp các sự kiện blockchain có cấu trúc theo thời gian thực và ghi thẳng vào cơ sở dữ liệu, hỗ trợ nhà phát triển xây dựng các ứng dụng Web3 dựa trên dữ liệu đáng tin cậy.

Trong khi Goldsky đã sử dụng ClickHouse trong một thời gian để đáp ứng các kịch bản sử dụng nội bộ, họ thường được yêu cầu gửi dữ liệu blockchain đến các cụm ClickHouse riêng của khách hàng muốn phân tích. Cuối năm ngoái, trong cuộc phỏng vấn với Giám đốc Công nghệ Jeff Ling của Goldsky, chúng tôi đã chia sẻ ý tưởng xây dựng CryptoHouse. Điều bất ngờ là Jeff rất sẵn lòng tham gia và giải quyết các vấn đề về kỹ thuật dữ liệu mà chúng tôi đang đối mặt!

Thách thức kỹ thuật dữ liệu

Solana tạo ra 3000 đến 4000 giao dịch mỗi giây, dữ liệu cần được trích xuất trực tiếp từ các nút. Ban đầu, Goldsky vận hành phần mềm mã nguồn mở để cung cấp hỗ trợ Solana, điều này tương đương với việc quét API nút blockchain tích hợp. Phương pháp này dẫn đến một kiến trúc trong đó các khối mới được phát hiện và đặt vào hàng đợi, nhiều quy trình công việc chịu trách nhiệm lấy tất cả các giao dịch cần thiết, sau đó đặt vào nền tảng Goldsky Mirror để hoàn thành với độ trễ thấp nhất có thể.

Thực tế, mỗi giao dịch cũng được trích xuất vào các tập dữ liệu bổ sung, chẳng hạn như chuyển token và thay đổi tài khoản. Khung tiếp nhận dữ liệu đã được điều chỉnh để phù hợp với tất cả các chuyển đổi dữ liệu cần thiết cho hạ nguồn.

Khi dữ liệu chảy vào nền tảng theo thời gian thực, chúng tôi đã tạo cấu hình đường ống phản chiếu cho tất cả các bảng muốn hỗ trợ. Để khớp dữ liệu với bảng, chúng tôi cần thực hiện một số chuyển đổi, được tối ưu hóa để lưu trữ hiệu quả và hướng đến các truy vấn phổ biến nhất mà người dùng có thể muốn chạy.

# Ví dụ đường ống cho khối - điều này được lặp lại cho tất cả các bảng
name: clickhouse-partnership-solana
sources:
  blocks:
    dataset_name: solana.edge_blocks
    type: dataset
    version: 1.0.0
transforms:
  blocks_transform:
    sql: >
      SELECT hash as block_hash, `timestamp` AS block_timestamp, height, leader, leader_reward, previous_block_hash, slot, transaction_count 
      FROM blocks 
    primary_key: block_timestamp, slot, block_hash
sinks:
  solana_blocks_sink:
    type: clickhouse
    table: blocks
    secret_name: CLICKHOUSE_PARTNERSHIP_SOLANA
    from: blocks_transform

Cuối cùng, vì mô hình cuối cùng cần các bộ giá trị, chúng tôi gặp khó khăn khi chuyển đổi JSON trong tập dữ liệu sang định dạng chính xác. Để làm điều này, chúng tôi đã tận dụng động cơ Bảng Null, kết hợp với View Materialized, thực hiện chuyển đổi ClickHouse cụ thể từ chuỗi JSON sang bộ giá trị. Ví dụ, view và Bảng Null sau chịu trách nhiệm nhận các thao tác chèn cho tập dữ liệu token. Kết quả của View Materialized được gửi đến bảng solana.tokens cuối cùng:

CREATE TABLE solana.stage_tokens
(
	`block_slot` Int64,
	`block_hash` String,
	`block_timestamp` DateTime64(6),
	`tx_signature` String,
	`retrieval_timestamp` DateTime64(6),
	`is_nft` Bool,
	`mint` String,
	`update_authority` String,
	`name` String,
	`symbol` String,
	`uri` String,
	`seller_fee_basis_points` Decimal(38, 9),
	`creators` String,
	`primary_sale_happened` Bool,
	`is_mutable` Bool
)
ENGINE = Null

CREATE MATERIALIZED VIEW solana.stage_tokens_mv TO solana.tokens
(
	`block_slot` Int64,
	`block_hash` String,
	`block_timestamp` DateTime64(6),
	`tx_signature` String,
	`retrieval_timestamp` DateTime64(6),
	`is_nft` Bool,
	`mint` String,
	`update_authority` String,
	`name` String,
	`symbol` String,
	`uri` String,
	`seller_fee_basis_points` Decimal(38, 9),
	`creators` Array(Tuple(String, UInt8, Int64)),
	`primary_sale_happened` Bool,
	`is_mutable` Bool
)
AS SELECT block_slot, block_hash, block_timestamp, tx_signature, retrieval_timestamp, is_nft, mint, update_authority, name, symbol, uri, seller_fee_basis_points, arrayMap(x -> (x.1, (x.2) = 1, x.3), CAST(creators, 'Array(Tuple(String, Int8, Int64))')) AS creators,primary_sale_happened, is_mutable
FROM solana.stage_tokens

Phương pháp này rất hiệu quả và mang lại cho chúng tôi sự linh hoạt lớn, cho phép chúng tôi nạp lại dữ liệu với tốc độ gần 500k hàng/giây.

Tại biên, chúng tôi dễ dàng tối ưu hóa để chỉ có một đường ống chứa 10 quy trình công việc để xử lý tất cả dữ liệu biên, tương đương với khoảng 6000 hàng được ghi mỗi giây.

Đối với những người dùng muốn tìm hiểu thêm về View Materialized gia tăng trong ClickHouse hoạt động như thế nào, chúng tôi đề xuất tài liệu này hoặc video này.

Khi truy vấn, người dùng có thể nhận thấy một số khối và giao dịch Solana có giá trị timestamp1970-01-01height là 0. Mặc dù Goldsky cung cấp dữ liệu mới, nhưng các hàng trước tháng 6 năm 2024 được nạp lại từ BigQuery. Một số giá trị thời gian và chiều cao trong dữ liệu này là trống, và trong ClickHouse, các giá trị này trở thành giá trị mặc định của loại tương ứng - Date và Int64. Chúng tôi dự định giải quyết các vấn đề về chất lượng dữ liệu này trong dài hạn.

Các thách thức của ClickHouse

Đảm bảo sử dụng công bằng

Mặc dù lượng dữ liệu từ blockchain Solana không phải là lớn đối với ClickHouse, bảng lớn nhất chứa khoảng 500TiB dữ liệu giao dịch (như hiển thị dưới đây), nhưng chúng tôi muốn cung cấp một tính năng cho phép bất kỳ ai cũng có thể viết SQL truy vấn. Điều này đặt ra câu hỏi về cách quản lý tài nguyên một cách công bằng, đảm bảo rằng không có truy vấn nào tiêu thụ tất cả bộ nhớ hoặc CPU có sẵn.

SELECT
   `table`,
   formatReadableSize(sum(data_compressed_bytes)) AS compressed_size,
   formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size,
   round(sum(data_uncompressed_bytes) / sum(data_compressed_bytes), 2) AS ratio
FROM system.parts
WHERE (database = 'solana') AND active
GROUP BY `table`
ORDER BY sum(data_compressed_bytes) DESC

┌─table─────────────────────────┬─compressed_size─┬─uncompressed_size─┬─ratio─┐
│ transactions                  │ 79.34 TiB       │ 468.91 TiB        │  5.91 │
│ transactions_non_voting       │ 17.89 TiB       │ 162.20 TiB        │  9.07 │
│ token_transfers               │ 3.08 TiB        │ 18.84 TiB         │  6.11 │
│ block_rewards                 │ 1.31 TiB        │ 10.85 TiB         │  8.28 │
│ accounts                      │ 47.82 GiB       │ 217.88 GiB        │  4.56 │
│ blocks                        │ 41.17 GiB       │ 82.64 GiB         │  2.01 │
│ tokens                        │ 3.42 GiB        │ 10.10 GiB         │  2.96 │
└───────────────────────────────┴─────────────────┴───────────────────┴───────┘

10 rows in set. Elapsed: 0.009 sec. Processed 1.42 thousand rows, 78.31 KB (158.79 thousand rows/s., 8.74 MB/s.)
Peak memory usage: 99.91 KiB.

Để đảm bảo sử dụng công bằng (và chi phí có thể dự đoán được), chúng tôi đã triển khai hạn mức sử dụng ClickHouse, giới hạn số hàng mà truy vấn của người dùng có thể quét là 10 tỷ hàng. Truy vấn cũng phải hoàn thành trong vòng 60 giây (đa số các truy vấn đều làm được điều này, nhờ hiệu năng của ClickHouse), và mỗi người dùng có thể thực hiện tối đa 60 truy vấn mỗi giờ. Các hạn chế khác về việc sử dụng bộ nhớ nhằm đảm bảo sự ổn định và sử dụng công bằng của dịch vụ.

Tăng tốc truy vấn với View Materialized

Một số truy vấn không thể tránh khỏi sẽ tốn nhiều tài nguyên tính toán hơn các truy vấn khác. Truy vấn blockchain thường cần quét một lượng lớn dữ liệu, cung cấp thống kê tổng hợp cho hàng tỷ hàng. Để thực hiện các loại truy vấn này, chúng tôi cung cấp View Materialized của ClickHouse, nó chuyển tính toán từ thời gian truy vấn sang thời gian chèn. Điều này có thể tăng tốc đáng kể một số truy vấn và cho phép người dùng nhận được thống kê trên toàn bộ tập dữ liệu. Các view này được cập nhật gia tăng theo thời gian thực khi dữ liệu được chèn. Ví dụ, xem xét truy vấn sau, nó tính toán phí trung bình hàng tháng trong tháng trước:

SELECT
  toStartOfDay(block_timestamp) as day,
  avg(fee / 1e9) AS avg_fee_sol,
  sum(fee / 1e9) as fee_sol
FROM
  solana.transactions_non_voting
WHERE block_timestamp > today() - INTERVAL 1 MONTH
GROUP BY
  1
ORDER BY 1 DESC

31 rows in set. Elapsed: 1.783 sec. Processed 2.12 billion rows, 50.98 GB (1.19 billion rows/s., 28.58 GB/s.)
Peak memory usage: 454.44 MiB.

Truy vấn này quét khoảng 2 tỷ hàng dữ liệu và hoàn thành trong 2 giây. Người dùng có thể nhận được kết quả tương tự bằng cách sử dụng một trong các truy vấn mẫu, các truy vấn này tận dụng View Materialized:

SELECT day,
	avgMerge(avg_fee_sol) AS avg,
	sumMerge(fee_sol) AS fee_sol
FROM solana.daily_fees_by_day
WHERE day > today() - INTERVAL 1 MONTH
GROUP BY day
ORDER BY day DESC

31 rows in set. Elapsed: 0.007 sec. Processed 1.38 thousand rows, 60.54 KB (184.41 thousand rows/s., 8.11 MB/s.)
Peak memory usage: 4.88 MiB.

Truy vấn này hoàn thành trong 0.007 giây. Lưu ý rằng view được tổng hợp theo ngày, do đó đối với các truy vấn cần thống kê chi tiết hơn (ví dụ: theo giờ trong một ngày cụ thể), chúng tôi đề nghị sử dụng bảng nguồn solana.transactions_non_voting.

Các view hiện tại được phát triển hợp tác với Quỹ Solana và được tối ưu hóa trong quá trình thử nghiệm. Nếu người dùng tìm thấy một truy vấn đạt đến giới hạn hạn mức mà họ cho là cộng đồng sẽ được hưởng lợi, vui lòng gửi vấn đề tại kho lưu trữ ở đây. Chúng tôi có thể tạo view và nạp lại dữ liệu theo nhu cầu. Trong tương lai, chúng tôi hy vọng tự động hóa quá trình này và cung cấp một hệ thống xây dựng, cho phép người dùng chỉ cần gửi đề xuất view hoặc truy vấn mẫu dưới dạng PR.

Loại bỏ dữ liệu trùng lặp

Để truyền tải sự kiện hiệu quả, Goldsky cung cấp ngữ nghĩa ít nhất một lần. Điều này có nghĩa là mặc dù chúng tôi có thể đảm bảo nhận được tất cả dữ liệu xảy ra trên chuỗi, nhưng trong một số trường hợp hiếm, chúng tôi có thể nhận cùng một sự kiện nhiều lần. Để giải quyết vấn đề này, các bảng của chúng tôi sử dụng động cơ ReplacingMergeTree.

Loại động cơ này sẽ loại bỏ các sự kiện có cùng giá trị khóa sắp xếp bảng (trong hầu hết các trường hợp, đây là block_timestampslot). Quá trình loại bỏ trùng lặp này được thực hiện không đồng bộ trong nền và cuối cùng đạt được tính nhất quán. Nếu chèn sự kiện trùng lặp, kết quả có thể không chính xác trong một thời gian ngắn, nhưng do số lượng hàng khổng lồ và tỷ lệ sự kiện trùng lặp rất nhỏ, chúng tôi dự đoán điều này hiếm khi xảy ra và hầu hết các truy vấn không cần độ chính xác ở cấp hàng. Để biết thêm chi tiết về cách ReplacingMergeTree hoạt động, hãy xem tại đây.

Sử dụng ClickHouse Cloud

Các phiên bản được sử dụng để cung cấp dịch vụ được lưu trữ trong ClickHouse Cloud. Điều này mang lại nhiều lợi ích, trong đó quan trọng nhất là tách biệt lưu trữ và tính toán. Chỉ cần lưu trữ một bản sao dữ liệu trong lưu trữ đối tượng, chúng tôi có thể mở rộng CPU và bộ nhớ độc lập dựa trên nhu cầu của người dùng. Nếu chúng tôi thấy nhu cầu người dùng cao hơn đối với dịch vụ, chúng tôi chỉ cần đơn giản thêm nhiều nút hơn - không cần phân vùng lại hoặc phân phối lại dữ liệu. Ngoài việc đơn giản hóa hoạt động, việc sử dụng lưu trữ đối tượng có nghĩa là chúng tôi có thể mở rộng gần như vô hạn và cung cấp dịch vụ này với chi phí hiệu quả.

Cuối cùng, chúng tôi đã tận dụng bộ nhớ đệm truy vấn ClickHouse, được thêm vào phiên bản mã nguồn mở vào đầu năm nay.

Xây dựng giao diện người dùng

Sau khi giải quyết các thách thức về kỹ thuật dữ liệu và ClickHouse, chúng tôi muốn cung cấp một dịch vụ mà người dùng sẽ thích sử dụng, do đó chúng tôi đã cung cấp một giao diện người dùng đơn giản cho phép người dùng viết và chia sẻ truy vấn.

Xem xét rằng người dùng thường cần trực quan hóa kết quả, giao diện người dùng này cũng hỗ trợ biểu đồ đa chiều đơn giản, được hỗ trợ bởi e-charts.

Lưu ý rằng người dùng có thể lưu trữ truy vấn của họ, cùng với các ví dụ được cung cấp. Tuy nhiên, các truy vấn này không được lưu trữ lâu dài trong dịch vụ, chỉ tồn tại trong bộ nhớ trình duyệt.

Mẹo truy vấn

Để tránh đạt đến giới hạn hạn mức, chúng tôi đề nghị người dùng:

  • Sử dụng View Materialized. Các view này cố tình chuyển tính toán sang thời gian chèn, từ đó giảm thiểu số hàng mà truy vấn của người dùng cần đọc. Nhiều view này sử dụng loại AggregateFunction, chúng lưu trữ kết quả trung gian của phép tổng hợp. Khi truy vấn, điều này yêu cầu sử dụng hàm -Merge, ví dụ như ở đây.
  • Sử dụng bộ lọc ngày trên bảng chính - View Materialized được tổng hợp theo ngày. Đối với phân tích chi tiết hơn, hãy tham khảo bảng cơ sở, chẳng hạn như bảng giao dịch. Các bảng này chứa mỗi sự kiện và do đó có hàng tỷ hàng. Khi truy vấn các hàng này, luôn áp dụng bộ lọc ngày để tránh vượt quá khoảng thời gian một tháng.

Nếu người dùng cần nhiều hơn nữa…

Mặc dù chúng tôi đã cố gắng hào phóng về hạn mức, nhưng chúng tôi dự đoán một số người dùng sẽ muốn chạy các truy vấn cần nhiều khả năng tính toán hơn những gì CryptoHouse cung cấp. CryptoHouse được thiết kế cho sử dụng của cộng đồng, không dành cho các tổ chức muốn xây dựng dịch vụ hoặc sản phẩm thương mại, do đó không hỗ trợ lượng truy vấn lớn.

Nếu bạn cần hạn mức cao hơn hoặc cần gửi nhiều truy vấn hơn cho các mục đích này, chúng tôi đề nghị liên hệ với Goldsky, họ có thể cung cấp dữ liệu trong phiên bản ClickHouse chuyên dụng. Điều này cũng có thể được điều chỉnh theo mẫu truy cập và yêu cầu của bạn, mang lại hiệu năng tốt hơn và độ trễ thấp hơn cho các truy vấn.

Kết luận

Chúng tôi vui mừng thông báo rằng CryptoHouse hiện đã mở cửa cho người dùng và cộng đồng tiền điện tử của chúng tôi. Bài blog này đã đề cập đến một số chi tiết kỹ thuật.

Đối với độc giả quan tâm, chúng tôi sẽ tổ chức một cuộc họp dành cho nhà phát triển cùng với Goldsky tại hội nghị Solana Breakpoint vào tháng Chín, bao gồm cấu trúc dịch vụ và các thách thức đã gặp phải.

Chúng tôi chào đón người dùng đặt câu hỏi và thảo luận tại kho lưu trữ công khai.

Thêm thông tin

  • Xây dựng giải pháp khả quan đo lường dựa trên ClickHouse + Grafana - Phần log (Blog chính thức ClickHouse)
  • Thử nghiệm với Superset 4.x, ra mắt tài liệu tiếng Trung (Hoàn toàn dịch và chỉnh sửa bằng LLM)

Thẻ: ClickHouse Goldsky blockchain Solana Ethereum

Đăng vào ngày 20 tháng 7 lúc 17:37