Ripple数据本地存储概览

1.数据文件及介绍

1.1 Sqlite数据

文件 包含表 内容
Ledger.db Ledgers 区块信息
Ledger.db Validations 本地历史区块共识信息
Transaction.db AccountTransactions 账户交易表
Transaction.db Transactions 交易相关信息
Wallet.db NodeIdentity 存储当前节点的NodePublic与NodePrivate
Wallet.db PublisherManifests 没什么用
Wallet.db ValidatorManifests 没什么用

1.2 序列化数据的存储

  • NuDB 可用在各个平台上
  • RocksDB 不可用在Windows平台上

2.数据结构

2.1 Sqlite表结构及说明

2.1.1 Ledgers

列名 类型 含义
LedgerHash CHARACTER 哈希值
LedgerSeq BIGINT UNSIGNED Ledger序号
PrevHash CHARACTER 前个Ledger的Hash值
TotalCoins BIGINT UNSIGNED 当前网络上的XRP总数(交易会销毁XRP)
ClosingTime BIGINT UNSIGNED 关闭时间
PrevClosingTime BIGINT UNSIGNED 前一个区块的关闭时间
CloseTimeRes BIGINT UNSIGNED ledger关闭时间的解决方案(2-120S)
CloseFlags BIGINT UNSIGNED 标识这个ledger是怎么关闭的,一般都是0
AccountSetHash CHARACTER stateMap根结点hash
TransSetHash CHARACTER txMap 根节点哈希

2.1.2 Validations

列名 类型 含义
LedgerSeq BIGINT UNSIGNED Ledger序号
InitialSeq BIGINT UNSIGNED 共LedgerSeq一样
LedgerHash CHARACTER 共识过程中用到的LedgerHash
NodePubKey CHARACTER 对ledger签名的节点公钥
SignTime BIGINT UNSIGNED 签名时间
RawData BLOB 与ledgerInfo类似的数据

2.1.3 AccountTransactions

列名 类型 含义
TransID CHARACTER 交易hash
Account CHARACTER 账户ID
LedgerSeq BIGINT UNSIGNED ledger序号
TxnSeq INTEGER 交易Sequence号(是此账户的第几个交易)

2.1.4 Transactions

列名 类型 含义
TransID CHARACTER 交易hash
TransType CHARACTER 交易类型
FromAcct CHARACTER 交易的发起账户
FromSeq BIGINT UNSIGNED 交易在账户中的序号
LedgerSeq BIGINT UNSIGNED 交易落在哪个区块上
Status CHARACTER 交易的状态V表示“共识过”
RawTxn BLOB 交易序列化数据
TxnMeta BLOB 交易metaData的序列化数据

2.1.5 NodeIdentity

列名 类型 含义
PublicKey CHARACTER 当前节点的NodePublic
PrivateKey CHARACTER 储当前节点的NodePrivate

2.1.6 PublisherManifests

列名 类型 含义
RawData BLOB

2.1.7 ValidatorManifests

列名 类型 含义
RawData BLOB

2.2 序列化数据

2.2.1 Ripple的数据序列化

以LedgerInfo为例:

void addRaw (LedgerInfo const& info, Serializer& s)
{
    s.add32 (info.seq);
    s.add64 (info.drops.drops ());
    s.add256 (info.parentHash);
    s.add256 (info.txHash);
    s.add256 (info.accountHash);
    s.add32 (info.parentCloseTime.time_since_epoch().count());
    s.add32 (info.closeTime.time_since_epoch().count());
    s.add8 (info.closeTimeResolution.count());
    s.add8 (info.closeFlags);
}

int Serializer::add16 (std::uint16_t i)
{
    int ret = mData.size ();
    mData.push_back (static_cast<unsigned char> (i >> 8));
    mData.push_back (static_cast<unsigned char> (i & 0xff));
    return ret;
}

2.2.2 存到NuDB的数据及序列化

<big>需要序列化的数据分三种类型</big>

/** The types of node objects. */
enum NodeObjectType
{
    hotUNKNOWN = 0,
    hotLEDGER = 1,
    //hotTRANSACTION = 2        // Not used
    hotACCOUNT_NODE = 3,
    hotTRANSACTION_NODE = 4
};
  • LedgerInfo (对应hotLEDGER)
    • LedgerSeq,LedgerHash等,具体可参见Ripple官网
    • 区块之间是通过LedgerHash与PrevHash(上一个区块哈希)来产生顺序关联的
    • LedgerInfo的序列化代码:
    // Save the ledger header in the hashed object store
    {
        Serializer s (128);
        s.add32 (HashPrefix::ledgerMaster);
        addRaw(ledger->info(), s);
        app.getNodeStore ().store (
            hotLEDGER, std::move (s.modData ()), ledger->info().hash);
    }
    
  • StateMap (包括各种SLE信息)
    • SLE是STLedgerEntry的简写,是Ripple自定义的一种数据结构
    • SLE种类:Account、Escrow、Fee、Amendment、PayChannel等
    • 其中有一个比较重要的SLE是skipList,它包含前面256个区块的ledgerHash,这个SLE在无交易的情况下占用空间最大,每个区块hash占32字节,256个就是8k大小
    • StateMap序列化代码:
    void
    Ledger::rawInsert(std::shared_ptr<SLE> const& sle)
    {
        Serializer ss;
        sle->add(ss);
        auto item = std::make_shared<
            SHAMapItem const>(sle->key(),
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值