BTC
$96,000
5.73%
ETH
$3,521.91
3.97%
HTX
$0.{5}2273
5.23%
SOL
$198.17
3.05%
BNB
$710
3.05%
lang
简体中文
繁體中文
English
Tiếng Việt
한국어
日本語
ภาษาไทย
Türkçe
Trang chủ
AI AI
Tin nhanh
Bài viết
Sự kiện
BlockBeats Pro
Thêm
Thông tin tài chính
Chuyên đề
Hệ sinh thái chuỗi khối
Mục nhập
Podcast
Data
OPRR

Đối tác cũ của a16z: Sự khác biệt giữa ứng dụng Web2.0 và Web3.0 từ góc độ kiến trúc

Đọc bài viết này mất 43 phút
Mỗi thành phần trong kiến trúc ứng dụng xác định các thuộc tính cơ bản của ứng dụng
Mọi người đều quen thuộc với các thuật ngữ như blockchain, hợp đồng thông minh, IPFS, ví, nút, v.v. và có thể hiểu những gì chúng làm, nhưng chúng liên kết với nhau như thế nào? Còn việc xây dựng các ứng dụng phi tập trung Web3.0?

 

Những gì hiển thị trước mặt chúng ta chỉ là phần đầu của Chúng tôi khó có thể có được cái nhìn thoáng qua về cách ứng dụng được triển khai. Mỗi thành phần trong kiến trúc ứng dụng xác định các thuộc tính cơ bản của ứng dụng. Nếu muốn thực sự hiểu những khác biệt cơ bản giữa ứng dụng Web2.0 và Web3.0, chúng ta cần bắt đầu với kiến trúc ứng dụng.

 

Tác giả của bài viết này, Preethi Kasireddy, từng là đối tác của a16z từ năm 2013 đến năm 2015 , và sau đó vào năm 2016, gia nhập Coinbase với tư cách là kỹ sư phần mềm và hoạt động trong mạng Ethereum với tư cách là kỹ sư hợp đồng thông minh trong cùng thời gian. Bài viết này cung cấp phân tích chuyên sâu về các ứng dụng Web3.0 từ khía cạnh khung ứng dụng. Rhythm BlockBeats đã dịch toàn bộ văn bản:

 

Kiến trúc ứng dụng Web 3.0

 

Cấu trúc của ứng dụng Web 3.0 (hoặc "DApps") hoàn toàn khác với ứng dụng Web 2.0.

 

Lấy Medium, một trang blog đơn giản làm ví dụ. Medium cho phép người dùng xuất bản nội dung của riêng họ và tương tác với nội dung của người khác.

 

Medium là một ứng dụng web 2.0 có kiến trúc nghe có vẻ đơn giản. Nhưng thực sự phải mất rất nhiều công sức trong kiến trúc của Medium để biến điều này thành hiện thực.

 

Trước hết, Medium cần một nơi để lưu trữ những thứ như người dùng, bài đăng, thẻ, bình luận, lượt thích Dữ liệu cơ bản như vậy. Những tác vụ này yêu cầu cập nhật cơ sở dữ liệu liên tục.

 

Thứ hai, như Ngôn ngữ mã phụ trợ Node.js, Java hoặc Python xác định logic kinh doanh của phương tiện. Ví dụ: điều gì xảy ra khi người dùng mới đăng ký, đăng blog mới hoặc nhận xét trên blog của người khác?

 

Ngoài ra, các giao diện người dùng như JavaScript, HTML và CSS Mã ngôn ngữ xác định logic giao diện người dùng của Phương tiện. Ví dụ: trang web trông như thế nào và điều gì xảy ra khi người dùng tương tác với từng thành phần trên trang?

 

Khi bạn viết blog trên Medium, tất cả những thứ này sẽ được tích hợp và liên kết với nhau . Bạn tương tác với giao diện người dùng của nó, giao diện người dùng này tương tác với giao diện người dùng của nó, giao diện người dùng này tương tác với cơ sở dữ liệu của nó. Tất cả mã này được lưu trữ trên các máy chủ tập trung và gửi đến người dùng thông qua trình duyệt internet. Đây là bản tóm tắt cấp cao về cách hoạt động của hầu hết các ứng dụng Web 2.0 hiện nay.

 

 

Bây giờ tất cả điều này đã thay đổi.

 

Công nghệ chuỗi khối mở ra những cơ hội thú vị cho các ứng dụng Web 3.0 New Direction. Trong bài viết này, chúng tôi sẽ tập trung vào những thay đổi do Ethereum mang lại.

 

Điều gì làm cho Web 3.0 trở nên khác biệt?

 

Với Medium The Điểm khác biệt với loại chương trình web2.0 này là Web3.0 loại bỏ lớp giữa, không có cơ sở dữ liệu tập trung để lưu trữ trạng thái ứng dụng và không có máy chủ trang web tập trung để lưu trữ logic back-end.

 

Bạn có thể sử dụng các khối Các nhà xây dựng chuỗi xây dựng các ứng dụng trên một máy trạng thái phi tập trung được duy trì bởi các nút ẩn danh trên Internet.

 

Máy trạng thái đề cập đến một "máy" có thể bảo trì được, chứa trạng thái chương trình và cho phép viết trạng thái mới. Blockchain là một máy ảo lấy trạng thái tạo làm ví dụ và sau đó trạng thái được chuyển đổi theo các quy tắc cụ thể.

 

Quan trọng hơn, không có thực thể đơn lẻ nào kiểm soát bộ máy trạng thái phi tập trung này, nó được tất cả mọi người trong mạng lưới cùng duy trì.

 

Trong Web 3.0, bạn có thể viết các hợp đồng thông minh để xác định logic của ứng dụng và triển khai chúng vào một máy trạng thái phi tập trung. Điều này có nghĩa là tất cả những ai muốn xây dựng ứng dụng blockchain đều triển khai mã của họ trên máy trạng thái dùng chung này. Điều này rất khác với phần phụ trợ của Medium.

 

Giao diện người dùng của Web3.0 về cơ bản giống với giao diện người dùng của Web2.0. Có một số trường hợp đặc biệt mà chúng tôi sẽ giải thích sau.

 

Hình ảnh sau đây là kiến trúc của Web3.0

 

 

 

Phân tích chuyên sâu

 

Vì vậy, hãy xem xét kỹ hơn điều gì khiến điều này trở nên khả thi

 

1) Chuỗi khối

 Ethereum là một cỗ máy trạng thái xác định điểm-điểm mà thế giới có thể tham gia và duy trì. Điều này khiến Ethereum thường được gọi là "máy tính thế giới". Các thay đổi trạng thái trên máy trạng thái được kiểm soát bởi các nút trong mạng tuân theo các quy tắc đồng thuận.

 

Nói cách khác, nó được thiết kế để hầu như mọi người trong thế giới Một máy trạng thái có thể được truy cập và ghi vào. Do đó, máy không thuộc sở hữu của bất kỳ thực thể đơn lẻ nào mà thuộc sở hữu chung của mọi người trong mạng.

 

Một điều nữa cần biết: dữ liệu chỉ có thể được ghi vào Ethereum Với blockchain, bạn không bao giờ có thể cập nhật dữ liệu hiện có.

 

2) Hợp đồng thông minh

 

Hợp đồng thông minh là các chương trình chạy trên chuỗi khối Ethereum và được sử dụng để xác định logic đằng sau những thay đổi trạng thái xảy ra trên chuỗi khối . Hợp đồng thông minh thường được viết bằng các ngôn ngữ cấp cao như Solidity hoặc Vyper.

 

 

Vì mã hợp đồng thông minh được lưu trữ trên chuỗi khối Ethereum nên bất kỳ ai cũng có thể Kiểm tra ứng dụng logic của tất cả các hợp đồng thông minh trên mạng.

 

3) Máy ảo Ethereum (EVM)

 

Máy ảo được sử dụng để thực thi logic được xác định trong hợp đồng thông minh và xử lý trạng thái xảy ra trên máy trạng thái Variety.

 

Máy ảo Ethereum không hiểu lập trình cấp cao như Solidity hoặc Ngôn ngữ cấp độ Vyper Bạn cần biên dịch các ngôn ngữ cấp cao này thành mã byte mà Máy ảo Ethereum có thể thực thi.

 

4) Giao diện người dùng

 

Như chúng tôi đã đề cập trước đó, giao diện người dùng xác định logic giao diện người dùng, nhưng giao diện người dùng cũng tương tác với ứng dụng logic được xác định trong hợp đồng thông minh để tương tác.

 

Sự tương tác giữa giao diện người dùng và hợp đồng thông minh phức tạp hơn một chút so với minh họa trong hình trên. Hãy giải thích chi tiết về phần này tiếp theo.

 

Cách mã giao diện người dùng trên Ethereum tương tác với các hợp đồng thông minh

 

Chúng tôi muốn giao diện người dùng có thể kích hoạt các chức năng cụ thể của chương trình khi tương tác với hợp đồng thông minh, nhưng không Hãy quên rằng Ethereum là một mạng lưới phi tập trung. Mỗi nút Ethereum cần lưu một bản sao của tất cả các trạng thái trên máy trạng thái Ethereum. Bản sao này bao gồm tất cả mã và dữ liệu liên quan đến hợp đồng thông minh.

 

Khi chúng ta muốn tương tác với dữ liệu và mã trên chuỗi khối Khi , chúng ta cần liên lạc với một nút nhất định trong blockchain. Bởi vì bất kỳ nút nào cũng có thể phát đi yêu cầu thực hiện giao dịch trên Máy ảo Ethereum. Sau đó, người khai thác sẽ thực hiện giao dịch và phát các thay đổi trạng thái kết quả tới các nút khác trong mạng.

 

Có hai cách để thông báo các giao dịch mới:

 

1. Thiết lập một nút để tự chạy chương trình Ethereum

2. Sử dụng Infura hoặc Giả kim thuật Các nút do bên thứ ba cung cấp

 

Sử dụng nút của bên thứ ba có thể giúp bạn tránh khỏi rắc rối khi tự mình chạy một nút đầy đủ. Vì có một lượng lớn dữ liệu cần được đồng bộ hóa nên việc thiết lập nút Ethereum thường mất vài ngày. Và băng thông cũng như dung lượng lưu trữ cần thiết để đồng bộ hóa vượt quá khả năng xử lý của một chiếc máy tính xách tay thông thường, vì vậy bạn cũng cần một thiết bị mạnh mẽ.

 

Ngoài ra, chi phí lưu trữ toàn bộ chuỗi khối Ethereum tăng lên khi DApp Khi công suất tăng lên, bạn cần thêm nhiều nút hơn để mở rộng cơ sở hạ tầng của mình. Khi cơ sở hạ tầng của bạn trở nên đủ phức tạp, bạn sẽ cần một kỹ sư DevOps (kỹ sư vận hành lập trình) toàn thời gian. Họ sẽ giúp bạn duy trì cơ sở hạ tầng để đảm bảo bạn có thời gian hoạt động đáng tin cậy và thời gian phản hồi nhanh.

 

Tóm lại, để tránh những rắc rối này, nhiều DApp chọn sử dụng các nhà cung cấp dịch vụ như Infura hoặc Alchemy để quản lý các nút của họ. Nhưng cái gì cũng có ưu và nhược điểm, điều này cũng tạo ra điểm nghẽn tập trung. Nhưng bây giờ chúng ta đừng nói về vấn đề này.

 

Cho dù bạn tự thiết lập hay sử dụng nút từ bên thứ ba- dịch vụ bên, Các nút này thường được gọi là "Nhà cung cấp". Tiếp theo chúng ta hãy nói chi tiết về những “nhà cung cấp” này.

 

 

Mỗi khách hàng Ethereum (nhà cung cấp) triển khai đặc tả JSON-RPC. Điều này đảm bảo rằng các ứng dụng front-end có một bộ phương thức thống nhất khi chúng muốn tương tác với blockchain. JSON-RPC là giao thức gọi ứng dụng từ xa (RPC) nhẹ, không trạng thái, xác định nhiều cấu trúc dữ liệu và quy tắc xử lý của chúng. Bởi vì nó không phụ thuộc vào khả năng vận chuyển nên các khái niệm này có thể được sử dụng trong cùng một quy trình, được chuyển qua các ổ cắm, HTTP hoặc nhiều môi trường nhắn tin khác nhau. Nó sử dụng JSON (RFC 4627) làm định dạng dữ liệu.

 

Khi kết nối với blockchain thông qua nhà cung cấp, bạn có thể đọc trạng thái lưu trữ trên chuỗi khối. Tuy nhiên, nếu bạn muốn viết thư cho trạng thái, bạn cần phải "ký" giao dịch bằng khóa riêng của mình trước khi đưa nó vào blockchain.

 

Ví dụ: giả sử chúng tôi chạy DApp cho phép Người dùng đọc hoặc đăng bài đăng blog lên blockchain. Bạn thiết lập một nút ở giao diện người dùng cho phép mọi người truy vấn các bài đăng trên blog được viết bởi một người dùng cụ thể. Nhưng hãy nhớ rằng, việc đọc một bài viết trên blockchain không yêu cầu người dùng phải ký giao dịch.

 

Tuy nhiên, khi người dùng muốn xuất bản những cái mới trên blockchain Khi viết Trong bài viết này, DApp sẽ yêu cầu người dùng "ký" giao dịch bằng khóa riêng của họ và chỉ khi đó DApp mới truyền giao dịch đó tới blockchain. Nếu không, nút sẽ không chấp nhận giao dịch.

 

Bước ký kết giao dịch này thường yêu cầu sử dụng Metamask (Little Fox).

 

 

Metamask là công cụ cho phép các ứng dụng dễ dàng xử lý việc quản lý khóa và ký hiệu giao dịch. Nguyên tắc của nó rất đơn giản, Metamask lưu trữ khóa riêng của người dùng trong trình duyệt, bất cứ khi nào front-end cần người dùng ký giao dịch, nó sẽ gọi Metamask.

 

Metamask cũng sẽ được liên kết với chuỗi khối với tư cách là nhà cung cấp. Vì Metamask cần ký các giao dịch nên nó sẽ thiết lập kết nối với nút do Infura cung cấp. Theo một cách nào đó, Metamask vừa là nhà cung cấp vừa là người ký.


Được lưu trữ trên chuỗi khối

 

Tất nhiên, nếu tất cả hợp đồng thông minh và dữ liệu trong ứng dụng bạn xây dựng đều được lưu trữ trên Ethereum thì kiến trúc này là hợp lý. Tuy nhiên, bất kỳ ai đã xây dựng ứng dụng trên Ethereum đều biết rằng mặc dù việc lưu trữ trên blockchain rất nhanh nhưng nó cũng rất tốn kém.

 

Chúng ta phải hiểu , Người dùng phải trả tiền mỗi khi họ thêm dữ liệu mới trên Ethereum. Điều này là do máy trạng thái phi tập trung được duy trì bởi các nút và mỗi trạng thái mới được thêm vào máy trạng thái sẽ làm tăng chi phí của nút.  

 

Nếu bạn Nếu DApp yêu cầu người dùng trả phí bổ sung mỗi khi họ cần thêm trạng thái mới vào giao dịch thì trải nghiệm người dùng sẽ rất kém. Tuy nhiên, vấn đề này có thể được giải quyết bằng cách sử dụng các giải pháp lưu trữ phi tập trung ngoài chuỗi như IPFS hoặc Swarm.

 

IPFS là A hệ thống tập tin phân tán để lưu trữ và truy cập dữ liệu. Nói cách khác, hệ thống IPFS không lưu trữ dữ liệu trong cơ sở dữ liệu tập trung mà phân phối dữ liệu trong mạng P2P, cho phép bạn truy xuất dữ liệu bất cứ lúc nào.

 

"Filecoin" là lớp khuyến khích của IPFS. Vai trò của nó là khuyến khích các nút trên toàn thế giới lưu trữ và truy xuất dữ liệu này. Bạn có thể sử dụng nhà cung cấp như Infura hoặc Pinata, vì Infura có thể cung cấp cho bạn các nút IPFS và Pinata cho phép bạn "định vị" tệp trong IPFS, sau đó lấy giá trị băm IPFS và lưu trữ nó trong khối trên chuỗi và toàn bộ quá trình hoạt động khá đơn giản.

 

Bầy đàn là một điều tuyệt vời Mạng lưu trữ tập trung có nhiều điểm tương đồng với IPFS, nhưng cũng có sự khác biệt rõ ràng giữa hai mạng này. Nghĩa là, hệ thống Filecoin tương đối độc lập và hệ thống khuyến khích của Swarm được tích hợp và thực thi bằng các hợp đồng thông minh trên Ethereum để lưu trữ và truy xuất dữ liệu.  

 

Vậy bây giờ , với IPFS hoặc Swarm, kiến trúc ứng dụng của chúng tôi sẽ như thế này:

 



Trong hình bên dưới, bạn có thể tinh ý và nhận thấy rằng mã giao diện người dùng không được lưu trữ trên blockchain. Trên thực tế, chúng tôi có thể lưu trữ mã trên AWS giống như chúng tôi đã làm trong Web 2.0, nhưng làm như vậy cũng có nghĩa là DApp của bạn sẽ bị hạn chế do tập trung hóa. Ví dụ: nếu AWS ngừng hoạt động thì sao? Điều gì sẽ xảy ra nếu nó kiểm duyệt ứng dụng của bạn?  

 

Đây là Đó cũng là lý do tại sao, nếu bạn muốn xây dựng một ứng dụng phi tập trung thực sự, bạn sẽ chọn giải pháp lưu trữ phi tập trung như IPFS hoặc Swarm để lưu trữ giao diện người dùng.  

 

Vì vậy, bây giờ kiến trúc ứng dụng của bạn sẽ thay đổi Giống như cái này:

 



Truy vấn trên blockchain

 

Cho đến nay, chúng tôi đã khám phá cách viết giao dịch bằng cách ký chúng và gửi chúng tới chuỗi khối. Nhưng làm thế nào để đọc dữ liệu từ hợp đồng thông minh trên blockchain? Có hai cách chính:

 

1) Sự kiện hợp đồng thông minh

 

Bạn có thể sử dụng thư viện Web3.js để truy vấn và giám sát các sự kiện hợp đồng thông minh. Bạn cũng có thể sử dụng Web3.js để nghe các sự kiện cụ thể và chỉ định hàm gọi lại sẽ được gọi mỗi khi sự kiện diễn ra. Ví dụ: nếu hiện tại bạn có hợp đồng thông minh gửi luồng thanh toán liên tục giữa người gửi và người nhận trong mỗi khối, bạn có thể phát ra sự kiện hợp đồng thông minh mỗi khi thanh toán được thực hiện cho người nhận. Mã giao diện người dùng có thể lắng nghe các sự kiện được kích hoạt bởi hợp đồng thông minh và thực hiện các hành động thích hợp tương ứng.

 

2) Biểu đồ

 

Phương pháp trên là thực sự có thể thực hiện được nhưng nó cũng có những hạn chế nhất định. Ví dụ: bạn có thể phát hiện sau khi hợp đồng thông minh được triển khai, sự kiện bạn muốn gửi không có trong hợp đồng, bạn nên làm gì? Thật không may, bạn chỉ có thể triển khai lại hợp đồng thông minh mới và đưa sự kiện cũng như dữ liệu liên quan vào hợp đồng mới. Không chỉ vậy, các hàm gọi lại còn gặp khó khăn khi xử lý các logic giao diện người dùng khác nhau.  

 

Đây là lúc để "The Đồ thị "Nào.

 

Biểu đồ là một Giải pháp lập chỉ mục dữ liệu ngoài chuỗi có thể tạo điều kiện thuận lợi cho mọi người truy vấn dữ liệu trên Ethereum. Trong Biểu đồ, bạn có thể xác định hợp đồng thông minh nào cần được lập chỉ mục, sự kiện và lệnh gọi hàm nào cần được lắng nghe cũng như cách chuyển đổi các sự kiện đến thành các thực thể có thể được xử lý bằng logic giao diện người dùng (hoặc bất kỳ chương trình nào đang sử dụng API). Nó sử dụng GraphQL làm ngôn ngữ truy vấn, được các kỹ sư front-end yêu thích vì nó có thể truyền tải nhiều thông tin hơn các API REST truyền thống.

Bằng cách lập chỉ mục dữ liệu chuỗi khối, Biểu đồ cho phép chúng tôi truy vấn dữ liệu trên chuỗi trong logic ứng dụng mà hầu như không có điều kiện độ trễ.

 

Bây giờ, Kiến trúc DApp đại khái như thế này:




Bây giờ chỉ còn một vấn đề quan trọng cuối cùng: mở rộng.

 

Mở rộng DApp

 

Bạn có thể đã nghe nói rằng Ethereum không thể mở rộng được, ít nhất là chưa.

 


Giá trung bình của Ethereum Gas

Phí giao dịch trung bình

Kích thước khối trung bình


Rõ ràng, vấn đề là phí Gas trên Ethereum cao và Khối gần như đã bão hòa và việc xây dựng DApp trên đó sẽ mang lại trải nghiệm rất tồi tệ cho người dùng. May mắn thay, một số giải pháp liên quan đang được phát triển.

 

Polygon là một gói mở rộng L2 rất phổ biến. Trong Polygon, việc xử lý và thực hiện giao dịch được hoàn thành bởi "chuỗi bên" chứ không phải chuỗi chính. Các sidechain này là các chuỗi khối thứ cấp được kết nối với chuỗi chính. Thỉnh thoảng, sidechain tổng hợp các khối gần đây nhất của nó và gửi chúng vào chuỗi chính.




Tương tự, Optimistic Rollup và zkRollup cũng thuộc sơ đồ L2 và nguyên tắc hoạt động của chúng tương tự nhau: Họ sử dụng hợp đồng thông minh "Cuộn lên" để gộp một số lượng lớn giao dịch ngoài chuỗi và sau đó gửi các giao dịch này đến chuỗi chính một cách thường xuyên.  

 

Điều chúng ta cần biết là: L2 giải pháp Việc thực hiện giao dịch (tức là phần chậm hơn) được thực hiện ngoài chuỗi, trong khi chỉ có dữ liệu giao dịch được lưu trữ trên chuỗi. Điều này cho phép blockchain mở rộng quy mô vì chúng tôi không còn phải thực hiện mọi giao dịch trên chuỗi nữa. Đồng thời, điều này cũng tăng tốc quá trình giao dịch và giảm chi phí và khi cần thiết, giải pháp L2 cũng có thể giao tiếp với chuỗi chính Ethereum.




Ảnh đầy đủ


Nếu lúc này bạn cảm thấy chóng mặt và bối rối thì đó là điều bình thường vì tất cả các công cụ này vốn đã được tích hợp vào quy trình. phức tạp và có thể dễ dàng khiến các nhà phát triển cảm thấy choáng ngợp. Nhưng đừng lo lắng, sự xuất hiện liên tục của các framework phát triển sẽ thực sự cải thiện trải nghiệm làm việc của các nhà phát triển.  

 

Ví dụ , Hardhat là một khung phát triển tạo điều kiện cho các nhà phát triển Ethereum xây dựng, triển khai và thử nghiệm các hợp đồng thông minh. Hardhat có "Mạng Hardhat" tích hợp mà các nhà phát triển có thể sử dụng để triển khai các hợp đồng thông minh cho mạng cục bộ mà không cần phải xử lý môi trường thời gian thực. Không chỉ vậy, nó còn đi kèm với một hệ sinh thái plug-in mạnh mẽ có thể mang đến cho các nhà phát triển sự tiện lợi hơn. Đồng thời, Hardhat còn có hàm console.log(), có thể dùng để debug như javascript.

 

Tất nhiên, điều này Đây chỉ là sự khởi đầu, tôi hy vọng các công cụ dành cho nhà phát triển sẽ phát triển tốt hơn trong tương lai.


Tóm tắt


Mọi người đã mất nhiều tháng để tìm ra blockchain công cụ là gì, vì vậy nếu bạn là nhà phát triển DApp cấp thấp thì tôi hy vọng bài viết này có thể giúp bạn tiết kiệm thời gian. Trong trường hợp này, hãy bắt đầu xây dựng DApp!

 

Nếu bạn quan tâm trong quá trình xây dựng Nếu bạn quan tâm đến các ứng dụng Web 3.0, vui lòng đăng ký Bootcamp phát triển Ethereum tiếp theo của chúng tôi (Ethereum bootcamp), nơi bạn sẽ tìm hiểu cách xây dựng và triển khai DApp đầu tiên của mình trên Ethereum.

 

Như thường lệ, Nếu bạn có bất kỳ câu hỏi nào hoặc phát hiện bất kỳ lỗi nào trong bài viết này, vui lòng liên hệ với tôi trong phần bình luận!


Bản gốc văn bản Liên kết




Chào mừng bạn tham gia cộng đồng chính thức của BlockBeats:

Nhóm Telegram đăng ký: https://t.me/theblockbeats

Nhóm Telegram thảo luận: https://t.me/BlockBeats_App

Tài khoản Twitter chính thức: https://twitter.com/BlockBeatsAsia

举报 Báo lỗi/Báo cáo
Chọn thư viện
Thêm mới thư viện
Hủy
Hoàn thành
Thêm mới thư viện
Chỉ mình tôi có thể nhìn thấy
Công khai
Lưu
Báo lỗi/Báo cáo
Gửi