Có bao nhiêu TPS trên chuỗi khối của bạn?

Một câu hỏi yêu thích về bất kỳ hệ thống phân tán nào từ một người không rành về kỹ thuật là “Blockchain của bạn có bao nhiêu tps?” Tuy nhiên, con số đưa ra trong câu trả lời thường ít có điểm chung với những gì người hỏi muốn nghe. Trên thực tế, anh ấy muốn hỏi “liệu ​​blockchain của bạn có phù hợp với yêu cầu kinh doanh của tôi không” và những yêu cầu này không phải là một con số mà là nhiều điều kiện - đây là khả năng chịu lỗi mạng, yêu cầu cuối cùng, kích thước, tính chất của giao dịch và nhiều thông số khác. Vì vậy, câu trả lời cho câu hỏi “bao nhiêu tps” dường như không đơn giản và gần như không bao giờ đầy đủ. Một hệ thống phân tán có hàng chục hoặc hàng trăm nút thực hiện các phép tính khá phức tạp có thể ở một số lượng lớn các trạng thái khác nhau liên quan đến trạng thái của mạng, nội dung của chuỗi khối, lỗi kỹ thuật, sự cố kinh tế, tấn công mạng và nhiều lý do khác . Các giai đoạn có thể xảy ra sự cố về hiệu suất khác với các dịch vụ truyền thống và máy chủ mạng blockchain là một dịch vụ mạng kết hợp chức năng của cơ sở dữ liệu, máy chủ web và máy khách torrent, khiến nó cực kỳ phức tạp về mặt cấu hình tải trên tất cả các hệ thống con : bộ xử lý, bộ nhớ, mạng, lưu trữ

Điều đó xảy ra là các mạng phi tập trung và chuỗi khối là phần mềm khá đặc biệt và khác thường dành cho các nhà phát triển phần mềm tập trung. Do đó, tôi muốn nêu bật các khía cạnh quan trọng về hiệu suất và tính bền vững của mạng phi tập trung, các phương pháp đo lường chúng và tìm ra các điểm nghẽn. Chúng tôi sẽ xem xét các vấn đề hiệu suất khác nhau làm hạn chế tốc độ cung cấp dịch vụ cho người dùng blockchain và lưu ý các tính năng đặc trưng của loại phần mềm này.

Các giai đoạn yêu cầu dịch vụ của khách hàng blockchain

Để nói một cách trung thực về chất lượng của bất kỳ dịch vụ phức tạp nào ít nhiều, bạn cần phải tính đến không chỉ các giá trị trung bình mà còn cả mức tối đa/tối thiểu, trung vị, phần trăm. Về mặt lý thuyết, chúng ta có thể nói về tốc độ 1000 tps trong một số blockchain, nhưng nếu 900 giao dịch được hoàn thành với tốc độ cực lớn và 100 giao dịch bị “kẹt” trong vài giây, thì thời gian trung bình được thu thập trên tất cả các giao dịch không phải là một thước đo hoàn toàn công bằng đối với khách hàng. người mà tôi không thể hoàn thành giao dịch trong vài giây. Những “lỗ hổng” tạm thời do bỏ lỡ các vòng đồng thuận hoặc chia tách mạng có thể hủy hoại đáng kể một dịch vụ đã cho thấy hiệu suất xuất sắc trên các băng ghế thử nghiệm.

Để xác định những điểm nghẽn như vậy, cần phải hiểu rõ về các giai đoạn mà một blockchain thực sự có thể gặp khó khăn trong việc phục vụ người dùng. Hãy mô tả chu trình phân phối và xử lý giao dịch, cũng như đạt được trạng thái mới của chuỗi khối, từ đó khách hàng có thể xác minh rằng giao dịch của mình đã được xử lý và hạch toán.

  1. giao dịch được hình thành trên máy khách
  2. giao dịch được ký kết trên khách hàng
  3. khách hàng chọn một trong các nút và gửi giao dịch của mình đến nút đó
  4. máy khách đăng ký cập nhật cơ sở dữ liệu trạng thái của nút, chờ kết quả giao dịch của nó xuất hiện
  5. nút phân phối giao dịch qua mạng p2p
  6. một số hoặc một BP (nhà sản xuất khối) xử lý các giao dịch tích lũy, cập nhật cơ sở dữ liệu trạng thái
  7. BP hình thành một khối mới sau khi xử lý số lượng giao dịch được yêu cầu
  8. BP phân phối một khối mới qua mạng p2p
  9. khối mới được gửi đến nút mà máy khách đang truy cập
  10. nút cập nhật cơ sở dữ liệu trạng thái
  11. nút nhìn thấy thông tin cập nhật liên quan đến khách hàng và gửi cho anh ta thông báo giao dịch

Bây giờ chúng ta hãy xem xét kỹ hơn các giai đoạn này và mô tả các vấn đề tiềm ẩn về hiệu suất ở mỗi giai đoạn. Không giống như các hệ thống tập trung, chúng tôi cũng sẽ xem xét việc thực thi mã trên các máy khách mạng. Thông thường, khi đo TPS, thời gian xử lý giao dịch được thu thập từ các nút chứ không phải từ khách hàng - điều này không hoàn toàn công bằng. Khách hàng không quan tâm nút xử lý giao dịch của mình nhanh như thế nào; điều quan trọng nhất đối với anh ta là thời điểm thông tin đáng tin cậy về giao dịch này có trong blockchain có sẵn cho anh ta. Số liệu này về cơ bản là thời gian thực hiện giao dịch. Điều này có nghĩa là các máy khách khác nhau, thậm chí gửi cùng một giao dịch, có thể nhận được thời gian hoàn toàn khác nhau, điều này phụ thuộc vào kênh, tải và mức độ gần nhau của nút, v.v. Vì vậy việc đo lường thời gian này trên client là hoàn toàn cần thiết, vì đây là thông số cần tối ưu.

Chuẩn bị giao dịch ở phía khách hàng

Hãy bắt đầu với hai điểm đầu tiên: giao dịch được khách hàng hình thành và ký kết. Thật kỳ lạ, đây cũng có thể là điểm nghẽn đối với hiệu suất blockchain theo quan điểm của khách hàng. Điều này không bình thường đối với các dịch vụ tập trung, đảm nhận tất cả các phép tính và thao tác với dữ liệu và khách hàng chỉ cần chuẩn bị một yêu cầu ngắn có thể yêu cầu một lượng lớn dữ liệu hoặc phép tính, thu được kết quả có sẵn. Trong blockchain, mã máy khách ngày càng trở nên mạnh mẽ hơn và lõi blockchain ngày càng trở nên nhẹ hơn và các tác vụ tính toán lớn thường được chuyển sang phần mềm máy khách. Trong blockchain, có những khách hàng có thể chuẩn bị một giao dịch trong một thời gian khá dài (tôi đang nói về nhiều bằng chứng merkle khác nhau, bằng chứng ngắn gọn, chữ ký ngưỡng và các hoạt động phức tạp khác ở phía khách hàng). Một ví dụ điển hình về việc xác minh trên chuỗi dễ dàng và sự chuẩn bị kỹ càng cho giao dịch của khách hàng là bằng chứng về tư cách thành viên trong danh sách dựa trên Merkle-tree, tại đây bài viết.

Ngoài ra, đừng quên rằng mã khách hàng không chỉ gửi giao dịch đến blockchain mà trước tiên hãy truy vấn trạng thái của blockchain - và hoạt động này có thể ảnh hưởng đến tình trạng tắc nghẽn của mạng và các nút blockchain. Vì vậy, khi thực hiện các phép đo, sẽ hợp lý nếu mô phỏng hành vi của mã máy khách một cách hoàn chỉnh nhất có thể. Ngay cả khi trong blockchain của bạn có những khách hàng đơn giản thông thường đặt chữ ký số thông thường vào giao dịch đơn giản nhất để chuyển một số tài sản, thì hàng năm vẫn có nhiều phép tính lớn hơn trên khách hàng, thuật toán tiền điện tử ngày càng mạnh hơn và phần xử lý này có thể trở thành một nút thắt đáng kể trong tương lai. Do đó, hãy cẩn thận và đừng bỏ lỡ tình huống khi, trong một giao dịch kéo dài 3.5 giây, 2.5 giây được dành cho việc chuẩn bị và ký giao dịch, và 1.0 giây để gửi nó lên mạng và chờ phản hồi. Để đánh giá rủi ro của nút cổ chai này, bạn cần thu thập số liệu từ máy khách chứ không chỉ từ các nút blockchain.

Gửi một giao dịch và theo dõi trạng thái của nó

Bước tiếp theo là gửi giao dịch đến nút blockchain đã chọn và nhận trạng thái chấp nhận giao dịch đó vào nhóm giao dịch. Giai đoạn này tương tự như truy cập cơ sở dữ liệu thông thường; nút phải ghi lại giao dịch trong nhóm và bắt đầu phân phối thông tin về nó thông qua mạng p2p. Cách tiếp cận để đánh giá hiệu suất ở đây tương tự như đánh giá hiệu suất của các dịch vụ vi mô API Web truyền thống và bản thân các giao dịch trong chuỗi khối có thể được cập nhật và chủ động thay đổi trạng thái của chúng. Nhìn chung, việc cập nhật thông tin giao dịch trên một số blockchain có thể xảy ra nhiều lần, chẳng hạn như khi chuyển đổi giữa các nhánh chuỗi hoặc khi BP thông báo ý định đưa giao dịch vào một khối. Giới hạn về kích thước của nhóm này và số lượng giao dịch trong đó có thể ảnh hưởng đến hiệu suất của blockchain. Nếu nhóm giao dịch được lấp đầy ở kích thước tối đa có thể hoặc không vừa với RAM, hiệu suất mạng có thể giảm mạnh. Chuỗi khối không có phương tiện tập trung để bảo vệ khỏi lũ tin nhắn rác và nếu chuỗi khối hỗ trợ các giao dịch khối lượng lớn và phí thấp, điều này có thể khiến nhóm giao dịch bị tràn - một nút thắt hiệu suất tiềm ẩn khác.

Trong blockchain, khách hàng gửi giao dịch đến bất kỳ nút blockchain nào họ thích, hàm băm của giao dịch thường được khách hàng biết trước khi gửi, vì vậy tất cả những gì anh ta cần làm là đạt được kết nối và sau khi truyền, đợi blockchain thay đổi trạng thái của nó, cho phép giao dịch của anh ta. Lưu ý rằng bằng cách đo “tps”, bạn có thể nhận được các kết quả hoàn toàn khác nhau cho các phương pháp kết nối khác nhau với nút blockchain. Đây có thể là HTTP RPC thông thường hoặc WebSocket cho phép bạn triển khai mẫu “đăng ký”. Trong trường hợp thứ hai, máy khách sẽ nhận được thông báo sớm hơn và nút sẽ tiêu tốn ít tài nguyên hơn (chủ yếu là bộ nhớ và lưu lượng) cho các phản hồi về trạng thái giao dịch. Vì vậy, khi đo “tps” cần phải tính đến cách máy khách kết nối với các nút. Do đó, để đánh giá rủi ro của nút cổ chai này, chuỗi khối chuẩn phải có khả năng mô phỏng các máy khách có cả yêu cầu WebSocket và HTTP RPC, theo tỷ lệ tương ứng với mạng thực, cũng như thay đổi bản chất của giao dịch và quy mô của chúng.

Để đánh giá rủi ro của nút cổ chai này, bạn cũng cần thu thập số liệu từ máy khách chứ không chỉ từ các nút blockchain.

Truyền giao dịch và khối qua mạng p2p

Trong blockchain, mạng ngang hàng (p2p) được sử dụng để chuyển các giao dịch và khối giữa những người tham gia. Các giao dịch lan rộng khắp mạng, bắt đầu từ một trong các nút, cho đến khi chúng đến tay các nhà sản xuất khối ngang hàng, những người đóng gói các giao dịch thành các khối và sử dụng cùng một p2p để phân phối các khối mới cho tất cả các nút mạng. Cơ sở của hầu hết các mạng p2p hiện đại là những sửa đổi khác nhau của giao thức Kademlia. Đây một bản tóm tắt hay về giao thức này, và đây - một bài viết với nhiều phép đo khác nhau trong mạng BitTorrent, từ đó người ta có thể hiểu rằng loại mạng này phức tạp hơn và khó dự đoán hơn so với mạng được cấu hình cứng nhắc của một dịch vụ tập trung. Cũng, đây bài viết về việc đo lường các số liệu thú vị khác nhau cho các nút Ethereum.

Nói tóm lại, mỗi mạng ngang hàng trong các mạng như vậy duy trì danh sách động của riêng mình gồm các mạng ngang hàng khác mà từ đó nó yêu cầu các khối thông tin được xử lý theo nội dung. Khi một máy ngang hàng nhận được một yêu cầu, nó sẽ cung cấp thông tin cần thiết hoặc chuyển yêu cầu đến máy ngang hàng giả ngẫu nhiên tiếp theo trong danh sách và sau khi nhận được phản hồi, nó sẽ chuyển nó cho người yêu cầu và lưu vào bộ nhớ đệm trong một thời gian, đưa ra điều này khối thông tin sớm hơn vào lần tiếp theo. Do đó, thông tin phổ biến sẽ nằm trong một số lượng lớn bộ nhớ đệm của một số lượng lớn các đồng nghiệp và thông tin không phổ biến dần dần được thay thế. Các đồng nghiệp lưu giữ hồ sơ về ai đã chuyển bao nhiêu thông tin cho ai và mạng lưới cố gắng kích thích các nhà phân phối tích cực bằng cách tăng xếp hạng của họ và cung cấp cho họ mức độ dịch vụ cao hơn, tự động loại bỏ những người tham gia không hoạt động khỏi danh sách ngang hàng.

Vì vậy, giao dịch bây giờ cần được phân phối trên toàn mạng để các nhà sản xuất khối có thể nhìn thấy nó và đưa nó vào khối. Nút này chủ động “phân phối” một giao dịch mới cho mọi người và lắng nghe mạng, chờ đợi một khối trong chỉ mục mà giao dịch được yêu cầu sẽ xuất hiện để thông báo cho khách hàng đang chờ. Thời gian để mạng truyền thông tin về các giao dịch và khối mới cho nhau trong mạng p2p phụ thuộc vào một số lượng rất lớn các yếu tố: số lượng nút trung thực hoạt động gần đó (từ quan điểm mạng), “sự ấm áp- up” bộ nhớ đệm của các nút này, kích thước khối, giao dịch, bản chất của các thay đổi, địa lý mạng, số lượng nút và nhiều yếu tố khác. Các phép đo phức tạp về số liệu hiệu suất trong các mạng như vậy là một vấn đề phức tạp; cần phải đánh giá đồng thời thời gian xử lý yêu cầu trên cả máy khách và các mạng ngang hàng (các nút blockchain). Các vấn đề trong bất kỳ cơ chế p2p nào, việc loại bỏ và lưu trữ dữ liệu không chính xác, quản lý danh sách các đồng nghiệp đang hoạt động không hiệu quả và nhiều yếu tố khác có thể gây ra sự chậm trễ ảnh hưởng đến hiệu quả của toàn bộ mạng và nút cổ chai này là khó phân tích nhất , kiểm tra và giải thích kết quả.

Xử lý chuỗi khối và cập nhật cơ sở dữ liệu trạng thái

Phần quan trọng nhất của blockchain là thuật toán đồng thuận, ứng dụng của nó cho các khối mới nhận được từ mạng và xử lý các giao dịch với việc ghi lại kết quả vào cơ sở dữ liệu trạng thái. Việc thêm một khối mới vào chuỗi và sau đó chọn chuỗi chính sẽ hoạt động nhanh nhất có thể. Tuy nhiên, trong đời thực, “nên” không có nghĩa là “hoạt động” và chẳng hạn, người ta có thể tưởng tượng một tình huống trong đó hai chuỗi cạnh tranh dài liên tục chuyển đổi giữa chúng, thay đổi siêu dữ liệu của hàng nghìn giao dịch trong nhóm tại mỗi lần chuyển đổi và liên tục khôi phục cơ sở dữ liệu trạng thái. Giai đoạn này, về mặt xác định nút cổ chai, đơn giản hơn lớp mạng p2p, bởi vì Thuật toán thực hiện giao dịch và đồng thuận mang tính quyết định chặt chẽ và việc đo lường mọi thứ ở đây sẽ dễ dàng hơn.
Điều chính là không nhầm lẫn sự suy giảm ngẫu nhiên về hiệu suất của giai đoạn này với các sự cố mạng - các nút chậm hơn trong việc cung cấp các khối và thông tin về chuỗi chính và đối với một máy khách bên ngoài, điều này có thể trông giống như một mạng chậm, mặc dù vấn đề nằm ở chỗ một nơi hoàn toàn khác.

Để tối ưu hóa hiệu suất ở giai đoạn này, sẽ rất hữu ích khi thu thập và giám sát các số liệu từ chính các nút và đưa vào chúng những số liệu liên quan đến việc cập nhật cơ sở dữ liệu trạng thái: số lượng khối được xử lý trên nút, kích thước của chúng, số lượng giao dịch, số lượng chuyển đổi giữa các nhánh chuỗi, số khối không hợp lệ, thời gian vận hành máy ảo, thời gian cam kết dữ liệu, v.v. Điều này sẽ giúp các sự cố mạng không bị nhầm lẫn với các lỗi trong thuật toán xử lý chuỗi.

Các giao dịch xử lý máy ảo có thể là nguồn thông tin hữu ích có thể tối ưu hóa hoạt động của chuỗi khối. Số lượng phân bổ bộ nhớ, số lượng lệnh đọc/ghi và các số liệu khác liên quan đến hiệu quả thực thi mã hợp đồng có thể cung cấp nhiều thông tin hữu ích cho các nhà phát triển. Đồng thời, hợp đồng thông minh là các chương trình, có nghĩa là về mặt lý thuyết, chúng có thể tiêu thụ bất kỳ tài nguyên nào: cpu/bộ nhớ/mạng/lưu trữ, vì vậy việc xử lý giao dịch là một giai đoạn khá không chắc chắn, ngoài ra, nó còn thay đổi rất nhiều khi di chuyển giữa các phiên bản. và khi thay đổi mã hợp đồng. Do đó, các số liệu liên quan đến xử lý giao dịch cũng cần thiết để tối ưu hóa hiệu suất blockchain một cách hiệu quả.

Khách hàng nhận được thông báo về việc đưa giao dịch vào blockchain

Đây là giai đoạn cuối cùng của khách hàng blockchain nhận dịch vụ; so với các giai đoạn khác, không có chi phí lớn nhưng vẫn đáng xem xét khả năng khách hàng nhận được phản hồi lớn từ nút (ví dụ: hợp đồng thông minh trả về một mảng dữ liệu). Trong mọi trường hợp, điểm này là quan trọng nhất đối với người đặt câu hỏi “blockchain của bạn có bao nhiêu tps?”, bởi vì Lúc này, thời điểm nhận dịch vụ được ghi nhận.

Ở nơi này, luôn có việc gửi toàn bộ thời gian mà khách hàng phải dành để chờ phản hồi từ blockchain; đó là lúc người dùng sẽ chờ xác nhận trong ứng dụng của mình và chính sự tối ưu hóa của nó là nhiệm vụ chính của các nhà phát triển.

Kết luận

Do đó, chúng ta có thể mô tả các loại hoạt động được thực hiện trên blockchain và chia chúng thành nhiều loại:

  1. biến đổi mật mã, xây dựng bằng chứng
  2. mạng ngang hàng, sao chép giao dịch và khối
  3. xử lý giao dịch, thực hiện hợp đồng thông minh
  4. áp dụng các thay đổi trong blockchain vào cơ sở dữ liệu trạng thái, cập nhật dữ liệu về các giao dịch và khối
  5. yêu cầu chỉ đọc tới cơ sở dữ liệu trạng thái, API nút blockchain, dịch vụ đăng ký

Nhìn chung, các yêu cầu kỹ thuật đối với các nút blockchain hiện đại là cực kỳ nghiêm trọng - CPU nhanh để mã hóa, dung lượng RAM lớn để lưu trữ và truy cập nhanh vào cơ sở dữ liệu trạng thái, tương tác mạng bằng cách sử dụng số lượng lớn kết nối mở đồng thời và dung lượng lưu trữ lớn. Những yêu cầu cao như vậy và sự phong phú của các loại hoạt động khác nhau chắc chắn dẫn đến thực tế là các nút có thể không có đủ tài nguyên và khi đó bất kỳ giai đoạn nào được thảo luận ở trên có thể trở thành một nút thắt cổ chai khác đối với hiệu suất tổng thể của mạng.

Khi thiết kế và đánh giá hiệu suất của chuỗi khối, bạn sẽ phải tính đến tất cả những điểm này. Để làm được điều này, bạn cần thu thập và phân tích đồng thời các số liệu từ máy khách và nút mạng, tìm kiếm mối tương quan giữa chúng, ước tính thời gian cần thiết để cung cấp dịch vụ cho máy khách, tính đến tất cả các tài nguyên chính: cpu/bộ nhớ/mạng/lưu trữ , hiểu cách chúng được sử dụng và ảnh hưởng lẫn nhau. Tất cả điều này làm cho việc so sánh tốc độ của các chuỗi khối khác nhau dưới dạng “có bao nhiêu TPS” trở thành một nhiệm vụ cực kỳ khó khăn, vì có một số lượng lớn các cấu hình và trạng thái khác nhau. Trong các hệ thống tập trung lớn, cụm hàng trăm máy chủ, những vấn đề này cũng phức tạp và cũng đòi hỏi phải thu thập một số lượng lớn các số liệu khác nhau, nhưng trong blockchain, do mạng p2p, hợp đồng xử lý máy ảo, nền kinh tế nội bộ, số độ mức độ tự do lớn hơn nhiều, điều này khiến cho thử nghiệm ngay cả trên một số máy chủ không mang tính biểu thị và chỉ hiển thị các giá trị cực kỳ gần đúng và hầu như không có mối liên hệ nào với thực tế.

Do đó, khi phát triển trong lõi blockchain, để đánh giá hiệu suất và trả lời câu hỏi “nó đã được cải thiện so với lần trước chưa?”, chúng tôi sử dụng phần mềm khá phức tạp để điều phối việc khởi chạy blockchain với hàng chục nút và tự động khởi chạy điểm chuẩn và thu thập số liệu ; nếu không có thông tin này thì việc gỡ lỗi các giao thức hoạt động với nhiều người tham gia là vô cùng khó khăn.

Vì vậy, khi bạn nhận được câu hỏi “có bao nhiêu TPS trong blockchain của bạn?”, hãy mời người đối thoại của bạn một tách trà và hỏi xem anh ấy đã sẵn sàng xem hàng tá biểu đồ và lắng nghe cả ba hộp về các vấn đề về hiệu suất blockchain và đề xuất của bạn về giải quyết chúng...

Nguồn: www.habr.com

Thêm một lời nhận xét