Don Liên Nhận Ngã ba: Thực tiễn tốt nhất để xử lý các bản nâng cấp khách hàng của Constantinople và Ethereum

Các bản cập nhật phần mềm, có thể cài đặt các lỗi bảo mật, sửa lỗi hoặc thêm các tính năng mới hay không, nói chung là một điều tốt cho các ứng dụng chúng ta sử dụng hàng ngày và chúng tôi không nghĩ gì về việc áp dụng chúng. Nhưng các bản cập nhật cho các phần cốt lõi của cơ sở hạ tầng cũng có thể đáng sợ khi chúng đưa ra các thay đổi vi phạm hoặc hành vi không mong muốn cho các ứng dụng phụ thuộc hoặc trong các trường hợp khác khi không cập nhật kịp thời có thể gây ra sự cố. Vấn đề này ảnh hưởng đến các thực thể nhỏ và lớn và blockchain cũng không ngoại lệ.

Tại Alchemy, chúng tôi cung cấp dịch vụ cơ sở hạ tầng Ethereum đáng tin cậy, có thể mở rộng và nhanh chóng cho khách hàng của mình để họ không phải đấu tranh với việc duy trì các nút và có thể tập trung vào việc xây dựng các ứng dụng của họ. Trong quá trình làm việc, chúng tôi đã học được nhiều bài học (đôi khi là một cách khó khăn!) Về cách xử lý tốt nhất các dĩa mạng và cập nhật máy khách. Với hard fork Constantinople sắp tới, chúng tôi nghĩ rằng đây sẽ là một cơ hội tuyệt vời để chia sẻ một số thực tiễn tốt nhất của chúng tôi.

Đây là bài viết đầu tiên trong số nhiều bài đăng trên blog mà chúng tôi sẽ viết về việc chạy cơ sở hạ tầng Ethereum theo cách đáng tin cậy, hiệu quả và có thể mở rộng.

Constantinople

Constantinople là Ethereum, bản nâng cấp toàn hệ thống tiếp theo và sẽ triển khai năm EIP, đây thực sự là một phần của lộ trình lớn hơn đối với Ethereum 2.0. Có rất nhiều bài viết trên mạng thảo luận về những thay đổi cụ thể, nhưng điều cần lưu ý là vì đây là một hard fork không gây tranh cãi, cộng đồng sẽ chấp nhận fork mới, làm cho token và trạng thái khác trên các nút không cập nhật trở nên vô giá trị.

cái này ảnh hưởng gì đến bạn?

Đối với các nhà phát triển dapp, điều quan trọng nhất là bạn sẽ phải cập nhật nút của mình thành phiên bản tương thích Constantinople hoặc nó sẽ không tương thích với phần còn lại của mạng qua khối 7.080.000. Các khách hàng của Ethereum rất có thể sẽ được cập nhật trên các nhánh cứng cho chuỗi và phát hành phiên bản ổn định, tương thích của khách hàng của họ trước ngày kết thúc ước tính, ví dụ: geth và chẵn lẻ. Nếu bạn đang quản lý nút máy khách Ethereum của riêng mình, bạn sẽ cần cập nhật máy khách ethereum của mình lên phiên bản tương thích với hard fork; chẵn lẻ sẽ là 2.1.10 - ổn định hoặc cao hơn và geth sẽ là 1.8.20 hoặc cao hơn.

Các bản cập nhật hard fork nên có ít và xa, nhưng các bản cập nhật máy khách Ethereum có thể phổ biến hơn nhiều. Nếu bạn đang chạy một dịch vụ phụ thuộc vào chuỗi, việc cập nhật ứng dụng khách của bạn có thể có lợi để khắc phục các lỗi bảo mật hoặc tận dụng chức năng mới. Tuy nhiên, bạn phải cẩn thận rằng bạn không giới thiệu các vấn đề bất ngờ vào ứng dụng của mình.

Thực hành tốt nhất

Nếu bạn đang chạy một dịch vụ yêu cầu tương tác thường xuyên với chuỗi khối Ethereum, một vài thực tiễn tốt nhất cốt lõi sẽ cứu bạn khỏi các lỗi nghiêm trọng tiềm ẩn khi bạn cập nhật các nút của mình. Chúng tôi sẽ xem xét một số tình huống thực tế về các bản cập nhật đã trở thành động lực cho bài đăng trên blog này.

Chạy nhiều nút

Chúng tôi thực sự khuyên bạn nên chạy nhiều nút như một cách thực hành tốt nhất chung để duy trì cơ sở hạ tầng Ethereum nội bộ vì có nhiều lợi ích, bao gồm tăng độ tin cậy và khả năng mở rộng. Tuy nhiên, điều này có thể giới thiệu các vấn đề về tính nhất quán và tính nhất quán vào hệ thống của bạn, mà chúng tôi sẽ giải quyết trong một bài đăng blog tiếp theo.

Khi nói đến cập nhật, chạy nhiều nút cung cấp một vài lợi ích bổ sung:

  1. Các nút bổ sung đóng vai trò sao lưu trong trường hợp cập nhật bị lỗi và khiến một nút không thể phục hồi
  2. Tính sẵn sàng cao và không có thời gian chết trong khi cập nhật các nút theo kiểu cuộn
  3. Cho phép kiểm tra hồi quy so sánh các nút được cập nhật với các nút gốc để đảm bảo hành vi dự kiến

Trong kịch bản của một nút không thể phục hồi, một nút lưu trữ đầy đủ mới có thể mất tới hai tuần để đồng bộ hóa hoàn toàn. Không có một bản sao lưu, đây là một lượng thời gian chết không thể chấp nhận được.

Ví dụ 1: Di chuyển Buggy DB

Một vấn đề chúng tôi thấy khi nâng cấp chẵn lẻ từ 1.X.X lên 2.X.X là lỗi trong cơ sở dữ liệu. Bản cập nhật bao gồm di chuyển DB nội bộ đã chuyển đổi không chính xác số khối trong bộ lọc nở, dẫn đến kết quả trống cho các yêu cầu getLog cho các khối lịch sử. Mất dữ liệu là không thể đảo ngược để nút không thể được cứu vãn. Chúng tôi đã may mắn bắt được nó thông qua thử nghiệm nội bộ trên một nút canary, dự phòng cho các nút không được cập nhật của chúng tôi để giữ cho hệ thống của chúng tôi và chờ cho đến khi vấn đề được giải quyết bởi nhóm chẵn lẻ trong 2.2.3-beta.

Kiểm tra hồi quy nghiêm ngặt

Kiểm tra nghiêm ngặt luôn được khuyến nghị mạnh mẽ cho bất kỳ thay đổi nào đối với hệ thống của bạn. Theo đó, khi cập nhật các nút của bạn, bạn sẽ muốn kiểm tra để đảm bảo rằng ứng dụng và cơ sở hạ tầng của bạn tiếp tục hoạt động như mong đợi. Làm khác đi có khả năng khiến người dùng và hệ thống của bạn bị cúp điện. Với nhiều nút đang chạy, cách tốt nhất để đảm bảo điều này là kiểm tra các nút ổn định trước đó của bạn với một nút canary được cập nhật. Nếu phát hiện bất kỳ thay đổi vi phạm nào, hãy đảm bảo hệ thống của bạn có thể xử lý chúng một cách an toàn trước khi cập nhật phần còn lại của cụm.

Đối với các bài kiểm tra hồi quy, chúng tôi đi thẳng vào nguồn bằng cách phát lại các yêu cầu sản xuất đối với các nút của chúng tôi. Điều này có thể được thực hiện thủ công cho một lần kiểm tra, nhưng vì chúng tôi hỗ trợ rất nhiều dự án, chúng tôi đã xây dựng một khung kiểm tra tự động mở rộng để lấy mẫu các yêu cầu trực tiếp gần đây, phát lại chúng trên các phiên bản máy khách khác nhau và so sánh kết quả. Điều này cho phép chúng tôi xác minh rằng mã của chúng tôi có thể tương tác an toàn với các nút được cập nhật trước khi chuyển đến sản xuất. Khung này có thể được sử dụng để kiểm tra hồi quy về thay đổi mã nội bộ.

Ví dụ 2: Thay đổi định dạng đầu ra phản hồi

Đây là một vấn đề thú vị mà chúng tôi gặp phải khi một khách hàng mới được cập nhật trả về một phản hồi khác về lỗi thực thi EVM. Parity 1.11.1-beta đã trả về một phản hồi giống như thế này:

{Lỗi jsonrpc, canh: 2.0, lỗi, lỗi: {32 mã, lỗi: - 32015, thông báo lỗi: Lỗi thực thi VM., Dữ liệu, dữ liệu

Thay vì phản hồi từ các phiên bản trước trông như thế này:

{Nhật ký jsonrpc

Thay đổi định dạng phản hồi thực sự có lợi vì nó tạo ra nhiều chi tiết thực thi hơn cho người gọi thay vì âm thầm thất bại, nhưng có thể gây ra sự cố nếu mã không được thiết lập để xử lý nó. Trong kịch bản này, việc so sánh các kết quả đầu ra phản hồi đã tạo ra sự thay đổi và chúng tôi chỉ cần cập nhật các hệ thống của chúng tôi và cảnh báo cho khách hàng của mình để họ không bị báo động bởi phản hồi mới và có thể cập nhật các dịch vụ của họ để tương thích.

Xây dựng dựa trên!

Chúng tôi hy vọng rằng điều này hữu ích và những thực tiễn tốt nhất này sẽ giúp cập nhật nút không gây đau đớn cho bạn trong tương lai. Họ đã giúp chúng tôi đảm bảo rằng các cập nhật luôn diễn ra suôn sẻ cho cả hệ thống của chúng tôi và cho các khách hàng dựa vào chúng tôi. Chúng tôi biết mức độ khó khăn của việc duy trì và nhân rộng các nút có thể khó khăn như thế nào và chúng tôi muốn truyền bá những kiến ​​thức mà chúng tôi đã có trong những năm qua.

Nếu bạn đang làm việc trong một dự án Ethereum và không muốn đối phó với chi phí duy trì các nút, hãy nói chuyện với chúng tôi! Alchemy cung cấp cơ sở hạ tầng Ethereum nhanh nhất, có khả năng mở rộng nhất và đáng tin cậy nhất như một dịch vụ để bạn có thể tập trung vào việc xây dựng sản phẩm của mình. Dưới vỏ bọc, Alchemy đã xây dựng cơ sở hạ tầng mới mang tính cách mạng, cung cấp năng lượng cho các dự án blockchain hàng đầu như Augur, các công ty blockchain hàng đầu như CryptoKitties và các quỹ phòng hộ hàng đầu (quản lý hơn 3 tỷ đô la). Tìm hiểu thêm tại alchemyapi.io.