> ## Documentation Index
> Fetch the complete documentation index at: https://docs.seminode.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 会话

> 会话是通过计算得到的 "h" 标签绑定到底层挂单的一连串报价和响应事件。

会话是围绕单个挂单形成的报价与响应事件链。会话中的每个事件都共享相同的 `"h"` 标签——这是一个确定性的会话 ID，用于将对话与其根挂单及涉及的双方绑定起来。

## 为什么需要会话 ID？

挂单是**可替换事件**（kind `31001`），这意味着底层挂单事件的 ID 在挂单更新时可能会发生变化。需要一个稳定的会话 ID，以便即使根挂单已被重新发布，完整的报价历史仍然可以被可靠地查询。

会话 ID 还是**与参与方相关的**：两个不同的贸易伙伴就同一挂单进行报价时，各自将拥有不同的会话 ID。这样可以确保对话在各参与者组合之间保持私密和隔离。

## 会话 ID 计算

给定 `event_id`、`pubkey1`、`pubkey2`（均为 64 位十六进制小写），其中 `event_id` 是根挂单事件 ID，`pubkey1`/`pubkey2` 是对话的两名参与者：

1. **验证** `event_id` 非空（如需强制格式，则为 64 位十六进制）。
2. **规范化顺序：** `pk_lo = min(pubkey1, pubkey2)`；`pk_hi = max(pubkey1, pubkey2)`（按字典序）。
3. **拼接（不使用分隔符）：** `raw = event_id + pk_lo + pk_hi`。
4. **哈希：** `sha256(raw)`；**编码为小写十六进制** → `thread_id`。

在哈希之前，公钥按字典序排序，因此无论哪一方进行计算，结果都是一致的。挂单作者和报价方对于他们的会话总会得到相同的会话 ID。
