Khi một hoạt động nghiệp vụ cần diễn ra đồng thời có tính nguyên tử trên cả hai Chuỗi con (ví dụ: chuyển một tài sản từ chuỗi logistics sang chuỗi finance), HieraChain sử dụng giao thức Cam kết Hai pha (2PC - Two-Phase Commit) để đảm bảo tính toàn vẹn và nguyên tử. Hoặc cả hai chuỗi cùng lưu khối xác nhận sự thay đổi, hoặc cả hai cùng khôi phục lại trạng thái cũ (roll back) — tuyệt đối không có trạng thái lấp lửng hay bất đối xứng.
Ví dụ thực tế: Chuyển một mặt hàng trong kho giữa hai phòng ban khác nhau. Chuỗi nguồn ghi nhận sự kiện deduct (trừ hàng); chuỗi đích ghi nhận sự kiện receive (nhận hàng). Cả hai hoạt động đều phải thành công hoặc không hoạt động nào được áp dụng.
Biểu đồ luồng — Trường hợp Thuận lợi (Happy Path)
sequenceDiagram
autonumber
participant HM as 🏛️ HierarchyManager
participant TM as 🔄 CrossChainTransactionManager
participant SRC as 📦 Chuỗi con Nguồn (Source SubChain)
participant DST as 📦 Chuỗi con Đích (Destination SubChain)
HM->>TM: initiate_cross_chain_transaction(src, dst, payload)
TM->>TM: Khởi tạo CrossChainTransaction (UUID, state=PENDING)
rect rgb(0, 0, 0, 0)
Note over TM,DST: PHA 1 — CHUẨN BỊ (PREPARE)
TM->>SRC: prepare_transaction(tx_id, payload, is_source=True)
SRC->>SRC: Khóa tài nguyên, xác thực dữ liệu payload
SRC-->>TM: True ✅
TM->>DST: prepare_transaction(tx_id, payload, is_source=False)
DST->>DST: Kiểm tra khả năng tiếp nhận
DST-->>TM: True ✅
TM->>TM: state = PREPARED
end
rect rgb(0, 0, 0, 0)
Note over TM,DST: PHA 2 — CAM KẾT (COMMIT)
TM->>SRC: commit_transaction(tx_id)
SRC-->>TM: True ✅
TM->>DST: commit_transaction(tx_id)
DST-->>TM: True ✅
TM->>TM: state = COMMITTED
end
TM-->>HM: tx_id (COMMITTED)
Biểu đồ luồng — Các Trường hợp Thất bại (Failure Paths)
sequenceDiagram
autonumber
participant TM as 🔄 CrossChainTransactionManager
participant SRC as 📦 Chuỗi con Nguồn
participant DST as 📦 Chuỗi con Đích
rect rgb(0, 0, 0, 0)
Note over TM,DST: KỊCH BẢN A — Pha 1 Chuẩn bị Thất bại
TM->>SRC: prepare_transaction(tx_id, payload)
SRC-->>TM: True ✅
TM->>DST: prepare_transaction(tx_id, payload)
DST-->>TM: False ❌ (Quá tải / Xác thực lỗi)
TM->>TM: state = PENDING → Bắt đầu khôi phục (rollback)
TM->>SRC: rollback_transaction(tx_id)
TM->>DST: rollback_transaction(tx_id)
TM->>TM: state = ROLLED_BACK ⚠️
end
rect rgb(0, 0, 0, 0)
Note over TM,DST: KỊCH BẢN B — Pha 2 Cam kết Một phần Thất bại
TM->>SRC: commit_transaction(tx_id)
SRC-->>TM: True ✅
TM->>DST: commit_transaction(tx_id)
DST-->>TM: Gặp Ngoại lệ (Exception) ❌
TM->>TM: state = FAILED ❌
Note over TM: Cần đối soát thủ công<br/>Kiểm tra log để xác định trạng thái một phần
end
Máy trạng thái Giao dịch (Transaction State Machine)
flowchart LR
P["PENDING"] --> PR["PREPARED"]
PR --> C["COMMITTED ✅"]
PR --> RB["ROLLED_BACK ⚠️"]
P --> F["FAILED ❌"]
PR --> F
Các bước thực hiện chi tiết
Bước
Mô tả
1. Khởi tạo
HierarchyManager tạo một thực thể CrossChainTransaction với UUID duy nhất và trạng thái state=PENDING.
2. Pha 1 — Chuẩn bị nguồn
Chuỗi nguồn khóa tài nguyên liên quan, xác thực lược đồ (schema) của payload.
3. Pha 1 — Chuẩn bị đích
Chuỗi đích kiểm tra dung lượng lưu trữ khả dụng và các ràng buộc nghiệp vụ.
4. Kết quả Pha 1
Nếu cả hai chuỗi trả về True: trạng thái chuyển thành PREPARED. Nếu một trong hai lỗi: khôi phục trạng thái cũ (rollback) ngay lập tức trên cả hai chuỗi.
5. Pha 2 — Cam kết nguồn
Chuỗi nguồn hoàn tất hoạt động (phát ra sự kiện thông qua Gửi Sự kiện).
6. Pha 2 — Cam kết đích
Chuỗi đích hoàn tất hoạt động (phát ra sự kiện thông qua Gửi Sự kiện).
7. Kết quả
Trạng thái chuyển thành COMMITTED. Mã tx_id được trả về cho bên gọi.
Xử lý lỗi
Tình huống
Trạng thái chuyển dịch
Cách thức phục hồi
Lỗi Pha 1 trên Chuỗi Nguồn
ROLLED_BACK
Tự động hoàn trả trạng thái (rollback) trên Chuỗi Đích
Lỗi Pha 1 trên Chuỗi Đích
ROLLED_BACK
Tự động hoàn trả trạng thái (rollback) trên Chuỗi Nguồn
Lỗi Pha 2 khi cam kết trên một trong hai chuỗi
FAILED
Phải đối soát thủ công thông qua nhật ký kiểm toán (audit log)
Hết hạn kết nối mạng (Timeout) trong Pha 2
FAILED
Người vận hành hệ thống phải kiểm tra trạng thái cam kết cuối cùng