Skip to content

Commit 1ce26ce

Browse files
authored
Adapt block streams protobuf changes in 0.62 (#11104)
- Upgrade to hedera-protobuf-java-api 0.62 - Remove usage of BlockHeader.first_transaction_consensus_time Signed-off-by: Xin Li <[email protected]>
1 parent 7fb6c10 commit 1ce26ce

File tree

9 files changed

+43
-37
lines changed

9 files changed

+43
-37
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ dependencies {
5151
api("com.graphql-java:graphql-java-extended-validation:22.0")
5252
api("com.hedera.hashgraph:app:0.61.3")
5353
api("com.hedera.evm:hedera-evm:0.54.2")
54-
api("com.hedera.hashgraph:hedera-protobuf-java-api:0.61.3")
54+
api("com.hedera.hashgraph:hedera-protobuf-java-api:0.62.0")
5555
api("com.hedera.hashgraph:sdk:2.54.0")
5656
api("com.ongres.scram:client:2.1")
5757
api("com.playtika.testcontainers:embedded-google-pubsub:3.1.11")

hedera-mirror-importer/src/main/java/com/hedera/mirror/importer/reader/block/ProtoBlockFileReader.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,6 @@ private void readBlockHeader(ReaderContext context) {
108108
blockHeader.getHashAlgorithm(), context.getFilename()));
109109
}
110110

111-
// BlockHeader.first_transaction_consensus_time is null when there's no transactions in the block file even
112-
// though HIP defines how to derive it for empty round
113-
if (blockHeader.hasFirstTransactionConsensusTime()) {
114-
context.setLastMetaTimestamp(
115-
DomainUtils.timestampInNanosMax(blockHeader.getFirstTransactionConsensusTime()));
116-
}
117111
blockFileBuilder.blockHeader(blockHeader);
118112
blockFileBuilder.index(blockHeader.getNumber());
119113
}

hedera-mirror-importer/src/test/java/com/hedera/mirror/importer/parser/domain/BlockFileBuilder.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ public BlockFile.BlockFileBuilder items(List<BlockItem> blockItems) {
2424
long blockNumber = domainBuilder.number();
2525
byte[] bytes = domainBuilder.bytes(256);
2626
String filename = StringUtils.leftPad(Long.toString(blockNumber), 36, "0") + ".blk.gz";
27+
var blockTimestamp = blockItems.isEmpty()
28+
? domainBuilder.protoTimestamp()
29+
: blockItems.getLast().getTransactionResult().getConsensusTimestamp();
2730
var firstConsensusTimestamp = blockItems.isEmpty()
2831
? domainBuilder.protoTimestamp()
2932
: blockItems.getFirst().getTransactionResult().getConsensusTimestamp();
@@ -36,7 +39,7 @@ public BlockFile.BlockFileBuilder items(List<BlockItem> blockItems) {
3639

3740
return BlockFile.builder()
3841
.blockHeader(BlockHeader.newBuilder()
39-
.setFirstTransactionConsensusTime(firstConsensusTimestamp)
42+
.setBlockTimestamp(blockTimestamp)
4043
.setNumber(blockNumber)
4144
.setHapiProtoVersion(SemanticVersion.newBuilder().setMinor(57))
4245
.setSoftwareVersion(SemanticVersion.newBuilder().setMinor(57))

hedera-mirror-importer/src/test/java/com/hedera/mirror/importer/reader/block/ProtoBlockFileReaderTest.java

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
package com.hedera.mirror.importer.reader.block;
44

5-
import static com.hedera.mirror.common.util.DomainUtils.NANOS_PER_SECOND;
65
import static org.assertj.core.api.Assertions.assertThat;
76
import static org.assertj.core.api.Assertions.assertThatThrownBy;
87

@@ -19,6 +18,7 @@
1918
import com.hedera.hapi.block.stream.protoc.RecordFileItem;
2019
import com.hedera.hapi.platform.event.legacy.EventTransaction;
2120
import com.hedera.mirror.common.domain.DigestAlgorithm;
21+
import com.hedera.mirror.common.domain.DomainBuilder;
2222
import com.hedera.mirror.common.domain.transaction.BlockFile;
2323
import com.hedera.mirror.common.util.DomainUtils;
2424
import com.hedera.mirror.importer.TestUtils;
@@ -27,7 +27,6 @@
2727
import com.hederahashgraph.api.proto.java.AtomicBatchTransactionBody;
2828
import com.hederahashgraph.api.proto.java.CryptoTransferTransactionBody;
2929
import com.hederahashgraph.api.proto.java.SignedTransaction;
30-
import com.hederahashgraph.api.proto.java.Timestamp;
3130
import com.hederahashgraph.api.proto.java.Transaction;
3231
import com.hederahashgraph.api.proto.java.TransactionBody;
3332
import java.time.Instant;
@@ -45,42 +44,42 @@ public class ProtoBlockFileReaderTest {
4544

4645
public static final List<BlockFile> TEST_BLOCK_FILES = List.of(
4746
BlockFile.builder()
48-
.consensusStart(1743543388185101630L)
49-
.consensusEnd(1743543388372187000L)
50-
.count(5L)
47+
.consensusStart(1746477299499963486L)
48+
.consensusEnd(1746477301609588787L)
49+
.count(6L)
5150
.digestAlgorithm(DigestAlgorithm.SHA_384)
5251
.hash(
53-
"449e750e4da69fecb92234a8dede0ac3e7b53141aecc1a30cba050ec44a729c9b5e5a06607ac6ac8a17110fb99c202ef")
54-
.index(2301160L)
55-
.name(BlockFile.getBlockStreamFilename(2301160))
52+
"fb31381a223175f1f8730df52be31c318eb093f8029440da2d3f0ed19f29e58af111b5c1600412eed02be1e92b4befb4")
53+
.index(76L)
54+
.name(BlockFile.getBlockStreamFilename(76))
5655
.previousHash(
57-
"aeb9db588e53e6b3d1d39f1a75dbf7123e95c18cea102380989bdda89079809e2217bfb230eda982e37e36f40e87988a")
58-
.roundStart(2301161L)
59-
.roundEnd(2301161L)
56+
"47ad177417a4e6a85c67660dc9abcd5e735ae689f5a3096c68bbdff6b330e7951ddd545cd16445d19118975464380a3b")
57+
.roundStart(521L)
58+
.roundEnd(527L)
6059
.version(ProtoBlockFileReader.VERSION)
6160
.build(),
6261
BlockFile.builder()
63-
.consensusStart(1743543388490143524L)
64-
.consensusEnd(1743543388704490000L)
65-
.count(4L)
62+
.consensusStart(1746477301948765000L)
63+
.consensusEnd(1746477303380786221L)
64+
.count(3L)
6665
.digestAlgorithm(DigestAlgorithm.SHA_384)
6766
.hash(
68-
"0d2523cc3f44a0ffebd9bcd1950c685deb932e53b7af3e8cd202397ae2d110c3452797eb0ff05cca1ffe9780e31bec34")
69-
.index(2301161L)
70-
.name(BlockFile.getBlockStreamFilename(2301161))
67+
"c198f382ba69796c805450842de7f97c91d2a8a7f88f43c977247d15b898b5b09ac7f857fa13fe627f8d15bb68879bb2")
68+
.index(77L)
69+
.name(BlockFile.getBlockStreamFilename(77))
7170
.previousHash(
72-
"449e750e4da69fecb92234a8dede0ac3e7b53141aecc1a30cba050ec44a729c9b5e5a06607ac6ac8a17110fb99c202ef")
73-
.roundStart(2301162L)
74-
.roundEnd(2301162L)
71+
"fb31381a223175f1f8730df52be31c318eb093f8029440da2d3f0ed19f29e58af111b5c1600412eed02be1e92b4befb4")
72+
.roundStart(528L)
73+
.roundEnd(534L)
7574
.version(ProtoBlockFileReader.VERSION)
7675
.build(),
7776
BlockFile.builder()
78-
.consensusStart(1741033890694027337L)
79-
.consensusEnd(1741033890694027337L)
80-
.count(0L)
77+
.consensusStart(1746477093416982857L)
78+
.consensusEnd(1746477093416983584L)
79+
.count(728L)
8180
.digestAlgorithm(DigestAlgorithm.SHA_384)
8281
.hash(
83-
"40ecba4f4134cf9e7a6fb643b54cda852ed4dcacee7d339a120165a6552169b52568dcdd921913df69b18074d6fd6cf0")
82+
"958e5fba01f066cdbe2733059b33bf0ebec0fbac5eac5b0806ebc2c792187650e1b0b34a6a4c83025a31c2da787f510d")
8483
.index(0L)
8584
.name(BlockFile.getBlockStreamFilename(0))
8685
.previousHash(
@@ -89,8 +88,8 @@ public class ProtoBlockFileReaderTest {
8988
.roundEnd(1L)
9089
.version(ProtoBlockFileReader.VERSION)
9190
.build());
92-
private static final long TIMESTAMP = 1738889423L;
9391

92+
private final DomainBuilder domainBuilder = new DomainBuilder();
9493
private final ProtoBlockFileReader reader = new ProtoBlockFileReader();
9594

9695
@ParameterizedTest(name = "{0}")
@@ -343,16 +342,21 @@ void readBatchTransactionsMissingInnerTransaction() {
343342
void noEventTransactions() {
344343
var roundHeader = BlockItem.newBuilder().setRoundHeader(RoundHeader.getDefaultInstance());
345344
var eventHeader = BlockItem.newBuilder().setEventHeader(EventHeader.getDefaultInstance());
345+
// A standalone state changes block item, with consensus timestamp
346+
var stateChanges = stateChanges();
346347
var block = Block.newBuilder()
347348
.addItems(blockHeader())
348349
.addItems(roundHeader)
349350
.addItems(eventHeader)
351+
.addItems(stateChanges)
350352
.addItems(blockProof())
351353
.build();
352354
var streamFileData = StreamFileData.from(BlockFile.getBlockStreamFilename(0), gzip(block));
355+
long timestamp =
356+
DomainUtils.timestampInNanosMax(stateChanges.getStateChanges().getConsensusTimestamp());
353357
assertThat(reader.read(streamFileData))
354-
.returns(TIMESTAMP * NANOS_PER_SECOND, BlockFile::getConsensusEnd)
355-
.returns(TIMESTAMP * NANOS_PER_SECOND, BlockFile::getConsensusStart)
358+
.returns(timestamp, BlockFile::getConsensusEnd)
359+
.returns(timestamp, BlockFile::getConsensusStart)
356360
.returns(0L, BlockFile::getCount)
357361
.returns(List.of(), BlockFile::getItems)
358362
.returns(ProtoBlockFileReader.VERSION, BlockFile::getVersion);
@@ -465,8 +469,7 @@ void thrownWhenTransactionBytesCorrupted() {
465469

466470
private BlockItem blockHeader() {
467471
return BlockItem.newBuilder()
468-
.setBlockHeader(BlockHeader.newBuilder()
469-
.setFirstTransactionConsensusTime(Timestamp.newBuilder().setSeconds(TIMESTAMP)))
472+
.setBlockHeader(BlockHeader.newBuilder().setBlockTimestamp(domainBuilder.protoTimestamp()))
470473
.build();
471474
}
472475

@@ -536,6 +539,12 @@ private byte[] gzip(Block block) {
536539
return TestUtils.gzip(block.toByteArray());
537540
}
538541

542+
private BlockItem stateChanges() {
543+
return BlockItem.newBuilder()
544+
.setStateChanges(StateChanges.newBuilder().setConsensusTimestamp(domainBuilder.protoTimestamp()))
545+
.build();
546+
}
547+
539548
@SneakyThrows
540549
private static Stream<Arguments> readTestArgumentsProvider() {
541550
return TEST_BLOCK_FILES.stream().map(blockFile -> {

0 commit comments

Comments
 (0)