Export acceptance data to archival

This commit is contained in:
Ori Newman 2025-04-21 22:28:22 +03:00
parent c12731d4d4
commit 9efaa52d9f
7 changed files with 5380 additions and 2374 deletions

View File

@ -1,8 +1,20 @@
package appmessage package appmessage
type AcceptedTxEntry struct {
TransactionID string
IndexWithinBlock uint32
}
type MergesetBlockAcceptanceData struct {
BlockHash string
AcceptedTxs []*AcceptedTxEntry
}
type ArchivalBlock struct { type ArchivalBlock struct {
Block *RPCBlock Block *RPCBlock
Child string Child string
AcceptanceData []*MergesetBlockAcceptanceData
SelectedParent string
} }
// AddArchivalBlocksRequestMessage represents a request to add archival blocks // AddArchivalBlocksRequestMessage represents a request to add archival blocks

View File

@ -94,6 +94,10 @@ func mainImpl(cfg *configFlags) error {
return err return err
} }
if int(root.PPIndex-1) >= len(ppHeaders) {
continue
}
nextPP := ppHeaders[root.PPIndex-1] nextPP := ppHeaders[root.PPIndex-1]
blockToChild := make(map[externalapi.DomainHash]externalapi.DomainHash) blockToChild := make(map[externalapi.DomainHash]externalapi.DomainHash)
@ -140,6 +144,37 @@ func mainImpl(cfg *configFlags) error {
archivalBlock.Child = child.String() archivalBlock.Child = child.String()
} }
acceptanceData, err := tc.AcceptanceDataStore().Get(tc.DatabaseContext(), model.NewStagingArea(), hash)
isNotFoundErr := database.IsNotFoundError(err)
if !isNotFoundErr && err != nil {
return err
}
if blockGHOSTDAGData.SelectedParent() != model.VirtualGenesisBlockHash && !isNotFoundErr && len(acceptanceData) > 0 {
acceptanceDataRPC := make([]*appmessage.MergesetBlockAcceptanceData, 0, len(acceptanceData))
for _, data := range acceptanceData {
acceptedTxs := make([]*appmessage.AcceptedTxEntry, 0, len(data.TransactionAcceptanceData))
for i, tx := range data.TransactionAcceptanceData {
if !tx.IsAccepted {
continue
}
acceptedTxs = append(acceptedTxs, &appmessage.AcceptedTxEntry{
TransactionID: consensushashing.TransactionID(tx.Transaction).String(),
IndexWithinBlock: uint32(i),
})
}
acceptanceDataRPC = append(acceptanceDataRPC, &appmessage.MergesetBlockAcceptanceData{
BlockHash: data.BlockHash.String(),
AcceptedTxs: acceptedTxs,
})
}
archivalBlock.AcceptanceData = acceptanceDataRPC
archivalBlock.SelectedParent = blockGHOSTDAGData.SelectedParent().String()
}
chunk = append(chunk, archivalBlock) chunk = append(chunk, archivalBlock)
if len(chunk) == 1 { if len(chunk) == 1 {

View File

@ -902,9 +902,22 @@ message GetPruningWindowRootsResponseMessage {
RPCError error = 1000; RPCError error = 1000;
} }
message ArchivalBlock { message AcceptedTxEntry{
string transactionId = 1;
uint32 index_within_block = 2;
}
message MergesetBlockAcceptanceData{
string blockHash = 1;
repeated AcceptedTxEntry acceptedTxs = 3;
}
message ArchivalBlock{
string child = 1; string child = 1;
RpcBlock block = 2; RpcBlock block = 2;
repeated MergesetBlockAcceptanceData acceptanceData = 3;
string selectedParent = 4;
} }
message AddArchivalBlocksRequestMessage { repeated ArchivalBlock blocks = 1; } message AddArchivalBlocksRequestMessage { repeated ArchivalBlock blocks = 1; }

View File

@ -6,6 +6,7 @@ import (
) )
func (x *KaspadMessage_AddArchivalBlocksRequest) toAppMessage() (appmessage.Message, error) { func (x *KaspadMessage_AddArchivalBlocksRequest) toAppMessage() (appmessage.Message, error) {
panic("we need to implement acceptance data conversion")
if x == nil { if x == nil {
return nil, errors.Wrapf(errorNil, "KaspadMessage_AddArchivalBlocksRequest is nil") return nil, errors.Wrapf(errorNil, "KaspadMessage_AddArchivalBlocksRequest is nil")
} }
@ -32,7 +33,8 @@ func (x *KaspadMessage_AddArchivalBlocksRequest) fromAppMessage(message *appmess
blocks := make([]*ArchivalBlock, len(message.Blocks)) blocks := make([]*ArchivalBlock, len(message.Blocks))
for i, block := range message.Blocks { for i, block := range message.Blocks {
protoBlock := &ArchivalBlock{ protoBlock := &ArchivalBlock{
Child: block.Child, Child: block.Child,
SelectedParent: block.SelectedParent,
} }
if block.Block != nil { if block.Block != nil {
@ -42,6 +44,12 @@ func (x *KaspadMessage_AddArchivalBlocksRequest) fromAppMessage(message *appmess
return err return err
} }
} }
protoBlock.AcceptanceData = make([]*MergesetBlockAcceptanceData, len(block.AcceptanceData))
for j, acceptanceData := range block.AcceptanceData {
protoBlock.AcceptanceData[j] = &MergesetBlockAcceptanceData{}
protoBlock.AcceptanceData[j].fromAppMessage(acceptanceData)
}
blocks[i] = protoBlock blocks[i] = protoBlock
} }
@ -51,6 +59,23 @@ func (x *KaspadMessage_AddArchivalBlocksRequest) fromAppMessage(message *appmess
return nil return nil
} }
func (x *MergesetBlockAcceptanceData) fromAppMessage(message *appmessage.MergesetBlockAcceptanceData) error {
if message == nil {
return errors.Wrapf(errorNil, "MergesetBlockAcceptanceData is nil")
}
x.BlockHash = message.BlockHash
x.AcceptedTxs = make([]*AcceptedTxEntry, len(message.AcceptedTxs))
for i, tx := range message.AcceptedTxs {
x.AcceptedTxs[i] = &AcceptedTxEntry{
TransactionId: tx.TransactionID,
IndexWithinBlock: tx.IndexWithinBlock,
}
}
return nil
}
func (x *KaspadMessage_AddArchivalBlocksResponse) toAppMessage() (appmessage.Message, error) { func (x *KaspadMessage_AddArchivalBlocksResponse) toAppMessage() (appmessage.Message, error) {
if x == nil { if x == nil {
return nil, errors.Wrapf(errorNil, "KaspadMessage_AddArchivalBlocksResponse is nil") return nil, errors.Wrapf(errorNil, "KaspadMessage_AddArchivalBlocksResponse is nil")