本文主要是介绍瑞波Ripple概念解析-发行货币(官方文档不完全翻译),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
已发行货币概览
XRP以外的所有货币都可以在XRP账本中表示为已发行货币。这些数字资产(有时称为“发行”或“借条”)在地址间的会计关系中被称为“信任关系”。发行的货币通常被认为是来自一个角度的负债,而来自另一个角度的资产被认为是负债,因此信任额度的平衡是负面的还是积极的,取决于您从哪个方面来看待。任何地址都可以自由发行(非XRP)货币,仅受其他地址愿意持有多少的限制。
如果使用相同的货币代码,发行的货币可以通过多个发行人和持有人进行“Ripple”。这在某些情况下很有用,但会在其他情况下导致意想不到的行为。您可以使用信任行上的NoRipple标志来防止这些信任行波动。
发行的货币可以通过XRP进行交易,也可以在XRP账本中的去中心化交易所进行交易。
在典型模型中,发行货币与XRP账本外的货币或其他资产的持有挂钩。称为网关的货币发行人处理存款和提款,以便在XRP账本外以外币兑换XRP账本中已发行货币的等值余额。有关如何运行网关的更多信息,请参阅成为XRP账本网关。
XRP账本中还有其他用于已发行货币的使用情况。例如,您可以通过向次要地址发放固定数量的货币,然后“扔掉发行人(网关)的钥匙”来创建“初始投币产品”(ICO)。
警告:ICO可能在美国被监管为证券。
Ripple强烈建议在从事任何金融服务业务之前研究相关规定。
已发行货币属性
XRP账本中的所有已发行货币都存在于信任线中,在账本数据中表示为RippleState对象。要创建发行货币,发行地址将付款交易发送到与发行方关联的信任线的地址,该地址对该币种的限额为非零。(您也可以通过这种信任线来创建已发行货币)。您可以通过将发行的货币发回给发行人来清除已发行的货币。
货币发行人可以定义一个百分比转账费用来扣除双方对已发行货币进行的交易。
地址也可以冻结已发行的货币,这对企业遵守其管辖范围内的财务条例可能有用。如果您不需要此功能并且不想冻结货币,则可以放弃您的地址冻结个别信任关系并撤销全局冻结的功能。XRP不能被冻结。
发行货币旨在能够表示任何种类的货币或资产,包括具有非常小或非常大的名义值的货币或资产。有关货币代码类型和已发行货币表示的数字限制的详细技术信息,请参阅货币格式参考。
信任线和发行
通常情况下,XRP账本中的已发行货币代表XRP账本外世界网关持有的价值。当用户通过将XRP账户余额返还给发行人来赎回XRP账户余额时,XRP账户中发行这些资金的地址预计将在XRP账户之外支付余额。
由于计算机程序不能强迫某人在外界承诺,因此信任线代表了发行人有多少信任可以代您持有利益。由于一个大型的信誉良好的金融机构比你的破产室友更有可能偿还你的钱,你可以在XRP账本中对每个信托额度设定不同的限制,以表明你愿意让发行人“欠”的最大金额。如果发行人违约或倒闭,您可能会损失那么多钱,因为您在XRP账本中持有的余额不能再换成其他地方的等值余额。(您仍然可以在XRP账本中保留或交易已发行货币,但可能不再有任何理由认为该已发行货币是值钱的。)
有两种情况下,你可能在一个信任线上持有比你的限额更多的余额:当您通过获得更多的该货币交易,或当你减少对你的信任线的限制。
由于信任线占用账本中的空间,因此信任线会增加帐户必须保留的XRP。这适用于扩展信任的帐户,而不适用于接收该帐户的帐户。
每个信任线都特定于特定的货币代码。两个账户之间可以有任意数量的不同的货币代码之间的信任线,但对于任何给定的货币代码,在任一方向只有一条信任线。
信任线设置
信任线在账本的状态数据中表示为RippleState对象。单个RippleState对象表示在任一方向或两个方向上信任线的可能性:它对每一方都有限制属性及其他一些设置,但是双方之间有净余额。
信任线的状态默认是无信任线。
所有信任线标志的默认状态都是关闭的,除了NoRipple标志的默认状态取决于DefaultRipple标志。
授权信任线
XRP账本的授权信托行功能使货币发行人能够限制谁可以持有其发行的(非XRP)货币,以便未知的XRP账本地址不能持有这些货币。授权信任线功能仅适用于已发行货币,对XRP没有影响。
要使用授权信任线功能,请在您的发行地址上启用RequireAuth标志。这样做后,您的发行地址可以发送TrustSet事务来授权来自其他地址的信任线。在启用RequireAuth的情况下,如果您的发行地址的信任线路已获得授权,其他地址就能持有您的地址发放的资金。
授权托管行的交易必须由发行地址签署,这不幸意味着该地址的风险敞口增加。启用了RequireAuth的XRP账本发送资金的过程如下所示:
- 发行网关将其发行地址发布给客户。
- 客户发送一个TrustSet交易来创建一个信任线,从她的XRP账本地址到网关的发行地址。这表明她愿意持有由网关发行的特定货币,达到特定的数字限制。
- 网关的发布地址发送授权客户信任线的TrustSet交易。
提示:在客户创建之前,发行网关可以预先授权信任线(步骤3)。这将创建一个具有零限制的信任线,以便客户的TrustSet交易(步骤2)设置预授权信任线的限制。(需要TrustSetAuth修订,自2016-07-19以来已在生产XRP账本中启用。)
RequireAuth设置
该RequireAuth
设置(requireAuthorization
在RippleAPI中)可防止所有交易对手持有地址发行的余额,除非发行地址已明确批准与该交易对手有关该货币的信任额度。
作为预防措施,Ripple建议发行网关总是在运行地址和备用地址启用RequireAuth
,从不批准任何信任线到这些地址。这可以防止偶然情况下操作地址和备用地址在XRP账本中发布货币。这是一个纯粹的预防措施,并不会阻止这些地址转移发行地址创建的已发行货币,因为它们打算这样做。
要使用授权信任线功能,发行人还必须在其发行地址上启用RequireAuth
。这样做后,发行地址必须提交TrustSet
交易以批准来自客户的每条信任线。
注意:只有在XRP账本中账户没有信任线和没有挂单的情况下才能启用RequireAuth
,因此您必须决定是否在XRP账本中开始交易之前使用它。
启用RequireAuth
以下是使用本地托管rippled
的提交方法发送AccountSet事务以启用RequireAuth标志的示例:(无论地址是发布地址,操作地址还是备用地址,此方法的工作方式都是相同的。 )
请求:
POST http:
//localhost:5005/
{
"method"
:
"submit",
"params"
: [
{
"secret"
:
"sn3nxiW7v8KXzPzAqzyHXbSSKNuN9",
"tx_json"
: {
"Account"
:
"rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v",
"Fee"
:
"15000",
"Flags"
:
0,
"SetFlag"
:
2,
"TransactionType"
:
"AccountSet"
}
}
]
}
警告:切勿将密钥提交给不受控制的服务器。不要通过网络发送未加密的密钥。
检查帐户是否已启用RequireAuth
要查看某个帐户是否启用了RequireAuth设置,请使用account_info方法查找该帐户。将Flags
字段的值(在result.account_data
对象中)与为AccountRoot账本对象定义的按位标志进行比较。
如果Flags
按值的结果AND lsfRequireAuth
标志值(0x00040000)不为零,那么帐户启用RequireAuth。如果结果为零,那么该帐户已禁用RequireAuth。
授权信任线
如果您使用授权信任线功能,则除非您首先向您授予信任热线,否则其他人无法持有您发行的余额。如果您发行多种货币,则必须为每种货币单独授权信任额度。
授权信托行,提交TrustSet交易从发行地址,以及用户信任作为issuer
的LimitAmount
。将value
(信任它们的金额)保留为0,并为交易启用tfSetfAuth标志。
以下是使用本地托管rippled
的提交方法发送TrustSet交易的一个示例,该交易授权客户地址rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn从发行地址rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW持有USD的发行:
请求:
POST http:
//localhost:8088/
{
"method"
:
"submit",
"params"
: [
{
"secret"
:
"sn3nxiW7v8KXzPzAqzyHXbSSKNuN9",
"tx_json"
: {
"Account"
:
"rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
"Fee"
:
"15000",
"TransactionType"
:
"TrustSet",
"LimitAmount"
: {
"currency"
:
"USD",
"issuer"
:
"rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"value"
:
0
},
"Flags"
:
65536
}
}
]
}
警告:切勿将密钥提交给不受控制的服务器。不要通过网络发送未加密的密钥。
检查信任线是否授权
要查看信任线是否已被授权,请使用account_lines方法查找信任线。在请求中,提供客户在account
现场的地址和发货人在peer
现场的地址。
在响应的result.lines
数组中,找到其currency
字段指示它代表所需货币的信任线的对象。如果该对象有一个peer_authorized
带有值的字段true
,则发行者(您用作请求peer
字段的地址)已授权信任线。
冻结已发行的货币
没有人可以冻结XRP。对于XRP账本中的其他货币,其发行人可以冻结他们发行的非XRP余额。此功能对于满足法规要求或调查可疑活动时很有用。
提示:没有人可以冻结XRP。
有三个与冻结相关的设置:
- 个人冻结 - 冻结一个交易对手。
- 全球冻结 - 冻结所有交易对手。
- 不冻结 - 永久放弃冻结个别交易对手的能力,以及终止全球冻结的能力。
冻结功能仅适用于已发行货币。由于没有任何一方在XRP账户中拥有特权地位,冻结功能无法阻止交易对手在XRP或其他交易对手发行的基金中进行交易。没有人,甚至连Ripple都不能冻结XRP。
无论待冻结的余额是正数还是负数,都可以制定所有冻结设置。货币发行人或货币持有人可以冻结信任额度; 然而,货币持有人冻结发行人的影响很小。
个人冻结
在个别冻结的特点是在一个设定的信任线。当发行地址启用个人冻结设置时,以下规则适用于该信任额度的币种:
- 付款仍然可以直接在冻结的信任关系的两方之间进行。
- 除了向发行人直接支付外,该信任线的交易对手不能再降低冻结信任额度的余额。交易对手只能将冻结的发行直接发送给发行人。
- 交易对手仍然可以从冻结的信任热线获得其他人的付款。
- 对方提出的出售在冻结信托上发行的货币的报价被认为是没有资金的。
提醒:信任线不包含XRP。XRP不能被冻结。
如果金融机构出现可疑活动或违反金融机构的使用条款,金融机构可冻结将其与对方链接的信任线。金融机构还应冻结与XRP账本相关的金融机构运营的其他系统中的交易对手。(否则,通过向金融机构发送付款,地址可能仍然能够进行不希望的活动。)
个人地址可以冻结其信任线到金融机构。这对机构和其他用户之间的交易没有影响。但是,它确实阻止其他地址,包括操作地址,将该金融机构的发行发送到个人地址。这种单独冻结对优惠没有影响。
个人冻结只适用于单一货币。要冻结与特定交易对手的多种货币,地址必须启用单独冻结各个货币的信任额度。
如果地址启用了“ 无冻结”设置,则无法启用“单独冻结”设置。
全球冻结
在全球冻结功能上的地址的设置。当发行地址启用全球冻结功能时,以下规则适用于所有发行的货币:
- 除向发行人直接支付外,冻结发行地址的所有交易对手不能再将其信托额度中的余额减少至冻结地址。(这也影响任何操作地址。)
- 冻结发行地址的对手方仍可直接发送和接收付款地址的付款。
- 所有出售冻结地址发行的货币的报价都被认为没有资金。
提醒:地址不能发布XRP。全局冻结不适用于XRP。
如果操作地址的密钥被泄露,即使重新获得对此类地址的控制权后,在金融机构的发行地址上启用全球冻结可能也很有用。这会阻止资金流入,防止攻击者逃脱更多的金钱,或者至少让追踪事件更容易。除了在XRP账本中制定全球冻结之外,金融机构还应该暂停其与外部系统连接的活动。
如果金融机构打算迁移到新的发行地址,或者金融机构打算停止经营,启用全球冻结也可能有用。这将资金锁定在特定的时间点,因此用户不能将它们换成其他货币。
全球冻结适用于该地址发行和持有的所有货币。您只能为一种货币启用Global Freeze。如果您想要冻结某些货币而非其他货币,则应为每种货币使用不同的地址。
地址始终可以启用全局冻结设置。但是,如果地址启用了“ 无冻结”设置,则永不会禁用“全局冻结”。
没有冻结
在没有冻结功能是对永久放弃冻结对手的发行货币的能力的地址的设置。企业可以使用此功能将其发行的资金视为“更像物理资金”,因为企业无法干涉客户之间的交易。
提醒:XRP已经不能被冻结。不冻结功能仅适用于在XRP账本中发行的其他货币。
NoFreeze设置有两个作用:
- 发行地址不能再将信任线上的单个冻结启用给任何交易对手。
- 发行地址仍然可以启用Global Freeze制定全局冻结,但地址不能禁用 Global Freeze。
XRP账簿不能强制金融机构履行其发行资金所代表的义务,因此放弃启用全球冻结的能力无法保护客户。但是,放弃禁用 Global Freeze的功能可确保Global Freeze功能不会对某些客户不公平地使用。
无冻结设置适用于发往和来自地址的所有货币。如果您希望能够冻结某些货币而不冻结其他货币,则应为每种货币使用不同的地址。
您只能通过由地址的主密钥秘密签名的交易启用“不冻结”设置。您不能使用常规密钥或多重签名的交易来启用冻结。
技术细节
启用或禁用单个冻结
运用 rippled
要启用或禁用特定信任线上的单个冻结,请发送TrustSet
交易。使用该tfSetFreeze
标志来启用冻结,并使用该tfClearFreeze
标志来禁用它。交易的领域应该如下:
领域 | 值 | 描述 |
帐户 | 串 | 用于启用或禁用冻结的XRP账本地址。 |
TRANSACTIONTYPE | 串 |
|
LimitAmount | 目的 | 定义要冻结的信任线的对象。 |
LimitAmount.currency | 串 | 信任线的货币(不能是XRP) |
LimitAmount.issuer | 串 | 冻结交易对手的XRP账本地址 |
LimitAmount.value | 串 | 作为引用的数字,您信任该交易对手向您发行的货币数量。从金融机构的角度来看,这通常是 |
旗 | 数 | 要启用冻结,请在启用位 |
设定Fee
,Sequence
以及Last
账本
Sequence
参数的典型方式。
提交TrustSet事务以使用WebSocket API启用单个冻结的示例:
{
"id"
:
12,
"command"
:
"submit",
"tx_json"
: {
"TransactionType"
:
"TrustSet",
"Account"
:
"rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Fee"
:
"12000",
"Flags"
:
1048576,
"Last账本Sequence"
:
18103014,
"LimitAmount"
: {
"currency"
:
"USD",
"issuer"
:
"rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
"value"
:
"110"
},
"Sequence"
:
340
},
"secret"
:
"s████████████████████████████",
"offline"
:
false,
"fee_mult_max"
:
1000
}
警告:切勿将密钥发送给不受信任的服务器或不安全的通道。
使用RippleAPI
要启用或禁用特定信任线上的单个冻结,请使用prepareTrustline方法准备Trustline交易。参数的字段应该设置如下:trustline
领域 | 值 | 描述 |
货币 | 串 | 冻结的信任线的货币(不能是XRP) |
对手 | 串 | 交易对手的XRP账本地址 |
限制 | 串 | 作为引用的数字,您信任该交易对手向您发行的货币数量。从金融机构的角度来看,这通常是 |
冻结的 | 布尔 |
|
其余的交易流程与其他交易相同。
用于在信任线上启用单独冻结的示例JavaScript(ECMAScript 6)代码:
const{RippleAPI} =
require(
'ripple-lib');
constapi =
newRippleAPI({
server
:
'wss://s1.ripple.com'// Public rippled server
});
api.on
(
'error', (errorCode, errorMessage) => {
console
.log(
errorCode +
': '+ errorMessage);
});
constissuing_address =
'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn';
constissuing_secret =
's████████████████████████████';
// Best practice: get your secret from an encrypted
// config file instead
constaddress_to_freeze =
'rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v';
constcurrency_to_freeze =
'USD';
api.connect
().then(
() =>{
// Look up current state of trust line
const
options = {
counterparty: address_to_freeze,
currency
: currency_to_freeze};
console
.log(
'looking up', currency_to_freeze,
'trust line from',
issuing_address,
'to', address_to_freeze);
return
api.getTrustlines(issuing_address, options);
}).then(
data =>{
// Prepare a trustline transaction to enable freeze
let
trustline = {};
if
(data.length !==
1) {
console
.log(
'trustline not found, making a default one');
trustline = {
currency
: currency_to_freeze,
counterparty
: address_to_freeze,
limit
:
0
};
}
else{
trustline = data[
0].specification;
console
.log(
'trustline found. previous state:', trustline);
}
trustline.frozen =
true;
console
.log(
'preparing trustline transaction for line:', trustline);
return
api.prepareTrustline(issuing_address, trustline);
}).then(
prepared_tx =>{
// Sign and submit the trustline transaction
console
.log(
'signing tx:', prepared_tx.txJSON);
const
signed1 = api.sign(prepared_tx.txJSON, issuing_secret);
console
.log(
'submitting tx:', signed1.id);
return
api.submit(signed1.signedTransaction);
}).then(
() =>{
return
api.disconnect();
}).catch(
console.error);
启用或禁用全局冻结
运用 rippled
要在地址上启用全局冻结,请使用该字段中AccountSet
的asfGlobalFreeze标志值发送事务SetFlag
。要禁用Global Freeze,请将asfGlobalFreeze标志值ClearFlag
替换为该字段。
提交AccountSet事务以使用WebSocket API启用Global Freeze的示例:
{
"id"
:
12,
"command"
:
"submit",
"tx_json"
: {
"TransactionType"
:
"AccountSet",
"Account"
:
"rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"Fee"
:
"12000",
"Flags"
:
0,
"SetFlag"
:
7,
"Last账本Sequence"
:
18122753,
"Sequence"
:
349
},
"secret"
:
"s████████████████████████████",
"offline"
:
false,
"fee_mult_max"
:
1000
}
警告:切勿将密钥发送给不受信任的服务器或不安全的通道。
使用RippleAPI
要启用或禁用地址上的全局冻结,请使用prepareSettings方法准备设置事务。该参数应该是一个对象集,如下所示:settings
领域 | 值 | 描述 |
globalFreeze | 布尔 |
|
其余的交易流程与其他交易相同。
用于在地址上启用Global Freeze的示例JavaScript(ECMAScript 6)代码:
const{RippleAPI} =
require(
'ripple-lib');
constapi =
newRippleAPI({
server
:
'wss://s1.ripple.com'// Public rippled server
});
api.on
(
'error', (errorCode, errorMessage) => {
console
.log(
errorCode +
': '+ errorMessage);
});
constissuing_address =
'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn';
constissuing_secret =
's████████████████████████████';
// Best practice: get your secret from an encrypted
// config file instead
api.connect
().then(
() =>{
// Prepare a settings transaction to enable global freeze
const
settings = {
'globalFreeze'
:
true
};
console
.log(
'preparing settings transaction for account:',
issuing_address);
return
api.prepareSettings(issuing_address, settings);
}).then(
prepared_tx =>{
// Sign and submit the settings transaction
console
.log(
'signing tx:', prepared_tx.txJSON);
const
signed1 = api.sign(prepared_tx.txJSON, issuing_secret);
console
.log(
'submitting tx:', signed1.id);
return
api.submit(signed1.signedTransaction);
}).then(
() =>{
return
api.disconnect();
}).catch(
console.error);
无法冻结
运用 rippled
要在地址上启用冻结,请在字段中AccountSet
使用asfNoFreeze标志值发送事务SetFlag
。您必须使用主密钥签署此交易。一旦启用,您不能禁用不冻结。
使用WebSocket API提交AccountSet事务以启用No Freeze的示例:
WebSocket请求:
{
"id"
:
12,
"command"
:
"submit",
"tx_json"
: {
"TransactionType"
:
"AccountSet",
"Account"
:
"raKEEVSGnKSD9Zyvxu4z6Pqpm4ABH8FS6n",
"Fee"
:
"12000",
"Flags"
:
0,
"SetFlag"
:
6,
"Last账本Sequence"
:
18124917,
"Sequence"
:
4
},
"secret"
:
"s████████████████████████████",
"offline"
:
false,
"fee_mult_max"
:
1000
}
警告:切勿将密钥发送给不受信任的服务器或不安全的通道。
使用RippleAPI
要在地址上启用冻结,请使用prepareSettings方法准备设置交易。一旦启用,您不能禁用不冻结。该参数应该是一个对象集,如下所示:settings
领域 | 值 | 描述 |
noFreeze | 布尔 |
|
您必须使用主密钥签署此交易。其余的交易流程与其他交易相同。
用于在地址上启用无冻结的示例JavaScript(ECMAScript 6)代码:
const{RippleAPI} =
require(
'ripple-lib');
constapi =
newRippleAPI({
server
:
'wss://s1.ripple.com'// Public rippled server
});
api.on
(
'error', (errorCode, errorMessage) => {
console
.log(
errorCode +
': '+ errorMessage);
});
constissuing_address =
'rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v';
constissuing_secret =
'snnDVkSW3aV6jvMJTPdCiE2Qxv1RW';
// Best practice: get your secret from an encrypted
// config file instead
api.connect
().then(
() =>{
// Prepare a settings transaction to enable no freeze
const
settings = {
'noFreeze'
:
true
};
console
.log(
'preparing settings transaction for account:',
issuing_address);
return
api.prepareSettings(issuing_address, settings);
}).then(
prepared_tx =>{
// Sign and submit the settings transaction
console
.log(
'signing tx:', prepared_tx.txJSON);
const
signed1 = api.sign(prepared_tx.txJSON, issuing_secret);
console
.log(
'submitting tx:', signed1.id);
return
api.submit(signed1.signedTransaction);
}).then(
() =>{
return
api.disconnect();
}).catch(
console.error);
检查单个冻结
运用 rippled
要查看信任线是否启用了单独冻结,请使用具有以下参数的account_lines方法:
领域 | 值 | 描述 |
帐户 | 串 | 发行人的XRP账本地址 |
窥视 | 串 | 交易对手的XRP账本地址 |
账本_index | 串 | 使用 |
该响应包含一系列信任线,对于发行地址和交易对手所链接的每种货币。在每个信任线对象中查找以下字段:
领域 | 值 | 描述 |
冻结 | 布尔 | (可以省略) |
freeze_peer | 布尔 | (可以省略) |
示例WebSocket请求检查单个冻结:
{
"id"
:
15,
"command"
:
"account_lines",
"account"
:
"rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"账本"
:
"validated",
"peer"
:
"rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW"
}
示例WebSocket响应:
{
"id"
:
15,
"status"
:
"success",
"type"
:
"response",
"result"
: {
"account"
:
"rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"lines"
: [
{
"account"
:
"rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
"balance"
:
"10",
"currency"
:
"USD",
"freeze"
:
true,
"limit"
:
"110",
"limit_peer"
:
"0",
"peer_authorized"
:
true,
"quality_in"
:
0,
"quality_out"
:
0
}
]
}
}
该字段"freeze": true
表示rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn已启用USD信任线上的单独冻结至rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW。缺少字段"freeze_peer": true
表示交易对手未冻结信任线。
使用RippleAPI
要查看信任线是否启用了独立冻结,请使用具有以下参数的getTrustlines
方法:
领域 | 值 | 描述 |
地址 | 串 | 发行人的XRP账本地址 |
options.counterparty | 串 | 交易对手的XRP账本地址 |
该响应包含一系列信任线,对于发行地址和交易对手所链接的每种货币。在每个信任线对象中查找以下字段:
领域 | 值 | 描述 |
specification.frozen | 布尔 | (可以省略) |
counterparty.frozen | 布尔 | (可以省略) |
用于检查信任线是否被冻结的示例JavaScript(ECMAScript 6)代码:
const{RippleAPI} =
require(
'ripple-lib');
constapi =
newRippleAPI({
server
:
'wss://s1.ripple.com'// Public rippled server
});
api.on
(
'error', (errorCode, errorMessage) => {
console
.log(
errorCode +
': '+ errorMessage);
});
constmy_address =
'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn';
constcounterparty_address =
'rUpy3eEg8rqjqfUoLeBnZkscbKbFsKXC3v';
constfrozen_currency =
'USD';
api.connect
().then(
() =>{
// Look up current state of trust line
const
options = {
counterparty: counterparty_address,
currency
: frozen_currency};
console
.log(
'looking up', frozen_currency,
'trust line from',
my_address,
'to', counterparty_address);
return
api.getTrustlines(my_address, options);
}).then(
data =>{
if
(data.length !==
1) {
throw'should only be 1 trust line per counterparty+currency pair'
;
}
const
trustline = data[
0];
console
.log(
'Trust line frozen from our side?',
trustline.specification.frozen ===
true);
console
.log(
'Trust line frozen from counterparty\'s side?',
trustline.counterparty.frozen ===
true);
}).then(
() =>{
return
api.disconnect();
}).catch(
console.error);
检查全局冻结和无冻结
运用 rippled
要查看地址是否启用了全局冻结,无冻结或两者,请使用具有以下参数的account_info方法:
领域 | 值 | 描述 |
帐户 | 串 | 发行地址的XRP账本地址 |
账本_index | 串 | 使用 |
account_data.Flags
使用按位与运算符检查响应字段的值:
- 如果
Flags
AND0x00400000
(lsfGlobalFreeze)非零:Global Freeze已启用。 - 如果
Flags
AND0x00200000
(lsfNoFreeze)不为零:不启用冻结。
示例WebSocket请求:
{
"id"
:
1,
"command"
:
"account_info",
"account"
:
"rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"账本_index"
:
"validated"
}
WebSocket响应:
{
"id"
:
4,
"status"
:
"success",
"type"
:
"response",
"result"
: {
"account_data"
: {
"Account"
:
"rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"AccountTxnID"
:
"41320138CA9837B34E82B3B3D6FB1E581D5DE2F0A67B3D62B5B8A8C9C8D970D0",
"Balance"
:
"100258663",
"Domain"
:
"6D64756F31332E636F6D",
"EmailHash"
:
"98B4375E1D753E5B91627516F6D70977",
"Flags"
:
12582912,
"账本EntryType"
:
"AccountRoot",
"MessageKey"
:
"0000000000000000000000070000000300",
"OwnerCount"
:
4,
"PreviousTxnID"
:
"41320138CA9837B34E82B3B3D6FB1E581D5DE2F0A67B3D62B5B8A8C9C8D970D0",
"PreviousTxnLgrSeq"
:
18123095,
"Sequence"
:
352,
"TransferRate"
:
1004999999,
"index"
:
"13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8",
"urlgravatar"
:
"http://www.gravatar.com/avatar/98b4375e1d753e5b91627516f6d70977"
},
"账本_hash"
:
"A777B05A293A73E511669B8A4A45A298FF89AD9C9394430023008DB4A6E7FDD5",
"账本_index"
:
18123249,
"validated"
:
true
}
}
在上例中,Flags
值为12582912.这表示已启用以下标志:lsfGlobalFreeze,lsfDefaultRipple,如以下JavaScript代码所示:
varlsfGlobalFreeze =
0x00400000;
varlsfNoFreeze =
0x00200000;
varcurrentFlags =
12582912;
console.log(
currentFlags & lsfGlobalFreeze);
//4194304
//therefore, Global Freeze is enabled
console.log(
currentFlags & lsfNoFreeze);
//0
//therefore, No Freeze is not enabled
使用RippleAPI
要查看某个地址是否已启用全局冻结,无冻结或全部冻结,请使用具有以下参数的getSettings
方法:
领域 | 值 | 描述 |
地址 | 串 | 发行地址的XRP账本地址 |
在响应对象中查找以下值:
领域 | 值 | 描述 |
noFreeze | 布尔 | (可以省略) |
globalFreeze | 布尔 | (可以省略) |
示例JavaScript(ECMAScript 6)代码来检查地址是否启用了Global Freeze或No Freeze:
const{RippleAPI} =
require(
'ripple-lib');
constapi =
newRippleAPI({
server
:
'wss://s1.ripple.com'// Public rippled server
});
api.on
(
'error', (errorCode, errorMessage) => {
console
.log(
errorCode +
': '+ errorMessage);
});
constmy_address =
'rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn';
api.connect
().then(
() =>{
// Look up settings object
return
api.getSettings(my_address);
}).then(
settings =>{
console
.log(
'Got settings for address', my_address);
console
.log(
'Global Freeze enabled?',
(settings.globalFreeze ===
true));
console
.log(
'No Freeze enabled?', (settings.noFreeze ===
true));
}).then(
() =>{
return
api.disconnect();
}).catch(
console.error);
也可以看看
- GB-2014-02新功能:余额冻结
- 冻结代码示例
Rippling
在XRP账本中,“Ripple”描述了多个有相同货币信托关系的关联方之间的原子净结算过程。ripple是已发行货币的重要组成部分,因为它允许信任相同发行人的用户将发行人作为被动媒介发送给对方。从某种意义上说,波动就像是一种被动的双向货币兑换令,对于具有相同货币代码但发行人不同的两种货币而言,无限制和1:1汇率。
ripple仅发生在支付的路径上。
对于非发行账户,Ripple可能是不受欢迎的,因为它可以让其他用户与同一货币发行方之间改变债务数量。因此,默认情况下,NoRipple标志会禁用所有信任线上的波动,除非帐户通过启用DefaultRipple标志来默认启用波动。
Ripple的例子
如果调整多条信任线以进行付款,则会出现“波动”。例如,如果爱丽丝欠查理钱,而爱丽丝也欠欠鲍勃钱,那么你可以在XRP账本中用信任线表示这样的情况:
如果鲍伯想要支付3美元给查理,那么他可以说,“爱丽丝,拿你欠我3美元的钱,然后付给查理。” 爱丽丝将一些债务从鲍勃转移给查理。最后,信任线如下所示:
我们称这一过程为两个地址互相支付,通过调整它们之间的信任关系的平衡来“Ripple”。这是XRP账本的一个有用和重要的功能。当地址由使用相同货币代码的信任线链接时发生波动。发行人不需要是相同的:事实上,较大的连锁店总是涉及到更改发行人。
NoRipple标志
非发行账户,尤其是流动性提供者可能持有来自不同费用和政策的不同发行人的余额,通常不希望他们的余额可以波动。
“NoRipple”标志是信任线上的设置。当两条信任线都使用同一地址启用NoRipple时,来自第三方的支付不能通过该信任线上的该地址进行波动。这样可以防止流动性提供者在同一货币的不同发行人之间出现意外的余额变动。
一个帐户可以在单个信任线上禁用NoRipple,这可以允许在包含该信任线的任何对中Rippling。通过启用DefaultRipple标志,该帐户还可以启用全局波动。
例如,想象一下,艾米丽有两个不同的金融机构发行的钱,像这样
现在,查理可以通过荡过艾米丽的地址来支付丹尼尔。例如,如果查理支付丹尼尔10美元:
这可能会让艾米丽感到惊讶,她不认识查理或丹尼尔。更糟糕的是,如果A机构向B机构收取更高的费用来提取资金,这可能会损失Emily的钱。NoRipple标志存在以避免这种情况。如果Emily在两条信任线上设置它,那么付款不能通过使用这两条信任线来影响她的地址。
例如:
现在,上述情景,查理在通过艾米莉的地址荡漾时支付了丹尼尔,不再可能。
细节
NoRipple标志使某些路径无效,因此它们不能用于付款。当且仅当它通过信任线路进入和退出地址节点时,路径才被认为无效,其中NoRipple已经为该地址启用。
DefaultRipple标志
DefaultRipple标志是一个帐户设置,默认情况下可以在所有信任线上Rippling。网关和其他货币发行者必须启用该标志,以便其他地址能够将这些货币发送给他们自己。
有关更多信息,请参阅“成为XRP账本网关”中的DefaultRipple。
使用NoRipple
启用/禁用NoRipple
NoRipple标志只能在信任线上启用,如果地址在该信任线上具有正值或零值余额。这是为了使该特征不能被滥用以履行信托额度平衡所代表的义务。(当然,你仍然可以通过放弃地址来默认。)
在这些rippled
API中,您可以通过发送具有该标志的TrustSet事务来启用NoRipple tfSetNoRipple
标志。您可以使用该tfClearNoRipple
标志禁用NoRipple(启用Ripple)。
在RippleAPI中,您可以通过发送Trustline事务处理事务ripplingDisabled
并将信任线设置为的字段来启用NoRipple标志true
。
查找NoRipple状态
在两个彼此相互信任的账户的情况下,对于每个账户分别跟踪NoRipple标志。
在rippled
API中,您可以使用account_lines方法查找与地址关联的信任线。对于每个信任线,该no_ripple
字段显示当前地址是否已启用该信任线上的NoRipple标志,并且该no_ripple_peer
字段显示对方是否已启用NoRipple标志。
在RippleAPI中,可以使用getTrustlines方法查找与地址关联的信任线。对于每个信任线,该ripplingDisabled
字段显示当前地址是否已启用该信任线上的NoRipple标志,并且该counterparty.ripplingDisabled
字段显示对方是否已启用NoRipple标志。
转移费用
TransferRateXRP账本中的设置允许在XRP账本中发行货币的金融机构向用户收取发送该金融机构发行的货币的转账费用。转账的发送人将根据转账手续费额外收取额度,而转账的收款人将计入预期金额。不同之处在于转让费用成为发行地址的财产,并且不再在XRP账本中进行跟踪。直接向发行账户发送或从发行账户接收时,转账费用不适用,但在从运营地址转账至其他用户时适用。
XRP从来没有转让费,因为它从来没有发行人。
例如,ACME Bank可能会将ACME发行的转账费用设定为0.5%。如果收款人收到2欧元.ACME,发送方必须发送2.01欧元.ACME。交易后,ACME在XRP账本中的未偿债务减少了0.01欧元,这意味着ACME不再需要在支持其XRP账本的账户中持有这一数额。
下图显示了从Alice到Charlie的2 EUR.ACME的XRP账本支付,转账费为1%:
转移支付途径费用
每次转账将通过发行账户将发行通知从一方转移到另一方时,转账手续费将适用。在更复杂的交易中,这可能会发生多次。转让费从最后开始并向后退出,以便最终付款的发送方必须发送足够的费用来支付所有费用。例如:
在这种情况下,Salazar(发送方)持有ACME发行的EUR,并且希望将WayGate发出的100美元交给Rosa(接收方)。FXMaker是一个货币交易者,在订单簿中提供最优惠的价格,每1美元的汇率为1美元.WayGate每0.9欧元.ACME。如果没有转让费,Salazar可以通过发送90欧元向Rosa交付100美元。但是,ACME的转让费为1%,WayGate的转让费为0.2%。意即:
- FXMaker必须发送100.20 USD.WayGate for Rosa才能收到100 USD.WayGate。
- FXMaker目前的询问是90.18 EUR.ACME发送100.20 USD.WayGate。
- 对于FXMaker收到90.18 EUR.ACME,Salazar必须发送91.0818 EUR.ACME。
技术细节
转让费由发行地址上的设置表示。转会费不得低于0%或高于100%,并向下舍入至最接近的0.0000001%。TransferRate设置适用于由同一账户发行的所有货币。如果您希望针对不同货币拥有不同的转账费用百分比,请为每种货币使用不同的发行地址。
注意:v0.80.0中引入并于rippled2017-11-14启用的fix1201修订版将最高转帐费用从有效限制约329%(基于32位整数的最大大小)降至100%。账本可能仍然包含与转移费设定高于100%(一个帐户TransferRate的2000000000)。已经设置的任何转账费用继续以其规定的速率运行。
RippleAPI
在RippleAPI中,转账费用在transferRate字段中指定,表示您必须发送给收款人以获得同一货币的1个单位的小数。甲transferRate的1.005是相当于0.5%的传送费。默认情况下,transferRate设置为免费。值transferRate不能小于1.0或大于2.0。传输速率四舍五入为10位有效数字,包括个位数。价值null是免费的特殊情况,相当于1.0。
金融机构可以从其发行地址发送设置交易以更改其发行。transferRate
您可以transferRate使用getSettings方法检查帐户。
Ripple
在rippledJSON-RPC和WebSocket API中,传输费用在该TransferRate字段中指定,作为一个整数,表示您必须为接收方发送10亿个单位的相同货币。甲TransferRate的1005000000是相当于0.5%的传送费。默认情况下,TransferRate设置为免费。价值TransferRate不得低于1000000000(“0%”费用)或高于2000000000(“100%”费用)。价值0是免费的特殊情况,相当于1000000000。
金融机构可以从其发行地址提交AccountSet交易以更改其发行。TransferRate
您可以TransferRate使用account_info方法检查帐户。如果TransferRate省略,则表示不收费。
发行和运营地址
在XRP账本中,金融机构通常使用多个XRP账本地址来最大限度降低与受损密钥相关的风险。Ripple强烈建议以下角色分离:
- 一个发行地址,也被称为“冷钱包”。该地址是账本中金融机构会计关系的中心,但发送的交易尽可能少。
- 一个或多个操作地址,也称为“热钱包”。自动化的互联网连接系统使用这些地址的密钥来进行日常业务,例如传输给客户和合作伙伴。
- 可选的备用地址,也称为“温暖的钱包”。值得信赖的人类操作员使用这些地址将资金转移到操作地址。
资金生命周期
XRP账本中的所有非XRP货币余额(发行)都与两个XRP账本地址之间的会计关系相关联。当金融机构使用Ripple建议的角色分离时,与该机构相关的资金往往会在一个周期内流动。
当发行地址发送付款时,它会在XRP账本中的会计关系中创建余额。在XRP账本中,用户可以在不同的会计关系中交换余额,所以我们使用术语发行来描述任何非XRP余额。发行地址的角度来看,发行具有负面价值,因为它们是义务。从发行地址的交易方角度看,相同的发行具有正面价值。当发行地址收到付款时,这减少了其义务,消除了发送的发行。
发行地址将通知发送到备用地址,或直接发送到操作地址。备用地址将这些通知发送到操作地址。运营地址将付款发送给其他交易对手,例如流动性提供商,合作伙伴和其他客户。因为所有发行都与发行地址的会计关系相关,发行的付款和交换“Ripple”发行地址。支付将发送方的余额记入与发行地址的会计关系中,并将收款人的余额记入收款人与发行地址的会计关系中。。
发行地址
发行地址就像一个保险库。合作伙伴,客户和运营地址为发行地址创建会计关系(信任线),但该地址尽可能少地发送交易。人工操作员定期从发货地址创建并签署交易,以重新填充备用或运营地址的余额。理想情况下,用于签署这些交易的密钥永远不能从任何连接到互联网的计算机访问。
与保险库不同,发行地址可以直接从客户和合作伙伴处获得付款。由于XRP账本中的所有交易都是公开的,因此自动化系统可以监控发行地址的付款,而无需密钥。
发布地址妥协
如果恶意行为者获知机构发行地址背后的密钥,该行为人可以无限制地创建新的发行版,并将其交易到去中心化交易所。这将使金融机构难以区分合法获得的发行并公平地赎回。如果金融机构失去对其发行地址的控制权,机构必须创建新的发行地址,并且与旧发行地址具有会计关系的所有用户必须与新地址建立新的会计关系。
多个发行地址
金融机构可以从单个发行地址在XRP账本中发行多种货币。但是,有些设置同样适用于从地址发放的所有货币,包括转账费用和全球冻结状态的百分比。如果金融机构希望灵活地针对每种货币管理设置,则机构必须针对每种货币使用不同的发行地址。
操作地址
操作地址就像收银机一样。它代表该机构通过向客户和合作伙伴转移发行款来进行付款。要自动签署交易,操作地址的密钥必须存储在连接到互联网的服务器上。(秘密密钥可以加密存储,但服务器必须解密才能签署事务。)客户和合作伙伴不会,也不应该与操作地址建立会计关系。
每个运营地址的发行量有限。当业务地址的余额变小时,金融机构通过从发行地址或备用地址发送付款来补充它。
操作地址妥协
如果恶意行为者了解到运营地址背后的秘密密钥,金融机构只能损失与该运营地址相同的货币。该机构可以切换到新的运营地址,而无需客户和合作伙伴采取行动。
备份地址
机构为平衡风险和便利而采取的另一个可选步骤是使用“备用地址”作为发布地址与运营地址之间的中间步骤。该机构可以为额外的XRP账本地址提供资金作为备用地址,其密钥不在线存储,但委托给不同的可信用户。
当运营地址资金不足时,受信任的用户可以使用备用地址来重新填充运营地址的余额。当备用地址资金不足时,机构可以使用发行地址在单个交易中将更多货币发送到备用地址,并且备用地址可以根据需要在其间分配该货币。这样可以提高发行地址的安全性,从而可以减少总交易次数,而无需在单个自动化系统的控制下留下太多金钱。
与运营地址一样,备用地址必须与发行地址具有会计关系,而不与客户或合作伙伴有会计关系。适用于操作地址的所有预防措施也适用于备用地址。
备份地址妥协
如果备用地址受到影响,其后果就像一个正在运行的地址受到威胁。恶意行为者可以窃取备用地址所拥有的任何余额,金融机构可以更改为新的备用地址,而无需客户和合作伙伴采取行动。
路径
在XRP账本中,路径定义了一种支付方式,通过中间步骤从发送方到接收方的方式流动。路径通过订单簿连接发送者和接收者来实现跨货币支付。路径还可以实现抵消债务的复杂结算。
XRP账本中的单一付款交易可以使用多条路径,合并来自不同来源的流动性以提供期望的金额。因此,一个事务包括一个路径集合,它是可能的路径集合。路径集中的路径必须以相同货币开始和结束。
由于XRP可以直接发送到任何地址,因此XRP到XRP事务不会使用任何路径。
路径步骤
路径由将发送方连接到付款接收方的步骤组成。每一步都是:
- 用同一种货币在另一个地址上徘徊
- 在订单簿上兑换货币
通过另一个地址荡漾是转移债务的过程。在典型情况下,这涉及到降低发行人对一方的义务并增加对另一方的义务。任何通过信任线路连接的地址之间都可能发生Ripple。请参阅了解NoRipple标志以获取更多Ripple示例。
在货币兑换步骤的情况下,路径步骤指定要改变的货币,但不在订单簿中记录要约的状态。在确认账本之前,交易的规范顺序并不是最终的,因此您无法确定某项交易将采取哪些优惠,直至交易得到验证。(您可以进行有根据的猜测,因为每笔交易在最终账本中执行时都会获得最佳可用优惠。)
在这两种类型的步骤中,每个中间地址的收益和损失大约相等:从信任线到另一个相同货币的信任线的余额波动,或者它们根据先前订购的订单交换货币。在某些情况下,由于转账费用,信任线质量或四舍五入,获得和损失的金额可能并不完全相同。
技术细节
寻找路径
该rippledAPI具有可用于寻路的两种方法。该ripple_path_find方法确实的可能路径组的一次性查找。只有在账本关闭或服务器找到更好的路径时,path_find方法(仅限WebSocket)才会随搜索进行扩展。
rippled通过build_path在签名方法或submit命令(签署和提交模式)的请求中包含字段,您可以在签名时自动填写路径。不过,我们建议单独进行寻路并在签署前确认结果,以避免意外。
警告:尽管rippled设计用于搜索可能的最便宜的路径,但它可能并不总能找到它们。不rippled值得信任的实例也可以修改,以改变这种行为的利润。在提交和交易执行之间,沿路径执行支付的实际成本可能会发生变化。
寻找路径是一个非常具有挑战性的问题,随着新账本的验证,每隔几秒就会稍微改变一次,因此rippled不能设计出找到绝对最佳路径。不过,您可以找到几种可能的途径并估算交付特定金额的成本。
隐含的步骤
按照惯例,付款交易字段默示了几个步骤:具体来说,Account(发送方),Destination(接收方),Amount(要交付的SendMax货币和金额)以及(如果指定,货币和金额将被发送)。隐含的步骤如下:
- 路径的第一步始终暗示为事务的发送者,如事务的Account字段所定义。
- 如果交易包含一个不是交易发送方的SendMax字段issuer,则该发行人暗示为该路径的第二步。
- 如果issuer的SendMax 是发送地址,那么路径开始于发送地址,并且可以在给定的货币使用任何地址的信任线。有关详细信息,请参阅SendMax和金额的特殊值。
- 如果Amount该事务的字段包括issuer不属于相同Destination的交易,该发行者隐含为所述路径的第二到最后一个步骤。
- 最后,路径的最后一步始终暗示为事务的接收者,如事务的Destination字段所定义。
默认路径
除了明确指定的路径之外,事务可以沿着默认路径执行。默认路径是连接事务的隐含步骤的最简单可能的方式。
默认路径可以是以下任何一种:
- 如果交易仅使用一种货币(不管发行人),则默认路径假定付款应该涉及涉及的地址。如果这些地址通过信任线连接,此路径才有效。
- 如果SendMax被省略,或者issuer的SendMax是发送者,默认的路径需要从发送信托线Account到issuer目的地的Amount工作。
- 如果SendMax和Amount具有不同的issuer值,并且既不是发送者也不是接收者,则默认路径可能没有用处,因为它需要横跨两个发行者之间的信任线。Ripple(公司)通常不鼓励发行人直接相互信任。
- 对于跨货币交易,默认路径使用源货币(如SendMax字段中指定的)和目标货币(如字段中指定的)之间的订单Amount。
您可以使用该tfNoDirectRipple标志来禁用默认路径。在这种情况下,只能使用显式包含在事务中的路径执行事务。交易者可以使用这个选项来套利机会。
路径规格
路径集是一个数组。路径集的每个成员都是表示单个路径的另一个数组。路径的每个成员都是指定步骤的对象。一个步骤具有以下字段:
领域 | 值 | 描述 |
account | 字符串 - 地址 | (可选)如果存在,则此路径步代表通过指定地址荡漾。如果此步骤指定currency或issuer字段,则不能提供。 |
currency | 字符串 - 货币代码 | (可选)如果存在,此路径步骤表示通过订单簿更改货币。指定的货币表示新货币。如果此步骤指定了该account字段,则不得提供该字段。 |
issuer | 字符串 - 地址 | (可选)如果存在,此路径步骤表示更改货币,并且此地址定义新货币的发行人。如果在非XRP的步骤中省略,currency路径的上一步将定义发行者。如果currency省略时存在,则表示在相同名称货币与不同发行者之间使用订单的路径步骤。如果currency是XRP,必须省略。如果此步骤指定了该account字段,则不得提供该字段。 |
type | 整数 | DEPRECATED (可选)指示其他字段存在的指示符。 |
type_hex | 串 | DEPRECATED:(可选)该type字段的十六进制表示。 |
总之,下面的字段的组合是有效的,任选地与type,type_hex或两者:
- account 通过它自己
- currency 通过它自己
- currency并且issuer只要currency不是XRP
- issuer 通过它自己
任何其他用途的account,currency以及issuer在路径步骤字段中是无效的。
该type字段用于路径集的二进制序列化,实际上是通过对单个整数进行按位运算来构造的。这些位的定义如下:
值(十六进制) | 值(十进制) | 描述 |
0×01 | 1 | 地址变化(Ripple):该account字段存在。 |
为0x10 | 16 | 货币变化:该currency字段存在。 |
为0x20 | 32 | 发行人变更:该issuer字段存在。 |
滞期费
警告:滞期费是一项不推荐的功能,不提供持续支持。此页面描述旧版Ripple软件的历史行为。
滞期费是持有资产的负利率,代表持有这些资产的成本。要表示XRP账本中已发行货币的滞期费,您可以使用指示滞期费的自定义货币代码进行跟踪。这有效地为每个不同的滞期费创建单独的货币版本。客户端应用程序可以通过以货币代码和货币代码一起以年度百分比表示滞销货币代码来支持这一点。例如:“XAU(-0.5%pa)”。
代表货币贬值的金额
这种方法不是不断更新XRP账本中的所有金额,而是将计息或滞期货币的金额分为两类:XRP账本中记录的“账本值”和向人员显示的“显示值”。“账本价值”表示货币在一个固定点的价值,即2000年1月1日午夜的“波纹时代”。“显示价值”表示在以后的时间点(通常是当前时间)之后的金额直到那个时候计算来自波纹时期的持续兴趣或滞期。
提示:您可以将滞期费视为与通货膨胀类似,其中受其影响的所有资产的价值随时间而下降,但账本始终保持2000年的价值。这并不反映实际的实际通货膨胀; 滞期更像是假设性的通货膨胀率。
因此,客户端软件必须应用两次转换:
- 在给定的时间获取显示值并将它们转换为要记录的账本值。
- 在给定时间点取账本值并将其转换为显示值。
计算滞期费
计算货币滞期费的完整公式如下:
D = A × ( e ^ (t ÷ τ) )
- D是滞期费用后的金额
- A是全球账本中记录的滞期前金额
- e是欧拉数
- t是自Ripple Epoch(2000年1月1日0:00)以来的秒数,
- τ是以秒为单位的电子折叠时间。该值是从所需的利率计算得出的。
要在显示金额和账本金额之间进行转换,您可以使用以下步骤:
- 计算的价值
( e ^ (t ÷ τ) )
。我们称这个数字为“滞期系数”。滞期系数始终相对于特定时间,例如当前时间。 - 将其应用于要转换的金额:
- 要将账本值转换为显示值,请乘以滞期系数。
- 要将显示值转换为账本值,请除以滞期系数。
有息货币代码格式
与使用标准货币代码格式不同,具有正利益或负利息(滞期)的货币使用以下格式的160位货币代码:
- 前8位必须是
0x01
。 - 接下来的24位代表ASCII的3个字符。预计这是一个ISO 4217的代码。它支持与标准格式的ASCII字符相同的字符。
- 接下来的24位必须都是
0
s。 - 接下来的64位是货币的利率,以IEEE 754双重格式表示为“ e-folding time ”。
- 接下来的24位是保留的,应该都是
0
s。
计算电子折叠时间
要在账本金额和显示金额之间进行转换,或计算带息/累计汇率货币的货币代码,您需要将利率作为“电子折叠时间”。电子折叠时间是指数量增加e倍(欧拉数)所需的时间。按照惯例,电子折叠时间在公式中写为字母τ。
要计算给定利率百分比的电子折叠时间:
- 将利率加到100%以获得应用年利率后初始金额的百分比。对于滞期费,请使用负利率。例如,0.5%的滞期费率是-0.5%的利率,导致剩余99.5%。
- 以百分比表示百分比。例如,99.5%变为0.995。
- 以该号码的自然记录。例如,ln(0.995)= -0.005012541823544286。(如果初始利率为正值,则该数字为正,如果利率为负数则为负数。)
- 以一年中的秒数(31536000)除以上一步骤的自然对数结果。例如,31536000÷-0.005012541823544286 = -6291418827.045599。这个结果是以秒为单位的电子折叠时间。
注意:按照惯例,Ripple的兴趣/滞期规则每年使用固定秒数(31536000),这不会针对闰日或闰秒进行调整。
客户支持
为了支持带息和贬值的货币,客户端应用程序必须实现以下几个功能:
· 当显示从账本或交易数据中检索到的超额累计货币金额时,客户必须从账本值转换为显示值。(使用滞期费,显示值小于账本值。)
· 在接受超值货币的投入时,客户必须将显示格式的金额转换为账本格式。(由于滞期费用,账本值大于用户输入值。)创建付款,优惠和其他类型的交易时,客户必须使用账本值。
· 客户必须区分是否有利息或滞期货币,以及具有不同利率或滞期费率的货币。客户应该能够将有息货币代码格式解析为诸如“XAU(-0.5%pa)”的显示。
ripple-lib支持
涟波库版本0.7.37到0.12.9支持滞期费。滞期费是不支持在RippleAPI。
以下代码示例演示如何使用兼容版本的ripple-lib在账本值和显示值之间进行转换。另请参阅波纹滞期计算器。
要将显示值转换为账本值,请使用Amount.from_human()
:
// create an Amount object for the display amount of the demurring currency
// and pass in a reference_date that represents the current date
// (in this case, 账本 value 10 XAU with 0.5% annual demurrage,
// at 2017-11-04T00:07:50Z.)
vardemAmount = ripple.Amount.from_human(
'10 0158415500000000C1F76FF6ECB0BAC600000000',
{
reference_date:
563069270});
// set the issuer
demAmount.set_issuer(
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh");
// get the JSON format for the 账本 amount
console.log(demAmount.to_json());
// { "value": "10.93625123082769",
// "currency": "0158415500000000C1F76FF6ECB0BAC600000000",
// "issuer": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh" }
从账本值转换为显示值:
// create an Amount object with the 账本 value,
账本
Amount = ripple.Amount.from_json({
"currency"
:
"015841551A748AD2C1F76FF6ECB0CCCD00000000",
"issuer"
:
"rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh",
"value"
:
"10.93625123082769"})
// apply interest up to the current time to get the display amount
vardisplayAmount = demAmount.applyInterest(
newDate(
));
这个太多。。。翻到一半累坏了,,,大概过了下~~~
这篇关于瑞波Ripple概念解析-发行货币(官方文档不完全翻译)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!