---
title: "Vòng đời khóa và luồng ký"
description: "Cách cosigner thực hiện tạo khóa, ký theo ngưỡng và chia sẻ lại khóa, cùng mọi bước kiểm tra được áp dụng trước khi ký."
url: https://docs.fystack.io/vi/cosigner/signing-flow
last_updated: 2026-11-13
---

> ## Documentation index
> Fetch the complete documentation index at: https://docs.fystack.io/llms.txt
> Use it to discover all available pages before exploring further.

# 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.

> **Note:** ECDSA cần các tham số chuẩn bị trước Paillier. Cosigner tạo chúng ở lần khởi động đầu tiên (tối đa 5 phút) và báo chưa sẵn sàng cho đến khi hoàn tất.

## Ký

_Diagram: 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ý_

### 1. Tiếp nhận

Một yêu cầu vượt qua các [chính sách](https://docs.fystack.io/product/policies.md) 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.

> **Note:** Chia sẻ lại khóa được bật theo từng bản triển khai. Hãy liên hệ Fystack trước khi thay đổi ủy ban.

## 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. |
