@@ -23,6 +23,23 @@ impl NeuronPrecompile {
23
23
id if id == get_method_id ( "burnedRegister(uint16,bytes32)" ) => {
24
24
Self :: burned_register ( handle, & method_input)
25
25
}
26
+ id if id
27
+ == get_method_id (
28
+ "serveAxon(uint16,uint32,uint128,uint16,uint8,uint8,uint8,uint8)" ,
29
+ ) =>
30
+ {
31
+ Self :: serve_axon ( handle, & method_input)
32
+ }
33
+ id if id
34
+ == get_method_id (
35
+ "serveAxonTls(uint16,uint32,uint128,uint16,uint8,uint8,uint8,uint8,bytes)" ,
36
+ ) =>
37
+ {
38
+ Self :: serve_axon_tls ( handle, & method_input)
39
+ }
40
+ id if id == get_method_id ( "servePrometheus(uint16,uint32,uint128,uint16,uint8)" ) => {
41
+ Self :: serve_prometheus ( handle, & method_input)
42
+ }
26
43
27
44
_ => Err ( PrecompileFailure :: Error {
28
45
exit_status : ExitError :: InvalidRange ,
@@ -40,6 +57,53 @@ impl NeuronPrecompile {
40
57
dispatch ( handle, call, NEURON_CONTRACT_ADDRESS )
41
58
}
42
59
60
+ pub fn serve_axon ( handle : & mut impl PrecompileHandle , data : & [ u8 ] ) -> PrecompileResult {
61
+ let ( netuid, version, ip, port, ip_type, protocol, placeholder1, placeholder2) =
62
+ Self :: parse_serve_axon_parameters ( data) ?;
63
+ let call = RuntimeCall :: SubtensorModule ( pallet_subtensor:: Call :: < Runtime > :: serve_axon {
64
+ netuid,
65
+ version,
66
+ ip,
67
+ port,
68
+ ip_type,
69
+ protocol,
70
+ placeholder1,
71
+ placeholder2,
72
+ } ) ;
73
+ dispatch ( handle, call, NEURON_CONTRACT_ADDRESS )
74
+ }
75
+
76
+ pub fn serve_axon_tls ( handle : & mut impl PrecompileHandle , data : & [ u8 ] ) -> PrecompileResult {
77
+ let ( netuid, version, ip, port, ip_type, protocol, placeholder1, placeholder2, certificate) =
78
+ Self :: parse_serve_axon_tls_parameters ( data) ?;
79
+ let call =
80
+ RuntimeCall :: SubtensorModule ( pallet_subtensor:: Call :: < Runtime > :: serve_axon_tls {
81
+ netuid,
82
+ version,
83
+ ip,
84
+ port,
85
+ ip_type,
86
+ protocol,
87
+ placeholder1,
88
+ placeholder2,
89
+ certificate,
90
+ } ) ;
91
+ dispatch ( handle, call, NEURON_CONTRACT_ADDRESS )
92
+ }
93
+
94
+ pub fn serve_prometheus ( handle : & mut impl PrecompileHandle , data : & [ u8 ] ) -> PrecompileResult {
95
+ let ( netuid, version, ip, port, ip_type) = Self :: parse_serve_prometheus_parameters ( data) ?;
96
+ let call =
97
+ RuntimeCall :: SubtensorModule ( pallet_subtensor:: Call :: < Runtime > :: serve_prometheus {
98
+ netuid,
99
+ version,
100
+ ip,
101
+ port,
102
+ ip_type,
103
+ } ) ;
104
+ dispatch ( handle, call, NEURON_CONTRACT_ADDRESS )
105
+ }
106
+
43
107
fn parse_netuid_hotkey_parameter ( data : & [ u8 ] ) -> Result < ( u16 , [ u8 ; 32 ] ) , PrecompileFailure > {
44
108
if data. len ( ) < 64 {
45
109
return Err ( PrecompileFailure :: Error {
@@ -55,4 +119,113 @@ impl NeuronPrecompile {
55
119
56
120
Ok ( ( netuid, parameter) )
57
121
}
122
+
123
+ fn parse_serve_axon_parameters (
124
+ data : & [ u8 ] ,
125
+ ) -> Result < ( u16 , u32 , u128 , u16 , u8 , u8 , u8 , u8 ) , PrecompileFailure > {
126
+ if data. len ( ) < 256 {
127
+ return Err ( PrecompileFailure :: Error {
128
+ exit_status : ExitError :: InvalidRange ,
129
+ } ) ;
130
+ }
131
+ let mut netuid_vec = [ 0u8 ; 2 ] ;
132
+ netuid_vec. copy_from_slice ( get_slice ( data, 30 , 32 ) ?) ;
133
+ let netuid = u16:: from_be_bytes ( netuid_vec) ;
134
+
135
+ let mut version_vec = [ 0u8 ; 4 ] ;
136
+ version_vec. copy_from_slice ( get_slice ( data, 60 , 64 ) ?) ;
137
+ let version = u32:: from_be_bytes ( version_vec) ;
138
+
139
+ let mut ip_vec = [ 0u8 ; 16 ] ;
140
+ ip_vec. copy_from_slice ( get_slice ( data, 80 , 96 ) ?) ;
141
+ let ip = u128:: from_be_bytes ( ip_vec) ;
142
+
143
+ let mut port_vec = [ 0u8 ; 2 ] ;
144
+ port_vec. copy_from_slice ( get_slice ( data, 126 , 128 ) ?) ;
145
+ let port = u16:: from_be_bytes ( port_vec) ;
146
+
147
+ let ip_type = data[ 160 ] ;
148
+ let protocol = data[ 192 ] ;
149
+ let placeholder1 = data[ 224 ] ;
150
+ let placeholder2 = data[ 256 ] ;
151
+ Ok ( (
152
+ netuid,
153
+ version,
154
+ ip,
155
+ port,
156
+ ip_type,
157
+ protocol,
158
+ placeholder1,
159
+ placeholder2,
160
+ ) )
161
+ }
162
+
163
+ fn parse_serve_axon_tls_parameters (
164
+ data : & [ u8 ] ,
165
+ ) -> Result < ( u16 , u32 , u128 , u16 , u8 , u8 , u8 , u8 , vec:: Vec < u8 > ) , PrecompileFailure > {
166
+ if data. len ( ) < 256 {
167
+ return Err ( PrecompileFailure :: Error {
168
+ exit_status : ExitError :: InvalidRange ,
169
+ } ) ;
170
+ }
171
+ let mut netuid_vec = [ 0u8 ; 2 ] ;
172
+ netuid_vec. copy_from_slice ( get_slice ( data, 30 , 32 ) ?) ;
173
+ let netuid = u16:: from_be_bytes ( netuid_vec) ;
174
+
175
+ let mut version_vec = [ 0u8 ; 4 ] ;
176
+ version_vec. copy_from_slice ( get_slice ( data, 60 , 64 ) ?) ;
177
+ let version = u32:: from_be_bytes ( version_vec) ;
178
+
179
+ let mut ip_vec = [ 0u8 ; 16 ] ;
180
+ ip_vec. copy_from_slice ( get_slice ( data, 80 , 96 ) ?) ;
181
+ let ip = u128:: from_be_bytes ( ip_vec) ;
182
+
183
+ let mut port_vec = [ 0u8 ; 2 ] ;
184
+ port_vec. copy_from_slice ( get_slice ( data, 126 , 128 ) ?) ;
185
+ let port = u16:: from_be_bytes ( port_vec) ;
186
+
187
+ let ip_type = data[ 160 ] ;
188
+ let protocol = data[ 192 ] ;
189
+ let placeholder1 = data[ 224 ] ;
190
+ let placeholder2 = data[ 256 ] ;
191
+ Ok ( (
192
+ netuid,
193
+ version,
194
+ ip,
195
+ port,
196
+ ip_type,
197
+ protocol,
198
+ placeholder1,
199
+ placeholder2,
200
+ vec ! [ ] ,
201
+ ) )
202
+ }
203
+
204
+ fn parse_serve_prometheus_parameters (
205
+ data : & [ u8 ] ,
206
+ ) -> Result < ( u16 , u32 , u128 , u16 , u8 ) , PrecompileFailure > {
207
+ if data. len ( ) < 160 {
208
+ return Err ( PrecompileFailure :: Error {
209
+ exit_status : ExitError :: InvalidRange ,
210
+ } ) ;
211
+ }
212
+ let mut netuid_vec = [ 0u8 ; 2 ] ;
213
+ netuid_vec. copy_from_slice ( get_slice ( data, 30 , 32 ) ?) ;
214
+ let netuid = u16:: from_be_bytes ( netuid_vec) ;
215
+
216
+ let mut version_vec = [ 0u8 ; 4 ] ;
217
+ version_vec. copy_from_slice ( get_slice ( data, 60 , 64 ) ?) ;
218
+ let version = u32:: from_be_bytes ( version_vec) ;
219
+
220
+ let mut ip_vec = [ 0u8 ; 16 ] ;
221
+ ip_vec. copy_from_slice ( get_slice ( data, 80 , 96 ) ?) ;
222
+ let ip = u128:: from_be_bytes ( ip_vec) ;
223
+
224
+ let mut port_vec = [ 0u8 ; 2 ] ;
225
+ port_vec. copy_from_slice ( get_slice ( data, 126 , 128 ) ?) ;
226
+ let port = u16:: from_be_bytes ( port_vec) ;
227
+
228
+ let ip_type = data[ 160 ] ;
229
+ Ok ( ( netuid, version, ip, port, ip_type) )
230
+ }
58
231
}
0 commit comments