2017-11-27 35 views
1

저는 Ethereum이 어떻게 점프와 점프 목적지를 다루는 지에 대한 정보를 찾고있었습니다. 다음과 같이 다양한 블로그와 노란 종이에서 제가 발견 한 것은입니다!Ethereum 바이트 코드 JUMP 및 JUMPDEST가 어떻게 해결 되었습니까?

JUMP 촬영 피연산자와 JUMPI 취한 두 개의 피연산자의 첫 번째하여 PC로 설정 값 (첫 번째 스택 값을 가정입니다 = JUMPI의 경우 0).

그러나, (옵 코드로) this 계약의 생성 코드에서보고 처음 몇 옵 코드는/값은 다음과 같습니다

PUSH1 0x60 PUSH1 0x40 MSTORE CALLDATASIZE ISZERO PUSH2 0x00f8 JUMPI

내가 이것이 의미하는 알고있는 것처럼 값이 ISZERO에 의해 스택에 푸시 경우 그! = 0이면 PC0x00f8으로 변경되며 JUMPI은 스택에서 2를 취하고 두 번째가 0인지 확인하고 그렇지 않으면 PC을 첫 번째 피연산자의 값으로 설정합니다.

내가 겪고있는 문제는 0x00f8은 십진수로 248입니다. 계약의 248 번째 위치는 JUMPDEST이 아니며 JUMP*은 유효한 JUMPDEST을 가리킬 수 있으므로 계약 실행을 실패하게하는 MSTORE이 아닌 것으로 보입니다.

아마도 계약이 잘못된 목적지로 점프하지 않을까요?

점프 및 점프 목적지가 어떻게 해결되는지 설명 할 수 있다면 매우 감사하게 생각합니다.

답변

0

는 경우는 다른 사람을 도움 :

혼란 단어에 의해 단어를 바이트로 EVM 읽기 바이트에서 일어나 없습니다.

질문의 예에서 0x00f8은 248 번째 바이트가 아니라 248 번째 바이트가됩니다.

각 opcode는 1 바이트 길이이므로 opcode를 읽을 때 PC은 일반적으로 1 씩 증가합니다.

그러나 PUSH 명령어의 경우에는 다음 바이트 중 몇 개를 피연산자로 사용할지에 대한 정보도 포함됩니다.

예를 들어 PUSH2은 그 뒤에 오는 2 바이트를 취하고 PUSH6은 그 다음 6 바이트를 취합니다. 여기서 PCPUSH에 대해 1 씩 증가한 다음 PUSH에서 사용하는 데이터의 각 바이트에 대해 2 또는 6 씩 증가합니다.