尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

x402 Algorand exact 支付方案详解:原子交易组、feePayer 免 Gas 与即时最终性

发布时间:2026/9/17 21:34:47

资讯中心
01
ARTICLE

x402 Algorand exact 支付方案详解:原子交易组、feePayer 免 Gas 与即时最终性

x402 Algorand exact 支付方案详解:原子交易组、feePayer 免 Gas 与即时最终性
x402 Algorand exact 支付方案详解原子交易组、feePayer 免 Gas 与即时最终性【免费下载链接】x402A payments protocol for the internet. Built on HTTP.项目地址: https://gitcode.com/GitHub_Trending/x4/x402x402 的exact方案在 Algorand 网络上基于标准资产ASA实现精确金额支付资源服务器预先声明精确金额客户端构造一个原子交易组transaction group并签名后回传Facilitator 校验、为免 Gasgasless交易补签 feePayer 交易、先模拟后上链借助 Algorand 无共识分叉特性获得即时最终性。读完全文你将掌握paymentRequirements/PAYMENT-SIGNATURE/PAYMENT-RESPONSE三个关键报文的完整字段规范、8 步校验流程的源码级实现以及交易组构造、费用池化fee pooling、资产 opt-in 等实操要点。方案总览根据 scheme_exact_algo.md 的定义exact方案在 Algorand 上使用Algorand Standard AssetASA——Algorand 协议的原生资产无需任何智能合约——授权一笔从付款方到资源服务器的特定金额转账。其核心安全性质是Facilitator 没有能力把资金导向除资源服务器在paymentRequirements中指定地址之外的任何地方。整个支付流程的时序如下从源码结构看这个时序在 x402 仓库中由x402/avm包的三类实现类分别承担客户端 ExactAvmClient、资源服务器端 ExactAvmServer、以及 Facilitator 端 ExactAvmFacilitator。paymentRequirements402 响应中的支付要求在exact方案Algorand中paymentRequirements记录可以MAY在extra元素中包含一个feePayer字段。它告知客户端可以构造一笔包含 0 Algo 支付交易发送方为feePayer的交易其fee值足以覆盖整组交易的手续费。这笔交易与被期望的资产转账交易一起放入同一个原子组并在 Facilitator 验证交易组之后、结算上链之前由Facilitator 补签名。此外paymentRequirements.asset字段必须MUST是一个表示 ASA ID64 位无符号整数的字符串而不是像 EVM 那样的ERC20合约地址。资源服务器在使用 Algorand 方案时必须校验该asset字段合法。paymentRequirements.extra规范如下{ // Optional Algorand address that will pay the transaction fees. feePayer?: string; }完整的paymentRequirements示例主网 USDC5 美元{ scheme: exact, network: algorand:wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8, amount: 5000000, payTo: RESOURCESERVERADDRESSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALTSRPAE, maxTimeoutSeconds: 60, asset: 31566704, extra: { feePayer: FACILITATORADDRESSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALQCXBZE } }几个值得注意的细节均可在仓库中印证网络标识采用 CAIP-2 格式algorand:genesis-hash-base64。主网 genesis hash 为wGHE2Pwdvdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8测试网为SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI见 constants.ts。示例中的asset: 31566704正是 Algorand 主网 USDC 的 ASA ID与 constants.ts 中定义的USDC_MAINNET_ASA_ID 31566704、测试网USDC_TESTNET_ASA_ID 10458941一致USDC 精度固定为 6 位小数USDC_DECIMALS 6。feePayer的注入路径Facilitator 在 supported 接口中通过getExtra()返回 feePayer 地址资源服务器再把它合入paymentRequirements.extra。仓库实现见 facilitator/scheme.ts 的 getExtra 与 server/scheme.ts 的 enhancePaymentRequirements——前者还会把decimals一并写入extra。从源码结构看getExtra()在多个 Facilitator 地址中随机选取一个作为 feePayer用于分散 ALGO 手续费成本避免单一费用账户被更快耗尽。PAYMENT-SIGNATURE头报文paymentGroup 与 paymentIndexPAYMENT-SIGNATURE头的payload字段必须MUST包含paymentGroup字段它是一个数组代表一个原子交易组。交易组是 Algorand 协议原生能力无需合约组内可以包含多笔不同授权者的交易整组要么全部成功、要么整体被拒绝不存在部分执行。交易组可包含多种交易类型例如payALGO 原生资产转账和axfer通用 ASA 转账等。payload 中还必须有paymentIndex字段标识组内真正向资源服务器付款的那笔交易。组内可以执行交换、资产转账等多种辅助操作但只有一笔交易会把资金转给资源服务器。若组内只有一笔独立交易paymentIndex必须MUST为 0。交易组的容量上限Algorand 协议限制最多16 笔顶层交易每笔可由单签名Ed25519、k-of-n阈值多签名或逻辑签名logic signature授权最多256 笔内部交易inner transactions由应用智能合约授权。仓库中该 payload 的类型定义是 ExactAvmPayloadV2并配套一个运行时类型守卫isExactAvmPayload做结构校验export interface ExactAvmPayloadV2 { /** * Array of base64-encoded msgpack transactions forming an atomic group. * May include unsigned transactions (for fee payer) that the facilitator will sign. */ paymentGroup: string[]; /** * Zero-based index of the payment transaction within paymentGroup. * This transaction must be an ASA transfer to the payTo address. */ paymentIndex: number; }一笔带 feePayer 抽象费用即由 Facilitator 付 Gas的 USDC 资产转账示例{ paymentIndex: 1, // 0th index of the transaction in the group that will pay the resource server paymentGroup: [ gaN0eG6Jo2ZlZc0H0KJmds4DLgNro2dlbqxtYWlubmV0LXYxLjCiZ2jEIMBhxNj8Hb3e0tdgSRWjj9tBBmHrDe95LYgtas5JIrfo2dycMQgfy1SzrlgvgTJsviMY2KnHSsXqyfCJ1UOCE2Tf3vSibHbOAy4HU6NyY3bEICgEhaJgm6IBjiSUgAAAAAAAAAAAAAAAAAAAAAAAAAAAo3NuZMQgKASFomCbogGOJJSAAAAAAAAAAAAAAAAAAAAAAAAAAACkdHlwZaNwYXk, gqNzaWfEQP3J1DI6GLSfK0nLZftvSyVMJuFOE48xPlnZpNdEJWbGbcxsD5aASwza4TjbwhgEF0dXOv8E3W/f22vkEzfFywWjdHhuiaRhYW10zgBMS0CkYXJjdsQgiSTqRESRI1JEAxxJKQAAAAAAAAAAAAAAAAAAAAAAAACiZnbOAy4Da6JnaMQgwGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkitjZ3JwxCB/LVLOv6WCBMmyIxjYqcdKxerJ8InVQ4IT7ZN/e9L6Jsds4DLgdTo3NuZMQgEtBGzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkdHlwZaVheGZlcqR4YWlkzgHhq3A ] }完整的PAYMENT-SIGNATURE头示例{ x402Version: 2, scheme: exact, network: algorand:wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8, resource: { url: https://example.net/signup, description: $5 registration payment, mimeType: text/html }, accepted: { scheme: exact, network: algorand:wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8, amount: 5000000, payTo: RESOURCESERVERADDRESSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALTSRPAE, maxTimeoutSeconds: 60, asset: 31566704, extra: { feePayer: FACILITATORADDRESSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALQCXBZE } }, extensions: {}, outputSchema: null, payload: { paymentIndex: 1, paymentGroup: [ gaN0eG6Jo2ZlZc0H0KJmds4DLgNro2dlbqxtYWlubmV0LXYxLjCiZ2jEIMBhxNj8Hb3e0tdgSRWjj9tBBmHrDe95LYgtas5JIrfo2dycMQgfy1SzrlgvgTJsviMY2KnHSsXqyfCJ1UOCE2Tf3vSibHbOAy4HU6NyY3bEICgEhaJgm6IBjiSUgAAAAAAAAAAAAAAAAAAAAAAAAAAAo3NuZMQgKASFomCbogGOJJSAAAAAAAAAAAAAAAAAAAAAAAAAAACkdHlwZaNwYXk, gqNzaWfEQP3J1DI6GLSfK0nLZftvSyVMJuFOE48xPlnZpNdEJWbGbcxsD5aASwza4TjbwhgEF0dXOv8E3W/f22vkEzfFywWjdHhuiaRhYW10zgBMS0CkYXJjdsQgiSTqRESRI1JEAxxJKQAAAAAAAAAAAAAAAAAAAAAAAACiZnbOAy4Da6JnaMQgwGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkitjZ3JwxCB/LVLOv6WCBMmyIxjYqcdKxerJ8InVQ4IT7ZN/e9L6Jsds4DLgdTo3NuZMQgEtBGzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkdHlwZaVheGZlcqR4YWlkzgHhq3A ] } }从客户端源码看上述报文是这样构造出来的client/scheme.ts 的 createPaymentPayload若requirements.extra.feePayer存在先用占位手续费追加一笔 feePayer 自付的 0 ALGOpay交易此时paymentIndex 1否则paymentIndex 0。追加一笔axferASA 转账交易sender 客户端地址、receiver payTo、assetId、amount。通过 TransactionComposer 的build()分配 group ID、建议参数suggested params与费用。对 gasless 场景重算费用按fee max(fee_per_byte × txn_size, min_fee)对组内每笔交易按其真实编码字节数计算费用把总费用写入 feePayer 交易并因为 group ID 由交易编码字节派生须先剥离旧 group ID、修正费用后再重新groupTransactions()计算新的 group 哈希。客户端只签名自己的交易索引feePayer 交易保持未签名状态放入paymentGroup等待 Facilitator 补签。PAYMENT-RESPONSE头报文结算成功后PAYMENT-RESPONSE必须MUST返回paymentGroup[paymentIndex]交易的交易 IDtransaction ID它标识了那笔向payTo地址转账amount的资产转账交易可用于在网络上定位该交易。若结算失败应当SHOULD也返回交易 ID但由于失败交易不会上链它可能无法在链上查到。完整的PAYMENT-RESPONSE头示例{ success: true, errorReason: null, payer: payer, transaction: NTRZR6HGMMZGYMJKUNVNLKLA427ACAVIPFNC6JHA5XNBQQHW7MWA, network: algorand:wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8 }校验Verification8 步流程与源码实现规范规定的校验步骤为校验x402Version是受支持版本当前为2。校验PAYMENT-SIGNATUREpayload 的accepted字段与paymentRequirements中的scheme均为exact。校验两者的network一致。检查paymentGroup元素不超过 16 个。解码paymentGroup中的所有交易。定位paymentGroup[paymentIndex]交易检查aamt资产金额等于paymentRequirements的amount检查arcv资产接收方等于payTo检查xaid资产 ID等于asset。定位所有snd发送方为 Facilitator Algorand 地址的交易检查type是pay检查以下字段被省略close、rekey、amt检查fee是合理金额由 Facilitator 对该交易签名。将支付组提交到 Algorand 节点的simulate端点评估确认这些交易能够成功执行。仓库中 ExactAvmFacilitator.verify 按同样的顺序实现了这 8 步且每一步失败都会返回机器可读的错误码invalid_exact_avm_*前缀见 AVM 包 README 的 Error Codes 一节。几个源码级的实现要点值得展开费用上限是每笔 5000 µAlgo × 组大小。规范只说检查 fee 是合理金额仓库实现给出了具体取值constants.ts 定义MAX_REASONABLE_FEE_PER_TXN 5000最低手续费 1000 µAlgo 的 5 倍并对整组费用池化场景用maxReasonableGroupFee(groupSize) 5000 × groupSize计算上限。选择 5 倍是因为 Algorand 费用公式fee max(current_fee_per_byte × txn_size, min_fee)在网络拥堵时fee_per_byte会上升正常时则等于最低费。verifyFeePayerTransaction 还额外校验 feePayer 交易必须是自付receiver 等于 sender、amt必须为 0、且closeRemainderTo与rekeyTo必须缺省——这正是规范第 7 步close、rekey、amt省略的落地。只有 Facilitator 地址允许以未签名交易出现。decodeTransactionGroup 对每笔交易先尝试按签名交易解码若实为未签名交易则只有当发送方属于 Facilitator 地址集合时才被接受否则返回invalid_exact_avm_unsigned_non_facilitator并会校验全组 group ID 一致invalid_exact_avm_invalid_group_id。支付交易必须真实签名且签名必须由发送方所出。verifyPaymentTransaction 除了核对axfer类型、金额用 BigInt 比较避免字符串格式差异、接收方、资产 ID 之外还会检查原始字节含签名invalid_exact_avm_payment_not_signed并调用ed25519Verifier对bytesForSigning.transaction(txn)的 Ed25519 签名做密码学校验invalid_exact_avm_invalid_signature。一条额外的安全约束规范未逐字写出、但 exact 方案总规范 附录中要求Facilitator 必须执行防止赞助滥用的安全约束。Algorand 实现对应地检查了paymentGroup[paymentIndex]的发送方不得是 Facilitator 自身地址invalid_exact_avm_facilitator_transferring防止 Facilitator 用自己的资金冒充付款方。模拟端点直接返回失败原因。simulateTransactionGroup 读取节点txnGroups[0].failureMessage作为invalidMessage原样返回给资源服务器。结算Settlement与即时最终性交易组被资源服务器校验通过后Facilitator 通过向任意合法 Algorand 节点的v2/transactions端点提交已验证的交易组来完成结算。Algorand 不存在共识分叉交易一经包含进区块即获得即时最终性instant finality。因此只要交易进入区块支付即视为结算完成Facilitator 通知资源服务器成功并继续资源交付。settle 实现 的调用链是先完整复跑一遍verify→ 解码并重签 feePayer 交易 →在提交前先计算支付交易的 TxIDpaymentStxn.txn.txId()保证即使后续失败也能把它写进PAYMENT-RESPONSE的transaction字段→sendTransactions提交整组 →waitForConfirmation(paymentTxnId, network, 10)最多等待 10 轮出块确认。超时或提交异常分别返回invalid_exact_avm_settlement_failed/invalid_exact_avm_confirmation_failed。其他注意事项Additional Considerations资产 opt-in 是前置条件资源服务器要收到某个特定资产ASA的支付必须MUST已对该资产完成 opt-in。Algorand 中账户须显式开启接收某资产的资格否则转给该账户的资产转账会被拒绝。因此资源服务器在部署时应确保SHOULD已对paymentRequirements.asset指定的资产 ID 完成 opt-inopt-in 就是一笔金额 0 的自转账。从 AVM 包 README 看这一约束同样适用于客户端与 Facilitator 账户每个账户需满足最低余额要求MBR每账户 0.1 ALGO每 opt-in 一个 ASA 再加 0.1 ALGO且 USDC 付款方客户端与收款方服务器/payTo都必须先 opt-in。一个交易组内可携带多笔支付Facilitator 可能需要在一组内同时处理多笔支付与 feePayer 交易。若客户端明确知道自己在支付什么并在一组中构造多笔支付理论上最多可有16 笔对资源服务器的支付或8 笔免 Gasgasless支付16 个槽位中一半被 feePayer 交易占用。签名方案paymentGroup中的每笔顶层交易必须MUST由组内对应发送地址的所有者单独签名。Algorand 中顶层交易签名基于三种机制之一Ed25519单签名sigk-of-n阈值多签名msig由 Algorand 虚拟机验证的逻辑签名Logic Signaturelsig。Algorand 地址与公钥的关系Algorand 地址是 58 字符的 base32 编码对应以下两种之一逻辑签名程序字节码 Program前缀的 SHA512_256 哈希公钥并在尾部附加 sha512_256 校验和最后 4 字节。这种编码保证无需预先存在的签名即可直接从公钥推导出地址对比 EVM 需要用ecRecover从签名反推地址。仓库示例的编码函数encodeAddress(publicKey: Buffer): string { const keyHash: string sha512_256.create().update(publicKey).hex() // last 4 bytes of the hash const checksum: string keyHash.slice(-8) return base32.encode(Encoder.ConcatArrays(publicKey, Buffer.from(checksum, hex))).slice(0, 58) }编码格式msgpack base64Algorand 交易使用msgpack编码。paymentGroup数组中每个元素都可以先 base64 解码、再 msgpack 解码来查看交易内容也可以借助goal命令行工具直接检视% cat payload.json | jq -r .paymentGroup[] | base64 -d | goal clerk inspect - -[0] { txn: { fee: 2000, fv: 53347179, gen: mainnet-v1.0, gh: wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8, grp: fy1SzrlgvgTJsviMY2KnHSsXqyfCJ1UOCE2Tf3vS8, lv: 53348179, rcv: FACILITATORADDRESSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALQCXBZE, snd: FACILITATORADDRESSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALQCXBZE, type: pay } } -[1] { sig: /cnUMjoYtJ8rSctl29LJUwm4U4TjzEWdmk10QlZsZtzGwPloBLDNrhONvCGAQXR1c6/wTdb9/baQTN8XLBQ, txn: { aamt: 5000000, arcv: RESOURCESERVERADDRESSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALTSRPAE, fv: 53347179, gh: wGHE2Pwdvd7S12BL5FaOP20EGYesN73ktiC1qzkkit8, grp: fy1SzrlgvgTJsviMY2KnHSsXqyfCJ1UOCE2Tf3vS8, lv: 53348179, snd: CLIENTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFUPIRI, type: axfer, xaid: 31566704 } }从解码结果可以直观看到校验步骤与字段的对应关系-[0]是未签名的 feePayerpay交易sndrcv Facilitatorfee覆盖整组-[1]是带sig的axfer支付交易aamt/arcv/xaid正是校验步骤 6 核对的三个字段两笔交易共享同一grpgroup ID。附录Gasless 交易 / 赞助费用提供 gasless 交易的 Facilitator若认为某笔feePayer交易被恶意构造可以拒绝为其签名。这类恶意检查可以下沉到一段逻辑签名logic signature中由 Facilitator 改为对 TxID 提供签名并把它作为参数传入从而把这笔交易是否值得我付费用的判定逻辑上链固化为合约。在仓库中落地该方案x402/avm 包速览规范之上typescript/packages/mechanisms/avm 提供了 TypeScript 参考实现安装x402/avm后即可按网络通配符注册客户端import { x402Client } from x402/core/client; import { ExactAvmClient } from x402/avm; const client new x402Client() .register(algorand:*, new ExactAvmClient(signer));各角色需要配置的环境变量来自 AVM 包 README角色变量说明客户端AVM_PRIVATE_KEYBase64 编码的 64 字节私钥32 字节 Ed25519 seed 32 字节公钥用于签名支付交易资源服务器AVM_ADDRESS收款 Algorand 地址58 字符 base32FacilitatorAVM_PRIVATE_KEYBase64 编码的 64 字节私钥用于提交结算交易并支付费用测试网快速起步要点账户需通过水龙头充值 ALGO 与测试网 USDC客户端与服务端地址须先对 USDC测试网 ASA ID10458941完成 opt-infeePayer账户需留有 ALGO 余额以覆盖 gasless 费用。签名器可用包内辅助函数创建toClientAvmSigner(privateKey)与toFacilitatorAvmSigner(privateKey, { testnetUrl?, mainnetUrl? })后者支持自定义 Algod 端点默认使用 algokit-utils 的AlgorandClient.testNet() / mainNet()公共端点。端到端行为由 集成测试 exact-avm.test.ts 覆盖它读取CLIENT_PRIVATE_KEY、FACILITATOR_PRIVATE_KEY、SERVER_ADDRESS三个环境变量构建scheme: exact、network为测试网 CAIP-2 标识、asset为测试网 USDC ASA ID 的支付要求走完整条 402 →PAYMENT-SIGNATURE→ verify/settle 链路。小结Algorand 上的 x402exact方案把支付约束从合约层前移到了协议层原子交易组保证要么全成要么全败paymentIndex 三字段核对aamt/arcv/xaid保证资金只能流向资源服务器指定的账户且金额分毫不差feePayer 0 ALGO 自付交易配合费用池化实现了免 Gas 支付而 Algorand 的即时最终性让结算在交易入块时即刻完成。规范文本位于 scheme_exact_algo.md可结合 scheme_exact.md 的跨网络关键校验要求与x402/avm包源码交叉阅读逐条印证每个 MUST 条款的具体实现位置。【免费下载链接】x402A payments protocol for the internet. Built on HTTP.项目地址: https://gitcode.com/GitHub_Trending/x4/x402创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。