A := B
: =
A를 <code> B로
정의하는 데 사용됩니다.BC
B
B_header
S
S_system
S_machine
P_modify_state
T
T_code
T_data
T_value
T_depth
호출
또는 실행
횟수)G
G_rem
G_price
A
A_code_owner
A_tx_sender
A_code_executor
F_apply
CREATE
, CALL
과 CALLCODE
를 위한 비용 지불입니다. 마지막으로, 가스는 메모리 사용이 늘었을 때 부과될 수 있습니다.G
는 트랜잭션에서 발생할 수 있는 연산의 가스값 정보를 가지고 있는 37개 스칼라값을 가진 튜플(tuple)입니다. Precompiled contracts
와 accounts
같은 다른 표에 대해서는 이 문서를 참고하세요.IstanbulEVM
protocol upgrade, or the "hard fork". 이전 문서는 이전 문서를 참고해주세요.IstanbulEVM
protocol upgrade block number is as follows.#75373312
#86816005
G_zero
W_zero
연산을 위해 지불할 금액은 없음G_base
W_base
연산을 위해 지불하는 가스량G_verylow
W_verylow
연산을 위해 지불하는 가스량G_low
W_low
연산을 위해 지불하는 가스량G_mid
W_mid
연산을 위해 지불하는 가스량G_high
W_high
연산을 위해 지불하는 가스량G_blockhash
BLOCKHASH
연산을 위해 지불하는 가스량G_extcode
W_extcode
연산을 위해 지불하는 가스량G_balance
BALANCE
연산을 위해 지불하는 가스량G_sload
SLOAD
연산을 위해 지불하는 가스량G_jumpdest
JUMPDEST
연산을 위해 지불하는 가스량G_sset
SSTORE
연산을 위해 지불하는 가스량G_sreset
SSTORE
연산을 위해 지불하는 가스량R_sclear
R_selfdestruct
G_selfdestruct
SELFDESTRUCT
연산을 위해 지불하는 가스량G_create
CREATE
연산을 위해 지불하는 가스량G_codedeposit
CREATE
연산 시 바이트당 지불되는 가스량입니다.G_call
CALL
연산을 위해 지불하는 가스량G_callvalue
CALL
연산의 일부로 지불되는 가스량W_zero
= {STOP
, RETURN
, REVERT
}W_base
= {ADDRESS
, ORIGIN
, CALLER
, CALLVALUE
, CALLDATASIZE
, CODESIZE
, GASPRICE
, COINBASE
, TIMESTAMP
, NUMBER
, DIFFICULTY
, GASLIMIT
, RETURNDATASIZE
, POP
, PC
, MSIZE
, GAS
, CHAINID
, BASEFEE
}W_verylow
= {ADD
, SUB
, LT
, GT
, SLT
, SGT
, EQ
, ISZERO
, AND
, OR
, XOR
, NOT
, BYTE
, CALLDATALOAD
, MLOAD
, MSTORE
, MSTORE8
, PUSH
, DUP
, SWAP
}W_low
= {MUL
, DIV
, SDIV
, MOD
, SMOD
, SIGNEXTEND
, SELFBALANCE
}W_mid
= {ADDMOD
, MULMOD
, JUMP
}W_high
= {JUMPI
}W_extcode
= {EXTCODESIZE
}C
는 다음과 같이 정의됩니다.C(S_system, S_machine, I) := C_mem(S_machine,i') - C_mem(S_machine, i) +
C_SSTORE(S_system, S_machine)
, if w == SSTORE
G_exp
, if (w == EXP) && (S_machine[1] == 0)
G_exp + G_expbyte x (1 + floor(log_256(S_machine,sp[1])))
,(w == EXP) && (S_machine,sp[1] > 0)
G_verylow + G_copy x ceil(S_machine,sp[2] / 32)
,w == CALLDATACOPY || CODECOPY || RETURNDATACOPY
G_extcode + G_copy x ceil(S_machine,sp[3] / 32)
,w == EXTCODECOPY
G_log + G_logdata x S_machine,sp[1]
,w == LOG0
G_log + G_logdata x S_machine,sp[1] + G_logtopic
,w == LOG1
G_log + G_logdata x S_machine,sp[1] + 2 x G_logtopic
,w == LOG2
G_log + G_logdata x S_machine,sp[1] + 3 x G_logtopic
,w == LOG3
G_log + G_logdata x S_machine,sp[1] + 4 x G_logtopic
,w == LOG4
C_CALL(S_system, S_machine)
,w == CALL || CALLCODE || DELEGATECALL
C_SELFDESTRUCT(S_system, S_machine)
,w == SELFDESTRUCT
G_create
, if w == CREATE
G_sha3 + G_sha3word x ceil(s[1] / 32)
,w == SHA3
G_jumpdest
, if w == JUMPDEST
G_sload
, if w == SLOAD
G_zero
, if w
in W_zero
G_base
, if w
in W_base
G_verylow
, if w
in W_verylow
G_low
, if w
in W_low
G_mid
, if w
in W_mid
G__high</sub>
, if w
in W_high
G_extcode
, if w
in W_extcode
G_balance
, if w == BALANCE
G_blockhash
, if w == BLOCKHASH
w
isT_code[S_machine,pc]
,S_machine,pc < length(T_code)
STOP
, otherwiseC_mem(a) := G_memory x a + floor(a^2 / 512)
C_CALL
, C_SELFDESTRUCT
그리고 C_SSTORE
는 앞으로 설명이 추가될 예정입니다.S_system
, 연산을 위해 남은 가스 G_rem
, 실행 에이전트가 제공하는 정보 I
으로 이루어져 있습니다. I
는 다음과 같이 정의된 튜플입니다.I := (B_header, T_code, T_depth, T_value, T_data, A_tx_sender, A_code_executor, A_code_owner, G_price, P_modify_state)
F_apply
함수를 정의하는데, 이로 결과로 나온 상태 S_system'
, 잔류 가스 G_rem '
, 발생한 하위 상태 A
및 결과적인 출력 O_result
를 계산할 수 있습니다. 현재는 다음과 같이 정의합니다.(S_system', G_rem', A, O_result) = F_apply(S_system, G_rem, I)
A
는 suicides 집합인 Set_suicide
, 로그 시리즈 L
, 접근한 계정의 집합 Set_touched_accounts
, 그리고 환불 G_refund
의 튜플로 정의된다는 것을 기억해야 합니다.A := (Set_suicide, L, Set_touched_accounts, G_refund)
F_apply
는 전체 시스템 상태 S_system
과 머신 상태 S_machine
쌍의 반복적인 진행으로 모델링됩니다. 형태적으로, 우리는 상태 머신에서 하나의 사이클의 결과값을 정의하는 이터레이터 함수 O
와 현재 상태가 예외적으로 중단된 머신 상태인지 확인하는 함수 Z
, 그리고 현재 상태가 정상적으로 중단된 머신 상태일 경우에만 명령어의 출력 데이터를 지정하는 H
를 사용하는 함수 X
를 이용하여 재귀적으로 정의합니다.()
는 빈 Set을 가리키는 Set_empty
와는 다릅니다. 이는 H
의 결과를 해석할 때 중요한데, 실행을 계속해도 된다면 결과가 Set_empty
이고 실행이 중지되어야 한다면 결과가 (아마도 비어 있을)시퀀스이기 때문입니다.F_apply(S_machine, G_rem, I, T) := (S_system', S_machine,g', A, o)
(S_system', S_machine,g', A, ..., o) := X((S_system, S_machine, A^0, I))
S_machine,g := G_rem
S_machine,pc := 0
S_machine,memory := (0, 0, ...)
S_machine,i := 0
S_machine,stack := ()
S_machine,o := ()
X((S_system, S_machine, A, I)) :=
(Set_empty, S_machine, A^0, I, Set_empty)
if Z(S_system, S_machine, I)
(Set_empty, S_machine', A^0, I, o)
if w = REVERT
O(S_system, S_machine, A, I) · o
if o != Set_empty
X(O(S_system, S_machine, A, I))
otherwiseo := H(S_machine, I)
(a, b, c, d) · e := (a, b, c, d, e)
S_machine' := S_machine
exceptS_machine,g' := S_machine,g - C(S_system, S_machine, I)
F_apply
를 계산할 때S_machine,g'
를S_machine'
에서 차감한다는 의미입니다.Z
가 true 즉 현재 상태에 예외가 발생했으며 머신이 반드시 중지되어야 하고 따라서 모든 상태 변화는 무시되는 상황이 될 때까지, 또는 H
가 (Set_empty가 아닌) 시퀀스가 될 때 즉 머신이 통제 가능한 중지 상황에 이를 때까지 X
는 재귀적으로(보통 실제 구현은 단순한 반복 루프 사용) 반복해서 정의됩니다.S_machine
는 튜플 (g, pc, memory, i, stack)
로 정의됩니다. 이는 사용 가능한 가스량, 프로그램 카운터 pc
(64-bit unsigned integer), 메모리 컨텐츠(memory contents,), 현재 메모리에 있는 단어 수(position 0부터 계속 카운팅), 스택 컨텐츠(stack contents)를 의미합니다. 메모리 컨텐츠 S_machine,memory
는 사이즈가 2^256이며 0으로 이루어진 series입니다.ADD
)은 동등한 숫자로 해석되어야 합니다. 전체 명령어과 세부 사항은 명령어 세트(Instruction Set)에 나와 있습니다.Z
, H
와 O
를 정의하기 위해, w
를 실행할 현재 연산으로 정의합니다.w := T_code[S_machine,pc]
if S_machine,pc < len(T_code)
w :=STOP
otherwise