Vòng đời khóa và luồng ký

Tạo khóa, ký và chia sẻ lại khóa từ góc nhìn của cosigner.

Tạo khóa

Việc tạo ví trong một workspace có cosigner sẽ chạy quá trình tạo khóa phân tán trên các node MPCium và cosigner của bạn.

  1. Orchestrator gửi một session_start có chữ ký với KEYGEN, key_id, giao thức và ngưỡng.
  2. Cosigner xác minh chữ ký và hỏi callback của bạn.
  3. Các thành viên chạy keygen của tss-lib. Mỗi thành viên kết thúc với phần khóa riêng và khóa công khai chung.
  4. Cosigner mã hóa phần khóa của mình, lưu dưới dạng shares:<protocol>:<key_id> và ghi lại ủy ban.
  5. Chỉ khóa công khai và một mã băm kết quả được gửi ra khỏi cosigner.
  6. Orchestrator kiểm tra tất cả khóa công khai khớp nhau và trả chúng về Apex.

Các ví cần cả ECDSA và EdDSA sẽ chạy hai phiên liên kết. Nếu một phiên thất bại, cả hai sẽ bị hủy.

Ký

Trình tự ký: Apex gửi yêu cầu, orchestrator bắt đầu phiên, cosigner hỏi callback, các thành viên ký, orchestrator trả về chữ ký
Click to open the full-size diagram

1. Tiếp nhận

Một yêu cầu vượt qua các chính sách của workspace sẽ được chuyển từ Apex đến orchestrator, được ký bằng khóa initiator của Apex. Orchestrator đối chiếu ủy ban với bản ghi keygen, xác nhận tất cả đều trực tuyến và gửi một session_start có chữ ký.

session_start chứa key_id, signing_input thô, signing_context tùy chọn (chi tiết giao dịch, tối đa 64 KiB), derivation HD, ngưỡng và các thành viên.

2. Kiểm tra cục bộ

Cosigner từ chối phiên trừ khi tất cả các điều kiện sau đều thỏa mãn, theo thứ tự:

  1. Thông điệp dưới 128 KiB.
  2. Chữ ký orchestrator hợp lệ (khóa được ghim khi ghép nối).
  3. Dưới 20 lần bắt đầu và 10 lần hủy mỗi phút.
  4. Dưới 5 phiên đồng thời.
  5. session_start được ghi vào nhật ký kiểm toán.
  6. Callback của bạn trả về approve. Nếu không, phiên sẽ thất bại với CALLBACK_REJECTED.

Nếu orchestrator hủy phiên trong khi callback đang chờ, cosigner sẽ ngừng chờ.

3. Trao đổi khóa

  • Phiên phải khớp với ủy ban đã ghim: ngưỡng, khóa của các bên, khóa định danh, cờ approver.
  • Cosigner gửi peer_joined, peer_ready và một khóa X25519 có chữ ký đến từng peer.
  • Mỗi cặp peer nhận một khóa ChaCha20-Poly1305 riêng cho từng chiều (HKDF trên X25519, gắn với phiên).

4. Ký theo ngưỡng

Orchestrator gửi mpc_begin. Nếu ví có approver (ví dụ approver trên ứng dụng di động Fystack), mpc_begin phải kèm phê duyệt có chữ ký của approver cho chính xác signing input này. Nếu thiếu, cosigner sẽ đánh dấu phiên thất bại với APPROVAL_REQUIRED.

Sau đó các thành viên chạy các vòng của tss-lib. Mọi thông điệp đều được ký và đánh số thứ tự, nên các thông điệp phát lại sẽ bị loại bỏ.

5. Kết quả

Mỗi thành viên báo cáo một mã băm của chữ ký. Orchestrator yêu cầu tất cả mã băm phải khớp, sau đó trả kết quả đã ký (signature, r, s, recovery id) về Apex. Cosigner ghi session_end vào nhật ký và xóa checkpoint của mình.

Chia sẻ lại khóa

Thay thế các phần khóa, có thể kèm ủy ban hoặc ngưỡng mới. Khóa công khai và địa chỉ không thay đổi.

  1. Ủy ban và ngưỡng cũ được lấy từ bản ghi keygen, không phải từ bên gọi.
  2. Ít nhất threshold + 1 thành viên cũ phải trực tuyến.
  3. Thành viên cũ và mới chạy quá trình resharing của tss-lib. Các phần khóa mới được đưa vào trạng thái chờ; phần khóa cũ vẫn hoạt động.
  4. Tất cả thành viên báo cáo cùng một kết quả và khóa công khai không đổi.
  5. Orchestrator lưu quyết định, sau đó gửi một reshare_commit có chữ ký. Mỗi thành viên chuyển sang phần khóa mới.

Nếu hủy trước khi commit, các phần khóa cũ được giữ nguyên. Sau khi commit, quá trình chỉ có thể tiến tới: commit sẽ được thử lại cho đến khi mọi thành viên xác nhận, kể cả sau khi gặp sự cố sập.

Mã lỗi

Mã Ý nghĩa
CALLBACK_REJECTED Callback từ chối, hết thời gian chờ hoặc trả về phản hồi không hợp lệ.
APPROVAL_REQUIRED Thiếu phê duyệt có chữ ký của approver của ví.
UNAVAILABLE Một thành viên ngoại tuyến tại thời điểm gửi yêu cầu.
PARTICIPANT_FAILED Một thành viên báo cáo lỗi. Xem failure_reason.
PARTICIPANT_DISCONNECTED Luồng kết nối của một thành viên bị ngắt giữa phiên.
SESSION_TIMEOUT Không hoàn tất trong vòng 120 giây.
RESULT_HASH_MISMATCH Các thành viên không thống nhất về kết quả.
CONFLICT Đang có một phiên khác chạy cho ví và giao thức này.