@@ -30,6 +30,12 @@ import (
30
30
"google.golang.org/grpc"
31
31
)
32
32
33
+ var (
34
+ oldest = & ab.SeekPosition {Type : & ab.SeekPosition_Oldest {Oldest : & ab.SeekOldest {}}}
35
+ newest = & ab.SeekPosition {Type : & ab.SeekPosition_Newest {Newest : & ab.SeekNewest {}}}
36
+ maxStop = & ab.SeekPosition {Type : & ab.SeekPosition_Specified {Specified : & ab.SeekSpecified {Number : math .MaxUint64 }}}
37
+ )
38
+
33
39
type deliverClient struct {
34
40
client ab.AtomicBroadcast_DeliverClient
35
41
chainID string
@@ -39,7 +45,7 @@ func newDeliverClient(client ab.AtomicBroadcast_DeliverClient, chainID string) *
39
45
return & deliverClient {client : client , chainID : chainID }
40
46
}
41
47
42
- func seekHelper (chainID string , start * ab.SeekPosition ) * cb.Envelope {
48
+ func seekHelper (chainID string , start * ab.SeekPosition , stop * ab. SeekPosition ) * cb.Envelope {
43
49
return & cb.Envelope {
44
50
Payload : utils .MarshalOrPanic (& cb.Payload {
45
51
Header : & cb.Header {
@@ -51,23 +57,24 @@ func seekHelper(chainID string, start *ab.SeekPosition) *cb.Envelope {
51
57
52
58
Data : utils .MarshalOrPanic (& ab.SeekInfo {
53
59
Start : start ,
54
- Stop : & ab. SeekPosition { Type : & ab. SeekPosition_Specified { Specified : & ab. SeekSpecified { Number : math . MaxUint64 }}} ,
60
+ Stop : stop ,
55
61
Behavior : ab .SeekInfo_BLOCK_UNTIL_READY ,
56
62
}),
57
63
}),
58
64
}
59
65
}
60
66
61
67
func (r * deliverClient ) seekOldest () error {
62
- return r .client .Send (seekHelper (r .chainID , & ab. SeekPosition { Type : & ab. SeekPosition_Oldest { Oldest : & ab. SeekOldest {}}} ))
68
+ return r .client .Send (seekHelper (r .chainID , oldest , maxStop ))
63
69
}
64
70
65
71
func (r * deliverClient ) seekNewest () error {
66
- return r .client .Send (seekHelper (r .chainID , & ab. SeekPosition { Type : & ab. SeekPosition_Newest { Newest : & ab. SeekNewest {}}} ))
72
+ return r .client .Send (seekHelper (r .chainID , newest , maxStop ))
67
73
}
68
74
69
- func (r * deliverClient ) seek (blockNumber uint64 ) error {
70
- return r .client .Send (seekHelper (r .chainID , & ab.SeekPosition {Type : & ab.SeekPosition_Specified {Specified : & ab.SeekSpecified {Number : blockNumber }}}))
75
+ func (r * deliverClient ) seekSingle (blockNumber uint64 ) error {
76
+ specific := & ab.SeekPosition {Type : & ab.SeekPosition_Specified {Specified : & ab.SeekSpecified {Number : blockNumber }}}
77
+ return r .client .Send (seekHelper (r .chainID , specific , specific ))
71
78
}
72
79
73
80
func (r * deliverClient ) readUntilClose () {
@@ -93,11 +100,21 @@ func main() {
93
100
94
101
var chainID string
95
102
var serverAddr string
103
+ var seek int
96
104
97
105
flag .StringVar (& serverAddr , "server" , fmt .Sprintf ("%s:%d" , config .General .ListenAddress , config .General .ListenPort ), "The RPC server to connect to." )
98
106
flag .StringVar (& chainID , "chainID" , provisional .TestChainID , "The chain ID to deliver from." )
107
+ flag .IntVar (& seek , "seek" , - 2 , "Specify the range of requested blocks." +
108
+ "Acceptable values:" +
109
+ "-2 (or -1) to start from oldest (or newest) and keep at it indefinitely." +
110
+ "N >= 0 to fetch block N only." )
99
111
flag .Parse ()
100
112
113
+ if seek < - 2 {
114
+ fmt .Println ("Wrong seek value." )
115
+ flag .PrintDefaults ()
116
+ }
117
+
101
118
conn , err := grpc .Dial (serverAddr , grpc .WithInsecure ())
102
119
if err != nil {
103
120
fmt .Println ("Error connecting:" , err )
@@ -110,7 +127,15 @@ func main() {
110
127
}
111
128
112
129
s := newDeliverClient (client , chainID )
113
- err = s .seekOldest ()
130
+ switch seek {
131
+ case - 2 :
132
+ err = s .seekOldest ()
133
+ case - 1 :
134
+ err = s .seekNewest ()
135
+ default :
136
+ err = s .seekSingle (uint64 (seek ))
137
+ }
138
+
114
139
if err != nil {
115
140
fmt .Println ("Received error:" , err )
116
141
}
0 commit comments