학습 데이터를 함수 단위로 나누기
- 소스 코드는 smart contract 단위로 이루어져 있음
- Function 단위로 나누어서 학습시키는 것이 직관적으로 더 유리할 것
- 효과적으로 나눌 방법을 찾기 위해 bytecode 를 분석 중
예시
- increment() 와 decrement() 가 함께 있는 contract 와, 따로 있는 contract 에 대한 bytecode 비교
Source Code
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Counter {
uint public number;
function increment() external {
number += 1;
}
function decrement() external {
number -= 1;
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Counter_inc {
uint public number;
function increment() external {
number += 1;
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Counter_dec {
uint public number;
function decrement() external {
number -= 1;
}
}
EVM assembly (solc)
/* store free memory pointer */
0x0000: PUSH1 0x80 PUSH1 0x40 MSTORE
/* callvalue check */
0x05: CALLVALUE DUP1 ISZERO PUSH2 0xF JUMPI
/* callvalue revert */
0x000C: PUSH0 PUSH0 REVERT
/* calldatasize check */
0x000F: JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x3F JUMPI
/* function selector check, 0x2BAECEB7=decrement, 0x8381F58A=number, 0xD09DE08A=increment */
0x0019: PUSH0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x2BAECEB7 EQ PUSH2 0x43 JUMPI
0x0029: 0xDUP1 PUSH4 0x8381F58A EQ PUSH2 0x4D JUMPI
0x0034: DUP1 PUSH4 0xD09DE08A EQ PUSH2 0x6B JUMPI
/*calldatasize & function selection revert */
0x003F: JUMPDEST PUSH0 PUSH0 REVERT
/* function decrement(...) */
0x0043: JUMPDEST PUSH2 0x4B PUSH2 0x75 JUMP
0x004B: JUMPDEST STOP
/* function number(...) */
0x004D: JUMPDEST PUSH2 0x55 PUSH2 0x8F JUMP
0x0055: JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x62 SWAP2 SWAP1 PUSH2 0xC6 JUMP
0x0062: JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN
/* function increment(...) */
0x006B: JUMPDEST PUSH2 0x73 PUSH2 0x94 JUMP
0x0073: JUMPDEST STOP
/* function decrement(...) */
0x0075: JUMPDEST PUSH1 0x1 PUSH0 PUSH0 DUP3 DUP3 SLOAD PUSH2 0x86 SWAP2 SWAP1 PUSH2 0x10C JUMP
생각해볼 점
- Function boundary 가 명확히 나눠지지 않는 것 같음
- 여러 개의 jump 를 통해 코드 곳곳에 분산되어 표현됨
- ML model 이 이렇게 분산되어있는 function 의 구성요소들을 이해하고 function 을 복원해내는 게 가능할까?
- Function 1개만 포함하는 학습 데이터로 학습시켰을 때, 여러 개의 function 이 포함된 bytecode 를 제대로 이해하지 못할 수도 있다.
Leave a Reply