Diem 支付网络(DPN)钱包与商户集成指南:VASP 账户、交易脚本与支付流程详解 📅 发布时间:2026/9/21 1:24:58 👁 浏览次数: 区块链金融科技【免费下载链接】diemDiem’s mission is to build a trusted and innovative financial network that empowers people and businesses around the world.项目地址https://gitcode.com/gh_mirrors/di/diem点击查看免费下载导读本文是面向合格受监管 VASPRegulated Virtual Asset Service Provider受监管虚拟资产服务商的 Diem Payment NetworkDPN集成指南完整覆盖从 VASP 账户创建、货币选择、交易提交、off-chain 合规 API 配置、gas 费用设置到商户直接支付、退款与链上事件查询的全流程。读完本文你将掌握基于 Diem 框架交易脚本完成钱包或商户门店接入 DPN 的完整实操路径并理解 ParentVASP/ChildVASP 账户模型、peer_to_peer_with_metadata等核心脚本在链上的真实调用关系与约束条件。前置条件成为合格的 Regulated VASP在开始集成之前你必须是合格的 Regulated VASP。这是参与 DPN 的硬性准入条件——Diem Networks 需要对你进行授权批准你成为 DPN 上的参与者之后你才有资格创建受监管的 VASP 账户。关于 Regulated VASP 角色与账户模型的权威定义可参见术语表与账户基础文档。整体集成分为三个步骤创建你的 VASP 账户提交交易如果你是要构建商户门店的 Regulated VASP还需要接受直接支付创建你的 VASP 账户DPN 上的 Regulated VASP 账户是为代表终端用户运营的受监管 VASP 保留的。账户分两类ParentVASP 账户与ChildVASP 账户。ParentVASP 账户ParentVASP 账户是每个 Regulated VASP 唯一的根账户每个 Regulated VASP 只能拥有一个。Diem Networks 会用你的认证密钥authentication key代为创建 ParentVASP 账户。该账户携带三份关键数据从 Move 源码看它们存储于DualAttestation::Credential资源中见 DualAttestation.move字段含义可变性human_name你的唯一账户名不可变base_url供 off-chain API 交换信息用于满足 Travel Rule的端点 URL账户创建时该值为占位符dummy value可变compliance_public_key用于验证 Travel Rule 载荷签名的 Ed25519 公钥账户创建时同样为占位符可变在源码中Credential资源还包含expiration_dateV1 版本恒为U64_MAX以及两个事件句柄compliance_key_rotation_events和base_url_rotation_events后者在每次轮换 base URL 时触发BaseUrlRotationEvent事件。ChildVASP 账户ChildVASP 账户是 ParentVASP 账户的子账户其中存储其 ParentVASP 的地址。你可以拥有任意数量的 ChildVASP 账户用于维护结构化的链上存在例如分离的冷/热/暖钱包。ChildVASP 账户不是必需的。值得注意的链上设计是当与 ChildVASP 交易需要 off-chain 通信时客户端应使用该 ChildVASP 存储的 ParentVASP 地址去查询父账户信息见账户基础文档。创建 VASP 账户的六个步骤生成密钥Generate keys生成 Ed25519 密钥对及对应的认证密钥。认证密钥的派生规则为auth_key sha3-256(K_pub | 0x00)其中0x00是单签名的签名方案标识字节auth_key的前 16 字节为认证密钥前缀auth key prefix后 16 字节即账户地址详见账户基础文档。DPN 采用 RFC 8032 定义的 PureEdDSA 方案。若需要 K-of-N 多签认证则派生方式为auth_key sha3-256(p_1 | … | p_n | K | 0x01)。共享账户信息Share account info离线将以下信息提交给 Diem Networks Treasury你的公钥、初始选择的货币XUS或ALL、以及用于链上的可读 VASP 名称。Diem Networks 需要校验该名称的唯一性。DPN 创建你的 ParentVASP 账户收到信息后Diem Networks 会发送一笔交易用你的认证密钥创建 ParentVASP 账户。从源码看这笔交易对应AccountCreationScripts::create_parent_vasp_account脚本见 AccountCreationScripts.move它要求仅 Treasury Compliance 账户可以调用参数包括sliding_nonce防重放滑动随机数、new_account_address、auth_key_prefix、ASCII 编码的human_name与add_all_currencies标志。创建时账户获得PARENT_VASP_ROLE_ID角色。设置 off-chain API 的 base URL 与合规公钥要使用 off-chain API你必须发送一笔交易来设置 ParentVASP 账户上的base_url与compliance_public_key值。这笔交易由rotate_dual_attestation_info脚本完成签名见脚本文档。其底层实现在 AccountAdministrationScripts.movepublic(script) fun rotate_dual_attestation_info(account: signer, new_url: vectoru8, new_key: vectoru8) { DualAttestation::rotate_base_url(account, new_url); DualAttestation::rotate_compliance_public_key(account, new_key) }其中new_url为 ASCII 编码的 off-chain 通信 URLnew_key必须是合法的 Ed25519 公钥否则交易将以EINVALID_PUBLIC_KEY中止。成功执行会同时发出ComplianceKeyRotationEvent与BaseUrlRotationEvent事件。从源码结构看持有Credential资源的账户实际即 ParentVASP 与指定做市商 Designated Dealer均可执行该脚本。创建 ChildVASP 账户可选如需子账户从 ParentVASP 账户调用create_child_vasp_account脚本创建。源码实现在 AccountCreationScripts.move参数为parent_vasp必须为 ParentVASP 角色否则以EPARENT_VASP中止、child_address、auth_key_prefix、add_all_currencies与child_initial_balance若初始余额大于 0还会触发一笔从父账户到子账户的转账并分别发出SentPaymentEvent与ReceivedPaymentEvent。注意父账户有子账户数量上限ETOO_MANY_CHILDREN子地址已存在会以EROLE_ID中止。开始交易Start transacting以上步骤完成后即可用第 1 步生成的密钥对从你的账户发送链上交易。选择货币创建 ParentVASP 账户时你至少需要选择一种 Diem Coin 货币。DPN 当前可用的货币为XUS一种 USD 稳定币。当未来有更多 Diem Coin 货币上线时你可以向 DPN 指定要关联的货币也可以要求 DPN 为你关联全部可用货币。通过add_currency_to_account交易脚本可以向现有账户追加新的 Diem Coin 货币源码见 AccountAdministrationScripts.move仅账户所有者可执行在创建账户脚本中使用add_all_currencies标志可以为 ChildVASP 账户一次性添加 DPN 提供的全部货币从 Move 层面看每种 Diem Coin 货币都是同一个 Diem 类型的不同泛型实例化即DiemXUS参见账户基础文档。需要特别留意余额语义当某种货币被授权给某账户时系统会为其添加该货币的零余额。向账户发送DiemCoinType前必须先确认账户地址存在、且该地址在目标货币上已有余额哪怕为零否则交易会中止账户被授权的货币余额一旦添加便不可移除。提交交易向 DPN 提交交易的过程本质上是用私钥对交易脚本进行密码学签名然后监听事件流等待验证者validator节点达成共识。交易的完整生命周期可参见交易生命周期文档。拥有 ParentVASP 账户后提交第一笔交易前需要完成三件事学会如何与 DPN 交互设置 off-chain API选择 gas 值如何与 DPN 交互如果你不是验证者节点运营者可以通过以下任一方式接入 DPN与验证者运营者或验证者节点所有者沟通通过 FullNode 或 FullNode 的 JSON-RPC 端点获得对验证者网络的专用访问部署自己的 FullNode带 JSON-RPC 端点利用公共 FullNode 网络直接访问公共 JSON-RPC 端点使用自己的私有 FullNode以更快访问区块链状态更紧密地监控已提交的交易私有 FullNode 还提供额外冗余当私有节点不可用时可以回退到维护良好的公共网络。从实践角度使用 JSON-RPC 服务通常能让钱包与 DPN 的集成更快。JSON-RPC 端点的方法与响应数据定义可查阅 json-rpc-spec.md 及 method_get_events 等方法文档。设置 off-chain APIOff-chain 协议是支撑 DPN 合规性与可扩展性的 API 与载荷规范在成对的 Regulated VASP如钱包、交易所、指定做市商之间执行允许其在链上结算之前、期间或之后私下交换支付信息。它同时提供满足 Travel Rule 合规的途径并为链上交易协商一次性标识符以降低交易的链上关联性linkability。连接建立方式VASP 查询对手方链上账户中的 base URL以定位其 off-chain 服务端点。需要强调的是每个使用 off-chain API 的实体都必须自行判断其是否满足 Travel Rule 合规要求。要启用 off-chain API你需要为链上 ParentVASP 账户设置base_url与compliance_public_key两个值即上文第 4 步的rotate_dual_attestation_info脚本。Off-chain 协议与载荷的规范定义在 DIPDiem Improvement Proposal协议文档中属于对外发布的协议标准仓库内不包含其实现。选择 gas 值账户提交交易时gas用于三个方面跟踪并计量执行所消耗的计算资源限制执行期间可使用的资源数量根据执行消耗的资源量收取交易手续费。手续费的计算依据三个 gas 参数完整取值要求如下表当前以测试网为准定义设置值max_gas_units执行一笔交易可消耗的最大 gas 单位数用于约束交易可消耗的计算资源上限。启动前将发布各交易的建议max_gas_amount列表。测试网上600 max_gas_amount ≤ 2,000,000gas_price以指定 gas 货币计价的 gas 单位价格。gas price 用于将 gas 单位虚拟机计量资源消耗的抽象单位换算为指定 gas 货币下的交易费。启动阶段可将其设为 0 或接近 0因为网络不应有高争用。测试网上0 ≤ gas_price ≤ 10,000gas_currency_code向客户端收取手续费的货币。gas_currency必须是链上已注册货币测试网为XUS且必须是发送账户持有的货币之一。例如将gas_currency设为Coin3会被拒绝因为Coin3既非链上注册货币发送账户也不持有该货币gas 与交易费的详细机制见 gas 与交易费基础文档。接受直接支付如果你是希望构建并集成自有商户门店的 Regulated VASP需要设置直接支付direct payments来接收付款并处理退款。DPN 上线初期钱包支持的基础支付流与点对点转账类似因此商户结账选项最初限定为直接支付——即金额与货币类型已知的单一时间点交易。结账时分享支付信息为提供可互操作的结账体验你需要与终端用户分享支付信息或上下文可通过生成的QR 码、可复制粘贴的URI或**移动端深链deep link**实现。支付信息包括完整的账户地址稳定的链上地址唯一即生成的子地址subaddress以微单位microunits计价的支付金额货币代码。当终端用户的钱包服务商Regulated VASP收到该支付上下文后即可构造一笔预填支付请求让用户授权。用户授权后其钱包走与点对点支付类似的发送方流程只要金额不超过 Travel Rule 阈值交易将直接上链一旦触发 Travel Rule支付会先通过 off-chain 协议预检preflight再上链提交。支付请求 URI 的序列化规范定义于 DIP-5 协议文档。检测支付当用户钱包向你商户服务商发起支付后你需要核对交易并将其关联到结账会话checkout session确认支付并通知终端用户。实现方式与 FullNode 对接跟踪你链上账户发出的事件。事件是交易的收据——每笔交易执行成功后都会以列表形式发出任意数量的事件而中止的交易从不发出事件因此事件可用来确认交易是否成功执行。关于事件机制的完整说明见事件基础文档。收到支付后检查附带的子地址进行内部路由。由于每个交易对应唯一的子地址你可以确定买家付款的终端用户身份从而将收款关联到具体结账会话并向用户确认支付。处理退款在重复支付、支付到无效地址、客户退货或客服介入等场景下你可能需要向客户退款。DPN 上的退款与任何其他点对点交易类似商户服务商需要代表商户构造交易脚本并提交给原客户若金额超过 Travel Rule 阈值退款同样受 Travel Rule 管控需要 off-chain 预检。与普通交易不同退款包含对原始交易的指针引用若超过 Travel Rule 阈值original event reference id原始事件引用 ID包含在 off-chain 载荷中否则非 Travel Rule 场景original event sequence number原始事件序列号随退款交易的链上主体发送。收到退款的钱包可利用对原始交易的引用为入账资金提供额外上下文。发送支付发送支付使用peer_to_peer_with_metadata交易脚本签名见脚本文档。其 Move 源码实现位于 PaymentScripts.movepublic(script) fun peer_to_peer_with_metadataCurrency( payer: signer, payee: address, amount: u64, metadata: vectoru8, metadata_signature: vectoru8 ) { let payer_withdrawal_cap DiemAccount::extract_withdraw_capability(payer); DiemAccount::pay_fromCurrency( payer_withdrawal_cap, payee, amount, metadata, metadata_signature ); DiemAccount::restore_withdraw_capability(payer_withdrawal_cap); }该脚本的约束条件如下收款账户必须存在地址否则脚本中止EPAYEE_DOES_NOT_EXIST双方账户都必须持有CoinType货币的余额可为零零余额在CoinType被授权给账户时添加。若发送方或接收方没有该货币余额交易中止泛型类型参数CoinType指定要转账的货币必须是链上已注册货币metadata参数接受任意二进制数据。对大多数交易metadata 应为接收支付的 Regulated VASP 客户的子地址。metadata 内容会随支付事件发出但链上不做其他检查因此测试时使用空或虚拟 metadata 完全没问题。需要注意metadata 参数的使用受参与协议与 DPN 规则的特定限制约束metadata_signature参数用于 Travel Rule 协议中的双重认证dual attestation。其签名消息格式为metadata | payer地址 | amount | DualAttestation::DOMAIN_SEPARATOR其中地址与金额字段为 BCS 编码字节用收款方compliance_public_key对应的私钥签名。仅当金额达到链上DualAttestation限制且双方为不同 VASP 时才强制要求但交易发送方也可通过提供非空metadata_signature主动选择启用双重认证例如做市商向 VASP 付款的场景。该脚本成功执行会发出两个事件发送方账户上的SentPaymentEvent与接收方账户上的ReceivedPaymentEvent。常见的失败情形还包括金额为零ECOIN_DEPOSIT_IS_ZERO、余额不足EINSUFFICIENT_BALANCE、收款方被冻结EACCOUNT_FROZEN、签名格式错误EMALFORMED_METADATA_SIGNATURE或签名验证失败EINVALID_METADATA_SIGNATURE等。查询区块链每笔交易成功执行后会以事件列表形式发出若干事件中止的交易从不发出事件因此事件可用于确认交易是否成功执行。以点对点支付为例发送方账户发出SentPaymentEvent发送方可据此确认款项已从自己账户发出接收方账户发出ReceivedPaymentEvent接收方可据此确认款项已入账。事件持久化保存在 Diem 区块链上Regulated VASP 可以利用这些事件回答查询。事件的结构、查询方式及 JSON 响应中的周边数据定义在 json-rpc-spec.md 中。要检查账户上的新交易需要使用 JSON-RPC 端点查询区块链发送方查询交易的序列号sequence number接收方查询ReceivedPaymentEvent事件。集成检查清单完成 DPN 钱包/商户集成后建议对照以下清单自检✅ 已获得 Diem Networks 的 Regulated VASP 授权✅ 已生成 Ed25519 密钥对并派生认证密钥与账户地址✅ 已向 Treasury 提交公钥、货币选择XUS/ALL与唯一账户名✅ ParentVASP 账户已创建且base_url与compliance_public_key已通过rotate_dual_attestation_info设置不再是占位符✅ 已通过create_child_vasp_account创建如需要并配置好冷/暖/热分层子账户✅ 已选定max_gas_units、gas_price、gas_currency_code等交易参数✅ 已确定与 DPN 的交互方式私有 FullNode / 公共 JSON-RPC并实现事件监听✅ 商户场景下已实现直接支付、子地址路由检测与退款含original event reference id/original event sequence number回填✅ 发送支付时已正确构造metadata客户子地址与metadata_signature并处理 Travel Rule 阈值场景的 off-chain 预检。赞分享区块链金融科技【免费下载链接】diemDiem’s mission is to build a trusted and innovative financial network that empowers people and businesses around the world.项目地址https://gitcode.com/gh_mirrors/di/diem点击查看免费下载相关推荐Diem 交易类型深度解析支付转账、账户创建与账户管理脚本全指南Diem 交易类型深度解析支付转账、账户创建与账户管理脚本全指南 Diem原 Libra区块链上的所有状态变更都必须通过交易transaction提交区块链金融科技AntdUI支付宝集成支付宝支付与商户功能对接AntdUI支付宝集成支付宝支付与商户功能对接 前言桌面应用支付集成的痛点 你是否曾经在开发WinForms桌面应用时为支付功能的集成而头疼传统的桌面应UI组件桌面应用如何验证PDB文件格式正确性从空PDB到完整调试信息的验证方法如何验证PDB文件格式正确性从空PDB到完整调试信息的验证方法 PDBProgram Database文件是Windows平台上存储调试信息的关键文件格式上一篇Kubernetes证书管理终极指南使用Lets Encrypt与cert-manager实现SSL自动化配置下一篇Lettuce-core SSL/TLS 安全配置终极指南保护 Redis 数据传输创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考