Tác giả: toly, Solana Labs Đồng sáng tạo bởi: >Ở Solana, trạng thái được tổ chức dưới dạng kho lưu trữ khóa-giá trị phẳng và các chương trình thực thi trên trạng thái này để cập nhật các giá trị, bao gồm các chương trình bỏ phiếu quan trọng để đạt được sự đồng thuận. Mục đích chính của việc thực thi không đồng bộ là cho phép chương trình biểu quyết chạy độc lập với tất cả các chương trình khác. Để đạt được điều này một cách nhất quán, chúng ta cần đảm bảo một số nguyên tắc chính.
Miền thực thi
Miền thực thi là một tập hợp các khóa và giá trị cho các chương trình cũng như hoạt động của chúng độc lập với nhau khi được thực thi. Các miền thực thi có thể chạy trên các luồng và lõi khác nhau và hoàn thành vào các thời điểm khác nhau trên nhiều máy khác nhau. Điều quan trọng là một miền thực thi (ví dụ: miền A) không thể đọc hoặc ghi bất kỳ giá trị nào trong miền khác (ví dụ: miền B). Tuy nhiên, các miền có thể chia sẻ trạng thái nhất quán trong quá trình thực thi bất kỳ một miền nào. Cần có một giao thức để đồng bộ hóa trạng thái giữa các miền và tạo điều kiện thuận lợi cho việc di chuyển các khóa và giá trị.
Người trả phí giao dịch xác định miền mà giao dịch được thực hiện.
Các miền chính: VED và UED
Ở Solana, chúng tôi chủ yếu tập trung vào hai miền: miền thực thi biểu quyết (VED) và miền thực thi người dùng (UED). Mục tiêu là cho phép người xác thực bỏ phiếu trước khi hoàn tất quá trình thực thi chương trình của người dùng.
Các thành phần của VED
Chương trình hệ thống: Đã sử dụng để chuyển giao
Các biến hệ thống của chương trình biểu quyết: Các biến hệ thống của chương trình biểu quyết được sử dụng để biểu quyết
< mạnh>Thủ tục bỏ phiếu: Thủ tục bỏ phiếu cốt lõi. Chương trình tĩnh và nhất quán và phải có trong cả UED và VED.
Quyền biểu quyết: Tài khoản có quyền biểu quyết
Người nộp phí biểu quyết : Tài khoản thanh toán các phí liên quan đến biểu quyết
Quỹ người nộp phí: Một tài khoản có thể gia hạn có thể được sử dụng để chuyển sol sang VED
Tất cả các tài khoản khác được đặt trong UED
Tính trạng thái VED
Sau N-1 và Ranh giới kỷ nguyên của N, trạng thái VED của miền N+1 được tính toán khi chạy. Việc tính toán này phải được hoàn thành trước khi kết thúc kỷ nguyên N. Việc tính toán UED không thể bắt đầu cho đến khi Epoch N-1 hoàn thành.
Tiêu chí cho trạng thái VED
Tài khoản biểu quyết: Tài khoản có hơn 5.000 sol được đặt cọc và đang hoạt động.
Người nộp phí và Quyền biểu quyết, Quỹ của người nộp phí: được liên kết với tài khoản biểu quyết trên.
Tài khoản biểu quyết mới tạo ban đầu được đặt ở trạng thái không hoạt động. Người dùng phải kích hoạt các tài khoản này và sau khi kích hoạt, chúng sẽ được đưa vào tính toán trạng thái VED tiếp theo. Người dùng có thể hủy kích hoạt tài khoản và tài khoản sẽ bị xóa khỏi trạng thái VED trong Epoch N+1.
Chuyển tiền trong VED
Tài khoản quỹ của người nộp phí được khai báo trong tài khoản biểu quyết có thể được sử dụng để chuyển tiền trong VED. Sau khi cập nhật tài khoản cấp vốn của người nộp phí vào tài khoản biểu quyết, quỹ của người nộp phí hiện tại sẽ vẫn hoạt động cho đến hết kỷ nguyên tiếp theo. Sau khi VED tính toán lại được kích hoạt, quỹ người nộp phí mới sẽ chuyển sang trạng thái VED và có thể được sử dụng để bổ sung thêm sol cho người nộp phí. Tiền của người nộp phí cũ sẽ chuyển sang trạng thái UED để tiền có thể được chuyển trở lại tài khoản trong UED.
Mặc dù có thể hợp nhất với người nộp phí, nhưng để giảm thiểu số lượng chữ ký được sử dụng cho mỗi phiếu bầu, người nộp phí thường được đặt cùng giá trị với cơ quan biểu quyết, do đó cần có một giá trị riêng tài khoản trong VED Chuyển sol giữa và UED.
Miền thực thi chung
Phương pháp trên rất cụ thể đối với thủ tục bỏ phiếu. Hơn nữa, có thể khái quát hóa phương thức này cho bất kỳ số lượng miền thực thi nào. Các tài khoản theo dõi miền thực thi mà chúng được ánh xạ tới, giống như trình ảo hóa hệ điều hành theo dõi VMID trong trang vật lý. Đối với dự án cụ thể này, một tập hợp ánh xạ nhỏ rất hữu ích:
RX-UED: Trong UED only Read và có thể thực thi
RX-UED-VED: Chỉ đọc và thực thi được trong UED và VED
< li>< p>RW-VED: Đọc và viết bằng VEDRW-UED: Đọc và viết bằng UED Write< /p>
Vì tài khoản không thể đọc và ghi đồng thời trên nhiều miền nên các ánh xạ khác không hợp lệ.
Chương trình: Chỉ có thể được ánh xạ tới RX-UED hoặc RX-UED-VED, nghĩa là giữa người dùng hoặc cả hai Tên miền có thể đọc và thực thi được nhưng không thể ghi. Bất kỳ giao dịch nào bao gồm chương trình có thể ghi đều phải thất bại.
Tài khoản: Chỉ có thể được ánh xạ tới RW-VED hoặc RW-UED.
Ảnh chụp nhanh hệ thống định cấu hình chương trình bỏ phiếu và chương trình hệ thống là RX-UED-VED. Chương trình hệ thống cung cấp các giao diện để di chuyển tài khoản hệ thống và tài khoản chương trình biểu quyết đến và đi từ VED. Bản cập nhật thực tế vẫn yêu cầu một kỷ nguyên đầy đủ để kích hoạt.
Các tài khoản chỉ có thể được ánh xạ lại giữa các miền nếu chương trình chủ sở hữu nằm trong miền mục tiêu. Do đó, chỉ có thể di chuyển các tài khoản chương trình biểu quyết và chương trình hệ thống giữa VED và UED.
Với cách tiếp cận phổ biến, tài khoản cấp vốn cho người trả phí rõ ràng không còn cần thiết nữa. Các nhà phát triển có thể ánh xạ lại bất kỳ tài khoản hệ thống nào giữa VED và UED để chuyển tiền giữa các miền.
Tính hàm băm VED
Sau khi nhận được khối, nút sẽ thực hiện tất cả các giao dịch. Quá trình này như sau:
Thực hiện các giao dịch chỉ liên quan đến tài khoản VED.
Giao dịch với các tài khoản hỗn hợp có người nộp phí VED không thành công.
Bỏ qua tất cả các giao dịch khác.
Bản cập nhật trạng thái VED được tạo ra được sử dụng để tính toán hàm băm ngân hàng, hàm băm VED. Người xác nhận hiện có thể bỏ phiếu bằng cách sử dụng hàm băm VED thay vì hàm băm ngân hàng cũ. Nếu đã có bản cập nhật băm UED kể từ lần bỏ phiếu cuối cùng trên nhánh đó, thì hàm băm và vị trí đó sẽ được đưa vào phiếu bầu.
Tính hàm băm UED
Sau khi nhận được khối, nút sẽ xử lý tất cả các giao dịch:
- < p> Các tài khoản không có trong VED được coi là một phần của UED.
Thực hiện các giao dịch chỉ liên quan đến tài khoản UED.
Giao dịch với người nộp phí UED nhưng tài khoản hỗn hợp không thành công.
Bỏ qua tất cả các giao dịch khác.
Bản cập nhật trạng thái UED được tạo ra được sử dụng để tính toán hàm băm ngân hàng, hàm băm UED.
Tính cuối cùng
Tính cuối cùng không thay đổi.
Mã trạng thái thực hiện giao dịch
Một tác dụng phụ của việc thực thi không đồng bộ là tính không xác định có thể không được phát hiện ngay lập tức một cách đồng bộ khi diễn ra các nhánh biểu quyết. Nếu 1/3 trình xác thực trở lên gửi các hàm băm UED khác nhau, tất cả các nút phải dừng xác nhận và bỏ phiếu, đồng thời cảnh báo cho người vận hành.
Để có được mã trạng thái, yêu cầu API RPC phải cho phép người dùng chỉ định một cam kết được quan sát để tính toán cùng hàm băm UED. Trạng thái thực thi có thể được biểu thị dưới dạng ExecutionStatus (chữ ký, cam kết = X), trong đó X có thể là 0 hoặc một số giá trị mặc định. Trong thiết lập có nhiều nút và máy khách, giá trị X bằng 0 có thể chấp nhận được, giúp người dùng tin tưởng rằng khả năng không xác định là rất khó xảy ra.
Tính không xác định là lỗi duy nhất cần được phát hiện trước khi trả lại mã trạng thái cho giao dịch đã xác nhận cho người dùng, do đó giá trị mặc định cho X thường có thể thấp bằng ngưỡng xác nhận lạc quan hoặc khoảng 5%.
Người lãnh đạo và tạo khối
Người lãnh đạo phải có khả năng bắt đầu tạo khối ngay sau khi VED hoàn thành. Điều này có nghĩa là người lãnh đạo sẽ có thông tin một phần và không đầy đủ về trạng thái của bất kỳ người nộp phí UED nào.
Kích hoạt chức năng của quy trình bỏ phiếu
Quy trình bỏ phiếu phải được chạy trên giả định rằng việc bỏ phiếu VED có thể vượt qua các kỷ nguyên khi chức năng được kích hoạt Các trường hợp ranh giới được thiết kế để hoạt động ở thời điểm khác với các giao dịch khác trong UED có liên quan đến quy trình biểu quyết.
Phần thưởng
Chỉ những tài khoản biểu quyết ở trạng thái VED mới nhận được phần thưởng.
Hình phạt
Tất cả các tài khoản biểu quyết dù đang hoạt động hay VED đều có nguy cơ bị trừng phạt.
Cập nhật đồng hồ toàn cầu
Các biến hệ thống đồng hồ được cập nhật bằng cách bỏ phiếu. Nên sử dụng các phương pháp thay thế. Thay vào đó, mỗi người đứng đầu khối có thể di chuyển đồng hồ về phía trước tối đa 1 giây. Ít nhất 40% mạng lưới cần phải có độc hại để đồng hồ tích tắc nhanh hơn thời gian thực. Đồng hồ cũng có thể được di chuyển về phía trước 400 mili giây theo mặc định. Giả sử độ lệch 50 mili giây, chỉ 12,5% lãnh đạo cần điều chỉnh thời gian đồng hồ của mình để luôn đồng bộ.