信誉驱动的Nostr中继服务

wotrlay是一个基于Web-of-Trust(WoT)的Nostr中继服务,通过信誉评分系统实现动态速率限制,适用于去中心化社交网络中的内容管理和垃圾信息防护。

  • by ContextVM
  • Go
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 ContextVM/wotrlay

使用说明

wotrlay

基于信任网络(WoT)的Nostr中继,具有声誉驱动的速率限制。

概述

wotrlay使用外部信任评分来加强社区垃圾邮件保护(r ∈ [0,1]).速率限制由发布密钥的声誉决定,更高的信任分数授予更多的发布能力和额外的特权。

主要特点

  • 信任分层利率限制:出版能力与声誉成正比
  • 种类门控:只允许低于信任阈值的1类事件
  • 真正的代币桶:平稳、连续的补充(不是每天重置)
  • 回填支撑:高信任度的pubkeys可以在不限制的情况下迁移旧历史记录
  • 无需NIP-42:速率限制基于 event.PubKey
  • 全球利率限制:使用中继范围限制器保护排名提供者免受滥用

费率限制级别

当 HIGH_THRESHOLD 设置为(例如0.9):

级别 信任评分 允许的种类 日费率
A r=0 仅限类型1 1
B 0<r<0.5 仅第1类 1-100
C 0.5≤r<0.9 各种 100-5000
D r≥0.9 各种 10000

当 HIGH_THRESHOLD 未设置(默认):

级别 信任评分 允许的种类 日费率
A r=0 仅限类型1 1
B 0<r<0.5 仅第1类 1-100
C r≥0.5 各种 10000

在这种模式下,没有明显的高层——所有公钥都有 r ≥ midThreshold 获得最高速率,无回填权限。

配置

配置是从中的环境变量加载的 main.go:

  • MID_THRESHOLD (默认值:0.5)-信任度得分,超过该得分则允许使用所有类型的信任度
  • HIGH_THRESHOLD (可选)-信任分数,高于该分数则可免费回填;如果未设置,则没有明确的高层,所有公钥都具有 r ≥ midThreshold 获得最大速率
  • URL_POLICY_ENABLED (可选)-为以下用户启用URL限制 MID_THRESHOLD
  • GLOBAL_RANK_REFRESH_LIMIT (默认值:500)-每秒最大列刷新请求数,中继范围
  • RELATR_RELAY (默认值:wss://relay.contextvm.org)-用于排名查找的ContextVM中继URL
  • RELATR_PUBKEY (默认值:750682303c9f0dadd 75941b49edc9d46e3 306b9ee3335338a2a3e404c5fa3)-中继服务公钥
  • RELATR_SECRET_KEY (可选)-用于签署排名请求的密钥;如果未提供,则自动生成
  • DEBUG (可选)-启用详细调试日志记录和定期可观察性度量

用法

环境设置

创建一个 .env 文件或设置环境变量:

# Optional (defaults shown)
export MID_THRESHOLD=0.5
# HIGH_THRESHOLD is optional - omit to use 3-tier system (no high tier)
# export HIGH_THRESHOLD=0.9  # uncomment to enable 4-tier system with backfill
# URL_POLICY_ENABLED is optional - enable to restrict URLs below MID_THRESHOLD
# export URL_POLICY_ENABLED="true"  # truthy: true/1/yes/on (case-insensitive)
export GLOBAL_RANK_REFRESH_LIMIT=500
export RELATR_RELAY="wss://relay.contextvm.org"
export RELATR_PUBKEY="750682303c9f0ddad75941b49edc9d46e3ed306b9ee3335338a21a3e404c5fa3"
export RELATR_SECRET_KEY="your-secret-key-here"  # auto-generated if not set
export DEBUG="1"  # optional: enable verbose logging and metrics

建筑

go build

跑步

./wotrlay

接力赛继续进行 localhost:3334 默认情况下。

运作原理

  1. 已收到事件:提取 event.PubKey
  2. 排名查询:查询缓存以获取信任分数(缓存未命中→ r=0)
  3. 种类检查:如果出现以下情况,则拒绝非Kind-1 r < MID_THRESHOLD
  4. 时间戳检查:拒绝未来24小时以上的事件
  5. 回填检查:如果出现以下情况,则跳过速率限制 HIGH_THRESHOLD 设置和 r ≥ HIGH_THRESHOLD 事件已经过时
  6. 速率限制:应用基于信任的充值率的令牌桶
  7. 保存:如果所有检查都通过,则存储事件

建筑

操作说明

错误处理

中继返回可用于客户端处理的事件拒绝的键入错误:

  • ErrKindNotAllowed -来自以下pubkeys的非Kind-1事件 MID_THRESHOLD
  • ErrInvalidTimestamp -未来时间戳>24小时的事件
  • ErrRateLimited -Pubkey已超出其速率限制
  • ErrURLNotAllowed -第1类事件,URL来自以下pubkeys MID_THRESHOLD (仅当 URL_POLICY_ENABLED=true)

排名缓存行为

  • 缓存命中:非阻塞查找立即返回
  • 缓存未命中:尽力异步刷新;事件以秩=0继续进行
  • 陈旧数据:早于的条目 StaleThreshold (24小时)触发异步刷新
  • 去重:并发 GetRank 对同一公钥的调用进行重复数据消除,以避免重复的网络请求
  • 定期冲洗:每次刷新都会刷新排队的请求 StaleThreshold (24小时)或批次满时(1000个公钥)

速率限制

  • 令牌桶:基于信任评分的持续补充(不是每日重置)
  • 容量:至少1个令牌,以确保pubkeys最终始终可以发布
  • 生存时间:1小时后清理不活动的桶
  • 监控: Limiter.GetTokens() 可用于调试,但不应用于生产代码
  • 可观测性:内置原子计数器跟踪错误类型和缓存行为;启用DEBUG时定期记录

安全

  • 密钥: RELATR_SECRET_KEY 从未被记录。如果没有提供,则会自动生成一个临时密钥(记录为“生成的临时密钥”,不带值)
  • 配置:所有敏感值都应通过环境变量提供

可观测性

当 DEBUG 启用后,中继器每30秒记录一次操作指标:

observability: rate_limited=5 kind_not_allowed=2 invalid_timestamp=1 cache_hits=150 cache_misses=25

跟踪的指标:

  • rate_limited -因速率限制而被拒绝的事件数
  • kind_not_allowed -因类型门控而被拒绝的事件数
  • invalid_timestamp -由于未来时间戳而被拒绝的事件数
  • url_not_allowed -由于URL策略而被拒绝的事件数
  • cache_hits -排名缓存命中次数
  • cache_misses -列组缓存未命中次数

用途:

  1. 启用调试模式: export DEBUG=1
  2. 运行继电器: ./wotrlay
  3. 观察日志以获取周期性指标输出

这些指标可用于:

  • 监控继电器的健康状况和性能
  • 检测滥用模式
  • 调整速率限制阈值
  • 了解缓存命中率

许可证

麻省理工学院