Skip to content

Commit aec8e08

Browse files
authored
feat: optionally provide raw header/block bytes in chainsync callback (#820)
This provides a "raw" variant of the RollForward callback that bypasses any decoding and returns only the raw bytes for the header or block
1 parent 2cb20b5 commit aec8e08

File tree

2 files changed

+66
-34
lines changed

2 files changed

+66
-34
lines changed

protocol/chainsync/chainsync.go

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -198,13 +198,14 @@ type ChainSync struct {
198198

199199
// Config is used to configure the ChainSync protocol instance
200200
type Config struct {
201-
RollBackwardFunc RollBackwardFunc
202-
RollForwardFunc RollForwardFunc
203-
FindIntersectFunc FindIntersectFunc
204-
RequestNextFunc RequestNextFunc
205-
IntersectTimeout time.Duration
206-
BlockTimeout time.Duration
207-
PipelineLimit int
201+
RollBackwardFunc RollBackwardFunc
202+
RollForwardFunc RollForwardFunc
203+
RollForwardRawFunc RollForwardRawFunc
204+
FindIntersectFunc FindIntersectFunc
205+
RequestNextFunc RequestNextFunc
206+
IntersectTimeout time.Duration
207+
BlockTimeout time.Duration
208+
PipelineLimit int
208209
}
209210

210211
// Callback context
@@ -217,6 +218,7 @@ type CallbackContext struct {
217218
// Callback function types
218219
type RollBackwardFunc func(CallbackContext, common.Point, Tip) error
219220
type RollForwardFunc func(CallbackContext, uint, interface{}, Tip) error
221+
type RollForwardRawFunc func(CallbackContext, uint, []byte, Tip) error
220222

221223
type FindIntersectFunc func(CallbackContext, []common.Point) (common.Point, Tip, error)
222224
type RequestNextFunc func(CallbackContext) error
@@ -262,13 +264,20 @@ func WithRollBackwardFunc(
262264
}
263265
}
264266

265-
// WithRollForwardFunc specifies the RollForward callback function
267+
// WithRollForwardFunc specifies the RollForward callback function. This will provided a parsed header or block
266268
func WithRollForwardFunc(rollForwardFunc RollForwardFunc) ChainSyncOptionFunc {
267269
return func(c *Config) {
268270
c.RollForwardFunc = rollForwardFunc
269271
}
270272
}
271273

274+
// WithRollForwardRawFunc specifies the RollForwardRaw callback function. This will provide the raw header or block
275+
func WithRollForwardRawFunc(rollForwardRawFunc RollForwardRawFunc) ChainSyncOptionFunc {
276+
return func(c *Config) {
277+
c.RollForwardRawFunc = rollForwardRawFunc
278+
}
279+
}
280+
272281
// WithFindIntersectFunc specifies the FindIntersect callback function
273282
func WithFindIntersectFunc(
274283
findIntersectFunc FindIntersectFunc,

protocol/chainsync/client.go

Lines changed: 49 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -596,7 +596,7 @@ func (c *Client) handleRollForward(msgGeneric protocol.Message) error {
596596
}
597597
}()
598598
if firstBlockChan == nil &&
599-
(c.config == nil || c.config.RollForwardFunc == nil) {
599+
(c.config == nil || (c.config.RollForwardFunc == nil && c.config.RollForwardRawFunc == nil)) {
600600
return fmt.Errorf(
601601
"received chain-sync RollForward message but no callback function is defined",
602602
)
@@ -607,26 +607,21 @@ func (c *Client) handleRollForward(msgGeneric protocol.Message) error {
607607
c.sendCurrentTip(msg.Tip)
608608

609609
var blockHeader ledger.BlockHeader
610+
var blockHeaderBytes []byte
610611
var blockType uint
611612
blockEra := msg.WrappedHeader.Era
612613

613614
switch blockEra {
614615
case ledger.BlockHeaderTypeByron:
615616
blockType = msg.WrappedHeader.ByronType()
616-
var err error
617-
blockHeader, err = ledger.NewBlockHeaderFromCbor(
618-
blockType,
619-
msg.WrappedHeader.HeaderCbor(),
620-
)
621-
if err != nil {
622-
if firstBlockChan != nil {
623-
firstBlockChan <- clientPointResult{error: err}
624-
}
625-
return err
626-
}
617+
blockHeaderBytes = msg.WrappedHeader.HeaderCbor()
627618
default:
628619
// Map block header type to block type
629620
blockType = ledger.BlockHeaderToBlockTypeMap[blockEra]
621+
blockHeaderBytes = msg.WrappedHeader.HeaderCbor()
622+
}
623+
if firstBlockChan != nil || c.config.RollForwardFunc != nil {
624+
// Decode header
630625
var err error
631626
blockHeader, err = ledger.NewBlockHeaderFromCbor(
632627
blockType,
@@ -650,35 +645,63 @@ func (c *Client) handleRollForward(msgGeneric protocol.Message) error {
650645
return nil
651646
}
652647
// Call the user callback function
653-
callbackErr = c.config.RollForwardFunc(
654-
c.callbackContext,
655-
blockType,
656-
blockHeader,
657-
msg.Tip,
658-
)
648+
if c.config.RollForwardRawFunc != nil {
649+
callbackErr = c.config.RollForwardRawFunc(
650+
c.callbackContext,
651+
blockType,
652+
blockHeaderBytes,
653+
msg.Tip,
654+
)
655+
} else {
656+
callbackErr = c.config.RollForwardFunc(
657+
c.callbackContext,
658+
blockType,
659+
blockHeader,
660+
msg.Tip,
661+
)
662+
}
659663
} else {
660664
msg := msgGeneric.(*MsgRollForwardNtC)
661665
c.sendCurrentTip(msg.Tip)
662666

663-
blk, err := ledger.NewBlockFromCbor(msg.BlockType(), msg.BlockCbor())
664-
if err != nil {
665-
if firstBlockChan != nil {
666-
firstBlockChan <- clientPointResult{error: err}
667+
var block ledger.Block
668+
669+
if firstBlockChan != nil || c.config.RollForwardFunc != nil {
670+
var err error
671+
block, err = ledger.NewBlockFromCbor(msg.BlockType(), msg.BlockCbor())
672+
if err != nil {
673+
if firstBlockChan != nil {
674+
firstBlockChan <- clientPointResult{error: err}
675+
}
676+
return err
667677
}
668-
return err
669678
}
670679
if firstBlockChan != nil {
671-
blockHash, err := hex.DecodeString(blk.Hash())
680+
blockHash, err := hex.DecodeString(block.Hash())
672681
if err != nil {
673682
firstBlockChan <- clientPointResult{error: err}
674683
return err
675684
}
676-
point := common.NewPoint(blk.SlotNumber(), blockHash)
685+
point := common.NewPoint(block.SlotNumber(), blockHash)
677686
firstBlockChan <- clientPointResult{tip: msg.Tip, point: point}
678687
return nil
679688
}
680689
// Call the user callback function
681-
callbackErr = c.config.RollForwardFunc(c.callbackContext, msg.BlockType(), blk, msg.Tip)
690+
if c.config.RollForwardRawFunc != nil {
691+
callbackErr = c.config.RollForwardRawFunc(
692+
c.callbackContext,
693+
msg.BlockType(),
694+
msg.BlockCbor(),
695+
msg.Tip,
696+
)
697+
} else {
698+
callbackErr = c.config.RollForwardFunc(
699+
c.callbackContext,
700+
msg.BlockType(),
701+
block,
702+
msg.Tip,
703+
)
704+
}
682705
}
683706
if callbackErr != nil {
684707
if callbackErr == StopSyncProcessError {

0 commit comments

Comments
 (0)