From f621df61e15549b84013bf1777b1f2e73b776020 Mon Sep 17 00:00:00 2001 From: miiu Date: Thu, 6 Mar 2025 15:58:42 +0200 Subject: [PATCH 1/3] current proof --- data/block.go | 3 +- go.mod | 2 +- go.sum | 4 +- process/elasticproc/block/blockProcessor.go | 27 ++++++-------- .../elasticproc/block/blockProcessor_test.go | 37 +++++++++++-------- process/elasticproc/block/serialize_test.go | 12 +++--- .../factory/elasticProcessorFactory.go | 2 +- 7 files changed, 46 insertions(+), 41 deletions(-) diff --git a/data/block.go b/data/block.go index e2a853cd..eb2cc661 100644 --- a/data/block.go +++ b/data/block.go @@ -20,7 +20,7 @@ type Block struct { MiniBlocksDetails []*MiniBlocksDetails `json:"miniBlocksDetails,omitempty"` NotarizedBlocksHashes []string `json:"notarizedBlocksHashes"` Proposer uint64 `json:"proposer"` - Validators []uint64 `json:"validators"` + Validators []uint64 `json:"validators,omitempty"` PubKeyBitmap string `json:"pubKeyBitmap"` Size int64 `json:"size"` SizeTxs int64 `json:"sizeTxs"` @@ -51,6 +51,7 @@ type Block struct { SoftwareVersion string `json:"softwareVersion,omitempty"` ReceiptsHash string `json:"receiptsHash,omitempty"` Reserved []byte `json:"reserved,omitempty"` + LeaderBLSKey string `json:"leaderBlsKey,omitempty"` } // MiniBlocksDetails is a structure that hold information about mini-blocks execution details diff --git a/go.mod b/go.mod index 892ebc48..981b4034 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/gin-gonic/gin v1.10.0 github.com/google/uuid v1.6.0 github.com/multiversx/mx-chain-communication-go v1.1.1 - github.com/multiversx/mx-chain-core-go v1.2.25-0.20250219104810-75b7a8ff6bbb + github.com/multiversx/mx-chain-core-go v1.2.25-0.20250306125819-46a071b85ade github.com/multiversx/mx-chain-logger-go v1.0.15 github.com/multiversx/mx-chain-vm-common-go v1.5.16 github.com/prometheus/client_model v0.4.0 diff --git a/go.sum b/go.sum index f22d15e2..04e7c5b5 100644 --- a/go.sum +++ b/go.sum @@ -253,8 +253,8 @@ github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/multiversx/mx-chain-communication-go v1.1.1 h1:y4DoQeQOJTaSUsRzczQFazf8JYQmInddypApqA3AkwM= github.com/multiversx/mx-chain-communication-go v1.1.1/go.mod h1:WK6bP4pGEHGDDna/AYRIMtl6G9OA0NByI1Lw8PmOnRM= -github.com/multiversx/mx-chain-core-go v1.2.25-0.20250219104810-75b7a8ff6bbb h1:XoFaZ3/KEaI7N0o1gqiek+2s/PlqmcvwukAT4iCvAIM= -github.com/multiversx/mx-chain-core-go v1.2.25-0.20250219104810-75b7a8ff6bbb/go.mod h1:B5zU4MFyJezmEzCsAHE9YNULmGCm2zbPHvl9hazNxmE= +github.com/multiversx/mx-chain-core-go v1.2.25-0.20250306125819-46a071b85ade h1:jLSSdm/X8T2H+I9/+wHvFuS9FBbXjTfNPJYZpzDdj/I= +github.com/multiversx/mx-chain-core-go v1.2.25-0.20250306125819-46a071b85ade/go.mod h1:B5zU4MFyJezmEzCsAHE9YNULmGCm2zbPHvl9hazNxmE= github.com/multiversx/mx-chain-crypto-go v1.2.12 h1:zWip7rpUS4CGthJxfKn5MZfMfYPjVjIiCID6uX5BSOk= github.com/multiversx/mx-chain-logger-go v1.0.15 h1:HlNdK8etyJyL9NQ+6mIXyKPEBo+wRqOwi3n+m2QIHXc= github.com/multiversx/mx-chain-logger-go v1.0.15/go.mod h1:t3PRKaWB1M+i6gUfD27KXgzLJJC+mAQiN+FLlL1yoGQ= diff --git a/process/elasticproc/block/blockProcessor.go b/process/elasticproc/block/blockProcessor.go index b21d91be..ce3129b6 100644 --- a/process/elasticproc/block/blockProcessor.go +++ b/process/elasticproc/block/blockProcessor.go @@ -34,22 +34,27 @@ var ( ) type blockProcessor struct { - hasher hashing.Hasher - marshalizer marshal.Marshalizer + hasher hashing.Hasher + marshalizer marshal.Marshalizer + validatorsPubKeyConverter core.PubkeyConverter } // NewBlockProcessor will create a new instance of block processor -func NewBlockProcessor(hasher hashing.Hasher, marshalizer marshal.Marshalizer) (*blockProcessor, error) { +func NewBlockProcessor(hasher hashing.Hasher, marshalizer marshal.Marshalizer, validatorsPubKeyConverter core.PubkeyConverter) (*blockProcessor, error) { if check.IfNil(hasher) { return nil, indexer.ErrNilHasher } if check.IfNil(marshalizer) { return nil, indexer.ErrNilMarshalizer } + if check.IfNil(validatorsPubKeyConverter) { + return nil, indexer.ErrNilPubkeyConverter + } return &blockProcessor{ - hasher: hasher, - marshalizer: marshalizer, + hasher: hasher, + marshalizer: marshalizer, + validatorsPubKeyConverter: validatorsPubKeyConverter, }, nil } @@ -75,7 +80,6 @@ func (bp *blockProcessor) PrepareBlockForDB(obh *outport.OutportBlockWithHeader) sizeTxs := computeSizeOfTransactions(obh.TransactionPool) miniblocksHashes := bp.getEncodedMBSHashes(obh.BlockData.Body, obh.BlockData.IntraShardMiniBlocks) - leaderIndex := bp.getLeaderIndex(obh.SignersIndexes) numTxs, notarizedTxs := getTxsCount(obh.Header) elasticBlock := &data.Block{ @@ -86,7 +90,8 @@ func (bp *blockProcessor) PrepareBlockForDB(obh *outport.OutportBlockWithHeader) Hash: hex.EncodeToString(obh.BlockData.HeaderHash), MiniBlocksHashes: miniblocksHashes, NotarizedBlocksHashes: obh.NotarizedHeadersHashes, - Proposer: leaderIndex, + Proposer: obh.LeaderIndex, + LeaderBLSKey: hex.EncodeToString([]byte(obh.LeaderBLSKey)), Validators: obh.SignersIndexes, PubKeyBitmap: hex.EncodeToString(obh.Header.GetPubKeysBitmap()), Size: int64(blockSizeInBytes), @@ -396,14 +401,6 @@ func (bp *blockProcessor) computeBlockSize(headerBytes []byte, body *block.Body) return blockSize, nil } -func (bp *blockProcessor) getLeaderIndex(signersIndexes []uint64) uint64 { - if len(signersIndexes) > 0 { - return signersIndexes[0] - } - - return 0 -} - func computeBlockSearchOrder(header coreData.HeaderHandler) uint64 { shardIdentifier := createShardIdentifier(header.GetShardID()) stringOrder := fmt.Sprintf("1%02d%d", shardIdentifier, header.GetNonce()) diff --git a/process/elasticproc/block/blockProcessor_test.go b/process/elasticproc/block/blockProcessor_test.go index d81d7678..4aa4490a 100644 --- a/process/elasticproc/block/blockProcessor_test.go +++ b/process/elasticproc/block/blockProcessor_test.go @@ -26,27 +26,34 @@ func TestNewBlockProcessor(t *testing.T) { tests := []struct { name string - argsFunc func() (hashing.Hasher, marshal.Marshalizer) + argsFunc func() (hashing.Hasher, marshal.Marshalizer, core.PubkeyConverter) exErr error }{ { name: "NilMarshalizer", - argsFunc: func() (hashing.Hasher, marshal.Marshalizer) { - return &mock.HasherMock{}, nil + argsFunc: func() (hashing.Hasher, marshal.Marshalizer, core.PubkeyConverter) { + return &mock.HasherMock{}, nil, nil }, exErr: indexer.ErrNilMarshalizer, }, { name: "NilHasher", - argsFunc: func() (hashing.Hasher, marshal.Marshalizer) { - return nil, &mock.MarshalizerMock{} + argsFunc: func() (hashing.Hasher, marshal.Marshalizer, core.PubkeyConverter) { + return nil, &mock.MarshalizerMock{}, nil }, exErr: indexer.ErrNilHasher, }, + { + name: "NilValidatorPubKeyConverter", + argsFunc: func() (hashing.Hasher, marshal.Marshalizer, core.PubkeyConverter) { + return &mock.HasherMock{}, &mock.MarshalizerMock{}, nil + }, + exErr: indexer.ErrNilPubkeyConverter, + }, { name: "ShouldWork", - argsFunc: func() (hashing.Hasher, marshal.Marshalizer) { - return &mock.HasherMock{}, &mock.MarshalizerMock{} + argsFunc: func() (hashing.Hasher, marshal.Marshalizer, core.PubkeyConverter) { + return &mock.HasherMock{}, &mock.MarshalizerMock{}, &mock.PubkeyConverterMock{} }, exErr: nil, }, @@ -61,7 +68,7 @@ func TestNewBlockProcessor(t *testing.T) { func TestBlockProcessor_PrepareBlockForDBShouldWork(t *testing.T) { t.Parallel() - bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}) + bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}, &mock.PubkeyConverterMock{}) outportBlockWithHeader := &outport.OutportBlockWithHeader{ Header: &dataBlock.Header{ @@ -123,7 +130,7 @@ func TestBlockProcessor_PrepareBlockForDBShouldWork(t *testing.T) { func TestBlockProcessor_PrepareBlockForDBNilHeader(t *testing.T) { t.Parallel() - bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}) + bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}, &mock.PubkeyConverterMock{}) outportBlockWithHeader := &outport.OutportBlockWithHeader{} dbBlock, err := bp.PrepareBlockForDB(outportBlockWithHeader) @@ -134,7 +141,7 @@ func TestBlockProcessor_PrepareBlockForDBNilHeader(t *testing.T) { func TestBlockProcessor_PrepareBlockForDBNilBody(t *testing.T) { t.Parallel() - bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}) + bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}, &mock.PubkeyConverterMock{}) outportBlockWithHeader := &outport.OutportBlockWithHeader{ Header: &dataBlock.MetaBlock{}, @@ -155,7 +162,7 @@ func TestBlockProcessor_PrepareBlockForDBMarshalFailHeader(t *testing.T) { MarshalCalled: func(obj interface{}) ([]byte, error) { return nil, expectedErr }, - }) + }, &mock.PubkeyConverterMock{}) outportBlockWithHeader := &outport.OutportBlockWithHeader{ Header: &dataBlock.Header{}, @@ -182,7 +189,7 @@ func TestBlockProcessor_PrepareBlockForDBMarshalFailBlock(t *testing.T) { MarshalCalled: func(obj interface{}) ([]byte, error) { return nil, expectedErr }, - }) + }, &mock.PubkeyConverterMock{}) outportBlockWithHeader := &outport.OutportBlockWithHeader{ Header: &dataBlock.Header{}, @@ -204,7 +211,7 @@ func TestBlockProcessor_PrepareBlockForDBMarshalFailBlock(t *testing.T) { func TestBlockProcessor_ComputeHeaderHash(t *testing.T) { t.Parallel() - bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}) + bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}, &mock.PubkeyConverterMock{}) header := &dataBlock.Header{} hashBytes, err := bp.ComputeHeaderHash(header) @@ -215,7 +222,7 @@ func TestBlockProcessor_ComputeHeaderHash(t *testing.T) { func TestBlockProcessor_PrepareBlockForDBEpochStartMeta(t *testing.T) { t.Parallel() - bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}) + bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}, &mock.PubkeyConverterMock{}) header := &dataBlock.MetaBlock{ TxCount: 1000, @@ -405,7 +412,7 @@ func TestBlockProcessor_PrepareBlockForDBMiniBlocksDetails(t *testing.T) { t.Parallel() gogoMarshaller := &marshal.GogoProtoMarshalizer{} - bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}) + bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}, &mock.PubkeyConverterMock{}) mbhr := &dataBlock.MiniBlockHeaderReserved{ IndexOfFirstTxProcessed: 0, diff --git a/process/elasticproc/block/serialize_test.go b/process/elasticproc/block/serialize_test.go index e88fb1dc..c8146550 100644 --- a/process/elasticproc/block/serialize_test.go +++ b/process/elasticproc/block/serialize_test.go @@ -16,7 +16,7 @@ import ( func TestBlockProcessor_SerializeBlockNilElasticBlockErrors(t *testing.T) { t.Parallel() - bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}) + bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}, &mock.PubkeyConverterMock{}) err := bp.SerializeBlock(nil, nil, "") require.True(t, errors.Is(err, dataindexer.ErrNilElasticBlock)) @@ -25,20 +25,20 @@ func TestBlockProcessor_SerializeBlockNilElasticBlockErrors(t *testing.T) { func TestBlockProcessor_SerializeBlock(t *testing.T) { t.Parallel() - bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}) + bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}, &mock.PubkeyConverterMock{}) buffSlice := data.NewBufferSlice(data.DefaultMaxBulkSize) err := bp.SerializeBlock(&data.Block{Nonce: 1}, buffSlice, "blocks") require.Nil(t, err) require.Equal(t, `{ "index" : { "_index":"blocks", "_id" : "" } } -{"uuid":"","nonce":1,"round":0,"epoch":0,"miniBlocksHashes":null,"notarizedBlocksHashes":null,"proposer":0,"validators":null,"pubKeyBitmap":"","size":0,"sizeTxs":0,"timestamp":0,"stateRootHash":"","prevHash":"","shardId":0,"txCount":0,"notarizedTxsCount":0,"accumulatedFees":"","developerFees":"","epochStartBlock":false,"searchOrder":0,"gasProvided":0,"gasRefunded":0,"gasPenalized":0,"maxGasLimit":0} +{"uuid":"","nonce":1,"round":0,"epoch":0,"miniBlocksHashes":null,"notarizedBlocksHashes":null,"proposer":0,"pubKeyBitmap":"","size":0,"sizeTxs":0,"timestamp":0,"stateRootHash":"","prevHash":"","shardId":0,"txCount":0,"notarizedTxsCount":0,"accumulatedFees":"","developerFees":"","epochStartBlock":false,"searchOrder":0,"gasProvided":0,"gasRefunded":0,"gasPenalized":0,"maxGasLimit":0} `, buffSlice.Buffers()[0].String()) } func TestBlockProcessor_SerializeEpochInfoDataErrors(t *testing.T) { t.Parallel() - bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}) + bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}, &mock.PubkeyConverterMock{}) err := bp.SerializeEpochInfoData(nil, nil, "") require.Equal(t, dataindexer.ErrNilHeaderHandler, err) @@ -50,7 +50,7 @@ func TestBlockProcessor_SerializeEpochInfoDataErrors(t *testing.T) { func TestBlockProcessor_SerializeEpochInfoData(t *testing.T) { t.Parallel() - bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}) + bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}, &mock.PubkeyConverterMock{}) buffSlice := data.NewBufferSlice(data.DefaultMaxBulkSize) err := bp.SerializeEpochInfoData(&dataBlock.MetaBlock{ @@ -66,7 +66,7 @@ func TestBlockProcessor_SerializeEpochInfoData(t *testing.T) { func TestBlockProcessor_SerializeBlockEpochStartMeta(t *testing.T) { t.Parallel() - bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}) + bp, _ := NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}, &mock.PubkeyConverterMock{}) buffSlice := data.NewBufferSlice(data.DefaultMaxBulkSize) err := bp.SerializeBlock(&data.Block{ diff --git a/process/elasticproc/factory/elasticProcessorFactory.go b/process/elasticproc/factory/elasticProcessorFactory.go index ad865953..37ea72e0 100644 --- a/process/elasticproc/factory/elasticProcessorFactory.go +++ b/process/elasticproc/factory/elasticProcessorFactory.go @@ -66,7 +66,7 @@ func CreateElasticProcessor(arguments ArgElasticProcessorFactory) (dataindexer.E return nil, err } - blockProcHandler, err := blockProc.NewBlockProcessor(arguments.Hasher, arguments.Marshalizer) + blockProcHandler, err := blockProc.NewBlockProcessor(arguments.Hasher, arguments.Marshalizer, arguments.ValidatorPubkeyConverter) if err != nil { return nil, err } From a9aeb5121a6f45827ab3bde1279cebb08be8fe64 Mon Sep 17 00:00:00 2001 From: miiu Date: Thu, 6 Mar 2025 16:03:31 +0200 Subject: [PATCH 2/3] fix unit tests --- process/elasticproc/elasticProcessor_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/process/elasticproc/elasticProcessor_test.go b/process/elasticproc/elasticProcessor_test.go index 9f3311af..ac9123b9 100644 --- a/process/elasticproc/elasticProcessor_test.go +++ b/process/elasticproc/elasticProcessor_test.go @@ -62,7 +62,7 @@ func createMockElasticProcessorArgs() *ArgElasticProcessor { balanceConverter, _ := converters.NewBalanceConverter(10) acp, _ := accounts.NewAccountsProcessor(&mock.PubkeyConverterMock{}, balanceConverter) - bp, _ := block.NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}) + bp, _ := block.NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}, &mock.PubkeyConverterMock{}) mp, _ := miniblocks.NewMiniblocksProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}) vp, _ := validators.NewValidatorsProcessor(mock.NewPubkeyConverterMock(32), 0) args := logsevents.ArgsLogsAndEventsProcessor{ @@ -244,7 +244,7 @@ func TestElasticProcessor_RemoveHeader(t *testing.T) { }, } - args.BlockProc, _ = block.NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}) + args.BlockProc, _ = block.NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}, &mock.PubkeyConverterMock{}) elasticProc, err := NewElasticProcessor(args) require.NoError(t, err) @@ -329,7 +329,7 @@ func TestElasticseachDatabaseSaveHeader_RequestError(t *testing.T) { return localErr }, } - arguments.BlockProc, _ = block.NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}) + arguments.BlockProc, _ = block.NewBlockProcessor(&mock.HasherMock{}, &mock.MarshalizerMock{}, &mock.PubkeyConverterMock{}) elasticDatabase := newElasticsearchProcessor(dbWriter, arguments) err := elasticDatabase.SaveHeader(createEmptyOutportBlockWithHeader()) From 58675dd2ea38fdaa6a969ca8a9b7a6bdddedb569 Mon Sep 17 00:00:00 2001 From: miiu Date: Tue, 11 Mar 2025 10:50:08 +0200 Subject: [PATCH 3/3] fixes --- data/block.go | 2 +- process/elasticproc/block/blockProcessor.go | 4 +++- process/elasticproc/block/blockProcessor_test.go | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/data/block.go b/data/block.go index eb2cc661..39b56a7b 100644 --- a/data/block.go +++ b/data/block.go @@ -51,7 +51,7 @@ type Block struct { SoftwareVersion string `json:"softwareVersion,omitempty"` ReceiptsHash string `json:"receiptsHash,omitempty"` Reserved []byte `json:"reserved,omitempty"` - LeaderBLSKey string `json:"leaderBlsKey,omitempty"` + ProposerBlsKey string `json:"proposerBlsKey,omitempty"` } // MiniBlocksDetails is a structure that hold information about mini-blocks execution details diff --git a/process/elasticproc/block/blockProcessor.go b/process/elasticproc/block/blockProcessor.go index ce3129b6..c3b4942c 100644 --- a/process/elasticproc/block/blockProcessor.go +++ b/process/elasticproc/block/blockProcessor.go @@ -91,7 +91,7 @@ func (bp *blockProcessor) PrepareBlockForDB(obh *outport.OutportBlockWithHeader) MiniBlocksHashes: miniblocksHashes, NotarizedBlocksHashes: obh.NotarizedHeadersHashes, Proposer: obh.LeaderIndex, - LeaderBLSKey: hex.EncodeToString([]byte(obh.LeaderBLSKey)), + ProposerBlsKey: hex.EncodeToString(obh.LeaderBLSKey), Validators: obh.SignersIndexes, PubKeyBitmap: hex.EncodeToString(obh.Header.GetPubKeysBitmap()), Size: int64(blockSizeInBytes), @@ -145,6 +145,7 @@ func (bp *blockProcessor) PrepareBlockForDB(obh *outport.OutportBlockWithHeader) func addProofs(elasticBlock *data.Block, obh *outport.OutportBlockWithHeader) { if obh.BlockData.HeaderProof != nil { elasticBlock.Proof = proofToAPIProof(obh.BlockData.HeaderProof) + elasticBlock.PubKeyBitmap = elasticBlock.Proof.PubKeysBitmap } prevHeaderProof := obh.Header.GetPreviousProof() @@ -152,6 +153,7 @@ func addProofs(elasticBlock *data.Block, obh *outport.OutportBlockWithHeader) { return } elasticBlock.PreviousHeaderProof = proofToAPIProof(prevHeaderProof) + } func proofToAPIProof(headerProof coreData.HeaderProofHandler) *api.HeaderProof { diff --git a/process/elasticproc/block/blockProcessor_test.go b/process/elasticproc/block/blockProcessor_test.go index 4aa4490a..94d096c2 100644 --- a/process/elasticproc/block/blockProcessor_test.go +++ b/process/elasticproc/block/blockProcessor_test.go @@ -320,7 +320,7 @@ func TestBlockProcessor_PrepareBlockForDBEpochStartMeta(t *testing.T) { NotarizedBlocksHashes: nil, Proposer: 0, Validators: nil, - PubKeyBitmap: "", + PubKeyBitmap: "6269746d617031", Size: 1090, SizeTxs: 0, Timestamp: 0,