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