Phân tích sơ bộ về lỗi Minting
(Nếu bài viết bị lỗi Font trên Medium bạn có thể đọc bài viết tại đây.)
Mạng Avalanche đã gặp sự cố nghiêm trọng vào đầu tuần vừa qua . Bài viết sau sẽ mô tả nguyên nhân gây ra sự cố, cách các nhà phát triển và thành viên cộng đồng giải quyết vấn đề đó và các bài học rút ra từ nó.
TL; DR
Khối lượng lớn trên hệ thống đã gây ra lỗi không xác định liên quan đến xác minh trạng thái. Điều này khiến một số trình xác thực chấp nhận một số giao dịch đúc tiền không hợp lệ, trong khi phần còn lại của mạng lưới từ chối các giao dịch này và làm đình trệ chuỗi C.
Đây là tiền đúc không hợp lệ, không phải chi tiêu gấp đôi. Các giao dịch độc lập trên X-chain tiếp tục được xử lý. Mạng đã không dừng lại.
Sau khi vấn đề được xác định, lỗi nhanh chóng được vá để áp dụng các kiểm tra cần thiết trong tương lai. Bản vá đã được phân phối cho cộng đồng và áp dụng cho mạng. Mạng lưới Avalanche đã mạnh mẽ hơn trước.
Nhưng câu chuyện đầy đủ còn nhiều màu sắc hơn thế.
Nó bắt đầu với sự ra mắt của Pangolin, tạo ra hoạt động đáng kể trên chuỗi hợp đồng thông minh của Avalanche. Nhớ lại rằng Avalanche có 3 chuỗi mặc định: C-chain cho hợp đồng, X-chain để chuyển tài sản và P-chain để đặt cược và quản lý mạng con. Mỗi chúng chạy một máy ảo khác nhau, được thiết kế để phục vụ các mục đích tương ứng và được xác thực bởi cùng một bộ trình xác thực.
AVAX và các tài sản kỹ thuật số khác có thể được chuyển giữa các chuỗi này. Bởi vì các chuỗi này tách biệt và biệt lập với nhau, chúng không biết về hoặc phân tích các giao dịch của nhau. Khi ai đó di chuyển AVAX từ chuỗi này sang chuỗi khác, hệ thống sẽ phá hủy AVAX trên chuỗi nguồn và nghiền nó trên chuỗi đích thông qua một cặp giao dịch. Thiết kế này cho phép kết hợp chuỗi X dựa trên DAG hiệu suất cao với chuỗi C và P tuyến tính, có thứ tự hoàn toàn, mà không yêu cầu bất kỳ thời gian hoặc đồng bộ hóa cấu trúc dữ liệu nào.
Tất cả các blockchain, bao gồm cả Avalanche, đều thực hiện kiểm tra tính hợp lệ trên mỗi giao dịch và khối. Việc kiểm tra tính hợp lệ liên quan đến các giao dịch đúc tiền trên C-chain trong AvalancheGo v1.1.5 đã được thực hiện tại đây .
Mục đích của mã này là để đảm bảo rằng tất cả các giao dịch nhập khẩu đều hợp lệ. Ví dụ, bạn có thể thấy rằng khối khởi tạo chuỗi C được coi là trường hợp cơ sở và tất cả các giao dịch đúc tiền khác được xác minh thông qua bộ đệm ẩn khối. Như một minh họa về những gì đã xảy ra, giả sử rằng mạng đã phát hành các khối B0 ← B1 ← B2 ← B3 ← B4 , trong đó ← chỉ ra mối quan hệ cha.
Nếu B1 và B4 chứa giao dịch đúc tiền xung đột, thì B1 phải được đánh dấu là hợp lệ và B4 sẽ bị từ chối vì không hợp lệ. Việc kiểm tra tính hợp lệ cho B4 phải đảm bảo rằng không có tổ tiên nào của nó từ B1 đến B3 sử dụng giao dịch đúc xung đột. Bây giờ, hãy nhớ rằng với khối lượng lớn, nhiều khối có thể được xử lý cùng một lúc, chỉ với một tiền tố được chấp nhận.
Giả sử rằng khối B0 đã được chấp nhận và các khối B1 , B2 , B3 và B4 hiện đang ở giai đoạn đề xuất đồng thời, vì vậy chúng hiện chưa được chấp nhận (còn được gọi là chưa quyết định hoặc chưa hoàn thành, nghĩa là chúng chưa được cam kết với blockchain chưa). Nó chỉ ra rằng đoạn mã để kiểm tra các giao dịch đúc tiền này chứa một lỗi nhỏ phát sinh trong một điều kiện rất cụ thể, phụ thuộc vào thời gian.
if atx! = nil {
input.Union (atx.UnsignedTx. (UnsignedAtomicTx) .InputUTXOs ())
inputCopy.Union (* input)
}
Cụ thể, đoạn mã này điền một biến được gọi là inputCopy , nhưng không bao giờ thực hiện kết hợp các đầu vào với inputCopy nếu khối hiện tại không chứa giao dịch đúc hoặc hủy. Tập hợp đầu vào trống này sau đó sẽ được lưu vào bộ nhớ đệm, điều này phá vỡ sự bất biến mà một tập hợp được lưu trong bộ nhớ cache chứa tất cả các ID đầu vào của các giao dịch đúc và hủy tổ tiên của nó. Điều này có nghĩa là bản cập nhật bộ nhớ cache không hợp lệ, được thực hiện tại một thời điểm do cha mẹ đồng thời chưa được chấp nhận, sẽ kích hoạt không chính xác một giao dịch trong tương lai được đánh dấu là hợp lệ. Vì vậy, theo tình huống sau, trong đó B1 chứa giao dịch đúc, B2 chứa giao dịch không khai thác và B3 chứa giao dịch đúc không liên quan và nơi các khốiTừ B1 đến B3 chưa được chấp nhận, khi đó mục nhập bộ nhớ cache không hợp lệ có thể kích hoạt tính năng giả mạo trong B4 .
Lỗi này không ảnh hưởng đến các giao dịch thông thường, chuyển tiền, chuyển tài sản, phá hủy tiền hoặc lệnh gọi hợp đồng thông minh. Avalanche không bao giờ cho phép bất kỳ người dùng nào gửi thành công các khoản tiền giống nhau cho hai người nhận. Điều này có nghĩa là hoàn toàn không có chi tiêu kép nào xảy ra.
Thay vào đó, lỗi đã cho phép một thao tác xử lý không hợp lệ trên chuỗi C bằng cách không ghi lại xung đột với khối tổ tiên và làm như vậy nếu và chỉ khi khối tổ tiên đó không được quyết định đồng thời trên một số lượng nút đủ lớn.
Thực tế là lỗi chỉ có thể được kích hoạt khi ba tổ tiên chưa được quyết định có nghĩa là lỗi đó là không xác định. Nghĩa là, nó chỉ có thể xảy ra trong một số điều kiện mạng không liên tục. Vì tất cả các nút tiến hành với tốc độ hơi khác nhau, một nút có thể đã xác thực thành công và chấp nhận B1 khi B4 đang được kiểm tra tính hợp lệ, trong trường hợp đó, nó sẽ đánh dấu chính xác B4 là không hợp lệ, trong khi một nút khác có thể chưa hoàn thành B1 tại thời điểm nó kiểm tra B4 , do đó cho phép B4 .
Vào ngày 11 tháng 2, sự gia tăng lưu lượng mạng do sự ra mắt của Pangolin đã khiến số lượng khối xử lý đồng thời tăng lên. Điều này làm tăng số lượng khối đồng thời trong hệ thống và gây ra lỗi.
Kết quả là một số trình xác thực đã chấp nhận các khối chứa các giao dịch nhập không hợp lệ trong khi những người khác thì không. Cuối cùng, những người xác nhận chấp nhận các loại bạc hà không hợp lệ bắt đầu bất đồng với nhau vì tính không xác định, điều này khiến họ ngừng tiến bộ trên chuỗi C để đảm bảo an toàn cho đến khi các vấn đề này được giải quyết.
Vì chuỗi X và P không chứa lỗi đúc tiền, mạng Avalanche tiếp tục xử lý các giao dịch không liên quan đến chuỗi C. Chuỗi C đã ngừng xử lý, nhưng các giao dịch độc lập khác trên mạng Avalanche vẫn chưa bao giờ dừng lại. X-Chain là một DAG, không phải là một chuỗi tuyến tính, cho phép nó xử lý các giao dịch, ngay cả khi các nhà phát triển đang gỡ lỗi hệ thống.
Theo đảm bảo của giao thức Avalanche, không có hai nút nào chấp nhận các khối khác nhau ở cùng độ cao hoặc chứa các giao dịch xung đột khác. Cụ thể, một số nút Avalanche tiếp tục đạt được tiến bộ trên chuỗi chuẩn chính xác trong khi những nút khác không gặp lỗi chỉ dừng lại. Trình xác thực không dễ bị lỗi không xác định đã từ chối thực hiện bất kỳ tiến bộ nào khi một tập hợp trình xác thực chấp nhận khối mà họ coi là không hợp lệ. Tuy nhiên, vì phần lớn trình xác thực đã chấp nhận khối, những trình xác thực còn lại không thể đạt được tiến bộ trên bất kỳ khối nào khác ở độ cao đó không chứa lỗi đúc không hợp lệ.
Khắc phục
Thoạt nghĩ, cách dễ nhất để khắc phục sự cố như thế này có vẻ là viết lại chuỗi khối và hoàn tác các giao dịch được chấp nhận. Nhưng vì không có thực thể nào kiểm soát mạng Avalanche hoặc kiểm soát một tỷ lệ phần trăm đủ các nút để làm như vậy, nên cách tiếp cận như vậy thực sự không khả thi. Đây là một điều tốt, vì nó cho thấy rằng mạng Avalanche thực sự phi tập trung.
Thay vào đó, giải pháp khả thi tốt nhất là giải pháp có thể triển khai dần dần , nghĩa là nó không yêu cầu “fork” cứng hoặc mềm, không yêu cầu quyền kiểm soát đối với phần lớn mạng và cung cấp lợi ích cho tất cả những người triển khai nó. Các nhà phát triển nhanh chóng tập hợp một bản vá chấp nhận tất cả các khối mà mạng đã chấp nhận và chuyển mạng chuyển tiếp đến cùng một tập hợp các mẹo phổ biến. Phần quan trọng của bản vá là sau đây, vô hiệu hóa bộ nhớ cache và giới thiệu khái niệm về các khối đặc biệt tôn trọng các loại bạc hà không hợp lệ.
Sự khác biệt có thể được xem ở đây .
Nhược điểm của bản vá là nó cho phép tạo ra 790.2160157 AVAX bổ sung. Để duy trì sự bất biến rằng sẽ không bao giờ có nhiều hơn AVAX 720M, Avalanche Foundation đã quyết định đốt cùng một lượng AVAX đã được tạo ra . Việc triển khai bản vá cho phép tất cả các nút chính xác đồng ý về hợp lệ cao nhất và đồng loạt tiếp tục tiến bộ.
Phần kết luận
Hầu hết mọi chuỗi khối chính đều có các giai đoạn mà lỗi gây ra sự cố đe dọa sự an toàn hoặc hoạt động của hệ thống. Đây là những sự kiện không mong muốn nhưng không thể tránh khỏi.
Lỗi không xuất phát từ một vấn đề cơ bản với sự đồng thuận của Avalanche, mạng hoặc hệ thống.
Hệ sinh thái Avalanche chung phản ứng nhanh với những gì đã xảy ra. Mã hiện có và bản vá đã triển khai đảm bảo tất cả tiền vẫn an toàn và cho phép khôi phục hệ thống một cách chính xác. Mạng vẫn ổn định, bất kỳ ai cũng có thể xác minh bằng cách thực hiện các giao dịch hoặc quan sát các chỉ số mạng.
Các giao dịch đang xác minh nội bộ như bất kỳ sự kiện nào như vậy. Lỗi này trùng với Tết Nguyên Đán khiến việc kích hoạt lại dịch vụ bị chậm trễ. Không có tài sản nào đã hoặc có thể bị mất.
Các sàn giao dịch sẽ mất thời gian để đồng bộ trở lại với mạng. Nếu bạn đang thực hiện rút tiền từ một sàn giao dịch tại thời điểm mạng lưới chậm lại, thì có khả năng sàn giao dịch đó cần phát lại giao dịch rút tiền của bạn. Nếu bạn đang thực hiện gửi tiền và những người khám phá cho thấy rằng giao dịch đã được thực hiện, thì các sàn giao dịch sẽ ghi có vào tài khoản của bạn khi chúng đồng bộ hóa với mạng.
Bản vá này đã tiết lộ và sửa một lỗi phức tạp, đồng thời chứng minh cho cả thế giới thấy rằng Mạng lưới Avalanche thực sự phi tập trung. Kết quả là cả mạng lưới Avalanche ngày càng mạnh mẽ hơn và cộng đồng của nó vẫn vô cùng ủng hộ như mọi khi.
Vì phân tích bao gồm các chủ đề phức tạp, các bản cập nhật có thể được thực hiện để làm rõ hơn.
Link bài viết gốc từ Patrick O’Grady — kỹ sư tiền điện tử tại @AvaLabsOfficial: https://medium.com/avalancheavax/preliminary-analysis-of-the-invalid-minting-bug-bee940cbd9e9