# オペレーターノードのproof生成に関するテスト設計 ###### tags: `テスト設計` ## zkEVMのState Proofの回路のテスト - State読み出しのオペコードが正しく処理できる - State書き込みのオペコードが正しく処理できる ```javascript= describe("zkEVM(state)", () => { // 初期状態のメモリに対して、SLOADしてもエラーを起こさない。 it("should read by SLOAD in init", () => {}); // 初期状態のメモリに対して、SSTOREすると書き込める。 it("should write by SSTORE in init", () => {}); // データがある状態のメモリに対して、SLOADするとデータが読み取れる it("should read by SLOAD in having data", () => {}); // データがある状態のメモリに対して、SSTOREするとデータがアップデートされる it("should update by SSTORE in having data", () => {}); }); ``` ## zkEVMのExecutionの回路のテスト - EVMに実装されているオペコード各種ごとにテストケースを追加し、それぞれが正しく処理できる - EVMに実装されていないオペコードが入力された場合はエラーを返す ```javascript= describe("zkEVM Execution Proof", () => { // 参考 // https://github.com/crytic/evm-opcodes describe("STOP", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("ADD", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("MUL", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SUB", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("DIV", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SDIV", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("MOD", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SMOD", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("ADDMOD", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("MULMOD", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("EXP", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SIGNEXTEND", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("LT", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("GT", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SLT", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SGT", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("EQ", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("ISZERO", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("AND", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("OR", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("XOR", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("NOT", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("BYTE", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SHL", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SHR", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("KECCAK256", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("ADDRESS", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("BALANCE", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("ORIGIN", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("CALLER", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("CALLVALUE", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("CALLDATALOAD ", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("CALLDATASIZE", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("CALLDATACOPY", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("CODESIZE", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("CODECOPY", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("GASPRICE", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("EXTCODESIZE", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("EXTCODECOPY", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("RETURNDATASIZE", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("RETURNDATACOPY", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("EXTCODEHASH", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("BLOCKHASH", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("COINBASE", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("TIMESTAMP", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("NUMBER", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("DIFFICULTY", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("GASLIMIT", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("CHAINID", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("BASEFEE", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("POP", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("MLOAD", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("MSTORE", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("MSTORE8", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SLOAD", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SSTORE", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("JUMP", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("JUMPI", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("GETPC", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("MSIZE", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("GAS", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("JUMPDEST", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH1", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH2", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH3", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH4", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH5", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH6", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH7", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH8", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH9", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH10", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH11", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH12", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH13", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH14", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH15", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH16", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH17", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH18", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH19", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH20", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH21", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH22", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH23", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH24", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH25", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH26", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH27", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH28", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH29", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH30", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH31", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("PUSH32", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("DUP1", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("DUP2", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("DUP3", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("DUP4", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("DUP5", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("DUP6", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("DUP7", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("DUP8", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("DUP9", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("DUP10", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("DUP11", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("DUP12", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("DUP13", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("DUP14", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("DUP15", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("DUP16", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SWAP1", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SWAP2", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SWAP3", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SWAP4", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SWAP5", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SWAP6", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SWAP7", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SWAP8", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SWAP9", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SWAP10", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SWAP11", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SWAP12", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SWAP13", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SWAP14", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SWAP15", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SWAP16", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("LOG1", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("LOG2", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("LOG3", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("LOG4", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("CREATE", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("CALL", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("CALLCODE", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("RETURN", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("DELEGATECALL", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("CREATE2", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("STATICCALL", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("REVERT", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("INVALID", () => { it("should success", () => {}) it("should faild", () => {}) }) describe("SELFDESTRUCT", () => { it("should success", () => {}) it("should faild", () => {}) }) }) ``` ## zkEVMのStateとExecutionの回路をRecursiveで圧縮する回路 - txの数 == State Proofの数 == Execution Proofの数になっていなかった場合にProveが通らない - 全部同じ数でそれぞれが対応するProofだった場合にProveできる ```javascript= describe("zkEVM Recursive", () => { // txの数 == State Proofの数 == Execution Proofの数になっていなかった場合にProveが通らない it("should be equal txs.length == StateProofs.length == ExecutionProofs.length", () => {}); // 全部同じ数でそれぞれが対応するProofだった場合にProveできる it("should prove same length proof", () => {}); // proofの順番を入れ替えるとProveできない it("shold not prove changing proof order", () => {}); }); ```