Line data Source code
1 : #include "fd_zk_elgamal_proof_program.h" 2 : #include "zksdk/fd_zksdk.h" 3 : #include "../fd_executor.h" 4 : #include "../fd_runtime.h" 5 : #include "../fd_bank.h" 6 : #include "../../log_collector/fd_log_collector.h" 7 : 8 : /* 9 : * ZK ElGamal Proof Program 10 : */ 11 : 12 : int 13 3 : fd_executor_zk_elgamal_proof_program_execute( fd_exec_instr_ctx_t * ctx ) { 14 : /* Feature-gate program activation */ 15 3 : if( FD_UNLIKELY( !FD_FEATURE_ACTIVE_BANK( ctx->bank, zk_elgamal_proof_program_enabled ) ) ) { 16 0 : return FD_EXECUTOR_INSTR_ERR_UNSUPPORTED_PROGRAM_ID; 17 0 : } 18 : 19 : /* https://github.com/anza-xyz/agave/blob/v2.2.16/programs/zk-elgamal-proof/src/lib.rs#L175-L187 */ 20 3 : if( FD_LIKELY( FD_FEATURE_ACTIVE_BANK( ctx->bank, disable_zk_elgamal_proof_program ) 21 3 : && !FD_FEATURE_ACTIVE_BANK( ctx->bank, reenable_zk_elgamal_proof_program ) ) ) { 22 0 : fd_log_collector_msg_literal( ctx, "zk-elgamal-proof program is temporarily disabled" ); 23 0 : return FD_EXECUTOR_INSTR_ERR_INVALID_INSTR_DATA; 24 0 : } 25 : 26 3 : uchar const * instr_data = ctx->instr->data; 27 3 : ulong instr_data_sz = ctx->instr->data_sz; 28 : 29 : /* https://github.com/anza-xyz/agave/blob/v2.0.1/programs/zk-elgamal-proof/src/lib.rs#L172-L176 */ 30 3 : if( FD_UNLIKELY( instr_data_sz==0UL ) ) { 31 0 : return FD_EXECUTOR_INSTR_ERR_INVALID_INSTR_DATA; 32 0 : } 33 : 34 3 : switch( instr_data[0] ) { 35 0 : case FD_ZKSDK_INSTR_CLOSE_CONTEXT_STATE: 36 : /* https://github.com/anza-xyz/agave/blob/v2.0.1/programs/zk-elgamal-proof/src/lib.rs#L179-L185 */ 37 0 : FD_EXEC_CU_UPDATE( ctx, FD_ZKSDK_INSTR_CLOSE_CONTEXT_STATE_COMPUTE_UNITS ); 38 0 : fd_log_collector_msg_literal( ctx, "CloseContextState" ); 39 0 : return fd_zksdk_process_close_context_state( ctx ); 40 : 41 0 : case FD_ZKSDK_INSTR_VERIFY_ZERO_CIPHERTEXT: 42 0 : FD_EXEC_CU_UPDATE( ctx, FD_ZKSDK_INSTR_VERIFY_ZERO_CIPHERTEXT_COMPUTE_UNITS ); 43 0 : fd_log_collector_msg_literal( ctx, "VerifyZeroCiphertext" ); 44 0 : break; 45 : 46 0 : case FD_ZKSDK_INSTR_VERIFY_CIPHERTEXT_CIPHERTEXT_EQUALITY: 47 0 : FD_EXEC_CU_UPDATE( ctx, FD_ZKSDK_INSTR_VERIFY_CIPHERTEXT_CIPHERTEXT_EQUALITY_COMPUTE_UNITS ); 48 0 : fd_log_collector_msg_literal( ctx, "VerifyCiphertextCiphertextEquality" ); 49 0 : break; 50 : 51 0 : case FD_ZKSDK_INSTR_VERIFY_CIPHERTEXT_COMMITMENT_EQUALITY: 52 0 : FD_EXEC_CU_UPDATE( ctx, FD_ZKSDK_INSTR_VERIFY_CIPHERTEXT_COMMITMENT_EQUALITY_COMPUTE_UNITS ); 53 0 : fd_log_collector_msg_literal( ctx, "VerifyCiphertextCommitmentEquality" ); 54 0 : break; 55 : 56 3 : case FD_ZKSDK_INSTR_VERIFY_PUBKEY_VALIDITY: 57 3 : FD_EXEC_CU_UPDATE( ctx, FD_ZKSDK_INSTR_VERIFY_PUBKEY_VALIDITY_COMPUTE_UNITS ); 58 3 : fd_log_collector_msg_literal( ctx, "VerifyPubkeyValidity" ); 59 3 : break; 60 : 61 0 : case FD_ZKSDK_INSTR_VERIFY_PERCENTAGE_WITH_CAP: 62 0 : FD_EXEC_CU_UPDATE( ctx, FD_ZKSDK_INSTR_VERIFY_PERCENTAGE_WITH_CAP_COMPUTE_UNITS ); 63 0 : fd_log_collector_msg_literal( ctx, "VerifyPercentageWithCap" ); 64 0 : break; 65 : 66 0 : case FD_ZKSDK_INSTR_VERIFY_BATCHED_RANGE_PROOF_U64: 67 0 : FD_EXEC_CU_UPDATE( ctx, FD_ZKSDK_INSTR_VERIFY_BATCHED_RANGE_PROOF_U64_COMPUTE_UNITS ); 68 0 : fd_log_collector_msg_literal( ctx, "VerifyBatchedRangeProofU64" ); 69 0 : break; 70 : 71 0 : case FD_ZKSDK_INSTR_VERIFY_BATCHED_RANGE_PROOF_U128: 72 0 : FD_EXEC_CU_UPDATE( ctx, FD_ZKSDK_INSTR_VERIFY_BATCHED_RANGE_PROOF_U128_COMPUTE_UNITS ); 73 0 : fd_log_collector_msg_literal( ctx, "VerifyBatchedRangeProofU128" ); 74 0 : break; 75 : 76 0 : case FD_ZKSDK_INSTR_VERIFY_BATCHED_RANGE_PROOF_U256: 77 0 : FD_EXEC_CU_UPDATE( ctx, FD_ZKSDK_INSTR_VERIFY_BATCHED_RANGE_PROOF_U256_COMPUTE_UNITS ); 78 0 : fd_log_collector_msg_literal( ctx, "VerifyBatchedRangeProofU256" ); 79 0 : break; 80 : 81 0 : case FD_ZKSDK_INSTR_VERIFY_GROUPED_CIPHERTEXT_2_HANDLES_VALIDITY: 82 0 : FD_EXEC_CU_UPDATE( ctx, FD_ZKSDK_INSTR_VERIFY_GROUPED_CIPHERTEXT_2_HANDLES_VALIDITY_COMPUTE_UNITS ); 83 0 : fd_log_collector_msg_literal( ctx, "VerifyGroupedCiphertext2HandlesValidity" ); 84 0 : break; 85 : 86 0 : case FD_ZKSDK_INSTR_VERIFY_BATCHED_GROUPED_CIPHERTEXT_2_HANDLES_VALIDITY: 87 0 : FD_EXEC_CU_UPDATE( ctx, FD_ZKSDK_INSTR_VERIFY_BATCHED_GROUPED_CIPHERTEXT_2_HANDLES_VALIDITY_COMPUTE_UNITS ); 88 0 : fd_log_collector_msg_literal( ctx, "VerifyBatchedGroupedCiphertext2HandlesValidity" ); 89 0 : break; 90 : 91 0 : case FD_ZKSDK_INSTR_VERIFY_GROUPED_CIPHERTEXT_3_HANDLES_VALIDITY: 92 0 : FD_EXEC_CU_UPDATE( ctx, FD_ZKSDK_INSTR_VERIFY_GROUPED_CIPHERTEXT_3_HANDLES_VALIDITY_COMPUTE_UNITS ); 93 0 : fd_log_collector_msg_literal( ctx, "VerifyGroupedCiphertext3HandlesValidity" ); 94 0 : break; 95 : 96 0 : case FD_ZKSDK_INSTR_VERIFY_BATCHED_GROUPED_CIPHERTEXT_3_HANDLES_VALIDITY: 97 0 : FD_EXEC_CU_UPDATE( ctx, FD_ZKSDK_INSTR_VERIFY_BATCHED_GROUPED_CIPHERTEXT_3_HANDLES_VALIDITY_COMPUTE_UNITS ); 98 0 : fd_log_collector_msg_literal( ctx, "VerifyBatchedGroupedCiphertext3HandlesValidity" ); 99 0 : break; 100 : 101 0 : default: 102 0 : return FD_EXECUTOR_INSTR_ERR_INVALID_INSTR_DATA; 103 3 : } 104 : 105 3 : return fd_zksdk_process_verify_proof( ctx ); 106 3 : }