@@ -37,79 +37,81 @@ import (
37
37
38
38
var logger = logging .MustGetLogger ("common/configtx/tool" )
39
39
40
- func doOutputBlock (pgen provisional.Generator , channelID string , outputBlock string ) {
40
+ func doOutputBlock (pgen provisional.Generator , channelID string , outputBlock string ) error {
41
41
logger .Info ("Generating genesis block" )
42
42
genesisBlock := pgen .GenesisBlockForChannel (channelID )
43
43
logger .Info ("Writing genesis block" )
44
44
err := ioutil .WriteFile (outputBlock , utils .MarshalOrPanic (genesisBlock ), 0644 )
45
45
if err != nil {
46
- logger .Errorf ("Error writing genesis block: %s" , err )
46
+ return fmt .Errorf ("Error writing genesis block: %s" , err )
47
47
}
48
+ return nil
48
49
}
49
50
50
- func doOutputChannelCreateTx (pgen provisional.Generator , channelID string , outputChannelCreateTx string ) {
51
+ func doOutputChannelCreateTx (pgen provisional.Generator , channelID string , outputChannelCreateTx string ) error {
51
52
logger .Info ("Generating new channel configtx" )
52
53
// TODO, use actual MSP eventually
53
54
signer , err := msp .NewNoopMsp ().GetDefaultSigningIdentity ()
54
55
if err != nil {
55
- logger . Fatalf ("Error getting signing identity: %s" , err )
56
+ return fmt . Errorf ("Error getting signing identity: %s" , err )
56
57
}
57
58
configtx , err := configtx .MakeChainCreationTransaction (provisional .AcceptAllPolicyKey , channelID , signer , pgen .ChannelTemplate ())
58
59
if err != nil {
59
- logger . Fatalf ("Error generating configtx: %s" , err )
60
+ return fmt . Errorf ("Error generating configtx: %s" , err )
60
61
}
61
62
logger .Info ("Writing new channel tx" )
62
63
err = ioutil .WriteFile (outputChannelCreateTx , utils .MarshalOrPanic (configtx ), 0644 )
63
64
if err != nil {
64
- logger .Errorf ("Error writing channel create tx: %s" , err )
65
+ return fmt .Errorf ("Error writing channel create tx: %s" , err )
65
66
}
67
+ return nil
66
68
}
67
69
68
- func doInspectBlock (inspectBlock string ) {
70
+ func doInspectBlock (inspectBlock string ) error {
69
71
logger .Info ("Inspecting block" )
70
72
data , err := ioutil .ReadFile (inspectBlock )
71
73
logger .Info ("Parsing genesis block" )
72
74
block := & cb.Block {}
73
75
err = proto .Unmarshal (data , block )
74
76
if err != nil {
75
- logger . Fatalf ("Error unmarshaling block: %s" , err )
77
+ fmt . Errorf ("Error unmarshaling block: %s" , err )
76
78
}
77
79
78
80
ctx , err := utils .ExtractEnvelope (block , 0 )
79
81
if err != nil {
80
- logger . Fatalf ("Error retrieving configtx from block: %s" , err )
82
+ return fmt . Errorf ("Error retrieving configtx from block: %s" , err )
81
83
}
82
84
83
85
payload , err := utils .UnmarshalPayload (ctx .Payload )
84
86
if err != nil {
85
- logger . Fatalf ("Error extracting configtx payload: %s" , err )
87
+ return fmt . Errorf ("Error extracting configtx payload: %s" , err )
86
88
}
87
89
88
90
if payload .Header == nil {
89
- logger . Fatalf ("Config block did not contain header" )
91
+ return fmt . Errorf ("Config block did not contain header" )
90
92
}
91
93
92
94
header , err := utils .UnmarshalChannelHeader (payload .Header .ChannelHeader )
93
95
if err != nil {
94
- logger . Fatalf ("Error unmarshaling channel header: %s" , err )
96
+ return fmt . Errorf ("Error unmarshaling channel header: %s" , err )
95
97
}
96
98
97
99
if header .Type != int32 (cb .HeaderType_CONFIG ) {
98
- logger . Fatalf ("Bad header type: %d" , header .Type )
100
+ return fmt . Errorf ("Bad header type: %d" , header .Type )
99
101
}
100
102
101
103
configEnvelope , err := configtx .UnmarshalConfigEnvelope (payload .Data )
102
104
if err != nil {
103
- logger . Fatalf ("Bad configuration envelope" )
105
+ return fmt . Errorf ("Bad configuration envelope" )
104
106
}
105
107
106
108
if configEnvelope .Config == nil {
107
- logger . Fatalf ("ConfigEnvelope contained no config" )
109
+ return fmt . Errorf ("ConfigEnvelope contained no config" )
108
110
}
109
111
110
112
configResult , err := configtx .NewConfigResult (configEnvelope .Config .ChannelGroup , configtx .NewInitializer ())
111
113
if err != nil {
112
- logger . Fatalf ("Error parsing configuration: %s" , err )
114
+ return fmt . Errorf ("Error parsing configuration: %s" , err )
113
115
}
114
116
115
117
buffer := & bytes.Buffer {}
@@ -118,16 +120,73 @@ func doInspectBlock(inspectBlock string) {
118
120
fmt .Printf ("Config for channel: %s at sequence %d\n " , header .ChannelId , configEnvelope .Config .Sequence )
119
121
120
122
fmt .Println (buffer .String ())
123
+ return nil
124
+ }
125
+
126
+ func doInspectChannelCreateTx (inspectChannelCreateTx string ) error {
127
+ logger .Info ("Inspecting transaction" )
128
+ data , err := ioutil .ReadFile (inspectChannelCreateTx )
129
+ logger .Info ("Parsing transaction" )
130
+ env , err := utils .UnmarshalEnvelope (data )
131
+ if err != nil {
132
+ return fmt .Errorf ("Error unmarshaling envelope: %s" , err )
133
+ }
134
+
135
+ payload , err := utils .UnmarshalPayload (env .Payload )
136
+ if err != nil {
137
+ return fmt .Errorf ("Error extracting configtx payload: %s" , err )
138
+ }
139
+
140
+ if payload .Header == nil {
141
+ return fmt .Errorf ("Config block did not contain header" )
142
+ }
143
+
144
+ header , err := utils .UnmarshalChannelHeader (payload .Header .ChannelHeader )
145
+ if err != nil {
146
+ return fmt .Errorf ("Error unmarshaling channel header: %s" , err )
147
+ }
148
+
149
+ if header .Type != int32 (cb .HeaderType_CONFIG_UPDATE ) {
150
+ return fmt .Errorf ("Bad header type: %d" , header .Type )
151
+ }
152
+
153
+ configUpdateEnvelope , err := configtx .UnmarshalConfigUpdateEnvelope (payload .Data )
154
+ if err != nil {
155
+ return fmt .Errorf ("Bad ConfigUpdateEnvelope" )
156
+ }
157
+
158
+ configUpdate , err := configtx .UnmarshalConfigUpdate (configUpdateEnvelope .ConfigUpdate )
159
+ if err != nil {
160
+ return fmt .Errorf ("ConfigUpdateEnvelope contained no config" )
161
+ }
162
+
163
+ if configUpdate .ChannelId != header .ChannelId {
164
+ return fmt .Errorf ("ConfigUpdateEnvelope was for different channel than envelope: %s vs %s" , configUpdate .ChannelId , header .ChannelId )
165
+ }
166
+
167
+ configResult , err := configtx .NewConfigResult (configUpdate .WriteSet , configtx .NewInitializer ())
168
+ if err != nil {
169
+ return fmt .Errorf ("Error parsing configuration: %s" , err )
170
+ }
171
+
172
+ buffer := & bytes.Buffer {}
173
+ json .Indent (buffer , []byte (configResult .JSON ()), "" , " " )
174
+
175
+ fmt .Printf ("Config for channel: %s\n " , header .ChannelId )
176
+
177
+ fmt .Println (buffer .String ())
178
+ return nil
121
179
}
122
180
123
181
func main () {
124
- var outputBlock , outputChannelCreateTx , profile , channelID , inspectBlock string
182
+ var outputBlock , outputChannelCreateTx , profile , channelID , inspectBlock , inspectChannelCreateTx string
125
183
126
184
flag .StringVar (& outputBlock , "outputBlock" , "" , "The path to write the genesis block to (if set)" )
127
185
flag .StringVar (& channelID , "channelID" , provisional .TestChainID , "The channel ID to use in the configtx" )
128
186
flag .StringVar (& outputChannelCreateTx , "outputCreateChannelTx" , "" , "The path to write a channel creation configtx to (if set)" )
129
187
flag .StringVar (& profile , "profile" , genesisconfig .SampleInsecureProfile , "The profile from configtx.yaml to use for generation." )
130
188
flag .StringVar (& inspectBlock , "inspectBlock" , "" , "Prints the configuration contained in the block at the specified path" )
189
+ flag .StringVar (& inspectChannelCreateTx , "inspectChannelCreateTx" , "" , "Prints the configuration contained in the transaction at the specified path" )
131
190
132
191
flag .Parse ()
133
192
@@ -139,15 +198,27 @@ func main() {
139
198
pgen := provisional .New (config )
140
199
141
200
if outputBlock != "" {
142
- doOutputBlock (pgen , channelID , outputBlock )
201
+ if err := doOutputBlock (pgen , channelID , outputBlock ); err != nil {
202
+ logger .Fatalf ("Error on outputBlock: %s" , err )
203
+ }
143
204
}
144
205
145
206
if outputChannelCreateTx != "" {
146
- doOutputChannelCreateTx (pgen , channelID , outputChannelCreateTx )
207
+ if err := doOutputChannelCreateTx (pgen , channelID , outputChannelCreateTx ); err != nil {
208
+ logger .Fatalf ("Error on outputChannelCreateTx: %s" , err )
209
+ }
147
210
}
148
211
149
212
if inspectBlock != "" {
150
- doInspectBlock (inspectBlock )
213
+ if err := doInspectBlock (inspectBlock ); err != nil {
214
+ logger .Fatalf ("Error on inspectBlock: %s" , err )
215
+ }
216
+ }
217
+
218
+ if inspectChannelCreateTx != "" {
219
+ if err := doInspectChannelCreateTx (inspectChannelCreateTx ); err != nil {
220
+ logger .Fatalf ("Error on inspectChannelCreateTx: %s" , err )
221
+ }
151
222
}
152
223
153
224
}
0 commit comments