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
2.1.7 ValidatorManifests
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>
enum NodeObjectType
{
hotUNKNOWN = 0,
hotLEDGER = 1,
hotACCOUNT_NODE = 3,
hotTRANSACTION_NODE = 4
};
- LedgerInfo (对应hotLEDGER)
- LedgerSeq,LedgerHash等,具体可参见Ripple官网
- 区块之间是通过LedgerHash与PrevHash(上一个区块哈希)来产生顺序关联的
- LedgerInfo的序列化代码:
{
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(),