帐户-XRP分类帐开发门户

29/10/2019 0 条评论 39 次阅读 0 人点赞

帐户-XRP分类帐开发门户

帐目

XRP分类帐中的“帐户”代表XRP的持有者和交易的发送者。帐户的核心要素是:

  • 识别地址,例如rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn注意: XRP社区已建议(并开发了编解码器来支持)一种新的X地址格式,交易所和钱包可以代替目的地标签使用。这些“打包”地址以X而不是开头r。有关更多信息,请参见XRPL address-地址格式。 现场。
  • 一个XRP平衡。此XRP的一部分已预留给储备金
  • 序列号,从1开始,并与从该帐户发送的每个事务增加。除非交易的序列号与其发送者的下一个序列号匹配,否则任何交易都不能包含在分类帐中。
  • 交易的历史,影响本账户及其余额。
  • 一种或多种授权交易的方式,可能包括:
    • 帐户固有的主密钥对。(可以禁用但不能更改。)
    • 可以旋转的 “常规”密钥对。
    • 多重签名的签名者列表。(与帐户的核心数据分开存储。)

在分类帐的数据树中,帐户的核心数据存储在AccountRoot分类帐对象类型中。帐户也可以是其他几种类型的数据的所有者(或部分所有者)。

提示: XRP分类帐中的“帐户”介于财务使用情况(例如“银行帐户”)和计算使用情况(例如“ UNIX帐户”)之间。非XRP货币和资产本身不会存储在XRP分类帐帐户中;每个此类资产都存储在称为“信任线”的会计关系中,该关系将两方联系起来。

创建账户

没有专用的“创建帐户”交易。该支付交易如果付款发送XRP比等于或大于自动创建一个新帐户的帐号到不已经有一个帐户,数学,有效地址。这称为为帐户注,并在分类帐中创建一个AccountRoot对象。没有其他交易可以创建帐户。

注意:为帐户注资不会给您该帐户的任何特殊特权。拥有与帐户地址相对应的密钥的任何人都可以完全控制该帐户及其包含的所有XRP。对于某些地址,可能没有人拥有密钥,在这种情况下,帐户是一个黑洞,XRP会永远丢失。

在XRP分类帐中获取帐户的典型方法如下:

  1. 从强大的随机性源中生成一个密钥对,并计算该密钥对的地址。(例如,您可以使用wallet_propose方法执行此操作。)
  2. 让已经在XRP分类帐中拥有帐户的人将XRP发送到您生成的地址。
    • 例如,您可以在私人交易所中购买XRP,然后将XRP从交易所中撤出至您指定的地址。注意:第一次在自己的XRP分类帐地址接收XRP时,必须支付帐户准备金(当前为20 XRP),这将无限期锁定该XRP金额。相比之下,私人交易所通常将其所有客户的XRP保留在几个共享的XRP Ledger帐户中,因此客户不必在交易所中为单个帐户支付准备金。在提款之前,请考虑直接在XRP分类帐上拥有自己的帐户是否值得。

地址

XRP分类帐中的帐户由XRP分类帐的base58格式的地址标识。地址是从帐户的主公钥派生的,而后者又是从秘密密钥派生的。地址在JSON中以字符串表示,具有以下特征:

  • 长度在25到35个字符之间
  • 从角色开始 r注意: XRP社区已建议(并开发了编解码器来支持)一种新的X地址格式,交易所和钱包可以代替目的地标签使用。这些“打包”地址以X而不是开头r。有关更多信息,请参见XRPL address-地址格式。 现场。
  • 使用字母数字字符,但不包括数字“ 0大写字母O”,大写字母“ I”和小写字母“ l
  • 区分大小写
  • 包括一个4字节的校验和,以便从随机字符中生成有效地址的概率约为2 ^ 32中的1

有关更多信息,请参见Accountsbase58编码

任何有效的地址都可以通过注资成为XRP分类帐中的帐户。您也可以使用未提供资金的地址来表示常规密钥签署者列表的成员。只有注资帐户才能成为交易的发送者。

创建有效地址是从密钥对开始的严格数学任务。您可以生成密钥对并完全脱机计算其地址,而无需与XRP分类帐或任何其他方进行通信。从公用密钥到地址的转换涉及单向哈希函数,因此可以确认公用密钥与地址匹配,但是不可能仅从该地址派生公用密钥。(这是已签名交易包含公钥发送方地址的部分原因。)

有关如何计算XRP分类帐地址的更多技术细节,请参阅地址编码

特殊地址

在XRP分类帐中,某些地址具有特殊含义或历史用途。在许多情况下,这些是“黑洞”地址,这意味着该地址不是从已知的秘密密钥派生的。由于实际上不可能仅从地址中猜测秘密密钥,因此黑洞地址所拥有的任何XRP都将永远丢失。

地址 Name 含义 黑洞?
rrrrrrrrrrrrrrrrrrrrhoLvTp ACCOUNT_ZERO 一个地址,它是XRP分类帐的valuebase58编码0。在对等通信中,rippled将此地址用作XRP的发行者。
rrrrrrrrrrrrrrrrrrrrBZbvji ACCOUNT_ONE 一个地址,它是XRP分类帐的valuebase58编码1。在分类帐中,RippleState条目使用此地址作为信任行余额发行人的占位符。
rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh 起源账户 rippled从头开始创建新的创始分类账时(例如,在独立模式下),此帐户拥有所有XRP。该地址是从种子值“ masterpassphrase”生成的,该值是硬编码的. 没有
rrrrrrrrrrrrrrrrrrrNAMEtxvNvQ 波纹名称保留黑洞 过去,Ripple要求用户将XRP发送到该帐户以保留Ripple名称。
rrrrrrrrrrrrrrrrrrrn5RM1rHd NaN地址 先前版本的涟漪库编码值NaN时生成此地址使用XRP分类帐的base58字符串编码格式。

账户永久

创建后,帐户将永远存在于XRP分类帐的数据树中。这是因为必须永久跟踪事务的当前序列号,以便不能再次处理旧的事务。

与比特币和许多其他加密货币不同,XRP Ledger的公共分类帐链的每个新版本都包含分类帐的完整状态,每个新帐户的大小都会增加。因此,除非完全必要,否则Ripple不鼓励创建新帐户。代表许多用户发送和接收价值的机构可以使用源标签目标标签来区分与客户之间的付款,而仅使用XRP分类帐中的一个(或少数)帐户。

您无法支出或转移20 XRP 的储备金要求,因此每个新帐户都会锁定此金额。(可以销毁该XRP 来支付交易成本,但不能将其发送到其他帐户。)如果准备金减少,则该XRP中的一些可能会再次可用。有关储备金要求如何更改的更多信息,请参阅“ 费用投票”

交易记录

在XRP分类帐中,通过交易的“线程”跟踪交易历史,该“线程”由交易的标识哈希和分类帐索引链接。该AccountRoot分类帐对象具有识别哈希和最近修改它的交易分类帐; 该交易的元数据包括AccountRoot节点的先前状态,因此可以通过这种方式遍历单个帐户的历史记录。此事务历史记录包括AccountRoot直接修改节点的所有事务,包括:

帐户的概念性交易历史记录还包括修改该帐户拥有的对象和非XRP余额的交易。这些对象是单独的分类帐对象,每个对象都有影响它们的自己的交易线程。如果您具有帐户的完整分类帐历史记录,则可以跟踪该帐户,以查找该帐户创建或修改的分类帐对象。“完整的”交易历史记录包括交易拥有的对象的历史记录,例如:

  • RippleState 对象(信任线)连接到该帐户。
  • DirectoryNode 对象,尤其是跟踪该帐户拥有的对象的所有者目录。
  • Offer 对象,代表去中心化交易所中帐户的未完成货币兑换订单
  • PayChannel 对象,代表往返帐户的异步支付渠道
  • Escrow 对象,表示按时间或加密条件锁定的或来自账户的已付款。
  • SignerList对象,代表可以通过多次签名授权帐户交易的地址列表。

有关每个对象的更多信息,请参见《分类帐格式参考》

地址编码

提示:这些技术细节仅与构建具有XRP Ledger兼容性的低级库软件的人员有关!

[资源]

XRP分类帐地址使用base58编码与字典 rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz。由于XRP分类帐使用base58对几种类型的密钥进行编码,因此它以一个字节的“类型前缀”(也称为“版本前缀”)作为前缀来区分它们。类型前缀导致地址通常以base58格式以不同的字母开头。

下图显示了键和地址之间的关系:

根据公钥计算XRP分类帐地址的公式如下。有关完整的示例代码,请参见encode_address.js 。有关从密码短语或种子值导出公钥的过程,请参见“ 密钥派生”

  1. 导入所需的算法:SHA-256,RIPEMD160和base58。设置base58的字典。
    'use strict';
    const assert = require('assert');
    const crypto = require('crypto');
    const R_B58_DICT = 'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz';
    const base58 = require('base-x')(R_B58_DICT);
    
    assert(crypto.getHashes().includes('sha256'));
    assert(crypto.getHashes().includes('ripemd160'));
    
  2. 从33字节的ECDSA secp256k1公钥或32字节的Ed25519公钥开始。对于Ed25519密钥,请在密钥前面加上byte 0xED
    const pubkey_hex =
      'ED9434799226374926EDA3B54B1B461B4ABF7237962EAE18528FEA67595397FA32';
    const pubkey = Buffer.from(pubkey_hex, 'hex');
    assert(pubkey.length == 33);
    
  3. 计算RIPEMD160SHA-256公用密钥的哈希值。此值为“帐户ID”。
    const pubkey_inner_hash = crypto.createHash('sha256').update(pubkey);
    const pubkey_outer_hash = crypto.createHash('ripemd160');
    pubkey_outer_hash.update(pubkey_inner_hash.digest());
    const account_id = pubkey_outer_hash.digest();
    
  4. 计算帐户ID的SHA-256哈希值的SHA-256哈希值;取前4个字节。该值是“校验和”。
    const address_type_prefix = Buffer.from([0x00]);
    const payload = Buffer.concat([address_type_prefix, account_id]);
    const chksum_hash1 = crypto.createHash('sha256').update(payload).digest();
    const chksum_hash2 = crypto.createHash('sha256').update(chksum_hash1).digest();
    const checksum =  chksum_hash2.slice(0,4);
    
  5. 连接有效负载和校验和。计算串联缓冲区的base58值。结果是地址。
    const dataToEncode = Buffer.concat([payload, checksum]);
    const address = base58.encode(dataToEncode);
    console.log(address);
    // rDTXLQ7ZKZVKz33zJbHjgVShjsBnqMBhmN
    

也可以看看

Measure

Measure

XRPCC

这个人太懒什么东西都没留下

文章评论(0)