本文主要是介绍瑞波Ripple概念解析-支付系统基础知识(官方文档不完全翻译),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
帐号
XRP账本中的“账户”负责持有XRP瑞波币和发送交易。账户的属性元素有:
- 识别地址,例如rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn
- 一个XRP余额(XRP balance)。一些XRP预留给Reserve。
- 一个起始序号(sequence number),从1开始,随着从该帐户发送的每个交易增加而增加。除非交易的序号与其发送方的下一个序号相匹配,否则交易不能包含在账本中。
- 交易历史(history of transactions),影响本账户及其余额。
- 一种或多种授权交易,可能包括:
- 该帐户固有的主密钥对。(这可以禁用但不能更改。)
- 一个可以替换的 “常规”密钥对。
- 多签名的签名者列表。(与帐户的核心数据分开存储。)
在账本的数据树中,帐户的核心数据存储在AccountRoot账本对象类型中。一个帐户也可以是其他几种数据的所有者(或部分所有者)。
提示:XRP账本中的“账户”介于金融使用(如“银行账户”)和计算机的账户(如“UNIX账户”)之间。非XRP货币和资产不存储在XRP帐户帐户本身中; 每个这样的资产都存储在一个称为“信任线”的会计关系中,该关系连接双方。
创建帐户
没有一个专门的交易来“创建账户”。如一个支付交易发送大于等于预留数额(account reserve )的XRP到一个合法的地址,这个地址还没被使用的话,则会自动创建账户。这称为创建账户,并在账本中创建AccountRoot对象。除此外没有其他交易可以创建帐户。
警告:为账户提供资金不会为您提供该账户的任何特权。拥有与账户地址相对应的密钥的任何人都可以完全控制该账户及其包含的所有XRP。对于某些地址,可能没有人拥有秘密密钥,在这种情况下,帐户是黑洞,XRP永远丢失。
在XRP账本中创建帐户的典型方法如下:
- 使用强随机性生成密钥对并计算该密钥对的地址。(例如,您可以使用wallet_propose方法来执行此操作。)
- 让已有账户的人将XRP发送到您生成的地址。
- 例如,您可以在私人交易所购买XRP,然后将XRP从交易所撤回到您指定的地址。
警告:您第一次在您自己的XRP账本地址收到XRP时,您必须支付帐户预留(当前为20 XRP),无限期锁定XRP的数量。相比之下,私人交易通常将所有客户的XRP都保存在几个共享的XRP账户中,因此客户不必为交易所的个人账户支付保留金。在退出之前,考虑在XRP账本上直接拥有自己的账户是否物有所值。
地址
XRP账本中的帐户由base58 XRP账本地址标识。该地址来源于账户的主公钥,而后者又是从一个私钥中派生出来的。地址在JSON中表示为一个字符串,并具有以下特征:
- 长度在25到35个字符之间
- 从角色开始 r
- 使用字母数字字符,不包括数字“ 0”大写字母“ O”,大写字母“ I”和小写字母“ l”
- 区分大小写
- 包含一个4字节的校验和,从随机字符生成有效地址的概率约为1 / 2 ^ 32
有关更多信息,请参阅帐户。
任何有效的地址都可以通过创建成为XRP账户中的一个资金账户。您还可以使用尚未创建的地址来作为常规密钥或签名人列表的成员。只有资金账户才能成为交易的发送方。
创建一个有效的地址是一个以密钥对开始的严格的数学任务。您可以生成密钥对后完全离线,而无需与XRP账本或任何其他方通信。从公共密钥到地址的转换涉及单向散列函数,因此可以确认公钥与地址匹配,但无法单独从地址派生公钥。(这是签名交易包含公钥和发送方地址的原因之一。)
有关如何计算XRP账本地址的更多技术细节,请参阅地址编码。
特别地址
某些地址在XRP账本中具有特殊含义或历史用途。在很多情况下,这些是“黑洞”地址,这意味着地址不是从已知的密钥中派生出来的。由于仅从一个地址猜测秘密密钥实际上是不可能的,因此黑洞地址所拥有的任何XRP将永远丢失。
地址 | 名称 | 含义 | 黑洞 |
rrrrrrrrrrrrrrrrrrrrrhoLvTp | ACCOUNT_ZERO | 一个地址,它是该值的base58编码0。在点对点通信中,rippled使用此地址作为XRP的发行者。 | 是 |
rrrrrrrrrrrrrrrrrrrrBZbvji | ACCOUNT_ONE | 一个地址,它是该值的base58编码1。在账本中,RippleState条目使用此地址作为托管行余额发行人的占位符。 | 是 |
rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh | 起源说明 | 当rippled从头开始创建新创建账本(例如,在独立模式下)时,此帐户将保留所有XRP。该地址由硬编码的种子值“masterpassphrase”生成。 | 没有 |
rrrrrrrrrrrrrrrrrNAMEtxvNvQ | Ripple名称预留黑洞 | 在过去,Ripple要求用户将XRP发送到该帐户作为预留数额。 | 是 |
rrrrrrrrrrrrrrrrrrrn5RM1rHd | NaN地址 | 当base58编码值NaN时,先前版本的ripple-lib生成此地址。 | 是 |
账户永久性
一旦创建,账户将永远存在XRP账本的数据树中。这是因为交易的当前序号必须永久跟踪,以便旧交易不能再次处理。
与比特币和许多其他加密货币不同,XRP账本的公共账本链的每个新版本的账页都包含账本的全部状态,随着每个新账户的创建规模也会增加。出于这个原因,Ripple不鼓励创建新账户,除非完全有必要。代表许多用户发送和接收价值的机构可以使用“ 源标签(Source tags)”和“ 目的地标签(Destination tags)”来区分来自其客户的付款,同时仅使用XRP账本中的一个(或少数)帐户。
交易历史
在XRP账本中,交易历史是交易跟踪的“线索”,由交易的散列ID和账本索引连接的交易组成。该AccountRoot账本对象包含识别哈希和最近修改它的交易; 交易的元数据包括该AccountRoot节点的先前状态,因此可以以这种方式遍历单个帐户的历史记录。交易历史记录包括直接修改AccountRoot的所有交易,包括:
- 由帐户发送的交易,因为它们修改帐户的Sequence号码。由于交易费用会修改帐户的XRP余额。
- 交易修改了账户的XRP余额,包括传入付款交易和其他类型的交易,如PaymentChannelClaim和EscrowFinish。
原则上交易历史记录还包括修改账户的自身对象和没有修改XRP余额的交易。这些对象是单独的账本对象,每个对象都有影响它们的交易线索。如果您拥有帐户的全部账本历史记录,则可以按照该记录查找由其创建或修改的账本对象。“完整”交易历史记录包括的历史对象如下:
- RippleState 对象(信任线)与该帐户连接。
- DirectoryNode 对象,尤其是追踪账户自己拥有的对象。
- Offer 代表去中心化交易所中账户未完成的货币兑换订单。
- PayChannel 对象,代表帐户间的异步付款渠道。
- Escrow 对象,代表按时间或加密条件锁定的账户间的付款。
- SignerList对象,表示可以通过多重签名为帐户授权交易的地址列表。
有关每个这些对象的更多信息,请参阅账本格式参考。
地址编码
提示:这些技术细节仅与构建用于XRP账本兼容性的低级库软件的人员相关!
[资源]
XRP账本地址使用base58与Ripple 字典进行编码:rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz。由于XRP分类器使用base58对几种类型的密钥进行编码,因此它使用一个字节的“类型前缀”(也称为“版本前缀”)对编码数据进行前缀以区分它们。类型前缀导致地址通常以base58格式的不同字母开头。
下图显示了键和地址之间的关系:
计算XRP账本地址的公式如下。有关完整的示例代码,请参阅encode_address.js。
- 导入所需算法:SHA-256,RIPEMD160和base58。为base58设置字典。
2. 'use strict';
3. const assert = require('assert');
4. const crypto = require('crypto');
5. const R_B58_DICT = 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz';
6. const base58 = require('base-x')(R_B58_DICT);
7.
8. assert(crypto.getHashes().includes('sha256'));
9. assert(crypto.getHashes().includes('ripemd160'));
- 从33字节的ECDSA secp256k1公钥或32字节的Ed25119公钥开始。对于Ed25519密钥,在密钥前加上字节0xED。
11. const pubkey_hex =
12. 'ED9434799226374926EDA3B54B1B461B4ABF7237962EAE18528FEA67595397FA32';
13. const pubkey = Buffer.from(pubkey_hex, 'hex');
14. assert(pubkey.length == 33);
- 计算公钥的SHA-256哈希值的RIPEMD160哈希值。该值是“账户ID”。
16. const pubkey_inner_hash = crypto.createHash('sha256').update(pubkey);
17. const pubkey_outer_hash = crypto.createHash('ripemd160');
18. pubkey_outer_hash.update(pubkey_inner_hash.digest());
19. const account_id = pubkey_outer_hash.digest();
- 计算帐户ID的SHA-256散列的SHA-256散列; 采取前4个字节。这个值是“校验和”。
21. const address_type_prefix = Buffer.from([0x00]);
22. const payload = Buffer.concat([address_type_prefix, account_id]);
23. const chksum_hash1 = crypto.createHash('sha256').update(payload).digest();
24. const chksum_hash2 = crypto.createHash('sha256').update(chksum_hash1).digest();
25. const checksum = chksum_hash2.slice(0,4);
- 连接有效负载和校验和。计算连接缓冲区的base58值。结果是地址。
27. const dataToEncode = Buffer.concat([payload, checksum]);
28. const address = base58.encode(dataToEncode);
29. console.log(address);
// rDTXLQ7ZKZVKz33zJbHjgVShjsBnqMBhmN
加密密钥
在XRP账本中,数字签名证明交易有权执行特定的一组操作。只有已签署的交易才可以提交到网络并包含在经过验证的账本中。
每个数字签名均基于与交易的发送账户相关联的加密密钥对。密钥对可以使用任何XRP账本支持的加密签名算法生成。无论使用什么算法生成密钥,密钥对都可以用作主密钥对,常规密钥对或签名者列表的成员。
警告:保持私钥的适当安全非常重要。数字签名是向XRP 账本验证您有权发送交易的唯一方式,并且没有特权管理员可撤销或撤消已应用于账本的任何交易。如果其他人知道您的XRP账户的私钥,该人可以创建数字签名来授权任何交易,尽可能相同。
生成密钥
您使用该wallet_propose方法生成密钥对。以下是一个示例wallet_propose回应:
{
"result": {
"account_id": "rDGnaDqJczDAjrKHKdhGRJh2G7zJfZhj5q",
"key_type": "secp256k1",
"master_key": "COON WARN AWE LUCK TILE WIRE ELI SNUG TO COVE SHAM NAT",
"master_seed": "sstV9YX8k7yTRzxkRFAHmX7EVqMfX",
"master_seed_hex": "559EDD35041D3C11F9BBCED912F4DE6A",
"public_key": "aBQXEw1vZD3guCX3rHL8qy8ooDomdFuxZcWrbRZKZjdDkUoUjGVS",
"public_key_hex": "0351BDFB30E7924993C625687AE6127034C4A5EBA78A01E9C58B0C46E04E3A4948"
},
"status": "success",
"type": "response"
}
该响应包含一个密钥对(一个私钥和一个公钥,以各种格式)以及一个account_id。
私钥
该master_key,master_seed和master_seed_hex是各种格式的私钥,所有这些都可以用来签署交易。尽管有前缀master_,但这些密钥不一定是帐户的主密钥。在这种情况下,master_前缀更多地指的是密钥作为私钥的角色。这master_seed是所有其他有关此帐户信息的主要种子。
公钥
该public_key和public_key_hex在各种格式的公钥,与public_key_hex是对应于签订该交易的私钥的公钥。无论是public_key与public_key_hex直接从所导出的master_seed。
帐户ID
该account_id是从公共密钥导出并可创建用于XRP账本的账户。重要的是要知道,尽管account_id存在,但在XRP账簿中不存在实际账户,直到account_id收到第一笔XRP付款。此外,account_id只有在收到资金并创建帐户的交易后,才能发送任何交易。
但是,account_id(没有资金账户)也可以用作常规密钥或签名人列表的成员,以授权另一个确实存在的帐户进行交易。
要创建存储在账本中的资金账户时,account_id必须接受Payment交易,提供足够的XRP满足准备金要求。
有关wallet_propose响应的更多信息,请参阅wallet_propose。
生成的密钥对可用于以下三种方式:作为主密钥对,常规密钥对或签署者列表成员。
密钥类型
该字段key_type指示使用什么加密签名算法来生成该密钥对。您可以key_type使用wallet_propose方法指定何时发出请求以生成密钥对。
主密钥对
主密钥对由私钥和公钥组成。除了能够签署常规密钥对可以使用的所有交易之外,主密钥对的私钥是唯一可用于执行以下操作的密钥:
- 禁用主公钥。
- 永久放弃冻结的能力。
- 发送成本为0的密钥重置事务。
使用wallet_propose生成帐户的主密钥对就是跟返回结果中的account_id对应的主密钥对,可以用来授权签署交易。由于主密钥对是在同一个返回结果中产生的,所以它与account_id 内在绑定,account_id是由public_key_hex派生而来。
这与使用该wallet_propose方法生成的常规密钥对相反,但它必须明确指定为帐户的常规密钥对。由于常规密钥对是明确分配的,因此它与其account_id授权签署交易的帐户本质上没有关系。有关更多信息,请参阅常规密钥对。
警告:主密钥对不能更改,但可以禁用。这意味着如果您的主密钥被泄露,而不是改变它,您必须禁用它。
由于主密钥对无法更改,只能在发生危害时才能禁用,因此这是使主密钥对保持脱机并设置常规密钥对以代替您的帐户签署交易的强有力原因。
使主密钥对保持离线状态意味着不要将主密钥放在恶意角色可以访问的地方。例如,这可能意味着将其保存在永不连接互联网的空隙机器上,保存在保险箱中的一张纸上,或者一般来说,保存在与整个互联网互动的计算机程序的范围内。理想情况下,主密钥对仅在最值得信赖的设备上使用,并仅用于紧急情况,例如在发生可能或实际的危害时更改常规密钥对。
常规密钥对
XRP账户允许账户授权一个称为常规密钥对的二级密钥对来签署未来的交易,同时保持您的主密钥对离线。如果常规密钥对的私钥遭到破坏,您可以删除或替换它,而无需更改帐户的其余部分并重新建立与其他帐户的关系。您也可以主动替换常规密钥对。(这些东西都不可能用于帐户的主密钥对,该帐户内部链接到该帐户的地址。)
您使用该wallet_propose方法生成密钥对以用作常规密钥对。但是,与使用与其支持的帐户并行生成的主密钥对不同account_id,您必须明确创建常规密钥对与您希望为其签署交易的帐户之间的关系。您使用SetRegularKey方法将常规密钥对分配给帐户。
有关分配常规密钥对的教程,请参阅分配常规密钥对。
将常规密钥对分配给帐户后,该帐户有两个与其关联的密钥对:
- 与帐户内在相关account_id且您保持离线的主密钥对。
- 您已明确分配给该帐户的常规密钥对,以及用于为帐户签署交易的密钥对。
您可以将一个常规密钥对分配给一个帐户,并将其用于签署所有交易,但为主密钥对保留的交易除外。
您可以随时移除或更改常规密钥对。这意味着,如果普通私钥遭到破坏(但不是主密钥),只需删除或更改常规密钥对,即可重新获得对您帐户的控制权。
有关更改或删除常规密钥对的教程,请参阅分配常规密钥对。
签名算法
加密密钥对总是绑定到特定的签名算法,该算法定义私钥和公钥之间的数学关系。密码签名算法具有这样的性质,即鉴于密码技术的当前状态,使用私钥来计算匹配公共密钥是“容易的”,但是通过从公钥开始计算匹配的私钥是不可能的。
XRP账本支持以下加密签名算法:
密钥类型 | 算法 | 描述 |
secp256k1 | ECDSA使用椭圆曲线secp256k1 | 这是比特币中使用的方案。XRP账本默认使用这些密钥类型。 |
ed25519 | EdDSA使用椭圆曲线Ed25519 | 这是一个更新的算法,具有更好的性能和其他方便的属性。由于Ed25519公钥比secp256k1键短一个字节,因此rippled前缀Ed25519公钥的字节是0xED,因此这两种公钥都是33字节。 |
当您使用wallet_propose方法生成密钥对时,可以指定key_type选择使用哪种加密签名算法来导出密钥。如果您生成了除默认值以外的其他密钥类型,则还必须指定key_type签署事务处理时的密钥类型。
受支持的密钥对类型可在整个XRP账本中互换使用,作为主密钥对,常规密钥对和签名者列表的成员。派生地址的过程对于secp256k1和Ed25519密钥对是相同的。
注意:目前,您无法使用Ed25519密钥签署付款渠道声明。这是一个错误。
未来的算法
未来,Ripple期望在XRP账本中添加新的加密签名算法,以跟上加密技术的发展。例如,如果看起来使用Shor算法(或类似的)的量子计算机很快就会足够实用以破坏椭圆曲线密码体系,Ripple可以添加一个不易破碎的密码签名算法。截至2018年初,这种“量子抗性”签名算法相对不切实际,量子计算机更加不切实际,因此Ripple没有立即计划添加任何特定算法。
多签名
XRP账本中的多重签名是一种通过使用多个密钥的组合来为XRP账本进行交易授权的方法。您可以为您的地址启用授权方法的任意组合,包括多重签名,主密钥对和常规密钥对。(唯一的要求是至少必须启用一种方法。)
多重签署的好处包括:
- 您可以要求来自不同设备的密钥,以便恶意行为者必须妥协多台机器以您的名义发送交易。
- 您可以在多人之间分享地址的监管权限,每个人只能从该地址发送交易所必需的几个密钥之一。
- 您可以委派从您的地址发送交易到一组人员的权力,如果您不可用或无法正常签名,他们可以控制您的地址。
- ... 和更多。
签名者列表
在您可以进行多重签名之前,您必须创建一个可以为您签名的地址列表。
该SignerListSet交易定义哪些地址可以从地址授权的交易。您最多可以在SignerList中包含8个地址。您可以通过使用SignerList的法定人数和权重值来控制需要多少签名,以及在哪些组合中。
发送多重签名交易
要成功提交多签名交易,您必须执行以下所有操作:
- 发送交易的地址(在该Account字段中指定)必须SignerList在账本中拥有一个地址。
- 该交易必须包含该SigningPubKey字段作为空字符串。
- 该交易必须包含一个包含一系列签名的Signers字段。
- Signers数组中存在的签名必须与SignerList中定义的签名者匹配。
- 对于提供的签名,weight与这些签名者相关的总数必须等于或大于quorumSignerList的总数。
- 交易费用(Fee字段)必须至少在正常的交易成本(N + 1)倍,其中N是所提供的签名的数目。
- 收集签名之前,必须定义交易的所有字段。您无法自动填写任何字段。
- 如果以二进制形式表示,则Signers必须根据签名者地址的数值对数组进行排序,并以最低值开头。(如果以JSON提交,submit_multisigned方法会自动处理。)
有关更多信息,请参阅设置多重签名。
准备金
XRP账本在XRP中应用准备金要求,以防止由于垃圾邮件或恶意使用而导致共享全局账本过大。目标是限制账本的增长以匹配技术的改进,以便当前的商品级机器始终能够适应RAM中的当前账本和磁盘上的全额账本历史记录。
要提交交易,地址必须在共享的全局账本中保留最小量的XRP。您不能将此XRP发送到其他地址。为了支付新地址,您必须发送足够的XRP以满足储备要求。
目前的最低储备金要求是20 XRP。(这是在帐本中没有其他对象的地址的成本。)
基本储备和所有者储备
准备金要求分为两种:
- 基本储备是必需的账本每个地址XRP的最小量。目前,20个XRP(
20000000
Drop)。 - 所有者储备是该地址增加账本对象的存款准备金。目前,每个对象
5000000
,
5个XRP(Drop)。
所有者储备
账本中的许多对象都属于特定的地址,并计入该地址的预留要求。当物品从账本中被移除时,它们不再计入所有者的储备金要求。
- 挂单由放置它们的地址所有。交易处理会自动删除已完成消费。另外,所有者可以通过发送OfferCancel交易或通过发送包含
OfferSequence
参数的OfferCreate交易来取消交易。 - 信任线在两个地址之间共享。所有者保留可以应用于一个或两个地址,具体取决于控制地址的字段是否处于默认状态。有关详细信息,请参阅向所有者保留做出贡献
- 单个SignerList保留3到10个对象用于所有者,跟成员多少有关系。另见:签名者列表和储备。
- 持有的付款(托管)。
- 支付渠道由创建它们的地址所有。
- 所有者目录所有账本对象也需要所有者准备金。但是,所有者目录本身不计入准备金。
- 支票由创建它们的地址(发送方,而不是目的地)拥有。
所有者预留边缘案例
XRP账本认为OfferCreate交易是明确表示持有资产的意愿。taker_pays
如果该信任线不存在,则使用该提议会自动创建信用额度(限额为0,余额高于该限额)。但是,如果要约的所有者不具备足够的XRP以满足新信任额度的所有者准备金要求,则该要约被视为未获得资助。另请参阅:优惠的生命周期。
低于后备要求
在交易处理期间,交易成本破坏了一些发送地址的XRP余额。这可能会导致地址的XRP低于储备要求。
当地址的XRP比当前准备金要求少XRP时,它不能发送新交易将XRP发送给其他人,除非增加自己的准备金。即使如此,该地址仍然存在于账本中,只要它具有足够的XRP来支付交易成本,就可以发送其他交易。如果地址再次获得足够的XRP以满足其储备要求,或者储备要求减少到小于地址的XRP持有量,则该地址能够再次发送所有类型的交易。
提示:当地址低于准备金要求时,它可以用信任线发送新的OfferCreate交易以获取更多的XRP或其他货币。这些交易不能在账本中创建新的信任线或挂单交易,因此他们只能消费已经在订单簿中的挂单。
更改储备金要求
XRP账本具有调整XRP价值长期变动的准备金要求的机制。任何变化都必须经过共识流程的批准。请参阅费用投票以获取更多信息。
存款授权
(需要DepositAuth修正。)
存款授权是XRP账本中账户的可选功能。启用存款授权后,除非这些交易的发送方是账户本身,否则交易无法向账户发送任何类型的价值。这包括XRP和已发行货币的转账。
默认情况下,新帐户禁用了DepositAuth。
背景
金融服务法规和许可证可能要求企业或实体必须知道其收到的所有交易的发送方。这对像XRP账本系统这样的去中心化系统提出了挑战,参与者可以通过可以自由生成的假名识别,默认行为是任何地址都可以支付任何其他费用。
存款授权标志为那些使用XRP账本的人提供了一个选项,以符合这些规定,而不会改变去中心化式账本的基本性质。启用存款授权后,账户只能通过发送交易获得明确批准的资金。使用存款授权的账户的所有者可以在发送导致账户收到款项的交易之前,执行必要的尽职调查以识别任何资金的发送方。
存款授权旨在与支票,托管和付款渠道一起使用。 “两步操作”,首先交易发送方发送交易以授权发送资金,然后交易接受方发送交易以授权接收这些资金。存款授权不能与付款交易一起使用。
建议用法
为了获得存款授权的全部效果,Ripple建议还进行以下操作:
- 始终保持XRP余额高于最低准备金要求。
- 保持DefaultRipple标志处于其默认(禁用)状态。不要在任何信任线上启用rippling。发送TrustSet交易时,请始终使用
tfSetNoRipple flag
。 - 不要做挂单操作。事先是不可能知道哪些匹配报价将被用来执行这样的交易。
精确的语义
已启用存款授权的账户:x
- 不能成为付款交易的接受方,但有一个例外:
- 如果账户的XRP余额等于或低于最低账户存款准备金要求,它可以小于等于Amount最小账户准备金(当前为20 XRP)的XRP支付的目的地。这是为了防止帐户因无法发送交易而“卡住”,但无法接收XRP。该帐户的所有者储备对这种情况无关紧要。
- 只有当PaymentChannelClaim交易 的发送方是付款渠道的目的地时,才可以从PaymentChannelClaim交易中接收XRP 。
- 只有当EscrowFinish交易 的发送方是托管目的地时,才能从EscrowFinish交易中收到XRP 。
- 通过发送CheckCash事务可以接收XRP或发行的货币。(需要检查修正案。)
- 通过发送OfferCreate交易可以接收XRP或已发行货币。
- 如果账户发送的OfferCreate交易没有立即完全执行,那么当其他账户的Payment和OfferCreate交易消费时,它可以在稍后收到剩余的订购XRP或发行货币。
- 如果账户创建了没有启用NoRipple标志的信任线,或者启用了DefaultRipple标志并发行了任何货币,则账户可以通过Rippling接收付款交易中这些信任行的已发行货币。但它不能成为这些交易的接收方。
- 通常,只要满足以下所有条件,XRP账本中的账户就不能在XRP账本中收到任何非XRP货币。(此规则不是特定于DepositAuth标志。)
- 该帐户尚未创建任何额度大于零的信任线。
- 该帐户未在其他人创建的信任线上发布货币。
- 该帐户没有提供任何挂单。
下表总结了交易类型是否可以使用DepositAuth启用或禁用存款:
| DepositAuth Disabled |
| DepositAuth Enabled | ||
Transaction Type | Sent by Destination | Sent by Others |
| Sent by Destination | Sent by Others |
AccountSet | (This transaction type never sends money.) | ||||
CheckCancel | (This transaction type never sends money.) | ||||
CheckCash | OK | No Permission |
| OK | No Permission |
CheckCreate | (This transaction type never sends money.) | ||||
EscrowCancel | Can return XRP from an expired escrow | ||||
EscrowCreate | (This transaction type can only debit XRP, not credit it.) | ||||
EscrowFinish | OK | OK |
| OK | No Permission |
OfferCancel | This transaction type never sends money. | ||||
OfferCreate | OK | Only if account previously created a matching offer |
| OK | Only if account previously created a matching offer |
Payment (If account has more than the minimum XRP reserve, enables NoRipple on all trust lines, and places no offers) | Cross-currency only | OK |
| No Permission | No Permission |
Payment (If account XRP balance is below the minimum XRP reserve) | Cross-currency only | OK |
| No Permission | XRP payments up to the minimum reserve |
Payment (If account has any trust lines with NoRipple disabled) | Cross-currency only | OK |
| No Permission | Balance changes from rippling |
Payment (If account has placed offers) | Cross-currency only | OK |
| No Permission | Balance changes from executing offers |
PaymentChannelClaim | OK | OK |
| OK | No Permission |
PaymentChannelCreate | (This transaction type can only debit XRP, not credit it.) | ||||
PaymentChannelFund | Can return XRP when closing a channel created by self | ||||
SetRegularKey | (This transaction type never sends money.) | ||||
SignerListSet | (This transaction type never sends money.) | ||||
TrustSet | (This transaction type never sends money.) |
启用或禁用存款授权
一个账户可以通过发送一个AccountSet事务并且SetFlag设置为asfDepositAuth值(9)的字段来启用存款授权。该帐户可以通过发送一个AccountSet事务,并将该ClearFlag字段设置为asfDepositAuth值(9)来禁用存款授权。有关AccountSet标志的更多信息,请参阅AccountSet标志。
检查帐户是否已启用DepositAuth
要查看帐户是否启用了存款授权,请使用account_info方法查找帐户。将Flags字段的值(在result.account_data对象中)与为AccountRoot账本对象定义的按位标志进行比较。
如果Flags按值的结果(AND lsfDepositAuth标志值(0x01000000))不为零,则帐户启用了DepositAuth。如果结果为零,那么该帐户已禁用了存款授权。
也可以看看
- 该授权信托线功能(RequireAuth其对手可以持有账户发出的非XRP货币的标志)的限制。
- 该DisallowXRP标志表示一个账户不应该收到XRP。这是比存款授权更软的保护,而不是由XRP账本执行。(客户端应用程序应该尊重该标志或至少警告它。)
- RequireDest标志指示发送交易需要指定目标标签才能接收货币。这可以防止用户忘记指明付款的目的,但不会保护收件人免受未知发送方的限制,这些发送方可以组成任意目标标签。
- 部分付款交易为帐户返还不需要的付款提供了一种途径,同时从发送的金额中减去转账费用和汇率,而不是添加发送的金额。
总结:
账号地址生成规则类似于比特币的地址生成规则,地址的加密算法可以指定。
账号的秘钥有两种,一个主的,一个常规的,可以用主秘钥替换常规秘钥,主秘钥为了安全可以禁用,常规秘钥主要用来签署交易。这个设计还是挺不错的~~~
本文作者:architect.bian,欢迎收藏,转载请保留原文地址并保留版权声明!谢谢~
还没完!往下看!!!
这篇关于瑞波Ripple概念解析-支付系统基础知识(官方文档不完全翻译)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!