帐号
XRP账本中的“账户”负责持有XRP瑞波币和发送交易。账户的属性元素有:
在账本的数据树中,帐户的核心数据存储在AccountRoot账本对象类型中。一个帐户也可以是其他几种数据的所有者(或部分所有者)。
提示:XRP账本中的“账户”介于金融使用(如“银行账户”)和计算机的账户(如“UNIX账户”)之间。非XRP货币和资产不存储在XRP帐户帐户本身中; 每个这样的资产都存储在一个称为“信任线”的会计关系中,该关系连接双方。
创建帐户
没有一个专门的交易来“创建账户”。如一个支付交易发送大于等于预留数额(account reserve )的XRP到一个合法的地址,这个地址还没被使用的话,则会自动创建账户。这称为创建账户,并在账本中创建AccountRoot对象。除此外没有其他交易可以创建帐户。
警告:为账户提供资金不会为您提供该账户的任何特权。拥有与账户地址相对应的密钥的任何人都可以完全控制该账户及其包含的所有XRP。对于某些地址,可能没有人拥有秘密密钥,在这种情况下,帐户是黑洞,XRP永远丢失。
在XRP账本中创建帐户的典型方法如下:
警告:您第一次在您自己的XRP账本地址收到XRP时,您必须支付帐户预留(当前为20 XRP),无限期锁定XRP的数量。相比之下,私人交易通常将所有客户的XRP都保存在几个共享的XRP账户中,因此客户不必为交易所的个人账户支付保留金。在退出之前,考虑在XRP账本上直接拥有自己的账户是否物有所值。
地址
XRP账本中的帐户由base58 XRP账本地址标识。该地址来源于账户的主公钥,而后者又是从一个私钥中派生出来的。地址在JSON中表示为一个字符串,并具有以下特征:
有关更多信息,请参阅帐户。
任何有效的地址都可以通过创建成为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的所有交易,包括:
原则上交易历史记录还包括修改账户的自身对象和没有修改XRP余额的交易。这些对象是单独的账本对象,每个对象都有影响它们的交易线索。如果您拥有帐户的全部账本历史记录,则可以按照该记录查找由其创建或修改的账本对象。“完整”交易历史记录包括的历史对象如下:
有关每个这些对象的更多信息,请参阅账本格式参考。
地址编码
提示:这些技术细节仅与构建用于XRP账本兼容性的低级库软件的人员相关!
[资源]
XRP账本地址使用base58与Ripple 字典进行编码:rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz。由于XRP分类器使用base58对几种类型的密钥进行编码,因此它使用一个字节的“类型前缀”(也称为“版本前缀”)对编码数据进行前缀以区分它们。类型前缀导致地址通常以base58格式的不同字母开头。
下图显示了键和地址之间的关系:
计算XRP账本地址的公式如下。有关完整的示例代码,请参阅encode_address.js。
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'));
11. const pubkey_hex =
12. 'ED9434799226374926EDA3B54B1B461B4ABF7237962EAE18528FEA67595397FA32';
13. const pubkey = Buffer.from(pubkey_hex, 'hex');
14. assert(pubkey.length == 33);
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();
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);
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方法指定何时发出请求以生成密钥对。
主密钥对
主密钥对由私钥和公钥组成。除了能够签署常规密钥对可以使用的所有交易之外,主密钥对的私钥是唯一可用于执行以下操作的密钥:
使用wallet_propose生成帐户的主密钥对就是跟返回结果中的account_id对应的主密钥对,可以用来授权签署交易。由于主密钥对是在同一个返回结果中产生的,所以它与account_id 内在绑定,account_id是由public_key_hex派生而来。
这与使用该wallet_propose方法生成的常规密钥对相反,但它必须明确指定为帐户的常规密钥对。由于常规密钥对是明确分配的,因此它与其account_id授权签署交易的帐户本质上没有关系。有关更多信息,请参阅常规密钥对。
警告:主密钥对不能更改,但可以禁用。这意味着如果您的主密钥被泄露,而不是改变它,您必须禁用它。
由于主密钥对无法更改,只能在发生危害时才能禁用,因此这是使主密钥对保持脱机并设置常规密钥对以代替您的帐户签署交易的强有力原因。
使主密钥对保持离线状态意味着不要将主密钥放在恶意角色可以访问的地方。例如,这可能意味着将其保存在永不连接互联网的空隙机器上,保存在保险箱中的一张纸上,或者一般来说,保存在与整个互联网互动的计算机程序的范围内。理想情况下,主密钥对仅在最值得信赖的设备上使用,并仅用于紧急情况,例如在发生可能或实际的危害时更改常规密钥对。
常规密钥对
XRP账户允许账户授权一个称为常规密钥对的二级密钥对来签署未来的交易,同时保持您的主密钥对离线。如果常规密钥对的私钥遭到破坏,您可以删除或替换它,而无需更改帐户的其余部分并重新建立与其他帐户的关系。您也可以主动替换常规密钥对。(这些东西都不可能用于帐户的主密钥对,该帐户内部链接到该帐户的地址。)
您使用该wallet_propose方法生成密钥对以用作常规密钥对。但是,与使用与其支持的帐户并行生成的主密钥对不同account_id,您必须明确创建常规密钥对与您希望为其签署交易的帐户之间的关系。您使用SetRegularKey方法将常规密钥对分配给帐户。
有关分配常规密钥对的教程,请参阅分配常规密钥对。
将常规密钥对分配给帐户后,该帐户有两个与其关联的密钥对:
您可以将一个常规密钥对分配给一个帐户,并将其用于签署所有交易,但为主密钥对保留的交易除外。
您可以随时移除或更改常规密钥对。这意味着,如果普通私钥遭到破坏(但不是主密钥),只需删除或更改常规密钥对,即可重新获得对您帐户的控制权。
有关更改或删除常规密钥对的教程,请参阅分配常规密钥对。
签名算法
加密密钥对总是绑定到特定的签名算法,该算法定义私钥和公钥之间的数学关系。密码签名算法具有这样的性质,即鉴于密码技术的当前状态,使用私钥来计算匹配公共密钥是“容易的”,但是通过从公钥开始计算匹配的私钥是不可能的。
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的法定人数和权重值来控制需要多少签名,以及在哪些组合中。
发送多重签名交易
要成功提交多签名交易,您必须执行以下所有操作:
有关更多信息,请参阅设置多重签名。
XRP账本在XRP中应用准备金要求,以防止由于垃圾邮件或恶意使用而导致共享全局账本过大。目标是限制账本的增长以匹配技术的改进,以便当前的商品级机器始终能够适应RAM中的当前账本和磁盘上的全额账本历史记录。
要提交交易,地址必须在共享的全局账本中保留最小量的XRP。您不能将此XRP发送到其他地址。为了支付新地址,您必须发送足够的XRP以满足储备要求。
目前的最低储备金要求是20 XRP。(这是在帐本中没有其他对象的地址的成本。)
准备金要求分为两种:
20000000
Drop)。5000000
,
5个XRP(Drop)。账本中的许多对象都属于特定的地址,并计入该地址的预留要求。当物品从账本中被移除时,它们不再计入所有者的储备金要求。
OfferSequence
参数的OfferCreate交易来取消交易。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建议还进行以下操作:
tfSetNoRipple flag
。精确的语义
已启用存款授权的账户:x
下表总结了交易类型是否可以使用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。如果结果为零,那么该帐户已禁用了存款授权。
也可以看看
总结:
账号地址生成规则类似于比特币的地址生成规则,地址的加密算法可以指定。
账号的秘钥有两种,一个主的,一个常规的,可以用主秘钥替换常规秘钥,主秘钥为了安全可以禁用,常规秘钥主要用来签署交易。这个设计还是挺不错的~~~