contract Verifier { function verifyTx( Proof memory proof, uint[1] memory input ) public view returns (bool r) { // 楕円曲線の点の計算 uint256[6] memory p = ...; // ペアリング演算(暗号学的な検証) return pairing( Pairing.negate(proof.A), proof.B, ... ); } } verifier.sol def main( private field[5] hand_cards, private field[5] mana_zone, field required_mana_cost ) -> field { // 1. 手札にカードがあるかチェック field card_in_hand = 0; for u32 i in 0..5 { field is_match = if hand_cards[i] == 30 { 1 } else { 0 }; card_in_hand = card_in_hand + is_match; } assert(card_in_hand == 1); // 2. マナが足りるかチェック field mana_count = 0; for u32 i in 0..5 { field has_card = if mana_zone[i] > 0 { 1 } else { 0 }; mana_count = mana_count + has_card; } assert(mana_count >= required_mana_cost); return 1; } mana_check.zok WHAT IS ZOKRATES? Gaming & ZoKrates