01 · 安全中心
先验证,再信任:OpenVPT 安全中心
02 · 资金
我们能与不能对你的资金做什么
付款进入 VPTEscrow 合约。只有当三方(买家、卖家、平台)中的两个不同方签署同一个分配方案,合约才会放款。OpenVPT 只持有三把密钥中的一把。
合约所有者可以
四个管理开关,没有一个能动用资金。
暂停新的付款
停止新的 fund() 调用。合约暂停期间,已付款的订单仍可正常结算。更换平台签名密钥
替换平台的密钥。它仍然只是三把中的一把:每笔结算都还需要买家或卖家签名。调整代币白名单
决定新订单可以使用哪些代币(MVP 为 USDC)。已付款的订单不受影响。设置手续费收款地址
决定之后的结算中,平台所得部分付到哪个地址。
任何人都不能,包括我们
由合约代码强制执行,而不是靠政策。
提取托管中的资金
合约没有任何提取或清空函数,资金只能通过 settle() 离开合约。只用一把密钥放款
settle() 需要两个不同方的有效签名。同一把密钥签两次会被拒绝。付出超过付款金额的钱
卖家、买家与平台的金额相加必须正好等于付款金额,而且每笔订单只能结算一次。弃置合约
合约所有权无法放弃,只能通过两步转移,并且必须由新所有者确认接受。
- 签名
- {buyer, seller, platform} 中两个不同方
- 分配
- toSeller + toBuyer + toPlatform == amount
- 平台所得
- toPlatform >= fee * toSeller / amount
- 重放
- 只结算一次,之后即关闭
- 提交者
- 任何人都可以;权限来自签名
坦白说的限制
- 结算签名没有有效期,也无法撤回。因此平台对每笔订单最多只签一次结算。
- 如果 OpenVPT 停止运营,合约仍会接受由买家与卖家共同签署的结算。没有任何一方能单独放款。
- 合约规定的是平台所得的下限,而不是上限。在请你的钱包签名之前,网站会先检查分配方案是否与页面上的订单一致。
03 · 密钥
三把密钥,一把在我们手上:密钥管理
谁持有哪把密钥、能签什么,以及每个部分目前是已写入代码,还是仍属于设计。
- 已实现
买家密钥
用 fund() 付款,并签署你对结算的同意。OpenVPT 从不会看到或存储你的私钥或助记词。- 持有方
- 你的钱包
- 已实现
卖家密钥
接收货款,也可以共同签署结算。货款会付到订单上记录的钱包地址。- 持有方
- 你的钱包
- 已实现
平台签名密钥
共同签署每笔 CreateOrder,使金额、手续费与卖家无法被篡改,也共同签署结算提案。在本地开发环境中,这把密钥从环境变量读取。- 持有方
- OpenVPT API
- 设计
放在 KMS / HSM 的平台密钥
在生产环境中,平台密钥预定保存在云端 KMS / HSM 内部并在其中签署摘要,私钥不会被导出。API 已实现 KMS 签名器(AWS KMS、secp256k1),并用模拟的 KMS 测试过;正式上线要等主网部署。- 持有方
- 生产环境设计
- 已实现
中继密钥
在已有两个签名后支付 gas 提交 settle()。它无法修改分配,也无法代任何人签名:合约检查的是签名,而不是提交者。- 持有方
- OpenVPT API
- 规划中
合约所有者
只持有上面四个管理开关。部署脚本可以把所有权交给另一个地址,例如多签钱包;主网上改用多签所有者仍在规划中。- 持有方
- OpenVPT 管理员
04 · 合约
可以自行核对的合约信息
签名前,请把这些数值和钱包显示的内容对照。如果付款或结算消息的链、合约、订单或金额与页面上的订单不一致,网站会拒绝把它交给你的钱包。
- name
- "VPTEscrow"
- version
- "1"
- chainId
- 84532
- 网络
- Base Sepolia 测试网
- verifyingContract
0x0000000000000000000000000000000000000000
主网部署尚未完成。此地址属于Base Sepolia 测试网上的部署,并不是生产环境的合约。
你可能会被要求签署的结构化数据
CreateOrder(bytes32 orderId,address buyer,address seller,address token,uint256 amount,uint256 fee,uint64 expiresAt)- 由平台签署;由 fund() 检查,最长 15 分钟后失效。
Settle(bytes32 orderId,uint256 toSeller,uint256 toBuyer,uint256 toPlatform)- 由买家、卖家与平台其中两方签署;由 settle() 检查。
orderId = 订单 UUID 的 keccak256
技术栈
Solidity 0.8.24 与 OpenZeppelin v5:EIP712、ECDSA、SafeERC20、ReentrancyGuard、Ownable2Step、Pausable。
05 · 账号
账号安全
账号层面的保护,以及账号被封禁时会发生什么。
两步验证登录(TOTP)
在账号设置中为登录加上身份验证器 App 的动态码。密钥加密存储,多次输错验证码会被限制尝试。密码
至少 12 个字符,只以 Argon2 哈希存储。多次登录失败后会暂时锁定登录。钱包验证(SIWE)
钱包通过 Sign-In with Ethereum(EIP-4361)绑定。每个 nonce 只能用一次,10 分钟后失效,签名无法被重放。登录会话
每次使用 refresh token 都会换发新的。实时连接会在 token 过期时断开。被封禁的账号
封禁会立即撤销所有登录会话、拦截所有需要登录的请求和实时连接,并暂停该用户的商品。进行中的订单不会被冻结:会通过另一方、自动期限与仲裁继续推进。
06 · 数据
我们存储什么、如何存储
我们只存储服务运行所需的数据,并保护其中敏感的部分。
| 数据 | 存储方式 |
|---|---|
| 联系表单的 IP 地址 | 只存储加盐的 SHA-256 哈希,从不存储原始 IP。 |
| 交付给买家的授权密钥 | 用 AES-256-GCM 加密,并绑定该笔订单。 |
| 交付的文件 | 上传时记录 SHA-256 哈希,下载使用短时有效的签名链接。 |
| 两步验证密钥 | 用 AES-256-GCM 加密,并绑定该账号。 |
| 密码 | 只存储 Argon2 哈希。 |
| 钱包地址 | 你验证过的公开地址,从不存储私钥或助记词。 |
| 订单聊天 | 随订单存储。包含联系方式或站外付款链接的消息会带有警示标记。 |
我们从不收集银行卡号:付款是从你自己的钱包以 USDC 支付。
07 · 防骗指南
防骗指南:留在平台上交易
数字商品交易的损失,大多发生在托管之外。五个习惯让你留在托管的保护之内。
只通过托管付款
不要把 USDC 直接转到卖家的钱包,也不要理会 OpenVPT 以外的“托管”链接。只有 OpenVPT 合约上的 fund() 受到保护。
认真对待联系方式警示
订单聊天会标记邮箱、手机号、Telegram、WhatsApp、微信和站外付款链接。被标记的消息不会被拦截,但把交易转到站外是常见的诈骗第一步。
核对地址
签名前,把钱包显示的合约地址和链与本页的合约信息对照。只要不一致,就停下来。
绝不透露机密
OpenVPT 绝不会向你索要助记词、私钥、密码或两步验证码,无论在聊天、邮件还是其他任何地方。
验收后再确认
在验收期内检查交付内容。确认收货就会放款,已结算的订单无法重新打开;如果有问题,请改为发起争议。
08 · 负责任披露
发现漏洞?负责任披露
如果你认为在 OpenVPT 的合约、API 或应用中发现了漏洞,请先私下告诉我们。
- 使用联系表单并选择“安全”主题。安全报告会被专门标记给团队。
- 请附上受影响的组件、复现步骤和你预期的影响。
- 只用你自己的账号,在本地或测试网络上测试。不要访问他人的数据或资金,也不要进行拒绝服务测试。
- 在公开任何内容之前,请给我们合理的时间修复问题。
目前尚未提供
- 规划中
漏洞赏金计划
规划中。目前没有提供赏金。 - 规划中
第三方审计
规划中。托管合约尚未经过外部机构审计;目前由项目自身的自动化测试覆盖。
本页说明系统是如何构建的,不构成法律、财务或投资建议。
09 · 延伸阅读