1use self::{
5 address::{AddressFromBytesCostParams, AddressFromU256CostParams, AddressToU256CostParams},
6 crypto::{bls12381, ecdsa_k1, ecdsa_r1, ecvrf, ed25519, groth16, hash, hmac},
7 crypto::{
8 bls12381::{Bls12381Bls12381MinPkVerifyCostParams, Bls12381Bls12381MinSigVerifyCostParams},
9 ecdsa_k1::{
10 EcdsaK1DecompressPubkeyCostParams, EcdsaK1EcrecoverCostParams,
11 EcdsaK1Secp256k1VerifyCostParams,
12 },
13 ecdsa_r1::{EcdsaR1EcrecoverCostParams, EcdsaR1Secp256R1VerifyCostParams},
14 ecvrf::EcvrfEcvrfVerifyCostParams,
15 ed25519::Ed25519VerifyCostParams,
16 groth16::{
17 Groth16PrepareVerifyingKeyCostParams, Groth16VerifyGroth16ProofInternalCostParams,
18 },
19 hash::{HashBlake2b256CostParams, HashKeccak256CostParams},
20 hmac::HmacHmacSha3256CostParams,
21 poseidon,
22 },
23 dynamic_field::{
24 DynamicFieldAddChildObjectCostParams, DynamicFieldBorrowChildObjectCostParams,
25 DynamicFieldHasChildObjectCostParams, DynamicFieldHasChildObjectWithTyCostParams,
26 DynamicFieldHashTypeAndKeyCostParams, DynamicFieldRemoveChildObjectCostParams,
27 },
28 event::EventEmitCostParams,
29 object::{BorrowUidCostParams, DeleteImplCostParams, RecordNewIdCostParams},
30 transfer::{
31 TransferFreezeObjectCostParams, TransferInternalCostParams, TransferShareObjectCostParams,
32 },
33 tx_context::TxContextDeriveIdCostParams,
34 types::TypesIsOneTimeWitnessCostParams,
35 validator::ValidatorValidateMetadataBcsCostParams,
36};
37use crate::crypto::group_ops;
38use crate::crypto::group_ops::GroupOpsCostParams;
39use crate::crypto::poseidon::PoseidonBN254CostParams;
40use crate::crypto::zklogin;
41use crate::crypto::zklogin::{CheckZkloginIdCostParams, CheckZkloginIssuerCostParams};
42use better_any::{Tid, TidAble};
43use move_binary_format::errors::{PartialVMError, PartialVMResult};
44use move_core_types::{
45 annotated_value as A,
46 gas_algebra::InternalGas,
47 identifier::Identifier,
48 language_storage::{StructTag, TypeTag},
49 runtime_value as R,
50 vm_status::StatusCode,
51};
52use move_stdlib_natives::{GasParameters, NurseryGasParameters};
53use move_vm_runtime::native_functions::{NativeContext, NativeFunction, NativeFunctionTable};
54use move_vm_types::{
55 loaded_data::runtime_types::Type,
56 natives::function::NativeResult,
57 values::{Struct, Value},
58};
59use std::sync::Arc;
60use sui_protocol_config::ProtocolConfig;
61use sui_types::{MOVE_STDLIB_ADDRESS, SUI_FRAMEWORK_ADDRESS, SUI_SYSTEM_ADDRESS};
62use transfer::TransferReceiveObjectInternalCostParams;
63
64mod address;
65mod crypto;
66mod dynamic_field;
67mod event;
68mod object;
69pub mod object_runtime;
70mod test_scenario;
71mod test_utils;
72mod transfer;
73mod tx_context;
74mod types;
75mod validator;
76
77#[derive(Tid)]
78pub struct NativesCostTable {
79 pub address_from_bytes_cost_params: AddressFromBytesCostParams,
81 pub address_to_u256_cost_params: AddressToU256CostParams,
82 pub address_from_u256_cost_params: AddressFromU256CostParams,
83
84 pub dynamic_field_hash_type_and_key_cost_params: DynamicFieldHashTypeAndKeyCostParams,
86 pub dynamic_field_add_child_object_cost_params: DynamicFieldAddChildObjectCostParams,
87 pub dynamic_field_borrow_child_object_cost_params: DynamicFieldBorrowChildObjectCostParams,
88 pub dynamic_field_remove_child_object_cost_params: DynamicFieldRemoveChildObjectCostParams,
89 pub dynamic_field_has_child_object_cost_params: DynamicFieldHasChildObjectCostParams,
90 pub dynamic_field_has_child_object_with_ty_cost_params:
91 DynamicFieldHasChildObjectWithTyCostParams,
92
93 pub event_emit_cost_params: EventEmitCostParams,
95
96 pub borrow_uid_cost_params: BorrowUidCostParams,
98 pub delete_impl_cost_params: DeleteImplCostParams,
99 pub record_new_id_cost_params: RecordNewIdCostParams,
100
101 pub transfer_transfer_internal_cost_params: TransferInternalCostParams,
103 pub transfer_freeze_object_cost_params: TransferFreezeObjectCostParams,
104 pub transfer_share_object_cost_params: TransferShareObjectCostParams,
105
106 pub tx_context_derive_id_cost_params: TxContextDeriveIdCostParams,
108
109 pub type_is_one_time_witness_cost_params: TypesIsOneTimeWitnessCostParams,
111
112 pub validator_validate_metadata_bcs_cost_params: ValidatorValidateMetadataBcsCostParams,
114
115 pub crypto_invalid_arguments_cost: InternalGas,
117 pub bls12381_bls12381_min_sig_verify_cost_params: Bls12381Bls12381MinSigVerifyCostParams,
119 pub bls12381_bls12381_min_pk_verify_cost_params: Bls12381Bls12381MinPkVerifyCostParams,
120
121 pub ecdsa_k1_ecrecover_cost_params: EcdsaK1EcrecoverCostParams,
123 pub ecdsa_k1_decompress_pubkey_cost_params: EcdsaK1DecompressPubkeyCostParams,
124 pub ecdsa_k1_secp256k1_verify_cost_params: EcdsaK1Secp256k1VerifyCostParams,
125
126 pub ecdsa_r1_ecrecover_cost_params: EcdsaR1EcrecoverCostParams,
128 pub ecdsa_r1_secp256_r1_verify_cost_params: EcdsaR1Secp256R1VerifyCostParams,
129
130 pub ecvrf_ecvrf_verify_cost_params: EcvrfEcvrfVerifyCostParams,
132
133 pub ed25519_verify_cost_params: Ed25519VerifyCostParams,
135
136 pub groth16_prepare_verifying_key_cost_params: Groth16PrepareVerifyingKeyCostParams,
138 pub groth16_verify_groth16_proof_internal_cost_params:
139 Groth16VerifyGroth16ProofInternalCostParams,
140
141 pub hash_blake2b256_cost_params: HashBlake2b256CostParams,
143 pub hash_keccak256_cost_params: HashKeccak256CostParams,
144
145 pub poseidon_bn254_cost_params: PoseidonBN254CostParams,
147
148 pub hmac_hmac_sha3_256_cost_params: HmacHmacSha3256CostParams,
150
151 pub group_ops_cost_params: GroupOpsCostParams,
153
154 pub check_zklogin_id_cost_params: CheckZkloginIdCostParams,
156 pub check_zklogin_issuer_cost_params: CheckZkloginIssuerCostParams,
157
158 pub transfer_receive_object_internal_cost_params: TransferReceiveObjectInternalCostParams,
160}
161
162impl NativesCostTable {
163 pub fn from_protocol_config(protocol_config: &ProtocolConfig) -> NativesCostTable {
164 Self {
165 address_from_bytes_cost_params: AddressFromBytesCostParams {
166 address_from_bytes_cost_base: protocol_config.address_from_bytes_cost_base().into(),
167 },
168 address_to_u256_cost_params: AddressToU256CostParams {
169 address_to_u256_cost_base: protocol_config.address_to_u256_cost_base().into(),
170 },
171 address_from_u256_cost_params: AddressFromU256CostParams {
172 address_from_u256_cost_base: protocol_config.address_from_u256_cost_base().into(),
173 },
174
175 dynamic_field_hash_type_and_key_cost_params: DynamicFieldHashTypeAndKeyCostParams {
176 dynamic_field_hash_type_and_key_cost_base: protocol_config
177 .dynamic_field_hash_type_and_key_cost_base()
178 .into(),
179 dynamic_field_hash_type_and_key_type_cost_per_byte: protocol_config
180 .dynamic_field_hash_type_and_key_type_cost_per_byte()
181 .into(),
182 dynamic_field_hash_type_and_key_value_cost_per_byte: protocol_config
183 .dynamic_field_hash_type_and_key_value_cost_per_byte()
184 .into(),
185 dynamic_field_hash_type_and_key_type_tag_cost_per_byte: protocol_config
186 .dynamic_field_hash_type_and_key_type_tag_cost_per_byte()
187 .into(),
188 },
189 dynamic_field_add_child_object_cost_params: DynamicFieldAddChildObjectCostParams {
190 dynamic_field_add_child_object_cost_base: protocol_config
191 .dynamic_field_add_child_object_cost_base()
192 .into(),
193 dynamic_field_add_child_object_type_cost_per_byte: protocol_config
194 .dynamic_field_add_child_object_type_cost_per_byte()
195 .into(),
196 dynamic_field_add_child_object_value_cost_per_byte: protocol_config
197 .dynamic_field_add_child_object_value_cost_per_byte()
198 .into(),
199 dynamic_field_add_child_object_struct_tag_cost_per_byte: protocol_config
200 .dynamic_field_add_child_object_struct_tag_cost_per_byte()
201 .into(),
202 },
203 dynamic_field_borrow_child_object_cost_params:
204 DynamicFieldBorrowChildObjectCostParams {
205 dynamic_field_borrow_child_object_cost_base: protocol_config
206 .dynamic_field_borrow_child_object_cost_base()
207 .into(),
208 dynamic_field_borrow_child_object_child_ref_cost_per_byte: protocol_config
209 .dynamic_field_borrow_child_object_child_ref_cost_per_byte()
210 .into(),
211 dynamic_field_borrow_child_object_type_cost_per_byte: protocol_config
212 .dynamic_field_borrow_child_object_type_cost_per_byte()
213 .into(),
214 },
215 dynamic_field_remove_child_object_cost_params:
216 DynamicFieldRemoveChildObjectCostParams {
217 dynamic_field_remove_child_object_cost_base: protocol_config
218 .dynamic_field_remove_child_object_cost_base()
219 .into(),
220 dynamic_field_remove_child_object_child_cost_per_byte: protocol_config
221 .dynamic_field_remove_child_object_child_cost_per_byte()
222 .into(),
223 dynamic_field_remove_child_object_type_cost_per_byte: protocol_config
224 .dynamic_field_remove_child_object_type_cost_per_byte()
225 .into(),
226 },
227 dynamic_field_has_child_object_cost_params: DynamicFieldHasChildObjectCostParams {
228 dynamic_field_has_child_object_cost_base: protocol_config
229 .dynamic_field_has_child_object_cost_base()
230 .into(),
231 },
232 dynamic_field_has_child_object_with_ty_cost_params:
233 DynamicFieldHasChildObjectWithTyCostParams {
234 dynamic_field_has_child_object_with_ty_cost_base: protocol_config
235 .dynamic_field_has_child_object_with_ty_cost_base()
236 .into(),
237 dynamic_field_has_child_object_with_ty_type_cost_per_byte: protocol_config
238 .dynamic_field_has_child_object_with_ty_type_cost_per_byte()
239 .into(),
240 dynamic_field_has_child_object_with_ty_type_tag_cost_per_byte: protocol_config
241 .dynamic_field_has_child_object_with_ty_type_tag_cost_per_byte()
242 .into(),
243 },
244
245 event_emit_cost_params: EventEmitCostParams {
246 event_emit_value_size_derivation_cost_per_byte: protocol_config
247 .event_emit_value_size_derivation_cost_per_byte()
248 .into(),
249 event_emit_tag_size_derivation_cost_per_byte: protocol_config
250 .event_emit_tag_size_derivation_cost_per_byte()
251 .into(),
252 event_emit_output_cost_per_byte: protocol_config
253 .event_emit_output_cost_per_byte()
254 .into(),
255 event_emit_cost_base: protocol_config.event_emit_cost_base().into(),
256 },
257
258 borrow_uid_cost_params: BorrowUidCostParams {
259 object_borrow_uid_cost_base: protocol_config.object_borrow_uid_cost_base().into(),
260 },
261 delete_impl_cost_params: DeleteImplCostParams {
262 object_delete_impl_cost_base: protocol_config.object_delete_impl_cost_base().into(),
263 },
264 record_new_id_cost_params: RecordNewIdCostParams {
265 object_record_new_uid_cost_base: protocol_config
266 .object_record_new_uid_cost_base()
267 .into(),
268 },
269
270 crypto_invalid_arguments_cost: protocol_config.crypto_invalid_arguments_cost().into(),
272 ed25519_verify_cost_params: Ed25519VerifyCostParams {
274 ed25519_ed25519_verify_cost_base: protocol_config
275 .ed25519_ed25519_verify_cost_base()
276 .into(),
277 ed25519_ed25519_verify_msg_cost_per_byte: protocol_config
278 .ed25519_ed25519_verify_msg_cost_per_byte()
279 .into(),
280 ed25519_ed25519_verify_msg_cost_per_block: protocol_config
281 .ed25519_ed25519_verify_msg_cost_per_block()
282 .into(),
283 },
284 hash_blake2b256_cost_params: HashBlake2b256CostParams {
286 hash_blake2b256_cost_base: protocol_config.hash_blake2b256_cost_base().into(),
287 hash_blake2b256_data_cost_per_byte: protocol_config
288 .hash_blake2b256_data_cost_per_byte()
289 .into(),
290 hash_blake2b256_data_cost_per_block: protocol_config
291 .hash_blake2b256_data_cost_per_block()
292 .into(),
293 },
294 hash_keccak256_cost_params: HashKeccak256CostParams {
295 hash_keccak256_cost_base: protocol_config.hash_keccak256_cost_base().into(),
296 hash_keccak256_data_cost_per_byte: protocol_config
297 .hash_keccak256_data_cost_per_byte()
298 .into(),
299 hash_keccak256_data_cost_per_block: protocol_config
300 .hash_keccak256_data_cost_per_block()
301 .into(),
302 },
303 transfer_transfer_internal_cost_params: TransferInternalCostParams {
304 transfer_transfer_internal_cost_base: protocol_config
305 .transfer_transfer_internal_cost_base()
306 .into(),
307 },
308 transfer_freeze_object_cost_params: TransferFreezeObjectCostParams {
309 transfer_freeze_object_cost_base: protocol_config
310 .transfer_freeze_object_cost_base()
311 .into(),
312 },
313 transfer_share_object_cost_params: TransferShareObjectCostParams {
314 transfer_share_object_cost_base: protocol_config
315 .transfer_share_object_cost_base()
316 .into(),
317 },
318 tx_context_derive_id_cost_params: TxContextDeriveIdCostParams {
319 tx_context_derive_id_cost_base: protocol_config
320 .tx_context_derive_id_cost_base()
321 .into(),
322 },
323 type_is_one_time_witness_cost_params: TypesIsOneTimeWitnessCostParams {
324 types_is_one_time_witness_cost_base: protocol_config
325 .types_is_one_time_witness_cost_base()
326 .into(),
327 types_is_one_time_witness_type_tag_cost_per_byte: protocol_config
328 .types_is_one_time_witness_type_tag_cost_per_byte()
329 .into(),
330 types_is_one_time_witness_type_cost_per_byte: protocol_config
331 .types_is_one_time_witness_type_cost_per_byte()
332 .into(),
333 },
334 validator_validate_metadata_bcs_cost_params: ValidatorValidateMetadataBcsCostParams {
335 validator_validate_metadata_cost_base: protocol_config
336 .validator_validate_metadata_cost_base()
337 .into(),
338 validator_validate_metadata_data_cost_per_byte: protocol_config
339 .validator_validate_metadata_data_cost_per_byte()
340 .into(),
341 },
342 bls12381_bls12381_min_sig_verify_cost_params: Bls12381Bls12381MinSigVerifyCostParams {
343 bls12381_bls12381_min_sig_verify_cost_base: protocol_config
344 .bls12381_bls12381_min_sig_verify_cost_base()
345 .into(),
346 bls12381_bls12381_min_sig_verify_msg_cost_per_byte: protocol_config
347 .bls12381_bls12381_min_sig_verify_msg_cost_per_byte()
348 .into(),
349 bls12381_bls12381_min_sig_verify_msg_cost_per_block: protocol_config
350 .bls12381_bls12381_min_sig_verify_msg_cost_per_block()
351 .into(),
352 },
353 bls12381_bls12381_min_pk_verify_cost_params: Bls12381Bls12381MinPkVerifyCostParams {
354 bls12381_bls12381_min_pk_verify_cost_base: protocol_config
355 .bls12381_bls12381_min_pk_verify_cost_base()
356 .into(),
357 bls12381_bls12381_min_pk_verify_msg_cost_per_byte: protocol_config
358 .bls12381_bls12381_min_pk_verify_msg_cost_per_byte()
359 .into(),
360 bls12381_bls12381_min_pk_verify_msg_cost_per_block: protocol_config
361 .bls12381_bls12381_min_pk_verify_msg_cost_per_block()
362 .into(),
363 },
364 ecdsa_k1_ecrecover_cost_params: EcdsaK1EcrecoverCostParams {
365 ecdsa_k1_ecrecover_keccak256_cost_base: protocol_config
366 .ecdsa_k1_ecrecover_keccak256_cost_base()
367 .into(),
368 ecdsa_k1_ecrecover_keccak256_msg_cost_per_byte: protocol_config
369 .ecdsa_k1_ecrecover_keccak256_msg_cost_per_byte()
370 .into(),
371 ecdsa_k1_ecrecover_keccak256_msg_cost_per_block: protocol_config
372 .ecdsa_k1_ecrecover_keccak256_msg_cost_per_block()
373 .into(),
374 ecdsa_k1_ecrecover_sha256_cost_base: protocol_config
375 .ecdsa_k1_ecrecover_sha256_cost_base()
376 .into(),
377 ecdsa_k1_ecrecover_sha256_msg_cost_per_byte: protocol_config
378 .ecdsa_k1_ecrecover_sha256_msg_cost_per_byte()
379 .into(),
380 ecdsa_k1_ecrecover_sha256_msg_cost_per_block: protocol_config
381 .ecdsa_k1_ecrecover_sha256_msg_cost_per_block()
382 .into(),
383 },
384 ecdsa_k1_decompress_pubkey_cost_params: EcdsaK1DecompressPubkeyCostParams {
385 ecdsa_k1_decompress_pubkey_cost_base: protocol_config
386 .ecdsa_k1_decompress_pubkey_cost_base()
387 .into(),
388 },
389 ecdsa_k1_secp256k1_verify_cost_params: EcdsaK1Secp256k1VerifyCostParams {
390 ecdsa_k1_secp256k1_verify_keccak256_cost_base: protocol_config
391 .ecdsa_k1_secp256k1_verify_keccak256_cost_base()
392 .into(),
393 ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_byte: protocol_config
394 .ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_byte()
395 .into(),
396 ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_block: protocol_config
397 .ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_block()
398 .into(),
399 ecdsa_k1_secp256k1_verify_sha256_cost_base: protocol_config
400 .ecdsa_k1_secp256k1_verify_sha256_cost_base()
401 .into(),
402 ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_byte: protocol_config
403 .ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_byte()
404 .into(),
405 ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_block: protocol_config
406 .ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_block()
407 .into(),
408 },
409 ecdsa_r1_ecrecover_cost_params: EcdsaR1EcrecoverCostParams {
410 ecdsa_r1_ecrecover_keccak256_cost_base: protocol_config
411 .ecdsa_r1_ecrecover_keccak256_cost_base()
412 .into(),
413 ecdsa_r1_ecrecover_keccak256_msg_cost_per_byte: protocol_config
414 .ecdsa_r1_ecrecover_keccak256_msg_cost_per_byte()
415 .into(),
416 ecdsa_r1_ecrecover_keccak256_msg_cost_per_block: protocol_config
417 .ecdsa_r1_ecrecover_keccak256_msg_cost_per_block()
418 .into(),
419 ecdsa_r1_ecrecover_sha256_cost_base: protocol_config
420 .ecdsa_r1_ecrecover_sha256_cost_base()
421 .into(),
422 ecdsa_r1_ecrecover_sha256_msg_cost_per_byte: protocol_config
423 .ecdsa_r1_ecrecover_sha256_msg_cost_per_byte()
424 .into(),
425 ecdsa_r1_ecrecover_sha256_msg_cost_per_block: protocol_config
426 .ecdsa_r1_ecrecover_sha256_msg_cost_per_block()
427 .into(),
428 },
429 ecdsa_r1_secp256_r1_verify_cost_params: EcdsaR1Secp256R1VerifyCostParams {
430 ecdsa_r1_secp256r1_verify_keccak256_cost_base: protocol_config
431 .ecdsa_r1_secp256r1_verify_keccak256_cost_base()
432 .into(),
433 ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_byte: protocol_config
434 .ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_byte()
435 .into(),
436 ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_block: protocol_config
437 .ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_block()
438 .into(),
439 ecdsa_r1_secp256r1_verify_sha256_cost_base: protocol_config
440 .ecdsa_r1_secp256r1_verify_sha256_cost_base()
441 .into(),
442 ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_byte: protocol_config
443 .ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_byte()
444 .into(),
445 ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_block: protocol_config
446 .ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_block()
447 .into(),
448 },
449 ecvrf_ecvrf_verify_cost_params: EcvrfEcvrfVerifyCostParams {
450 ecvrf_ecvrf_verify_cost_base: protocol_config.ecvrf_ecvrf_verify_cost_base().into(),
451 ecvrf_ecvrf_verify_alpha_string_cost_per_byte: protocol_config
452 .ecvrf_ecvrf_verify_alpha_string_cost_per_byte()
453 .into(),
454 ecvrf_ecvrf_verify_alpha_string_cost_per_block: protocol_config
455 .ecvrf_ecvrf_verify_alpha_string_cost_per_block()
456 .into(),
457 },
458 groth16_prepare_verifying_key_cost_params: Groth16PrepareVerifyingKeyCostParams {
459 groth16_prepare_verifying_key_bls12381_cost_base: protocol_config
460 .groth16_prepare_verifying_key_bls12381_cost_base()
461 .into(),
462 groth16_prepare_verifying_key_bn254_cost_base: protocol_config
463 .groth16_prepare_verifying_key_bn254_cost_base()
464 .into(),
465 },
466 groth16_verify_groth16_proof_internal_cost_params:
467 Groth16VerifyGroth16ProofInternalCostParams {
468 groth16_verify_groth16_proof_internal_bls12381_cost_base: protocol_config
469 .groth16_verify_groth16_proof_internal_bls12381_cost_base()
470 .into(),
471 groth16_verify_groth16_proof_internal_bls12381_cost_per_public_input:
472 protocol_config
473 .groth16_verify_groth16_proof_internal_bls12381_cost_per_public_input()
474 .into(),
475 groth16_verify_groth16_proof_internal_bn254_cost_base: protocol_config
476 .groth16_verify_groth16_proof_internal_bn254_cost_base()
477 .into(),
478 groth16_verify_groth16_proof_internal_bn254_cost_per_public_input:
479 protocol_config
480 .groth16_verify_groth16_proof_internal_bn254_cost_per_public_input()
481 .into(),
482 groth16_verify_groth16_proof_internal_public_input_cost_per_byte:
483 protocol_config
484 .groth16_verify_groth16_proof_internal_public_input_cost_per_byte()
485 .into(),
486 },
487 hmac_hmac_sha3_256_cost_params: HmacHmacSha3256CostParams {
488 hmac_hmac_sha3_256_cost_base: protocol_config.hmac_hmac_sha3_256_cost_base().into(),
489 hmac_hmac_sha3_256_input_cost_per_byte: protocol_config
490 .hmac_hmac_sha3_256_input_cost_per_byte()
491 .into(),
492 hmac_hmac_sha3_256_input_cost_per_block: protocol_config
493 .hmac_hmac_sha3_256_input_cost_per_block()
494 .into(),
495 },
496 transfer_receive_object_internal_cost_params: TransferReceiveObjectInternalCostParams {
497 transfer_receive_object_internal_cost_base: protocol_config
498 .transfer_receive_object_cost_base_as_option()
499 .unwrap_or(0)
500 .into(),
501 },
502 check_zklogin_id_cost_params: CheckZkloginIdCostParams {
503 check_zklogin_id_cost_base: protocol_config
504 .check_zklogin_id_cost_base_as_option()
505 .map(Into::into),
506 },
507 check_zklogin_issuer_cost_params: CheckZkloginIssuerCostParams {
508 check_zklogin_issuer_cost_base: protocol_config
509 .check_zklogin_issuer_cost_base_as_option()
510 .map(Into::into),
511 },
512 poseidon_bn254_cost_params: PoseidonBN254CostParams {
513 poseidon_bn254_cost_base: protocol_config
514 .poseidon_bn254_cost_base_as_option()
515 .map(Into::into),
516 poseidon_bn254_data_cost_per_block: protocol_config
517 .poseidon_bn254_cost_per_block_as_option()
518 .map(Into::into),
519 },
520 group_ops_cost_params: GroupOpsCostParams {
521 bls12381_decode_scalar_cost: protocol_config
522 .group_ops_bls12381_decode_scalar_cost_as_option()
523 .map(Into::into),
524 bls12381_decode_g1_cost: protocol_config
525 .group_ops_bls12381_decode_g1_cost_as_option()
526 .map(Into::into),
527 bls12381_decode_g2_cost: protocol_config
528 .group_ops_bls12381_decode_g2_cost_as_option()
529 .map(Into::into),
530 bls12381_decode_gt_cost: protocol_config
531 .group_ops_bls12381_decode_gt_cost_as_option()
532 .map(Into::into),
533 bls12381_scalar_add_cost: protocol_config
534 .group_ops_bls12381_scalar_add_cost_as_option()
535 .map(Into::into),
536 bls12381_g1_add_cost: protocol_config
537 .group_ops_bls12381_g1_add_cost_as_option()
538 .map(Into::into),
539 bls12381_g2_add_cost: protocol_config
540 .group_ops_bls12381_g2_add_cost_as_option()
541 .map(Into::into),
542 bls12381_gt_add_cost: protocol_config
543 .group_ops_bls12381_gt_add_cost_as_option()
544 .map(Into::into),
545 bls12381_scalar_sub_cost: protocol_config
546 .group_ops_bls12381_scalar_sub_cost_as_option()
547 .map(Into::into),
548 bls12381_g1_sub_cost: protocol_config
549 .group_ops_bls12381_g1_sub_cost_as_option()
550 .map(Into::into),
551 bls12381_g2_sub_cost: protocol_config
552 .group_ops_bls12381_g2_sub_cost_as_option()
553 .map(Into::into),
554 bls12381_gt_sub_cost: protocol_config
555 .group_ops_bls12381_gt_sub_cost_as_option()
556 .map(Into::into),
557 bls12381_scalar_mul_cost: protocol_config
558 .group_ops_bls12381_scalar_mul_cost_as_option()
559 .map(Into::into),
560 bls12381_g1_mul_cost: protocol_config
561 .group_ops_bls12381_g1_mul_cost_as_option()
562 .map(Into::into),
563 bls12381_g2_mul_cost: protocol_config
564 .group_ops_bls12381_g2_mul_cost_as_option()
565 .map(Into::into),
566 bls12381_gt_mul_cost: protocol_config
567 .group_ops_bls12381_gt_mul_cost_as_option()
568 .map(Into::into),
569 bls12381_scalar_div_cost: protocol_config
570 .group_ops_bls12381_scalar_div_cost_as_option()
571 .map(Into::into),
572 bls12381_g1_div_cost: protocol_config
573 .group_ops_bls12381_g1_div_cost_as_option()
574 .map(Into::into),
575 bls12381_g2_div_cost: protocol_config
576 .group_ops_bls12381_g2_div_cost_as_option()
577 .map(Into::into),
578 bls12381_gt_div_cost: protocol_config
579 .group_ops_bls12381_gt_div_cost_as_option()
580 .map(Into::into),
581 bls12381_g1_hash_to_base_cost: protocol_config
582 .group_ops_bls12381_g1_hash_to_base_cost_as_option()
583 .map(Into::into),
584 bls12381_g2_hash_to_base_cost: protocol_config
585 .group_ops_bls12381_g2_hash_to_base_cost_as_option()
586 .map(Into::into),
587 bls12381_g1_hash_to_cost_per_byte: protocol_config
588 .group_ops_bls12381_g1_hash_to_cost_per_byte_as_option()
589 .map(Into::into),
590 bls12381_g2_hash_to_cost_per_byte: protocol_config
591 .group_ops_bls12381_g2_hash_to_cost_per_byte_as_option()
592 .map(Into::into),
593 bls12381_g1_msm_base_cost: protocol_config
594 .group_ops_bls12381_g1_msm_base_cost_as_option()
595 .map(Into::into),
596 bls12381_g2_msm_base_cost: protocol_config
597 .group_ops_bls12381_g2_msm_base_cost_as_option()
598 .map(Into::into),
599 bls12381_g1_msm_base_cost_per_input: protocol_config
600 .group_ops_bls12381_g1_msm_base_cost_per_input_as_option()
601 .map(Into::into),
602 bls12381_g2_msm_base_cost_per_input: protocol_config
603 .group_ops_bls12381_g2_msm_base_cost_per_input_as_option()
604 .map(Into::into),
605 bls12381_msm_max_len: protocol_config.group_ops_bls12381_msm_max_len_as_option(),
606 bls12381_pairing_cost: protocol_config
607 .group_ops_bls12381_pairing_cost_as_option()
608 .map(Into::into),
609 },
610 }
611 }
612}
613
614pub fn all_natives(silent: bool) -> NativeFunctionTable {
615 let sui_framework_natives: &[(&str, &str, NativeFunction)] = &[
616 ("address", "from_bytes", make_native!(address::from_bytes)),
617 ("address", "to_u256", make_native!(address::to_u256)),
618 ("address", "from_u256", make_native!(address::from_u256)),
619 ("hash", "blake2b256", make_native!(hash::blake2b256)),
620 (
621 "bls12381",
622 "bls12381_min_sig_verify",
623 make_native!(bls12381::bls12381_min_sig_verify),
624 ),
625 (
626 "bls12381",
627 "bls12381_min_pk_verify",
628 make_native!(bls12381::bls12381_min_pk_verify),
629 ),
630 (
631 "dynamic_field",
632 "hash_type_and_key",
633 make_native!(dynamic_field::hash_type_and_key),
634 ),
635 (
636 "dynamic_field",
637 "add_child_object",
638 make_native!(dynamic_field::add_child_object),
639 ),
640 (
641 "dynamic_field",
642 "borrow_child_object",
643 make_native!(dynamic_field::borrow_child_object),
644 ),
645 (
646 "dynamic_field",
647 "borrow_child_object_mut",
648 make_native!(dynamic_field::borrow_child_object),
649 ),
650 (
651 "dynamic_field",
652 "remove_child_object",
653 make_native!(dynamic_field::remove_child_object),
654 ),
655 (
656 "dynamic_field",
657 "has_child_object",
658 make_native!(dynamic_field::has_child_object),
659 ),
660 (
661 "dynamic_field",
662 "has_child_object_with_ty",
663 make_native!(dynamic_field::has_child_object_with_ty),
664 ),
665 (
666 "ecdsa_k1",
667 "secp256k1_ecrecover",
668 make_native!(ecdsa_k1::ecrecover),
669 ),
670 (
671 "ecdsa_k1",
672 "decompress_pubkey",
673 make_native!(ecdsa_k1::decompress_pubkey),
674 ),
675 (
676 "ecdsa_k1",
677 "secp256k1_verify",
678 make_native!(ecdsa_k1::secp256k1_verify),
679 ),
680 ("ecvrf", "ecvrf_verify", make_native!(ecvrf::ecvrf_verify)),
681 (
682 "ecdsa_r1",
683 "secp256r1_ecrecover",
684 make_native!(ecdsa_r1::ecrecover),
685 ),
686 (
687 "ecdsa_r1",
688 "secp256r1_verify",
689 make_native!(ecdsa_r1::secp256r1_verify),
690 ),
691 (
692 "ed25519",
693 "ed25519_verify",
694 make_native!(ed25519::ed25519_verify),
695 ),
696 ("event", "emit", make_native!(event::emit)),
697 (
698 "groth16",
699 "verify_groth16_proof_internal",
700 make_native!(groth16::verify_groth16_proof_internal),
701 ),
702 (
703 "groth16",
704 "prepare_verifying_key_internal",
705 make_native!(groth16::prepare_verifying_key_internal),
706 ),
707 ("hmac", "hmac_sha3_256", make_native!(hmac::hmac_sha3_256)),
708 ("hash", "keccak256", make_native!(hash::keccak256)),
709 (
710 "group_ops",
711 "internal_validate",
712 make_native!(group_ops::internal_validate),
713 ),
714 (
715 "group_ops",
716 "internal_add",
717 make_native!(group_ops::internal_add),
718 ),
719 (
720 "group_ops",
721 "internal_sub",
722 make_native!(group_ops::internal_sub),
723 ),
724 (
725 "group_ops",
726 "internal_mul",
727 make_native!(group_ops::internal_mul),
728 ),
729 (
730 "group_ops",
731 "internal_div",
732 make_native!(group_ops::internal_div),
733 ),
734 (
735 "group_ops",
736 "internal_hash_to",
737 make_native!(group_ops::internal_hash_to),
738 ),
739 (
740 "group_ops",
741 "internal_multi_scalar_mul",
742 make_native!(group_ops::internal_multi_scalar_mul),
743 ),
744 (
745 "group_ops",
746 "internal_pairing",
747 make_native!(group_ops::internal_pairing),
748 ),
749 ("object", "delete_impl", make_native!(object::delete_impl)),
750 ("object", "borrow_uid", make_native!(object::borrow_uid)),
751 (
752 "object",
753 "record_new_uid",
754 make_native!(object::record_new_uid),
755 ),
756 (
757 "test_scenario",
758 "take_from_address_by_id",
759 make_native!(test_scenario::take_from_address_by_id),
760 ),
761 (
762 "test_scenario",
763 "most_recent_id_for_address",
764 make_native!(test_scenario::most_recent_id_for_address),
765 ),
766 (
767 "test_scenario",
768 "was_taken_from_address",
769 make_native!(test_scenario::was_taken_from_address),
770 ),
771 (
772 "test_scenario",
773 "take_immutable_by_id",
774 make_native!(test_scenario::take_immutable_by_id),
775 ),
776 (
777 "test_scenario",
778 "most_recent_immutable_id",
779 make_native!(test_scenario::most_recent_immutable_id),
780 ),
781 (
782 "test_scenario",
783 "was_taken_immutable",
784 make_native!(test_scenario::was_taken_immutable),
785 ),
786 (
787 "test_scenario",
788 "take_shared_by_id",
789 make_native!(test_scenario::take_shared_by_id),
790 ),
791 (
792 "test_scenario",
793 "most_recent_id_shared",
794 make_native!(test_scenario::most_recent_id_shared),
795 ),
796 (
797 "test_scenario",
798 "was_taken_shared",
799 make_native!(test_scenario::was_taken_shared),
800 ),
801 (
802 "test_scenario",
803 "end_transaction",
804 make_native!(test_scenario::end_transaction),
805 ),
806 (
807 "test_scenario",
808 "ids_for_address",
809 make_native!(test_scenario::ids_for_address),
810 ),
811 (
812 "transfer",
813 "transfer_impl",
814 make_native!(transfer::transfer_internal),
815 ),
816 (
817 "transfer",
818 "freeze_object_impl",
819 make_native!(transfer::freeze_object),
820 ),
821 (
822 "transfer",
823 "share_object_impl",
824 make_native!(transfer::share_object),
825 ),
826 (
827 "transfer",
828 "receive_impl",
829 make_native!(transfer::receive_object_internal),
830 ),
831 (
832 "tx_context",
833 "derive_id",
834 make_native!(tx_context::derive_id),
835 ),
836 (
837 "types",
838 "is_one_time_witness",
839 make_native!(types::is_one_time_witness),
840 ),
841 (
842 "test_utils",
843 "create_one_time_witness",
844 make_native!(test_utils::create_one_time_witness),
845 ),
846 (
847 "zklogin_verified_id",
848 "check_zklogin_id_internal",
849 make_native!(zklogin::check_zklogin_id_internal),
850 ),
851 (
852 "zklogin_verified_issuer",
853 "check_zklogin_issuer_internal",
854 make_native!(zklogin::check_zklogin_issuer_internal),
855 ),
856 (
857 "poseidon",
858 "poseidon_bn254_internal",
859 make_native!(poseidon::poseidon_bn254_internal),
860 ),
861 ];
862 let sui_framework_natives_iter =
863 sui_framework_natives
864 .iter()
865 .cloned()
866 .map(|(module_name, func_name, func)| {
867 (
868 SUI_FRAMEWORK_ADDRESS,
869 Identifier::new(module_name).unwrap(),
870 Identifier::new(func_name).unwrap(),
871 func,
872 )
873 });
874 let sui_system_natives: &[(&str, &str, NativeFunction)] = &[(
875 "validator",
876 "validate_metadata_bcs",
877 make_native!(validator::validate_metadata_bcs),
878 )];
879 sui_system_natives
880 .iter()
881 .cloned()
882 .map(|(module_name, func_name, func)| {
883 (
884 SUI_SYSTEM_ADDRESS,
885 Identifier::new(module_name).unwrap(),
886 Identifier::new(func_name).unwrap(),
887 func,
888 )
889 })
890 .chain(sui_framework_natives_iter)
891 .chain(move_stdlib_natives::all_natives(
892 MOVE_STDLIB_ADDRESS,
893 GasParameters::zeros(),
895 ))
896 .chain(move_stdlib_natives::nursery_natives(
897 silent,
898 MOVE_STDLIB_ADDRESS,
899 NurseryGasParameters::zeros(),
901 ))
902 .collect()
903}
904
905pub fn get_receiver_object_id(object: Value) -> Result<Value, PartialVMError> {
908 get_nested_struct_field(object, &[0])
909}
910
911pub fn get_object_id(object: Value) -> Result<Value, PartialVMError> {
914 get_nested_struct_field(object, &[0, 0, 0])
915}
916
917pub fn get_nested_struct_field(mut v: Value, offsets: &[usize]) -> Result<Value, PartialVMError> {
920 for offset in offsets {
921 v = get_nth_struct_field(v, *offset)?;
922 }
923 Ok(v)
924}
925
926pub fn get_nth_struct_field(v: Value, n: usize) -> Result<Value, PartialVMError> {
927 let mut itr = v.value_as::<Struct>()?.unpack()?;
928 Ok(itr.nth(n).unwrap())
929}
930
931pub(crate) fn get_tag_and_layouts(
933 context: &NativeContext,
934 ty: &Type,
935) -> PartialVMResult<Option<(StructTag, R::MoveTypeLayout, A::MoveTypeLayout)>> {
936 let tag = match context.type_to_type_tag(ty)? {
937 TypeTag::Struct(s) => s,
938 _ => {
939 return Err(
940 PartialVMError::new(StatusCode::UNKNOWN_INVARIANT_VIOLATION_ERROR)
941 .with_message("Sui verifier guarantees this is a struct".to_string()),
942 )
943 }
944 };
945 let Some(layout) = context.type_to_type_layout(ty)? else {
946 return Ok(None);
947 };
948 let Some(annotated_layout) = context.type_to_fully_annotated_layout(ty)? else {
949 return Ok(None);
950 };
951 Ok(Some((*tag, layout, annotated_layout)))
952}
953
954#[macro_export]
955macro_rules! make_native {
956 ($native: expr) => {
957 Arc::new(
958 move |context, ty_args, args| -> PartialVMResult<NativeResult> {
959 $native(context, ty_args, args)
960 },
961 )
962 };
963}
964
965pub(crate) fn legacy_test_cost() -> InternalGas {
966 InternalGas::new(0)
967}