# MPC 分布式签名系统 - API 参考文档

## 1. API 概览

系统提供两种 API 接口:
- **gRPC**: 服务间通信，高性能
- **HTTP/REST**: 客户端接入，易用性

### 1.1 服务端点

| 服务 | gRPC 端口 | HTTP 端口 | 说明 |
|------|----------|----------|------|
| Session Coordinator | 50051 | 8080 | 会话管理 |
| Message Router | 50052 | 8081 | 消息路由 |
| Server Party 1 | 50053 | 8082 | 计算节点 |
| Server Party 2 | 50055 | 8084 | 计算节点 |
| Server Party 3 | 50056 | 8085 | 计算节点 |
| Account Service | 50054 | 8083 | 账户管理 |

## 2. Session Coordinator API

### 2.1 创建会话 (Create Session)

创建一个新的 MPC 会话 (keygen 或 sign)。

**gRPC**
```protobuf
rpc CreateSession(CreateSessionRequest) returns (CreateSessionResponse);
```

**HTTP**
```
POST /api/v1/sessions
Content-Type: application/json
```

**请求体**
```json
{
  "session_type": "keygen",
  "threshold_n": 3,
  "threshold_t": 2,
  "participants": [
    {
      "party_id": "party_user_device",
      "device_type": "iOS",
      "device_id": "device_001"
    },
    {
      "party_id": "party_server",
      "device_type": "server",
      "device_id": "server_001"
    },
    {
      "party_id": "party_recovery",
      "device_type": "recovery",
      "device_id": "recovery_001"
    }
  ],
  "message_hash": "abc123...",  // 仅签名会话需要
  "expires_in_seconds": 300
}
```

**响应**
```json
{
  "session_id": "550e8400-e29b-41d4-a716-446655440000",
  "join_tokens": {
    "party_user_device": "token-uuid-1",
    "party_server": "token-uuid-2",
    "party_recovery": "token-uuid-3"
  },
  "expires_at": 1703145600
}
```

**状态码**
| 状态码 | 说明 |
|--------|------|
| 201 | 创建成功 |
| 400 | 请求参数错误 |
| 500 | 服务器内部错误 |

---

### 2.2 加入会话 (Join Session)

参与方使用 join token 加入会话。

**HTTP**
```
POST /api/v1/sessions/join
Content-Type: application/json
```

**请求体**
```json
{
  "join_token": "token-uuid-1",
  "party_id": "party_user_device",
  "device_type": "iOS",
  "device_id": "device_001"
}
```

**响应**
```json
{
  "session_id": "550e8400-e29b-41d4-a716-446655440000",
  "party_index": 0,
  "status": "joined",
  "participants": [
    {
      "party_id": "party_user_device",
      "status": "joined"
    },
    {
      "party_id": "party_server",
      "status": "waiting"
    }
  ]
}
```

**状态码**
| 状态码 | 说明 |
|--------|------|
| 200 | 加入成功 |
| 400 | 会话已满或参数错误 |
| 401 | Token 无效 |
| 404 | 会话不存在 |

---

### 2.3 标记就绪 (Mark Party Ready)

参与方表示已准备好开始协议。

**HTTP**
```
PUT /api/v1/sessions/{session_id}/parties/{party_id}/ready
Content-Type: application/json
```

**请求体**
```json
{
  "party_id": "party_user_device"
}
```

**响应**
```json
{
  "success": true,
  "all_ready": false,
  "ready_count": 2,
  "total_parties": 3
}
```

---

### 2.4 启动会话 (Start Session)

当所有参与方就绪后，启动 MPC 协议。

**HTTP**
```
POST /api/v1/sessions/{session_id}/start
```

**响应**
```json
{
  "success": true,
  "status": "in_progress"
}
```

---

### 2.5 获取会话状态 (Get Session Status)

查询会话当前状态。

**HTTP**
```
GET /api/v1/sessions/{session_id}
```

**响应**
```json
{
  "session_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "in_progress",
  "threshold_t": 2,
  "threshold_n": 3,
  "participants": [
    {
      "party_id": "party_user_device",
      "party_index": 0,
      "status": "computing"
    },
    {
      "party_id": "party_server",
      "party_index": 1,
      "status": "computing"
    },
    {
      "party_id": "party_recovery",
      "party_index": 2,
      "status": "computing"
    }
  ]
}
```

**会话状态**
| 状态 | 说明 |
|------|------|
| created | 会话已创建，等待参与方加入 |
| waiting | 参与方已加入，等待就绪 |
| in_progress | MPC 协议执行中 |
| completed | 协议完成 |
| failed | 协议失败 |
| expired | 会话超时 |

---

### 2.6 报告完成 (Report Completion)

参与方报告协议完成。

**HTTP**
```
POST /api/v1/sessions/{session_id}/complete
Content-Type: application/json
```

**请求体 (Keygen)**
```json
{
  "party_id": "party_user_device",
  "public_key": "04a1b2c3d4..."
}
```

**请求体 (Signing)**
```json
{
  "party_id": "party_user_device",
  "signature": "r_value||s_value",
  "recovery_id": 0
}
```

**响应**
```json
{
  "success": true,
  "all_completed": true
}
```

---

## 3. Message Router API

### 3.1 发送消息 (Route Message)

发送 TSS 协议消息给其他参与方。

**gRPC**
```protobuf
rpc RouteMessage(MPCMessage) returns (RouteMessageResponse);
```

**请求**
```json
{
  "session_id": "550e8400-...",
  "from_party": "party_0",
  "to_parties": ["party_1"],  // 空表示广播
  "round": 1,
  "payload": "base64_encoded_tss_message",
  "is_broadcast": false
}
```

### 3.2 订阅消息 (Subscribe Messages)

实时接收发给自己的 TSS 消息。

**gRPC (Stream)**
```protobuf
rpc SubscribeMessages(SubscribeRequest) returns (stream MPCMessage);
```

**WebSocket**
```
WS /api/v1/messages/subscribe?session_id=xxx&party_id=yyy
```

### 3.3 获取待处理消息 (Get Pending Messages)

获取缓存的待处理消息。

**HTTP**
```
GET /api/v1/sessions/{session_id}/messages?party_id=xxx
```

**响应**
```json
{
  "messages": [
    {
      "from_party": "party_0",
      "round": 1,
      "payload": "base64...",
      "timestamp": 1703145600
    }
  ]
}
```

---

## 4. Account Service API

### 4.1 创建账户 (Create Account)

**HTTP**
```
POST /api/v1/accounts
Content-Type: application/json
```

**请求体**
```json
{
  "username": "alice",
  "email": "alice@example.com",
  "phone": "+1234567890",
  "publicKey": "04a1b2c3..."
}
```

**响应**
```json
{
  "id": "acc-uuid-123",
  "username": "alice",
  "email": "alice@example.com",
  "status": "active",
  "createdAt": "2024-01-15T10:30:00Z"
}
```

---

### 4.2 创建 Keygen 会话 (Create Keygen Session)

通过账户服务创建密钥生成会话。

**HTTP**
```
POST /api/v1/mpc/keygen
Content-Type: application/json
```

**请求体**
```json
{
  "threshold_n": 3,
  "threshold_t": 2,
  "participants": [
    {
      "party_id": "user_device",
      "device_type": "iOS",
      "device_id": "iphone_001"
    },
    {
      "party_id": "server_party",
      "device_type": "server",
      "device_id": "server_001"
    },
    {
      "party_id": "recovery_party",
      "device_type": "recovery",
      "device_id": "recovery_001"
    }
  ]
}
```

**响应**
```json
{
  "session_id": "550e8400-e29b-41d4-a716-446655440000",
  "session_type": "keygen",
  "threshold_n": 3,
  "threshold_t": 2,
  "join_tokens": {
    "user_device": "token-1",
    "server_party": "token-2",
    "recovery_party": "token-3"
  },
  "status": "waiting"
}
```

---

### 4.3 创建签名会话 (Create Signing Session)

**HTTP**
```
POST /api/v1/mpc/sign
Content-Type: application/json
```

**请求体**
```json
{
  "account_id": "acc-uuid-123",
  "message_hash": "8dcd9f3511659638d5c33938ddb7fee9bb63533b94a97c7467d3fd36abbdca81",
  "participants": [
    {
      "party_id": "user_device",
      "device_type": "iOS",
      "device_id": "iphone_001"
    },
    {
      "party_id": "server_party",
      "device_type": "server",
      "device_id": "server_001"
    }
  ]
}
```

**响应**
```json
{
  "session_id": "660e8400-e29b-41d4-a716-446655440001",
  "session_type": "sign",
  "account_id": "acc-uuid-123",
  "message_hash": "8dcd9f35...",
  "threshold_t": 2,
  "join_tokens": {
    "user_device": "token-a",
    "server_party": "token-b"
  },
  "status": "waiting"
}
```

---

### 4.4 获取 MPC 会话状态

**HTTP**
```
GET /api/v1/mpc/sessions/{session_id}
```

**响应**
```json
{
  "session_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "completed",
  "completed_parties": 3,
  "total_parties": 3,
  "public_key": "04a1b2c3d4...",  // keygen 完成后
  "signature": "r||s"              // signing 完成后
}
```

---

## 5. 健康检查 API

所有服务都提供健康检查端点。

**HTTP**
```
GET /health
```

**响应**
```json
{
  "status": "healthy",
  "service": "session-coordinator",
  "version": "1.0.0",
  "uptime": "24h30m15s"
}
```

---

## 6. 错误响应格式

所有 API 错误遵循统一格式:

```json
{
  "error": "error_code",
  "message": "Human readable error message",
  "details": {
    "field": "specific field error"
  }
}
```

**常见错误码**
| 错误码 | HTTP 状态 | 说明 |
|--------|----------|------|
| invalid_request | 400 | 请求参数无效 |
| unauthorized | 401 | 未授权 |
| not_found | 404 | 资源不存在 |
| session_expired | 410 | 会话已过期 |
| session_full | 409 | 会话参与方已满 |
| threshold_not_met | 400 | 未达到阈值要求 |
| internal_error | 500 | 服务器内部错误 |

---

## 7. gRPC Proto 定义

完整的 Proto 定义位于 `api/proto/session_coordinator.proto`:

```protobuf
syntax = "proto3";
package mpc.coordinator.v1;

service SessionCoordinator {
  rpc CreateSession(CreateSessionRequest) returns (CreateSessionResponse);
  rpc JoinSession(JoinSessionRequest) returns (JoinSessionResponse);
  rpc GetSessionStatus(GetSessionStatusRequest) returns (GetSessionStatusResponse);
  rpc MarkPartyReady(MarkPartyReadyRequest) returns (MarkPartyReadyResponse);
  rpc StartSession(StartSessionRequest) returns (StartSessionResponse);
  rpc ReportCompletion(ReportCompletionRequest) returns (ReportCompletionResponse);
  rpc CloseSession(CloseSessionRequest) returns (CloseSessionResponse);
}
```

---

## 8. SDK 使用示例

### 8.1 Go 客户端

```go
import (
    "context"
    coordinator "github.com/rwadurian/mpc-system/api/grpc/coordinator/v1"
    "google.golang.org/grpc"
)

func main() {
    conn, _ := grpc.Dial("localhost:50051", grpc.WithInsecure())
    client := coordinator.NewSessionCoordinatorClient(conn)

    // 创建 keygen 会话
    resp, _ := client.CreateSession(context.Background(), &coordinator.CreateSessionRequest{
        SessionType: "keygen",
        ThresholdN:  3,
        ThresholdT:  2,
        Participants: []*coordinator.ParticipantInfo{
            {PartyId: "party_0"},
            {PartyId: "party_1"},
            {PartyId: "party_2"},
        },
    })

    fmt.Println("Session ID:", resp.SessionId)
}
```

### 8.2 cURL 示例

```bash
# 创建 keygen 会话
curl -X POST http://localhost:8080/api/v1/sessions \
  -H "Content-Type: application/json" \
  -d '{
    "session_type": "keygen",
    "threshold_n": 3,
    "threshold_t": 2,
    "participants": [
      {"party_id": "party_0"},
      {"party_id": "party_1"},
      {"party_id": "party_2"}
    ]
  }'

# 加入会话
curl -X POST http://localhost:8080/api/v1/sessions/join \
  -H "Content-Type: application/json" \
  -d '{
    "join_token": "token-uuid-1",
    "party_id": "party_0",
    "device_type": "iOS",
    "device_id": "device_001"
  }'

# 查询会话状态
curl http://localhost:8080/api/v1/sessions/550e8400-e29b-41d4-a716-446655440000
```
