Skip to content

Commit 9de6b85

Browse files
committed
modify block timestamp to strictly increasing
1 parent 6f207d4 commit 9de6b85

File tree

24 files changed

+231
-86
lines changed

24 files changed

+231
-86
lines changed

bcos-executor/test/unittest/mock/MockLedger.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ class MockLedger : public bcos::ledger::LedgerInterface
7575
block->setBlockHeader(m_blockHeader);
7676
}
7777
block->blockHeader()->setNumber(m_blockNumber);
78+
auto hashImpl = std::make_shared<crypto::Keccak256>();
79+
block->blockHeader()->calculateHash(*hashImpl);
7880
_onGetBlock(nullptr, block);
7981
};
8082

bcos-framework/bcos-framework/ledger/Ledger.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,9 @@ inline constexpr struct GetBlockData
6464
co_return co_await tag_invoke(*this, ledger, blockNumber, blockFlag);
6565
}
6666
task::Task<protocol::Block::Ptr> operator()(auto& storage, protocol::BlockNumber blockNumber,
67-
int32_t blockFlag, protocol::BlockFactory& blockFactory, FromStorage fromStorage) const
67+
int32_t blockFlag, protocol::BlockFactory& blockFactory) const
6868
{
69-
co_return co_await tag_invoke(
70-
*this, storage, blockNumber, blockFlag, blockFactory, fromStorage);
69+
co_return co_await tag_invoke(*this, storage, blockNumber, blockFlag, blockFactory);
7170
}
7271
} getBlockData{};
7372

@@ -182,16 +181,17 @@ inline constexpr struct GetLedgerConfig
182181

183182
// Read from storage
184183
task::Task<void> operator()(storage2::ReadableStorage<executor_v1::StateKey> auto& storage,
185-
LedgerConfig& ledgerConfig, protocol::BlockNumber blockNumber) const
184+
LedgerConfig& ledgerConfig, protocol::BlockNumber blockNumber,
185+
protocol::BlockFactory& blockFactory) const
186186
{
187-
co_await tag_invoke(*this, storage, ledgerConfig, blockNumber);
187+
co_await tag_invoke(*this, storage, ledgerConfig, blockNumber, blockFactory);
188188
}
189189
task::Task<LedgerConfig::Ptr> operator()(
190190
storage2::ReadableStorage<executor_v1::StateKey> auto& storage,
191-
protocol::BlockNumber blockNumber) const
191+
protocol::BlockNumber blockNumber, protocol::BlockFactory& blockFactory) const
192192
{
193193
auto ledgerConfig = std::make_shared<LedgerConfig>();
194-
co_await tag_invoke(*this, storage, *ledgerConfig, blockNumber);
194+
co_await tag_invoke(*this, storage, *ledgerConfig, blockNumber, blockFactory);
195195
co_return ledgerConfig;
196196
}
197197
} getLedgerConfig{};

bcos-framework/bcos-framework/ledger/LedgerConfig.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class LedgerConfig
5959
m_candidateSealerNodeList = std::move(candidateSealerNodeList);
6060
}
6161
virtual void setHash(bcos::crypto::HashType const& _hash) { m_hash = _hash; }
62+
virtual void setTimestamp(int64_t _timestamp) { m_timestamp = _timestamp; }
6263
virtual void setBlockNumber(bcos::protocol::BlockNumber _blockNumber)
6364
{
6465
m_blockNumber = _blockNumber;
@@ -89,6 +90,8 @@ class LedgerConfig
8990
bcos::crypto::HashType const& hash() const { return m_hash; }
9091
bcos::protocol::BlockNumber blockNumber() const { return m_blockNumber; }
9192

93+
int64_t timestamp() const { return m_timestamp; }
94+
9295
void setConsensusType(const std::string& _consensusType) { m_consensusType = _consensusType; }
9396
std::string consensusType() const { return m_consensusType; }
9497

@@ -174,6 +177,7 @@ class LedgerConfig
174177
bcos::consensus::ConsensusNodeList m_candidateSealerNodeList;
175178
bcos::crypto::HashType m_hash;
176179
bcos::protocol::BlockNumber m_blockNumber = 0;
180+
int64_t m_timestamp = 0;
177181
std::string m_consensusType;
178182
uint64_t m_blockTxCountLimit = 0;
179183
uint64_t m_leaderSwitchPeriod = 1;

bcos-framework/bcos-framework/sealer/SealerInterface.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ class SealerInterface
4444
virtual void asyncNoteLatestBlockNumber(int64_t _blockNumber) = 0;
4545

4646
virtual void asyncNoteLatestBlockHash(crypto::HashType _hash) = 0;
47+
48+
virtual void asyncNoteLatestBlockTimestamp(int64_t _timestamp) = 0;
4749
// interface for the consensus module to notify reset the sealing transactions
4850
virtual void asyncResetSealing(std::function<void(Error::Ptr)> _onRecvResponse) = 0;
4951

bcos-framework/bcos-framework/testutils/faker/FakeSealer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class FakeSealer : public SealerInterface
5555
uint64_t maxTxsToSeal() const { return m_maxTxsToSeal; }
5656

5757
void asyncNoteLatestBlockNumber(int64_t _blockNumber) override { m_blockNumber = _blockNumber; }
58+
void asyncNoteLatestBlockTimestamp(int64_t _timestamp) override { m_timestamp = _timestamp; }
5859
int64_t blockNumber() const { return m_blockNumber; }
5960
void asyncResetSealing(std::function<void(Error::Ptr)>) override {}
6061

@@ -64,6 +65,7 @@ class FakeSealer : public SealerInterface
6465
uint64_t m_proposalEndIndex = 0;
6566
uint64_t m_maxTxsToSeal = 0;
6667
int64_t m_blockNumber;
68+
int64_t m_timestamp;
6769
};
6870
} // namespace test
6971
} // namespace bcos

bcos-ledger/bcos-ledger/LedgerMethods.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,13 @@ bcos::task::Task<void> bcos::ledger::tag_invoke(
430430
auto gasPrice = sysConfig.getOrDefault(ledger::SystemConfig::tx_gas_price, "0x0");
431431
ledgerConfig.setGasPrice(std::make_tuple(gasPrice.first, gasPrice.second));
432432

433+
// Get block header to retrieve timestamp
434+
auto block = co_await getBlockData(ledger, blockNumber, HEADER);
435+
if (block && block->blockHeader())
436+
{
437+
ledgerConfig.setTimestamp(block->blockHeader()->timestamp());
438+
// ledgerConfig.setHash(block->blockHeader()->hash());
439+
}
433440
ledgerConfig.setBlockNumber(blockNumber);
434441
ledgerConfig.setHash(co_await getBlockHash(ledger, blockNumber));
435442
ledgerConfig.setFeatures(co_await getFeatures(ledger));

bcos-ledger/bcos-ledger/LedgerMethods.h

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,7 @@ task::Task<protocol::Block::Ptr> tag_invoke(ledger::tag_t<getBlockData> /*unused
8181

8282
task::Task<protocol::Block::Ptr> tag_invoke(ledger::tag_t<getBlockData> /*unused*/,
8383
storage2::ReadableStorage<executor_v1::StateKeyView> auto& storage,
84-
protocol::BlockNumber _blockNumber, int32_t _blockFlag, protocol::BlockFactory& blockFactory,
85-
FromStorage /*unused*/)
84+
protocol::BlockNumber _blockNumber, int32_t _blockFlag, protocol::BlockFactory& blockFactory)
8685
{
8786
LEDGER_LOG(TRACE) << "GetBlockDataByNumber request" << LOG_KV("blockNumber", _blockNumber)
8887
<< LOG_KV("blockFlag", _blockFlag);
@@ -207,7 +206,8 @@ task::Task<void> tag_invoke(
207206
ledger::tag_t<getLedgerConfig> /*unused*/, LedgerInterface& ledger, LedgerConfig& ledgerConfig);
208207

209208
task::Task<void> tag_invoke(ledger::tag_t<getLedgerConfig> /*unused*/, auto& storage,
210-
LedgerConfig& ledgerConfig, protocol::BlockNumber blockNumber)
209+
LedgerConfig& ledgerConfig, protocol::BlockNumber blockNumber,
210+
protocol::BlockFactory& blockFactory)
211211
{
212212
auto nodeList = co_await ledger::getNodeList(storage);
213213
ledgerConfig.setConsensusNodeList(::ranges::views::filter(nodeList, [](auto& node) {
@@ -241,9 +241,19 @@ task::Task<void> tag_invoke(ledger::tag_t<getLedgerConfig> /*unused*/, auto& sto
241241
auto gasPrice = sysConfig.getOrDefault(ledger::SystemConfig::tx_gas_price, "0x0");
242242
ledgerConfig.setGasPrice(std::make_tuple(gasPrice.first, gasPrice.second));
243243

244+
// Get block header to retrieve timestamp
245+
if (blockNumber >= 0)
246+
{
247+
auto block = co_await getBlockData(storage, blockNumber, HEADER, blockFactory);
248+
if (block && block->blockHeader())
249+
{
250+
ledgerConfig.setTimestamp(block->blockHeader()->timestamp());
251+
ledgerConfig.setHash(block->blockHeader()->hash());
252+
}
253+
}
244254
ledgerConfig.setBlockNumber(blockNumber);
245-
auto blockHash = co_await getBlockHash(storage, blockNumber, fromStorage);
246-
ledgerConfig.setHash(blockHash.value_or(crypto::HashType{}));
255+
// auto blockHash = co_await getBlockHash(storage, blockNumber, fromStorage);
256+
// ledgerConfig.setHash(blockHash.value_or(crypto::HashType{}));
247257

248258
Features features;
249259
co_await readFromStorage(features, storage, blockNumber);
@@ -376,7 +386,7 @@ task::Task<protocol::BlockNumber> tag_invoke(ledger::tag_t<getCurrentBlockNumber
376386
task::Task<consensus::ConsensusNodeList> tag_invoke(ledger::tag_t<getNodeList> /*unused*/,
377387
storage2::ReadableStorage<executor_v1::StateKey> auto& storage)
378388
{
379-
LEDGER_LOG(DEBUG) << "GetNodeLis";
389+
LEDGER_LOG(DEBUG) << "getNodeList";
380390
auto nodeListEntry =
381391
co_await storage2::readOne(storage, executor_v1::StateKeyView{SYS_CONSENSUS, "key"});
382392
if (!nodeListEntry)

bcos-ledger/test/unittests/ledger/LedgerTest.cpp

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -778,8 +778,8 @@ BOOST_AUTO_TEST_CASE(getBlockDataByNumber)
778778
BOOST_CHECK_EQUAL(_block, nullptr);
779779
p1.set_value(true);
780780
});
781-
BOOST_CHECK_THROW(block = task::syncWait(ledger::getBlockData(
782-
*m_storage, 1000, FULL_BLOCK, *m_blockFactory, fromStorage)),
781+
BOOST_CHECK_THROW(
782+
block = task::syncWait(ledger::getBlockData(*m_storage, 1000, FULL_BLOCK, *m_blockFactory)),
783783
NotFoundBlockHeader);
784784

785785
std::promise<bool> pp1;
@@ -790,8 +790,8 @@ BOOST_AUTO_TEST_CASE(getBlockDataByNumber)
790790
BOOST_CHECK_EQUAL(_block, nullptr);
791791
pp1.set_value(true);
792792
});
793-
BOOST_CHECK_THROW(block = task::syncWait(ledger::getBlockData(
794-
*m_storage, -1, FULL_BLOCK, *m_blockFactory, fromStorage)),
793+
BOOST_CHECK_THROW(
794+
block = task::syncWait(ledger::getBlockData(*m_storage, -1, FULL_BLOCK, *m_blockFactory)),
795795
bcos::Error);
796796

797797
std::promise<bool> p2;
@@ -805,8 +805,7 @@ BOOST_AUTO_TEST_CASE(getBlockDataByNumber)
805805
BOOST_CHECK(_block->receiptsSize() != 0);
806806
p2.set_value(true);
807807
});
808-
block = task::syncWait(
809-
ledger::getBlockData(*m_storage, 15, FULL_BLOCK, *m_blockFactory, fromStorage));
808+
block = task::syncWait(ledger::getBlockData(*m_storage, 15, FULL_BLOCK, *m_blockFactory));
810809
BOOST_CHECK(block->blockHeader());
811810
BOOST_CHECK_GT(block->transactionsSize(), 0);
812811
BOOST_CHECK_GT(block->receiptsSize(), 0);
@@ -822,8 +821,7 @@ BOOST_AUTO_TEST_CASE(getBlockDataByNumber)
822821
BOOST_CHECK(_block->receiptsSize() != 0);
823822
p3.set_value(true);
824823
});
825-
block = task::syncWait(
826-
ledger::getBlockData(*m_storage, 3, FULL_BLOCK, *m_blockFactory, fromStorage));
824+
block = task::syncWait(ledger::getBlockData(*m_storage, 3, FULL_BLOCK, *m_blockFactory));
827825
BOOST_CHECK(block->blockHeader());
828826
BOOST_CHECK_GT(block->transactionsSize(), 0);
829827
BOOST_CHECK_GT(block->receiptsSize(), 0);
@@ -836,8 +834,7 @@ BOOST_AUTO_TEST_CASE(getBlockDataByNumber)
836834
BOOST_CHECK(_block->transactionsSize() != 0);
837835
p4.set_value(true);
838836
});
839-
block = task::syncWait(
840-
ledger::getBlockData(*m_storage, 5, TRANSACTIONS, *m_blockFactory, fromStorage));
837+
block = task::syncWait(ledger::getBlockData(*m_storage, 5, TRANSACTIONS, *m_blockFactory));
841838
BOOST_CHECK_GT(block->transactionsSize(), 0);
842839

843840
std::promise<bool> p5;
@@ -848,8 +845,7 @@ BOOST_AUTO_TEST_CASE(getBlockDataByNumber)
848845
BOOST_CHECK(_block->receiptsSize() != 0);
849846
p5.set_value(true);
850847
});
851-
block =
852-
task::syncWait(ledger::getBlockData(*m_storage, 5, RECEIPTS, *m_blockFactory, fromStorage));
848+
block = task::syncWait(ledger::getBlockData(*m_storage, 5, RECEIPTS, *m_blockFactory));
853849
BOOST_CHECK_GT(block->receiptsSize(), 0);
854850

855851
std::promise<bool> p6;
@@ -860,8 +856,7 @@ BOOST_AUTO_TEST_CASE(getBlockDataByNumber)
860856
BOOST_CHECK_EQUAL(_block->transactionsSize(), 0);
861857
p6.set_value(true);
862858
});
863-
block = task::syncWait(
864-
ledger::getBlockData(*m_storage, 0, TRANSACTIONS, *m_blockFactory, fromStorage));
859+
block = task::syncWait(ledger::getBlockData(*m_storage, 0, TRANSACTIONS, *m_blockFactory));
865860
BOOST_CHECK_EQUAL(block->transactionsSize(), 0);
866861

867862
std::promise<bool> p7;
@@ -872,8 +867,7 @@ BOOST_AUTO_TEST_CASE(getBlockDataByNumber)
872867
BOOST_CHECK_EQUAL(_block->receiptsSize(), 0);
873868
p7.set_value(true);
874869
});
875-
block =
876-
task::syncWait(ledger::getBlockData(*m_storage, 0, RECEIPTS, *m_blockFactory, fromStorage));
870+
block = task::syncWait(ledger::getBlockData(*m_storage, 0, RECEIPTS, *m_blockFactory));
877871
BOOST_CHECK_EQUAL(block->receiptsSize(), 0);
878872

879873
std::promise<bool> p8;
@@ -886,8 +880,8 @@ BOOST_AUTO_TEST_CASE(getBlockDataByNumber)
886880
BOOST_TEST(_block->transactionsMetaDataSize() != 0);
887881
p8.set_value(true);
888882
});
889-
block = task::syncWait(
890-
ledger::getBlockData(*m_storage, 15, TRANSACTIONS_HASH, *m_blockFactory, fromStorage));
883+
block =
884+
task::syncWait(ledger::getBlockData(*m_storage, 15, TRANSACTIONS_HASH, *m_blockFactory));
891885
BOOST_CHECK_GT(block->transactionsMetaDataSize(), 0);
892886
BOOST_CHECK_EQUAL(block->transactionsSize(), 0);
893887
BOOST_CHECK_EQUAL(block->receiptsSize(), 0);
@@ -1390,9 +1384,9 @@ BOOST_AUTO_TEST_CASE(getLedgerConfig)
13901384
co_await storage2::writeOne(
13911385
*m_storage, KeyType{SYS_CURRENT_STATE, SYS_KEY_CURRENT_NUMBER}, value);
13921386

1393-
auto randomHash = crypto::HashType::generateRandomFixedBytes();
1394-
value.set(randomHash.asBytes());
1395-
co_await storage2::writeOne(*m_storage, KeyType{SYS_NUMBER_2_HASH, "10086"}, value);
1387+
// auto randomHash = crypto::HashType::generateRandomFixedBytes();
1388+
// value.set(randomHash.asBytes());
1389+
// co_await storage2::writeOne(*m_storage, KeyType{SYS_NUMBER_2_HASH, "10086"}, value);
13961390

13971391
config = {"1", 0};
13981392
value.setObject(config);
@@ -1404,6 +1398,25 @@ BOOST_AUTO_TEST_CASE(getLedgerConfig)
14041398
co_await storage2::writeOne(
14051399
*m_storage, KeyType{SYS_CONFIG, SYSTEM_KEY_RPBFT_EPOCH_SEALER_NUM}, value);
14061400

1401+
auto block = std::make_shared<bcostars::protocol::BlockImpl>();
1402+
auto blockHeader = block->blockHeader();
1403+
blockHeader->setNumber(10086);
1404+
blockHeader->setVersion(200);
1405+
blockHeader->setTimestamp(110);
1406+
auto hashImpl = std::make_shared<Keccak256>();
1407+
blockHeader->calculateHash(*hashImpl);
1408+
auto randomHash = blockHeader->hash();
1409+
co_await ledger::prewriteBlock(*m_ledger,
1410+
std::make_shared<bcos::protocol::ConstTransactions>(), block, false, m_storage);
1411+
bytes headerBuffer;
1412+
blockHeader->encode(headerBuffer);
1413+
1414+
storage::Entry number2HeaderEntry;
1415+
number2HeaderEntry.importFields({std::move(headerBuffer)});
1416+
co_await storage2::writeOne(*m_storage,
1417+
KeyType{ledger::SYS_NUMBER_2_BLOCK_HEADER, std::to_string(blockHeader->number())},
1418+
std::move(number2HeaderEntry));
1419+
14071420
auto ledgerConfig = std::make_shared<LedgerConfig>();
14081421
co_await ledger::getLedgerConfig(*m_ledger, *ledgerConfig);
14091422
BOOST_CHECK_EQUAL(ledgerConfig->blockTxCountLimit(), 12);

bcos-pbft/bcos-pbft/pbft/PBFTImpl.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ class PBFTImpl : public ConsensusInterface
7272

7373
// notify the sealer the latest blockNumber
7474
void registerStateNotifier(
75-
std::function<void(bcos::protocol::BlockNumber, crypto::HashType const&)> _stateNotifier)
75+
std::function<void(bcos::protocol::BlockNumber, crypto::HashType const&, int64_t)>
76+
_stateNotifier)
7677
{
7778
m_pbftEngine->pbftConfig()->registerStateNotifier(std::move(_stateNotifier));
7879
}

bcos-pbft/bcos-pbft/pbft/cache/PBFTCacheProcessor.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,8 @@ bool PBFTCacheProcessor::tryToApplyCommitQueue()
388388
<< m_config->printCurrentState();
389389
return false;
390390
}
391+
// TODO: use lastAppliedProposal to check the current proposal's parent block header info
392+
// the number,hash and timestamp should be checked
391393
// commit the proposal
392394
m_committedQueue.pop();
393395
// in case of the same block execute more than once

0 commit comments

Comments
 (0)