Skip to content

Commit f949a16

Browse files
authored
Merge pull request #188 from cloudstruct/docs/protocol-chainsync-package
docs: code docs for protocol/chainsync package
2 parents 9bccc00 + 53fb5b5 commit f949a16

File tree

7 files changed

+130
-94
lines changed

7 files changed

+130
-94
lines changed

protocol/chainsync/chainsync.go

Lines changed: 45 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// Package chainsync implements the Ouroboros chain-sync protocol
12
package chainsync
23

34
import (
@@ -7,91 +8,95 @@ import (
78
"github.com/cloudstruct/go-ouroboros-network/protocol/common"
89
)
910

11+
// Protocol identifiers
1012
const (
11-
PROTOCOL_NAME = "chain-sync"
12-
PROTOCOL_ID_NTN uint16 = 2
13-
PROTOCOL_ID_NTC uint16 = 5
13+
protocolName = "chain-sync"
14+
protocolIdNtN uint16 = 2
15+
protocolIdNtC uint16 = 5
1416
)
1517

1618
var (
17-
STATE_IDLE = protocol.NewState(1, "Idle")
18-
STATE_CAN_AWAIT = protocol.NewState(2, "CanAwait")
19-
STATE_MUST_REPLY = protocol.NewState(3, "MustReply")
20-
STATE_INTERSECT = protocol.NewState(4, "Intersect")
21-
STATE_DONE = protocol.NewState(5, "Done")
19+
stateIdle = protocol.NewState(1, "Idle")
20+
stateCanAwait = protocol.NewState(2, "CanAwait")
21+
stateMustReply = protocol.NewState(3, "MustReply")
22+
stateIntersect = protocol.NewState(4, "Intersect")
23+
stateDone = protocol.NewState(5, "Done")
2224
)
2325

26+
// ChainSync protocol state machine
2427
var StateMap = protocol.StateMap{
25-
STATE_IDLE: protocol.StateMapEntry{
28+
stateIdle: protocol.StateMapEntry{
2629
Agency: protocol.AgencyClient,
2730
Transitions: []protocol.StateTransition{
2831
{
29-
MsgType: MESSAGE_TYPE_REQUEST_NEXT,
30-
NewState: STATE_CAN_AWAIT,
32+
MsgType: MessageTypeRequestNext,
33+
NewState: stateCanAwait,
3134
},
3235
{
33-
MsgType: MESSAGE_TYPE_FIND_INTERSECT,
34-
NewState: STATE_INTERSECT,
36+
MsgType: MessageTypeFindIntersect,
37+
NewState: stateIntersect,
3538
},
3639
{
37-
MsgType: MESSAGE_TYPE_DONE,
38-
NewState: STATE_DONE,
40+
MsgType: MessageTypeDone,
41+
NewState: stateDone,
3942
},
4043
},
4144
},
42-
STATE_CAN_AWAIT: protocol.StateMapEntry{
45+
stateCanAwait: protocol.StateMapEntry{
4346
Agency: protocol.AgencyServer,
4447
Transitions: []protocol.StateTransition{
4548
{
46-
MsgType: MESSAGE_TYPE_AWAIT_REPLY,
47-
NewState: STATE_MUST_REPLY,
49+
MsgType: MessageTypeAwaitReply,
50+
NewState: stateMustReply,
4851
},
4952
{
50-
MsgType: MESSAGE_TYPE_ROLL_FORWARD,
51-
NewState: STATE_IDLE,
53+
MsgType: MessageTypeRollForward,
54+
NewState: stateIdle,
5255
},
5356
{
54-
MsgType: MESSAGE_TYPE_ROLL_BACKWARD,
55-
NewState: STATE_IDLE,
57+
MsgType: MessageTypeRollBackward,
58+
NewState: stateIdle,
5659
},
5760
},
5861
},
59-
STATE_INTERSECT: protocol.StateMapEntry{
62+
stateIntersect: protocol.StateMapEntry{
6063
Agency: protocol.AgencyServer,
6164
Transitions: []protocol.StateTransition{
6265
{
63-
MsgType: MESSAGE_TYPE_INTERSECT_FOUND,
64-
NewState: STATE_IDLE,
66+
MsgType: MessageTypeIntersectFound,
67+
NewState: stateIdle,
6568
},
6669
{
67-
MsgType: MESSAGE_TYPE_INTERSECT_NOT_FOUND,
68-
NewState: STATE_IDLE,
70+
MsgType: MessageTypeIntersectNotFound,
71+
NewState: stateIdle,
6972
},
7073
},
7174
},
72-
STATE_MUST_REPLY: protocol.StateMapEntry{
75+
stateMustReply: protocol.StateMapEntry{
7376
Agency: protocol.AgencyServer,
7477
Transitions: []protocol.StateTransition{
7578
{
76-
MsgType: MESSAGE_TYPE_ROLL_FORWARD,
77-
NewState: STATE_IDLE,
79+
MsgType: MessageTypeRollForward,
80+
NewState: stateIdle,
7881
},
7982
{
80-
MsgType: MESSAGE_TYPE_ROLL_BACKWARD,
81-
NewState: STATE_IDLE,
83+
MsgType: MessageTypeRollBackward,
84+
NewState: stateIdle,
8285
},
8386
},
8487
},
85-
STATE_DONE: protocol.StateMapEntry{
88+
stateDone: protocol.StateMapEntry{
8689
Agency: protocol.AgencyNone,
8790
},
8891
}
8992

93+
// ChainSync is a wrapper object that holds the client and server instances
9094
type ChainSync struct {
9195
Client *Client
9296
Server *Server
9397
}
9498

99+
// Config is used to configure the ChainSync protocol instance
95100
type Config struct {
96101
RollBackwardFunc RollBackwardFunc
97102
RollForwardFunc RollForwardFunc
@@ -103,6 +108,7 @@ type Config struct {
103108
type RollBackwardFunc func(common.Point, Tip) error
104109
type RollForwardFunc func(uint, interface{}, Tip) error
105110

111+
// New returns a new ChainSync object
106112
func New(protoOptions protocol.ProtocolOptions, cfg *Config) *ChainSync {
107113
c := &ChainSync{
108114
Client: NewClient(protoOptions, cfg),
@@ -111,8 +117,10 @@ func New(protoOptions protocol.ProtocolOptions, cfg *Config) *ChainSync {
111117
return c
112118
}
113119

120+
// ChainSyncOptionFunc represents a function used to modify the ChainSync protocol config
114121
type ChainSyncOptionFunc func(*Config)
115122

123+
// NewConfig returns a new ChainSync config object with the provided options
116124
func NewConfig(options ...ChainSyncOptionFunc) Config {
117125
c := Config{
118126
IntersectTimeout: 5 * time.Second,
@@ -129,24 +137,28 @@ func NewConfig(options ...ChainSyncOptionFunc) Config {
129137
return c
130138
}
131139

140+
// WithRollBackwardFunc specifies the RollBackward callback function
132141
func WithRollBackwardFunc(rollBackwardFunc RollBackwardFunc) ChainSyncOptionFunc {
133142
return func(c *Config) {
134143
c.RollBackwardFunc = rollBackwardFunc
135144
}
136145
}
137146

147+
// WithRollForwardFunc specifies the RollForward callback function
138148
func WithRollForwardFunc(rollForwardFunc RollForwardFunc) ChainSyncOptionFunc {
139149
return func(c *Config) {
140150
c.RollForwardFunc = rollForwardFunc
141151
}
142152
}
143153

154+
// WithIntersectTimeout specifies the timeout for intersect operations
144155
func WithIntersectTimeout(timeout time.Duration) ChainSyncOptionFunc {
145156
return func(c *Config) {
146157
c.IntersectTimeout = timeout
147158
}
148159
}
149160

161+
// WithBlockTimeout specifies the timeout for block fetch operations
150162
func WithBlockTimeout(timeout time.Duration) ChainSyncOptionFunc {
151163
return func(c *Config) {
152164
c.BlockTimeout = timeout

protocol/chainsync/client.go

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"sync"
99
)
1010

11+
// Client implements the ChainSync client
1112
type Client struct {
1213
*protocol.Protocol
1314
config *Config
@@ -18,13 +19,14 @@ type Client struct {
1819
currentTipChan chan Tip
1920
}
2021

22+
// NewClient returns a new ChainSync client object
2123
func NewClient(protoOptions protocol.ProtocolOptions, cfg *Config) *Client {
2224
// Use node-to-client protocol ID
23-
protocolId := PROTOCOL_ID_NTC
25+
protocolId := protocolIdNtC
2426
msgFromCborFunc := NewMsgFromCborNtC
2527
if protoOptions.Mode == protocol.ProtocolModeNodeToNode {
2628
// Use node-to-node protocol ID
27-
protocolId = PROTOCOL_ID_NTN
29+
protocolId = protocolIdNtN
2830
msgFromCborFunc = NewMsgFromCborNtN
2931
}
3032
if cfg == nil {
@@ -39,19 +41,19 @@ func NewClient(protoOptions protocol.ProtocolOptions, cfg *Config) *Client {
3941
}
4042
// Update state map with timeouts
4143
stateMap := StateMap.Copy()
42-
if entry, ok := stateMap[STATE_INTERSECT]; ok {
44+
if entry, ok := stateMap[stateIntersect]; ok {
4345
entry.Timeout = c.config.IntersectTimeout
44-
stateMap[STATE_INTERSECT] = entry
46+
stateMap[stateIntersect] = entry
4547
}
46-
for _, state := range []protocol.State{STATE_CAN_AWAIT, STATE_MUST_REPLY} {
48+
for _, state := range []protocol.State{stateCanAwait, stateMustReply} {
4749
if entry, ok := stateMap[state]; ok {
4850
entry.Timeout = c.config.BlockTimeout
4951
stateMap[state] = entry
5052
}
5153
}
5254
// Configure underlying Protocol
5355
protoConfig := protocol.ProtocolConfig{
54-
Name: PROTOCOL_NAME,
56+
Name: protocolName,
5557
ProtocolId: protocolId,
5658
Muxer: protoOptions.Muxer,
5759
ErrorChan: protoOptions.ErrorChan,
@@ -60,7 +62,7 @@ func NewClient(protoOptions protocol.ProtocolOptions, cfg *Config) *Client {
6062
MessageHandlerFunc: c.messageHandler,
6163
MessageFromCborFunc: msgFromCborFunc,
6264
StateMap: stateMap,
63-
InitialState: STATE_IDLE,
65+
InitialState: stateIdle,
6466
}
6567
c.Protocol = protocol.New(protoConfig)
6668
// Start goroutine to cleanup resources on protocol shutdown
@@ -76,22 +78,23 @@ func NewClient(protoOptions protocol.ProtocolOptions, cfg *Config) *Client {
7678
func (c *Client) messageHandler(msg protocol.Message, isResponse bool) error {
7779
var err error
7880
switch msg.Type() {
79-
case MESSAGE_TYPE_AWAIT_REPLY:
81+
case MessageTypeAwaitReply:
8082
err = c.handleAwaitReply()
81-
case MESSAGE_TYPE_ROLL_FORWARD:
83+
case MessageTypeRollForward:
8284
err = c.handleRollForward(msg)
83-
case MESSAGE_TYPE_ROLL_BACKWARD:
85+
case MessageTypeRollBackward:
8486
err = c.handleRollBackward(msg)
85-
case MESSAGE_TYPE_INTERSECT_FOUND:
87+
case MessageTypeIntersectFound:
8688
err = c.handleIntersectFound(msg)
87-
case MESSAGE_TYPE_INTERSECT_NOT_FOUND:
89+
case MessageTypeIntersectNotFound:
8890
err = c.handleIntersectNotFound(msg)
8991
default:
90-
err = fmt.Errorf("%s: received unexpected message type %d", PROTOCOL_NAME, msg.Type())
92+
err = fmt.Errorf("%s: received unexpected message type %d", protocolName, msg.Type())
9193
}
9294
return err
9395
}
9496

97+
// Stop transitions the protocol to the Done state. No more protocol operations will be possible afterward
9598
func (c *Client) Stop() error {
9699
c.busyMutex.Lock()
97100
defer c.busyMutex.Unlock()
@@ -102,6 +105,7 @@ func (c *Client) Stop() error {
102105
return nil
103106
}
104107

108+
// GetCurrentTip returns the current chain tip
105109
func (c *Client) GetCurrentTip() (*Tip, error) {
106110
c.busyMutex.Lock()
107111
defer c.busyMutex.Unlock()
@@ -115,6 +119,8 @@ func (c *Client) GetCurrentTip() (*Tip, error) {
115119
return &tip, nil
116120
}
117121

122+
// Sync begins a chain-sync operation using the provided intersect point(s). Incoming blocks will be delivered
123+
// via the RollForward callback function specified in the protocol config
118124
func (c *Client) Sync(intersectPoints []common.Point) error {
119125
c.busyMutex.Lock()
120126
defer c.busyMutex.Unlock()

protocol/chainsync/error.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package chainsync
22

3+
// IntersectNotFoundError represents a failure to find a chain intersection
34
type IntersectNotFoundError struct {
45
}
56

0 commit comments

Comments
 (0)