@@ -18,7 +18,6 @@ package channel
18
18
19
19
import (
20
20
"fmt"
21
- "math"
22
21
"time"
23
22
24
23
"github.com/hyperledger/fabric/common/localmsp"
@@ -29,7 +28,9 @@ import (
29
28
)
30
29
31
30
type deliverClientIntf interface {
32
- getBlock () (* common.Block , error )
31
+ getSpecifiedBlock (num uint64 ) (* common.Block , error )
32
+ getOldestBlock () (* common.Block , error )
33
+ getNewestBlock () (* common.Block , error )
33
34
Close () error
34
35
}
35
36
@@ -43,10 +44,10 @@ func newDeliverClient(conn *grpc.ClientConn, client ab.AtomicBroadcast_DeliverCl
43
44
return & deliverClient {conn : conn , client : client , chainID : chainID }
44
45
}
45
46
46
- func seekHelper (chainID string , start * ab.SeekPosition ) * common.Envelope {
47
+ func seekHelper (chainID string , position * ab.SeekPosition ) * common.Envelope {
47
48
seekInfo := & ab.SeekInfo {
48
- Start : & ab. SeekPosition { Type : & ab. SeekPosition_Oldest { Oldest : & ab. SeekOldest {}}} ,
49
- Stop : & ab. SeekPosition { Type : & ab. SeekPosition_Specified { Specified : & ab. SeekSpecified { Number : math . MaxUint64 }}} ,
49
+ Start : position ,
50
+ Stop : position ,
50
51
Behavior : ab .SeekInfo_BLOCK_UNTIL_READY ,
51
52
}
52
53
@@ -61,10 +62,18 @@ func seekHelper(chainID string, start *ab.SeekPosition) *common.Envelope {
61
62
return env
62
63
}
63
64
64
- func (r * deliverClient ) seek (blockNumber uint64 ) error {
65
+ func (r * deliverClient ) seekSpecified (blockNumber uint64 ) error {
65
66
return r .client .Send (seekHelper (r .chainID , & ab.SeekPosition {Type : & ab.SeekPosition_Specified {Specified : & ab.SeekSpecified {Number : blockNumber }}}))
66
67
}
67
68
69
+ func (r * deliverClient ) seekOldest () error {
70
+ return r .client .Send (seekHelper (r .chainID , & ab.SeekPosition {Type : & ab.SeekPosition_Oldest {Oldest : & ab.SeekOldest {}}}))
71
+ }
72
+
73
+ func (r * deliverClient ) seekNewest () error {
74
+ return r .client .Send (seekHelper (r .chainID , & ab.SeekPosition {Type : & ab.SeekPosition_Newest {Newest : & ab.SeekNewest {}}}))
75
+ }
76
+
68
77
func (r * deliverClient ) readBlock () (* common.Block , error ) {
69
78
msg , err := r .client .Recv ()
70
79
if err != nil {
@@ -77,26 +86,42 @@ func (r *deliverClient) readBlock() (*common.Block, error) {
77
86
fmt .Println ("Got status " , t )
78
87
return nil , fmt .Errorf ("can't read the block" )
79
88
case * ab.DeliverResponse_Block :
80
- fmt .Println ("Received block: " , t .Block )
89
+ fmt .Println ("Received block: " , t .Block .Header .Number )
90
+ r .client .Recv () // Flush the success message
81
91
return t .Block , nil
82
92
default :
83
93
return nil , fmt .Errorf ("response error" )
84
94
}
85
95
}
86
96
87
- func (r * deliverClient ) getBlock () (* common.Block , error ) {
88
- err := r .seek (0 )
97
+ func (r * deliverClient ) getSpecifiedBlock (num uint64 ) (* common.Block , error ) {
98
+ err := r .seekSpecified (num )
99
+ if err != nil {
100
+ fmt .Println ("Received error:" , err )
101
+ return nil , err
102
+ }
103
+
104
+ return r .readBlock ()
105
+ }
106
+
107
+ func (r * deliverClient ) getOldestBlock () (* common.Block , error ) {
108
+ err := r .seekOldest ()
89
109
if err != nil {
90
110
fmt .Println ("Received error:" , err )
91
111
return nil , err
92
112
}
93
113
94
- b , err := r .readBlock ()
114
+ return r .readBlock ()
115
+ }
116
+
117
+ func (r * deliverClient ) getNewestBlock () (* common.Block , error ) {
118
+ err := r .seekNewest ()
95
119
if err != nil {
120
+ fmt .Println ("Received error:" , err )
96
121
return nil , err
97
122
}
98
123
99
- return b , nil
124
+ return r . readBlock ()
100
125
}
101
126
102
127
func (r * deliverClient ) Close () error {
@@ -113,7 +138,7 @@ func getGenesisBlock(cf *ChannelCmdFactory) (*common.Block, error) {
113
138
cf .DeliverClient .Close ()
114
139
return nil , fmt .Errorf ("timeout waiting for channel creation" )
115
140
default :
116
- if block , err := cf .DeliverClient .getBlock ( ); err != nil {
141
+ if block , err := cf .DeliverClient .getSpecifiedBlock ( 0 ); err != nil {
117
142
cf .DeliverClient .Close ()
118
143
cf , err = InitCmdFactory (EndorserNotRequired , OrdererRequired )
119
144
if err != nil {
0 commit comments