저는 Ethereum이 어떻게 점프와 점프 목적지를 다루는 지에 대한 정보를 찾고있었습니다. 다음과 같이 다양한 블로그와 노란 종이에서 제가 발견 한 것은입니다!Ethereum 바이트 코드 JUMP 및 JUMPDEST가 어떻게 해결 되었습니까?
JUMP
촬영 피연산자와 JUMPI
취한 두 개의 피연산자의 첫 번째하여 PC
로 설정 값 (첫 번째 스택 값을 가정입니다 = JUMPI
의 경우 0).
그러나, (옵 코드로) this 계약의 생성 코드에서보고 처음 몇 옵 코드는/값은 다음과 같습니다
PUSH1 0x60 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0x00f8 JUMPI
내가 이것이 의미하는 알고있는 것처럼 값이 ISZERO
에 의해 스택에 푸시 경우 그! = 0이면 PC
은 0x00f8
으로 변경되며 JUMPI
은 스택에서 2를 취하고 두 번째가 0인지 확인하고 그렇지 않으면 PC
을 첫 번째 피연산자의 값으로 설정합니다.
내가 겪고있는 문제는 0x00f8
은 십진수로 248
입니다. 계약의 248 번째 위치는 JUMPDEST
이 아니며 JUMP*
은 유효한 JUMPDEST
을 가리킬 수 있으므로 계약 실행을 실패하게하는 MSTORE
이 아닌 것으로 보입니다.
아마도 계약이 잘못된 목적지로 점프하지 않을까요?
점프 및 점프 목적지가 어떻게 해결되는지 설명 할 수 있다면 매우 감사하게 생각합니다.