本文件规定了Interledger协议(ILP)。它很大程度上取决于RFC 791中定义的互联网协议(IP)的定义。Interledger协议是十多年来分散式支付协议研究的高潮。Ryan Fugger于2004年开始了这项工作,并于2008年开发了比特币,并从此开始涉及众多贡献者。
今天的付款网络是孤立的,不连接。在一个国家内付款相对容易,或者如果发件人和收件人在同一网络或分类帐上有帐户。但是,从一个账本发送到另一个账户通常是不可能的。在连接确实存在的情况下,它们是手动,慢速或昂贵的。
Interledger协议提供跨越不同数字资产分类帐的路由支付,同时隔离发送方和接收方免于中间失败的风险。安全的多跳支付和自动路由功能可以为全球网络提供不同类型的价值,可以将任何发送方与任何接收方连接起来。
Interledger协议的范围有意限制,以提供必要的功能,以通过分类帐系统的互联系统从源端向目的地提供付款。它包含对基础分类帐的最低要求,它不包括公钥基础设施,身份,流动性管理或支付协议中常见的其他服务。
此协议由主机通过Interledger环境中的更高级协议模块调用。Interledger协议模块通过本地账本协议调用交叉支付到下一个连接器或目标账户。
例如,一个Simple Payment Setup Protocol (SPSP)
模块会使用interledger包中的地址和其他参数调用interledger模块来发送付款。插入器模块将根据给定的参数将转移发送到下一个连接器或目标帐户以及插入器数据包。传输和插入数据包将由下一个主机的插入器模块接收,并由每个连续的连接器和最终的目标的SPSP模块处理。
例如,在Ripple案例中,插入器模块将调用本地分类器模块,该模块将创建Ripple事务,并附加Interledger数据包以传输至Ripple Consensus Ledger。Ripple地址将由本地分类帐接口从Interledger地址派生,并将成为Ripple网络中某个帐户的地址,该帐户可能属于其他分类帐的连接器。
Interledger协议的核心功能是解决主机和跨不同分类帐的付款问题。
每个主机发送和接收付款的付款都有一个插入器模块,该模块使用插入器头中的地址向其目的地传输插入付款。Interledger模块共享解释地址的通用规则。模块(尤其是连接器)还具有制定路由决策和其他功能的程序。
插入者协议使用转移保留来确保发件人的资金被发送到目标帐户或返回到发件人的帐户。“ 概述”和“ Interledger白皮书”中详细介绍了此机制。
插入者协议将每个插入者付款视为与任何其他插入者付款无关的独立实体。没有连接或通道(虚拟或其他)。
Interledger支付不包含专用的生存时间或剩余跳数字段。相反,金额字段的作用类似于隐式生存时间:每次转发付款时,转发连接器都会从入站金额中收取一定费用。一旦连接器识别出入境金额比ILP头部中的目标金额小(但不一定数值上更小),它将拒绝转发付款。
请参阅IL-RFC 19,了解诸如转账,分类帐,连接器和付款等术语的定义。
下图说明了协议层次结构中的交互协议的位置:
Interledger协议一方面与更高级别的端到端协议接口连接,另一方面与本地总账协议接口。在这种情况下,“分类帐”可能是由个人或组织拥有的小型分类帐,也可能是像比特币这样的大型公共分类账。
该协议使用转帐暂停以确保发件人的资金被交付到目的地或返回到发件人的帐户。以下示例说明了操作模型:
(1,21) (11)
Application Application
\ /
(2,20) (6,16) (10,12)
Interledger Module Interledger Module Interledger Module
\ / \ /
(3,19) (5,17) (7,15) (9,13)
LLI-1 LLI-1 LLI-2 LLI-2
\ (4,18) / \ (8,14) /
Local Ledger 1 Local Ledger 2
发送应用程序使用更高级别的协议来协商地址,金额,加密条件以及与目标的超时。它调用interledger模块发送这些参数的付款。
Interledger模块准备ILP数据包,选择帐户发送本地分类帐传输,并将它们传递到本地分类帐接口。
本地分类账界面创建本地分类账转账(包括加密条件),然后在本地分类账上授权此转账。
分类账将发送人的资金置于保留状态 - 不会将资金转入连接器 - 并通知连接器。
连接器主机的本地分类帐接口接收通知并将其传递给插入器模块。
连接器的interledger模块提取ILP数据包并确定它应该转发付款。Interledger模块调用目的地分类帐的本地分类账接口发送第二次转账,包括与发件人转账相同的条件。
本地分类账界面创建本地分类账转账(包括加密条件),然后在本地分类账上授权此转账。
分类账将持卡人的资金搁置 - 不会将资金转移到目的地 - 并通知目标主机。
目标主机的本地分类帐接口接收通知并将其传递给插入器模块。
Interledger模块提取ILP数据包并确定支付是针对该主机中的应用程序的。它将传输数据传递给应用程序。
目标应用程序收到通知并确认资金处于待定状态,等待条件满足。它根据与发件人商定的内容检查传入传输的细节。如果检查通过,应用程序将生成条件履行并将其传递给交错模块。
目标的Interledger模块将履行交给本地分类帐界面。
本地分类帐界面将履行提交给分类帐。
目的地分类账根据持有的转账情况验证兑现情况。如果履行有效且传输未过期,则分类帐执行传输并通知目标主机和连接器。
连接器的本地分类帐接口收到履行通知并将其传递给交错模块。
连接器的插入器模块接收履行并将其传递到对应于源分类帐的本地分类帐接口。
该分类帐界面将履行情况提交给来源分类账。
源分类账根据持有的转账情况验证兑现情况。如果履行有效且传输未过期,则分类帐执行传输并通知连接器和发件人的主机。
发件人的本地分类帐接口收到履行通知并将其传递给交错模块。
发件人的interledger模块接收履行通知并将其传递给应用程序。
发件人的申请收到履行通知并作出相应反应。
Interledger协议的目的是使主机能够通过一组相互连接的分类帐路由支付。这是通过将支付从一个插入模块传递到另一个模块来完成的,直到达到目的地。interledger模块驻留在interledger系统中的主机和连接器中。根据对插入者地址的解释,付款将通过个别分类帐从一个插入模块发送到另一个。因此,interledger协议的中心组件是interledger地址。
在路由支付金额较大时,他们在路由过程中选择的连接器和中间分类帐可能不受信任。底层账簿提供的保留可用于保护发送方和接收方免受此风险。在这种情况下,ILP数据包包含密码条件和到期日期。
与互联网协议一样,Interledger在名称,地址和路由之间进行区分。
“一个名字表示我们寻求的东西,一个地址表示它在哪里,一条路线表示如何到达那里,互联网协议主要处理地址,它是更高层次(即端到端或应用)协议的任务从名字到地址的映射。“
interledger模块将interledger地址转换为本地分类帐地址。连接器和本地分类帐接口分别负责将地址转换为交错路由器和本地路由。
地址是由句点(.
)字符分隔的段组成的分层结构字符串。
g.us.bank1.bob
有关ILP地址的更多信息可在ILP地址规范中找到。
分类帐中地址到本地帐户的映射由分类帐协议定义。
连接器实施interledger协议,在分类账之间转发付款,并将错误传递回路径。连接器实现(或包含一个实现的模块)账户分类帐的账簿协议。
连接器还实现连接器到连接器协议(CCP)来协调路由和其他交互控制器信息。
随着Interledger付款的准备或接收方的出现,任何时候都可能产生错误。被通知被拒绝的传出传输的连接器必须拒绝相同的传入传输并发生相同的错误。
连接器应该forwardedBy
在错误中的字段中包含它们的ILP地址。连接器不应该以任何其他方式修改错误。
请参阅下面的ILP错误格式和ILP错误代码。
有两种类型的支付包:交付和转发。交付的付款指定应该到达目的地的金额,转发的付款不能。请注意,转发的付款仍处于试验阶段,其定义可能会随时更改或不再使用。
以下是已交付和转发的ILP支付数据包格式中的字段摘要:
领域 | 类型 | 简短的介绍 |
---|---|---|
类型 | UINT8 | 总是1 ,表示这个ILP数据包是一个ILP支付数据包(类型1) |
长度 | 长度决定因素 | 指示数据包剩余部分有多少个字节 |
量 | 答:64 | 目的地帐户应该接收的金额,在目的地分类账的资产中计价 |
帐户 | 地址 | 与目标帐户相对应的地址 |
数据 | OCTET STRING | 附加到付款的传输层数据 |
扩展 | 长度决定因素 | 总是 0 |
这是一个例子:
类型 | 长度,8+(1 + 14)+(1 + 3)+ 1 = 28 | 金额(123,000,000)... |
---|---|---|
1 | 28 | 0 0 0 0 7 84 |
..金额(123,000,000) | 长度 | 地址...('g.us.') |
---|---|---|
212 192 | 14 | 103 46 117 115 46 |
...地址('nexus.bo')... |
---|
110 101 120 117 115 46 98 111 |
...地址('b') | 长度 | 数据 | 扩展 |
---|---|---|---|
98 | 3 | 4 16 65 | 0 |
领域 | 类型 | 简短的介绍 |
---|---|---|
类型 | UINT8 | 始终10 ,表示该ILP数据包是ILP转发的支付数据包(类型10) |
长度 | 长度决定因素 | 指示数据包剩余部分有多少个字节 |
帐户 | 地址 | 与目标帐户相对应的地址 |
数据 | OCTET STRING | 附加到付款的传输层数据 |
扩展 | 长度决定因素 | 总是 0 |
例:
类型 | 长度,(1 + 14)+(1 + 3)+ 1 = 20 | 长度 | 地址...('g.us.nexus.bo') |
---|---|---|---|
10 | 20 | 14 | 103 46 117 115 46 110 101 120 117 115 46 98 111 |
...地址('b') | 长度 | 数据 | 扩展 |
---|---|---|---|
98 | 3 | 4 16 65 | 0 |
让我们更加紧密地看一下这三个重要领域:amount
,address
,和data
。
UInt64 ::= INTEGER (0..18446744073709551615)
接收分类账资产类型的离散单位金额。请注意,金额按收款分类帐中最小的不可分割单位计算。
-- Readable names for special characters that may appear in ILP addresses
hyphen IA5String ::= "-"
period IA5String ::= "."
underscore IA5String ::= "_"
tilde IA5String ::= "~"
-- A standard interledger address
Address ::= IA5String
(FROM
( hyphen
| period
| "0".."9"
| "A".."Z"
| underscore
| "a".."z"
| tilde )
)
(SIZE (1..1023))
Interledger接收帐户的地址。
OCTET STRING (SIZE(0..32767))
附加到付款的任意数据。内容由传输层协议定义。
以下是ILP错误格式中的字段摘要:
领域 | 类型 | 简短的介绍 |
---|---|---|
码 | IA5String | ILP错误代码 |
triggeredBy | 地址 | 最初发出错误的实体的ILP地址 |
信息 | UTF8字符串 | 提供用于调试目的的错误数据 |
数据 | OCTET STRING | 提供用于调试目的的错误数据 |
IA5String (SIZE(3))
错误代码。例如,F00
。请参阅ILP错误代码以获取错误代码列表及其含义。
Address
ILP最初发出错误的实体的地址。
UTF8String (SIZE(0..8191))
人类可读的错误消息。当发出拒绝时,实现(接收器或连接器)可能包含额外的调试信息。当包含额外的调试信息时,实现应该使用这种格式Error message. key1=value1 key2=value2
,例如:
Invalid destination. destination=example.us.bob
该字段必须编码为UTF-8。
OCTET STRING (SIZE(0..32767))
机器可读的数据。格式是为每个错误代码定义的。实现必须遵循code
字段中给出代码的正确格式。解析拒绝数据包时,实现必须忽略该data
字段中的额外字节。
弃用:改为使用ILP拒绝格式。
以下是ILP错误格式中的字段摘要:
领域 | 类型 | 简短的介绍 |
---|---|---|
码 | IA5String | ILP错误代码 |
名称 | IA5String | ILP错误代码名称 |
triggeredBy | 地址 | 最初发出错误的实体的ILP地址 |
forwardedBy | 地址序列 | 中继错误消息的连接器的ILP地址 |
triggeredAt | GeneralizedTime | 错误最初发布的时间 |
数据 | OCTET STRING | 提供用于调试目的的错误数据 |
IA5String (SIZE(3))
错误代码。例如,F00
。请参阅ILP错误代码以获取错误代码列表及其含义。
IA5String
错误名称。例如,Bad Request
。请参阅ILP错误代码以获取错误代码列表及其含义。
ILP的实现不应该依赖于name
而不是code
。该名称主要是为了便于人类调试而提供的。如果name
不匹配code
,则code
是错误的权威标识符。
ILP最初发出错误的实体的地址。如果最初省略错误的实体是分类账,这可能是地址前缀。
ILP中继错误消息的连接器的地址。
GeneralizedTime
错误最初发布的日期和时间。这必须以UTC + 0(Z)时区表示。
OCTET STRING (SIZE(0..8192))
错误数据主要用于调试目的。发出错误的系统应该包含关于该问题的其他解释或上下文。
在ILP之上构建的协议定义了某些错误的行为,应该指定错误的编码格式data
。
除非另有规定,否则data
应编码为UTF-8。
受到HTTP状态码的启发,ILP错误根据调用者在得到给定错误时的预期行为进行分类。
最终错误表明付款无效,除非详细信息发生变化,否则不应重试。
码 | 名称 | 描述 | 数据字段 |
---|---|---|---|
F00 | 错误的请求 | 通用发件人错误。 | (空) |
F01 | 无效的数据包 | ILP数据包在语法上无效。 | (空) |
F02 | 无法访问 | 无法转发付款,因为目的地ILP地址错误或连接器没有到目的地的路线。 | (空) |
F03 | 无效金额 | 该金额无效,例如其包含的精度数字比目的地账本上可用的精度数字更多,或金额大于现有资产的总金额。 | (空) |
F04 | 目的地金额不足 | 接收方认为金额不足,例如您试图用10美元支付100美元的发票。 | (空) |
F05 | 错误的情况 | 收款人产生了不同的条件,无法完成付款。 | (空) |
F06 | 意外付款 | 接收者不期待这样的付款(备忘录和目的地址在这种组合中没有意义,例如,如果接收者不理解所使用的传输协议) | (空) |
F07 | 无法接收 | 由于受到限制,接收方无法接受此付款。例如,付款会使收款人超过其最大账户余额。 | (空) |
F99 | 应用程序错误 | 保留用于应用层协议。应用程序可以使用除Application Error 。以外的名称。 |
(空) |
临时错误表明接收方或中间系统出现意外或可能很快解决的故障。发件人应该再次重试相同的付款,可能会在短暂的延迟后。
码 | 名称 | 描述 | 数据字段 |
---|---|---|---|
T00 | 内部错误 | 一般的意外异常。这通常表示错误或未处理的错误情况。 | (空) |
T01 | 总账无法到达 | 连接器具有到目的地的路线或部分路线,但无法到达下一个分类帐。稍后再试。 | (空) |
T02 | 总账繁忙 | 分类帐由于超载而拒绝请求。稍后再试。 | (空) |
T03 | 连接器忙 | 连接器拒绝因过载而发出的请求。稍后再试。 | (空) |
T04 | 流动性不足 | 连接器想要满足您的要求,但目前没有足够的资金。稍后再试。 | (空) |
T05 | 价格有限 | 发件人发送的付款太多,并且正在通过分类帐或连接器进行费率限制。如果连接器因速率限制而出现此错误,则应该通过其他路线重试付款或对发件人进行T03: Connector Busy 错误响应。 |
(空) |
T99 | 应用程序错误 | 保留用于应用层协议。应用程序可以使用除Application Error 。以外的名称。 |
(空) |
相对误差表明付款没有足够的金钱或时间保证金。但是,无法确定发件人是否提供了足够的误差范围,或者路径突然变得太慢或流动性不足。发件人可以以较大的安全余量重新尝试付款。
码 | 名称 | 描述 | 数据字段 |
---|---|---|---|
R00 | 传输超时 | 转移超时,意味着链中的下一方没有回应。这可能是因为你将你的超时设置得太低或者因为看起来比它应该看起来更长。发件人可以再次以较高的到期时间再次尝试,但他们不应该无限期地这样做,或者恶意连接器可能导致他们在不合理的长时间内捆绑他们的钱。 | (空) |
R01 | 源数量不足 | 在付款准备之前,发件人没有发送足够的钱或汇率发生变化。发件人可以再次尝试更高的金额,但他们不应该无限期地这样做,或者恶意连接器可以从他们那里窃取金钱。 | (空) |
R02 | 超时时间不足 | 连接器无法转发付款,因为超时太短而无法减少其安全余量。发件人可以再次以较高的到期时间再次尝试,但他们不应该无限期地这样做,或者恶意连接器可能导致他们在不合理的长时间内捆绑他们的钱。 | (空) |
R99 | 应用程序错误 | 保留用于应用层协议。应用程序可以使用除Application Error 。以外的名称。 |
(空) |
这种类型的ILP数据包附加到配送中,并携带发送方可用于进一步付款的附加传输层信息。以下是ILP履行数据格式中的字段摘要:
领域 | 类型 | 简短的介绍 |
---|---|---|
数据 | OCTET STRING | 传输层履行数据 |
考虑有效载荷4 16 65
(有效载荷长度是3
)。信封内容的长度将是1+3+1 = 5
。ILP数据包类型始终9
用于执行数据,并且扩展总是0
如此(并且在软件模块(如分类器插件)之间传递)时,生成的ILP数据包将如下所示:
类型 | 内容长度 | 净荷长度 | 数据 | 扩展 |
---|---|---|---|---|
9 | 五 | 3 | 4 16 65 | 0 |
OCTET STRING (SIZE(0..32767))
随附的履行数据。内容由传输层协议定义。
参见ASN.1定义。
以下初始条目应添加到Interledger标题类型注册表中,以在(建议的URI)http://www.iana.org/assignments/interledger-header-types上创建和维护:
标题类型ID | 协议 | 消息类型 |
---|---|---|
1 | ILP | IlpPayment |
2 | ILQP | QuoteLiquidityRequest |
3 | ILQP | QuoteLiquidityResponse |
4 | ILQP | QuoteBySourceAmountRequest |
五 | ILQP | QuoteBySourceAmountResponse |
6 | ILQP | QuoteByDestinationAmountRequest |
7 | ILQP | QuoteByDestinationAmountResponse |
8 | ILP | IlpError |
9 | ILP | IlpFulfillmentData |
10 | ILP | IlpForwardedPaymentData |
11 | ILP | IlpRejectionData |