Khám phá CryptoKitties - Phần 1: Khai thác dữ liệu

Nguồn: https://www.cryptokitties.co/kitty/101

Nếu bạn đang đọc điều này, có lẽ bạn đã nghe nói về trò chơi đã thu hút sự chú ý của mọi người trên mạng Ethereum trong vài tháng qua: CryptoKitties!

Nói tóm lại, trò chơi bao gồm thu thập mèo ảo. Mèo được tạo ra bởi những người chơi của trò chơi, chúng có thể nhân giống hai con mèo để tạo ra một con mới. Mỗi con mèo có trình tự di truyền riêng, xác định các thuộc tính vật lý của chúng. Bộ gen của họ là một chức năng của gen của cha mẹ họ cộng với một số ngẫu nhiên. Ngoài việc nhân giống, có thể tạo ra tới 50.000 con mèo với các đặc điểm được xác định trước bởi Axiom Zen, công ty đứng sau trò chơi. Có một thị trường để mua và bán mèo và một thị trường khác cho thuê mèo cho mục đích chăn nuôi. Bạn có thể đọc thêm về trò chơi ở đây.

Block Science là một công ty nghiên cứu và phân tích công nghệ chuyên thiết kế và đánh giá các hệ thống kinh tế phi tập trung. Phân tích các khía cạnh của nền kinh tế CryptoKitties dường như là một cơ hội tuyệt vời để cải thiện các công cụ trích xuất dữ liệu của chúng tôi đồng thời nắm trong tay một số dữ liệu trong thế giới thực từ một ứng dụng phi tập trung (và sống động!).

Bài đăng blog này đã được chia thành hai phần:

  • Phần 1 (bài đăng này) bao gồm các khía cạnh kỹ thuật liên quan đến trích xuất và chuyển đổi dữ liệu từ chuỗi khối Ethereum.
  • Phần 2 chứa phân tích thực tế của một số dữ liệu trò chơi.

Trích xuất dữ liệu từ Ethereum Blockchain

Mặc dù mọi thứ từng xảy ra trên mạng Ethereum đều được ghi lại trên blockchain, việc biến những bit đó thành dữ liệu có ý nghĩa không phải lúc nào cũng đơn giản. Thật đơn giản để trích xuất dữ liệu giao dịch nói rằng trong một tài khoản khối đã cho A đã gửi một số ether (ETH) đến tài khoản B và đặt giá khí nhất định cho giao dịch đó được xử lý. Tuy nhiên, khi chúng tôi làm việc với các giao dịch được gửi đến hợp đồng, giải mã dữ liệu blockchain giống như thực hiện một ETL từ nhiều tệp văn bản có chiều rộng cố định có định dạng chỉ được mô tả trong mã nguồn của phần mềm tạo ra chúng.

Giao dịch gọi hàm trong hợp đồng thông minh

Ví dụ: một giao dịch được gửi đến hợp đồng 0xb1690c08e213a35ed9bab7b318de14420fb57d8c với nội dung sau trong trường dữ liệu

0x454a2ab300000000000000000000000000000000000000000000000000000000000871ad

Nó làm gì?

Phần đầu tiên của trường dữ liệu (0x454a2ab3) đề cập đến chức năng bên trong hợp đồng thông minh đang được giao dịch gọi. Đó là bốn byte đầu tiên của hàm băm của chữ ký hàm, được định nghĩa là tên của hàm theo sau là các kiểu dữ liệu của tham số.

keccak256 (Tiếng  (, <,>

Các byte còn lại là các giá trị của các tham số hàm. Bạn có thể đọc về nó một cách chi tiết ở đây.

Ngay cả khi biết 4 byte đó, làm thế nào chúng ta có thể biết hàm nào đang được gọi, hoặc nó có bao nhiêu tham số? Trong trường hợp cụ thể này, chúng tôi biết rằng hợp đồng 0xb1690c, là hợp đồng thông minh đấu giá CryptoKitties - thị trường mua bán mèo. Và bởi vì mã nguồn của nó đã được công khai, chúng tôi biết rằng nó có một chức năng gọi là giá thầu

/// Chào giá đấu giá mở, hoàn thành đấu giá và
/// chuyển quyền sở hữu NFT nếu cung cấp đủ Ether.
/// param _tokenID: ID của mã thông báo để đặt giá thầu trên.
giá thầu chức năng (uint256 _tokenId)

Nếu chúng ta tính toán hàm băm của chữ ký hàm giá thầu, chúng ta có thể thấy rằng bốn byte đầu tiên chính xác là những byte có trong dữ liệu giao dịch.

keccak256 (giá thầu (uint256) sức) = 454a2ab3c602fd9

Và bởi vì hàm chỉ lấy một đối số, chúng ta có thể nói rằng mọi thứ theo bốn byte đầu tiên trong dữ liệu giao dịch là tham số đó. Nói cách khác, giao dịch được đặt giá thầu trên số mèo 0x871ad (553389).

Hợp đồng thông minh đăng nhập thông tin

Thông thường các hợp đồng thông minh để ghi thông tin trong quá trình thực hiện. Có thể lấy nhật ký được ghi lại bằng hợp đồng bằng cách gọi phương thức eth_getlogs của JSON RPC API. Như trường hợp các giao dịch gọi chức năng hợp đồng, chúng ta cần biết mã nguồn của hợp đồng để giải mã dữ liệu được API này trả về. Ví dụ, một bản ghi với dữ liệu sau có nghĩa là gì?

số khối: 0x51968f
chủ đề: [0x0a5311bd2a6608f08a180df2ee7c5946819a649b204b554bb8e39825b2c50ad5] dữ liệu: 0x0000000000000000000000001b8f7b13b14a59d9770f7c1789cf727046f7e542000000000000000000000000000000000000000000000000000000000009fac1000000000000000000000000000000000000000000000000000000000009f80e000000000000000000000000000000000000000000000000000000000008957200004a50b390a6738697012a030ac21d585b4c8214ae39446194054b98e0b98f

Nhật ký được ghi lại khi hợp đồng kích hoạt một sự kiện. Phần tử đầu tiên của mảng chủ đề (chỉ có một phần tử trong ví dụ của chúng tôi) là hàm băm của chữ ký sự kiện. Trong trường hợp của CryptoKitties, nhật ký được ghi lại khi một con mèo mang thai và khi một con mèo được sinh ra, chẳng hạn.

/// Sự kiện mang thai bị sa thải khi hai con mèo sinh sản thành công
/// và bộ đếm thời gian mang thai bắt đầu cho matron.
sự kiện Mang thai (chủ sở hữu địa chỉ, uint256 matronId, uint256 sireId, uint256 cooldownEndBlock);
/// Sự kiện sinh nở được kích hoạt bất cứ khi nào một chú mèo con mới bước vào
/// tồn tại. Điều này rõ ràng bao gồm bất cứ khi nào một con mèo được tạo ra
/// thông qua phương thức giveBirth, nhưng nó cũng được gọi là khi
/// một con mèo gen0 mới được tạo ra.
Sự kiện Sinh (chủ sở hữu địa chỉ, uint256 kittyId, uint256 matronId, uint256 sireId, uint256 gen);

Xem cách băm của chữ ký sự kiện Sinh tương ứng với giá trị trong nhật ký trong ví dụ của chúng tôi

keccak256 (Sinh ra (địa chỉ, uint256, uint256, uint256, uint256).)

Cho đến nay, chúng ta biết rằng trên khối số 51968F (5346959), một loại tiền điện tử đã ra đời! Bước tiếp theo trong quá trình giải mã của chúng tôi là phân tách trường dữ liệu theo năm tham số của sự kiện Sinh. Tham số đầu tiên là một địa chỉ Ethereum, dài 160 bit, nhưng được mã hóa với 256 bit (các số 0 được thêm vào bên trái của địa chỉ). Các tham số khác là số nguyên 256 bit. Do đó, trường dữ liệu được chia thành 5 phần, mỗi phần có 256 bit (64 ký tự thập lục phân).

chủ sở hữu: 0000000000000000000000001b8f7b13b14a59d9770f7c1789cf727046f7e542
mèo con:
0000000000000000000000000000000000000000000000000000000000000009fac1
matronId:
0000000000000000000000000000000000000000000000000000000000000009f80e
sireId:
00000000000000000000000000000000000000000000000000000000000000089572
gen:
00004a50b390a6738697012a030ac21d585b4c8214ae39446194054b98e0b98f

Hãy xem những gì tôi có nghĩa là bằng cách thực hiện một ETL từ nhiều tệp văn bản có chiều rộng cố định có định dạng chỉ được mô tả trong mã nguồn của phần mềm đã tạo ra chúng. :-)

Chuyển sang Phần 2, nơi chúng tôi sẽ chia sẻ một số sự thật thú vị mà chúng tôi đã gặp trong khi phân tích dữ liệu trò chơi CryptoKitties!

Đặc biệt cảm ơn nhóm Khoa học Block đã nghiên cứu, hiểu biết và đánh giá.