rwadurian/backend/mpc-system/docs/02-api-reference.md

12 KiB

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

rpc CreateSession(CreateSessionRequest) returns (CreateSessionResponse);

HTTP

POST /api/v1/sessions
Content-Type: application/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
}

响应

{
  "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

请求体

{
  "join_token": "token-uuid-1",
  "party_id": "party_user_device",
  "device_type": "iOS",
  "device_id": "device_001"
}

响应

{
  "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

请求体

{
  "party_id": "party_user_device"
}

响应

{
  "success": true,
  "all_ready": false,
  "ready_count": 2,
  "total_parties": 3
}

2.4 启动会话 (Start Session)

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

HTTP

POST /api/v1/sessions/{session_id}/start

响应

{
  "success": true,
  "status": "in_progress"
}

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

查询会话当前状态。

HTTP

GET /api/v1/sessions/{session_id}

响应

{
  "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)

{
  "party_id": "party_user_device",
  "public_key": "04a1b2c3d4..."
}

请求体 (Signing)

{
  "party_id": "party_user_device",
  "signature": "r_value||s_value",
  "recovery_id": 0
}

响应

{
  "success": true,
  "all_completed": true
}

3. Message Router API

3.1 发送消息 (Route Message)

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

gRPC

rpc RouteMessage(MPCMessage) returns (RouteMessageResponse);

请求

{
  "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)

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

响应

{
  "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

请求体

{
  "username": "alice",
  "email": "alice@example.com",
  "phone": "+1234567890",
  "publicKey": "04a1b2c3..."
}

响应

{
  "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

请求体

{
  "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"
    }
  ]
}

响应

{
  "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

请求体

{
  "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"
    }
  ]
}

响应

{
  "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}

响应

{
  "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

响应

{
  "status": "healthy",
  "service": "session-coordinator",
  "version": "1.0.0",
  "uptime": "24h30m15s"
}

6. 错误响应格式

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

{
  "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:

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 客户端

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 示例

# 创建 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