Skip to content

Commit 25efda0

Browse files
godexsoftPeterChen13579
authored andcommitted
feat: ETLng MPT support (XRPLF#2154)
1 parent 544a523 commit 25efda0

File tree

15 files changed

+380
-36
lines changed

15 files changed

+380
-36
lines changed

src/etl/ETLService.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@
3939
#include "etlng/LoadBalancerInterface.hpp"
4040
#include "etlng/impl/LedgerPublisher.hpp"
4141
#include "etlng/impl/TaskManagerProvider.hpp"
42+
#include "etlng/impl/ext/Cache.hpp"
43+
#include "etlng/impl/ext/Core.hpp"
44+
#include "etlng/impl/ext/MPT.hpp"
45+
#include "etlng/impl/ext/NFT.hpp"
46+
#include "etlng/impl/ext/Successor.hpp"
4247
#include "feed/SubscriptionManagerInterface.hpp"
4348
#include "util/Assert.hpp"
4449
#include "util/Constants.hpp"
@@ -96,7 +101,8 @@ ETLService::makeETLService(
96101
etlng::impl::CacheExt{cacheUpdater},
97102
etlng::impl::CoreExt{backend},
98103
etlng::impl::SuccessorExt{backend, backend->cache()},
99-
etlng::impl::NFTExt{backend}
104+
etlng::impl::NFTExt{backend},
105+
etlng::impl::MPTExt{backend}
100106
),
101107
amendmentBlockHandler
102108
);

src/etlng/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ target_sources(
1515
impl/TaskManager.cpp
1616
impl/ext/Cache.cpp
1717
impl/ext/Core.cpp
18+
impl/ext/MPT.cpp
1819
impl/ext/NFT.cpp
1920
impl/ext/Successor.cpp
2021
)

src/etlng/impl/ext/Cache.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@ CacheExt::CacheExt(std::shared_ptr<CacheUpdaterInterface> cacheUpdater) : cacheU
3636
}
3737

3838
void
39-
CacheExt::onLedgerData(model::LedgerData const& data) const
39+
CacheExt::onLedgerData(model::LedgerData const& data)
4040
{
41-
cacheUpdater_->update(data);
4241
LOG(log_.trace()) << "got data. objects cnt = " << data.objects.size();
42+
cacheUpdater_->update(data);
4343
}
4444

4545
void
46-
CacheExt::onInitialData(model::LedgerData const& data) const
46+
CacheExt::onInitialData(model::LedgerData const& data)
4747
{
4848
LOG(log_.trace()) << "got initial data. objects cnt = " << data.objects.size();
4949
cacheUpdater_->update(data);
@@ -52,7 +52,6 @@ CacheExt::onInitialData(model::LedgerData const& data) const
5252

5353
void
5454
CacheExt::onInitialObjects(uint32_t seq, std::vector<model::Object> const& objs, [[maybe_unused]] std::string lastKey)
55-
const
5655
{
5756
LOG(log_.trace()) << "got initial objects cnt = " << objs.size();
5857
cacheUpdater_->update(seq, objs);

src/etlng/impl/ext/Cache.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ class CacheExt {
4040
CacheExt(std::shared_ptr<CacheUpdaterInterface> cacheUpdater);
4141

4242
void
43-
onLedgerData(model::LedgerData const& data) const;
43+
onLedgerData(model::LedgerData const& data);
4444

4545
void
46-
onInitialData(model::LedgerData const& data) const;
46+
onInitialData(model::LedgerData const& data);
4747

4848
void
49-
onInitialObjects(uint32_t seq, std::vector<model::Object> const& objs, [[maybe_unused]] std::string lastKey) const;
49+
onInitialObjects(uint32_t seq, std::vector<model::Object> const& objs, [[maybe_unused]] std::string lastKey);
5050

5151
// We want cache updates through ETL if we are a potential writer but currently are not writing to DB
5252
static bool

src/etlng/impl/ext/Core.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,37 +34,37 @@ CoreExt::CoreExt(std::shared_ptr<BackendInterface> backend) : backend_(std::move
3434
}
3535

3636
void
37-
CoreExt::onLedgerData(model::LedgerData const& data) const
37+
CoreExt::onLedgerData(model::LedgerData const& data)
3838
{
3939
LOG(log_.debug()) << "Loading ledger data for " << data.seq;
4040
backend_->writeLedger(data.header, auto{data.rawHeader});
4141
insertTransactions(data);
4242
}
4343

4444
void
45-
CoreExt::onInitialData(model::LedgerData const& data) const
45+
CoreExt::onInitialData(model::LedgerData const& data)
4646
{
4747
LOG(log_.info()) << "Loading initial ledger data for " << data.seq;
4848
backend_->writeLedger(data.header, auto{data.rawHeader});
4949
insertTransactions(data);
5050
}
5151

5252
void
53-
CoreExt::onInitialObject(uint32_t seq, model::Object const& obj) const
53+
CoreExt::onInitialObject(uint32_t seq, model::Object const& obj)
5454
{
5555
LOG(log_.trace()) << "got initial OBJ = " << obj.key << " for seq " << seq;
5656
backend_->writeLedgerObject(auto{obj.keyRaw}, seq, auto{obj.dataRaw});
5757
}
5858

5959
void
60-
CoreExt::onObject(uint32_t seq, model::Object const& obj) const
60+
CoreExt::onObject(uint32_t seq, model::Object const& obj)
6161
{
6262
LOG(log_.trace()) << "got OBJ = " << obj.key << " for seq " << seq;
6363
backend_->writeLedgerObject(auto{obj.keyRaw}, seq, auto{obj.dataRaw});
6464
}
6565

6666
void
67-
CoreExt::insertTransactions(model::LedgerData const& data) const
67+
CoreExt::insertTransactions(model::LedgerData const& data)
6868
{
6969
for (auto const& txn : data.transactions) {
7070
LOG(log_.trace()) << "Inserting transaction = " << txn.sttx.getTransactionID();

src/etlng/impl/ext/Core.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,20 +39,20 @@ class CoreExt {
3939
CoreExt(std::shared_ptr<BackendInterface> backend);
4040

4141
void
42-
onLedgerData(model::LedgerData const& data) const;
42+
onLedgerData(model::LedgerData const& data);
4343

4444
void
45-
onInitialData(model::LedgerData const& data) const;
45+
onInitialData(model::LedgerData const& data);
4646

4747
void
48-
onInitialObject(uint32_t seq, model::Object const& obj) const;
48+
onInitialObject(uint32_t seq, model::Object const& obj);
4949

5050
void
51-
onObject(uint32_t seq, model::Object const& obj) const;
51+
onObject(uint32_t seq, model::Object const& obj);
5252

5353
private:
5454
void
55-
insertTransactions(model::LedgerData const& data) const;
55+
insertTransactions(model::LedgerData const& data);
5656
};
5757

5858
} // namespace etlng::impl

src/etlng/impl/ext/MPT.cpp

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
//------------------------------------------------------------------------------
2+
/*
3+
This file is part of clio: https://github.com/XRPLF/clio
4+
Copyright (c) 2025, the clio developers.
5+
6+
Permission to use, copy, modify, and distribute this software for any
7+
purpose with or without fee is hereby granted, provided that the above
8+
copyright notice and this permission notice appear in all copies.
9+
10+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17+
*/
18+
//==============================================================================
19+
20+
#include "etlng/impl/ext/MPT.hpp"
21+
22+
#include "data/BackendInterface.hpp"
23+
#include "data/DBHelpers.hpp"
24+
#include "etl/MPTHelpers.hpp"
25+
#include "etlng/Models.hpp"
26+
#include "util/log/Logger.hpp"
27+
28+
#include <xrpl/basics/strHex.h>
29+
#include <xrpl/protocol/AccountID.h>
30+
#include <xrpl/protocol/STTx.h>
31+
#include <xrpl/protocol/TxMeta.h>
32+
33+
#include <cstdint>
34+
#include <memory>
35+
#include <optional>
36+
#include <utility>
37+
#include <vector>
38+
39+
namespace etlng::impl {
40+
41+
MPTExt::MPTExt(std::shared_ptr<BackendInterface> backend) : backend_(std::move(backend))
42+
{
43+
}
44+
45+
void
46+
MPTExt::onLedgerData(model::LedgerData const& data)
47+
{
48+
LOG(log_.trace()) << "got TXS cnt = " << data.transactions.size() << "; OBJS size = " << data.objects.size();
49+
writeMPTHoldersFromTransactions(data);
50+
}
51+
52+
void
53+
MPTExt::onInitialObject(uint32_t, model::Object const& obj)
54+
{
55+
LOG(log_.trace()) << "got initial object with key: " << ripple::strHex(obj.key);
56+
if (auto const mptHolder = etl::getMPTHolderFromObj(obj.keyRaw, obj.dataRaw); mptHolder.has_value())
57+
backend_->writeMPTHolders({*mptHolder});
58+
}
59+
60+
void
61+
MPTExt::onInitialData(model::LedgerData const& data)
62+
{
63+
LOG(log_.trace()) << "got initial TXS cnt = " << data.transactions.size();
64+
writeMPTHoldersFromTransactions(data);
65+
}
66+
67+
void
68+
MPTExt::writeMPTHoldersFromTransactions(model::LedgerData const& data)
69+
{
70+
std::vector<MPTHolderData> holders;
71+
72+
for (auto const& tx : data.transactions) {
73+
if (auto const mptHolder = etl::getMPTHolderFromTx(tx.meta, tx.sttx); mptHolder.has_value())
74+
holders.push_back(*mptHolder);
75+
}
76+
77+
if (not holders.empty())
78+
backend_->writeMPTHolders(holders);
79+
}
80+
81+
} // namespace etlng::impl

src/etlng/impl/ext/MPT.hpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
//------------------------------------------------------------------------------
2+
/*
3+
This file is part of clio: https://github.com/XRPLF/clio
4+
Copyright (c) 2025, the clio developers.
5+
6+
Permission to use, copy, modify, and distribute this software for any
7+
purpose with or without fee is hereby granted, provided that the above
8+
copyright notice and this permission notice appear in all copies.
9+
10+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11+
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12+
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13+
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14+
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15+
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17+
*/
18+
//==============================================================================
19+
20+
#pragma once
21+
22+
#include "data/BackendInterface.hpp"
23+
#include "etlng/Models.hpp"
24+
#include "util/log/Logger.hpp"
25+
26+
#include <xrpl/basics/strHex.h>
27+
#include <xrpl/protocol/AccountID.h>
28+
#include <xrpl/protocol/STTx.h>
29+
#include <xrpl/protocol/TxMeta.h>
30+
31+
#include <cstdint>
32+
#include <memory>
33+
34+
namespace etlng::impl {
35+
36+
class MPTExt {
37+
std::shared_ptr<BackendInterface> backend_;
38+
util::Logger log_{"ETL"};
39+
40+
public:
41+
explicit MPTExt(std::shared_ptr<BackendInterface> backend);
42+
43+
void
44+
onLedgerData(model::LedgerData const& data);
45+
46+
void
47+
onInitialObject(uint32_t seq, model::Object const& obj);
48+
49+
void
50+
onInitialData(model::LedgerData const& data);
51+
52+
private:
53+
void
54+
writeMPTHoldersFromTransactions(model::LedgerData const& data);
55+
};
56+
57+
} // namespace etlng::impl

src/etlng/impl/ext/NFT.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,27 +37,28 @@ NFTExt::NFTExt(std::shared_ptr<BackendInterface> backend) : backend_(std::move(b
3737
}
3838

3939
void
40-
NFTExt::onLedgerData(model::LedgerData const& data) const
40+
NFTExt::onLedgerData(model::LedgerData const& data)
4141
{
42+
LOG(log_.trace()) << "got TXS cnt = " << data.transactions.size() << "; OBJS size = " << data.objects.size();
4243
writeNFTs(data);
4344
}
4445

4546
void
46-
NFTExt::onInitialObject(uint32_t seq, model::Object const& obj) const
47+
NFTExt::onInitialObject(uint32_t seq, model::Object const& obj)
4748
{
4849
LOG(log_.trace()) << "got initial object with key = " << obj.key;
4950
backend_->writeNFTs(etl::getNFTDataFromObj(seq, obj.keyRaw, obj.dataRaw));
5051
}
5152

5253
void
53-
NFTExt::onInitialData(model::LedgerData const& data) const
54+
NFTExt::onInitialData(model::LedgerData const& data)
5455
{
5556
LOG(log_.trace()) << "got initial TXS cnt = " << data.transactions.size();
5657
writeNFTs(data);
5758
}
5859

5960
void
60-
NFTExt::writeNFTs(model::LedgerData const& data) const
61+
NFTExt::writeNFTs(model::LedgerData const& data)
6162
{
6263
std::vector<NFTsData> nfts;
6364
std::vector<NFTTransactionsData> nftTxs;

src/etlng/impl/ext/NFT.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,17 @@ class NFTExt {
3636
NFTExt(std::shared_ptr<BackendInterface> backend);
3737

3838
void
39-
onLedgerData(model::LedgerData const& data) const;
39+
onLedgerData(model::LedgerData const& data);
4040

4141
void
42-
onInitialObject(uint32_t seq, model::Object const& obj) const;
42+
onInitialObject(uint32_t seq, model::Object const& obj);
4343

4444
void
45-
onInitialData(model::LedgerData const& data) const;
45+
onInitialData(model::LedgerData const& data);
4646

4747
private:
4848
void
49-
writeNFTs(model::LedgerData const& data) const;
49+
writeNFTs(model::LedgerData const& data);
5050
};
5151

5252
} // namespace etlng::impl

0 commit comments

Comments
 (0)