Status-2025-02-14

학습 데이터를 함수 단위로 나누기

  • 소스 코드는 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 를 제대로 이해하지 못할 수도 있다.


Comments

Leave a Reply

Your email address will not be published. Required fields are marked *