all: comment eip-2929 implementations

This commit is contained in:
siddharth0a 2024-04-10 10:13:40 +09:00
parent 0f6d38b50f
commit fff6498ed6
5 changed files with 32 additions and 6 deletions

View file

@ -25,12 +25,15 @@ type accessList struct {
slots []map[common.Hash]struct{} slots []map[common.Hash]struct{}
} }
// ContainsAddress는 address가 access list에 있는지 여부를 리턴한다.
// ContainsAddress returns true if the address is in the access list. // ContainsAddress returns true if the address is in the access list.
func (al *accessList) ContainsAddress(address common.Address) bool { func (al *accessList) ContainsAddress(address common.Address) bool {
_, ok := al.addresses[address] _, ok := al.addresses[address]
return ok return ok
} }
// Contains는 slot이 access list에 있는 account에 속해 있는지 확인하고,
// account와 slot각각에 대해 분리된 flag를 리턴한다.
// Contains checks if a slot within an account is present in the access list, returning // Contains checks if a slot within an account is present in the access list, returning
// separate flags for the presence of the account and the slot respectively. // separate flags for the presence of the account and the slot respectively.
func (al *accessList) Contains(address common.Address, slot common.Hash) (addressPresent bool, slotPresent bool) { func (al *accessList) Contains(address common.Address, slot common.Hash) (addressPresent bool, slotPresent bool) {
@ -47,6 +50,7 @@ func (al *accessList) Contains(address common.Address, slot common.Hash) (addres
return true, slotPresent return true, slotPresent
} }
// newAccessList는 새로운 accessList를 생성
// newAccessList creates a new accessList. // newAccessList creates a new accessList.
func newAccessList() *accessList { func newAccessList() *accessList {
return &accessList{ return &accessList{
@ -54,6 +58,7 @@ func newAccessList() *accessList {
} }
} }
// Copy는 accessList의 독립된 copy를 생성한다.
// Copy creates an independent copy of an accessList. // Copy creates an independent copy of an accessList.
func (a *accessList) Copy() *accessList { func (a *accessList) Copy() *accessList {
cp := newAccessList() cp := newAccessList()
@ -71,6 +76,7 @@ func (a *accessList) Copy() *accessList {
return cp return cp
} }
// AddAddress는 access list에 address를 추가하고, 이 연산이 변화를 만들었다면 true를 리턴한다.
// AddAddress adds an address to the access list, and returns 'true' if the operation // AddAddress adds an address to the access list, and returns 'true' if the operation
// caused a change (addr was not previously in the list). // caused a change (addr was not previously in the list).
func (al *accessList) AddAddress(address common.Address) bool { func (al *accessList) AddAddress(address common.Address) bool {
@ -81,6 +87,7 @@ func (al *accessList) AddAddress(address common.Address) bool {
return true return true
} }
// AddSlot은 (addr, slot)을 access list에 추가한다.
// AddSlot adds the specified (addr, slot) combo to the access list. // AddSlot adds the specified (addr, slot) combo to the access list.
// Return values are: // Return values are:
// - address added // - address added
@ -106,6 +113,7 @@ func (al *accessList) AddSlot(address common.Address, slot common.Hash) (addrCha
return false, false return false, false
} }
// DeleteSlot은 (address, slot) tuple을 access list에서 제거한다.
// DeleteSlot removes an (address, slot)-tuple from the access list. // DeleteSlot removes an (address, slot)-tuple from the access list.
// This operation needs to be performed in the same order as the addition happened. // This operation needs to be performed in the same order as the addition happened.
// This method is meant to be used by the journal, which maintains ordering of // This method is meant to be used by the journal, which maintains ordering of
@ -127,6 +135,7 @@ func (al *accessList) DeleteSlot(address common.Address, slot common.Hash) {
} }
} }
// DeleteAddress는 address를 access list에서 삭제한다.
// DeleteAddress removes an address from the access list. This operation // DeleteAddress removes an address from the access list. This operation
// needs to be performed in the same order as the addition happened. // needs to be performed in the same order as the addition happened.
// This method is meant to be used by the journal, which maintains ordering of // This method is meant to be used by the journal, which maintains ordering of

View file

@ -148,6 +148,7 @@ func init() {
} }
} }
// ActivePrecompiles은 config에 따라 precompiles할 주소 목록을 반환한다.
// ActivePrecompiles returns the precompiles enabled with the current configuration. // ActivePrecompiles returns the precompiles enabled with the current configuration.
func ActivePrecompiles(rules params.Rules) []common.Address { func ActivePrecompiles(rules params.Rules) []common.Address {
switch { switch {

View file

@ -102,6 +102,7 @@ type EVM struct {
// Context provides auxiliary blockchain related information // Context provides auxiliary blockchain related information
Context BlockContext Context BlockContext
TxContext TxContext
// StateDB는 state에 대한 access 제공
// StateDB gives access to the underlying state // StateDB gives access to the underlying state
StateDB StateDB StateDB StateDB
// Depth is the current call stack // Depth is the current call stack

View file

@ -96,6 +96,10 @@ func makeGasSStoreFunc(clearingRefund uint64) gasFunc {
} }
} }
// gasLoadEIP2929는 SLOAD의 dynamic gas를 계산한다.
// (address,storage_key) pair가 accessed list에
// 없으면 2100gas(ColdSLoadCostEIP2929)을 청구하고 해당 데이터 해시값을 해당 address의 slot에 저장하고
// 있으면 100gas(WarmStorageReadCostEIP2929)를 청구한다.
// gasSLoadEIP2929 calculates dynamic gas for SLOAD according to EIP-2929 // gasSLoadEIP2929 calculates dynamic gas for SLOAD according to EIP-2929
// For SLOAD, if the (address, storage_key) pair (where address is the address of the contract // For SLOAD, if the (address, storage_key) pair (where address is the address of the contract
// whose storage is being read) is not yet in accessed_storage_keys, // whose storage is being read) is not yet in accessed_storage_keys,
@ -103,6 +107,7 @@ func makeGasSStoreFunc(clearingRefund uint64) gasFunc {
// If the pair is already in accessed_storage_keys, charge 100 gas. // If the pair is already in accessed_storage_keys, charge 100 gas.
func gasSLoadEIP2929(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { func gasSLoadEIP2929(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {
loc := stack.peek() loc := stack.peek()
// slot에 접근 데이터 hash를 저장
slot := common.Hash(loc.Bytes32()) slot := common.Hash(loc.Bytes32())
// Check slot presence in the access list // Check slot presence in the access list
if _, slotPresent := evm.StateDB.SlotInAccessList(contract.Address(), slot); !slotPresent { if _, slotPresent := evm.StateDB.SlotInAccessList(contract.Address(), slot); !slotPresent {
@ -114,6 +119,7 @@ func gasSLoadEIP2929(evm *EVM, contract *Contract, stack *Stack, mem *Memory, me
return params.WarmStorageReadCostEIP2929, nil return params.WarmStorageReadCostEIP2929, nil
} }
// getExtCodeCopyEIP2929는 extcodecopy를 구현한다.
// gasExtCodeCopyEIP2929 implements extcodecopy according to EIP-2929 // gasExtCodeCopyEIP2929 implements extcodecopy according to EIP-2929
// EIP spec: // EIP spec:
// > If the target is not in accessed_addresses, // > If the target is not in accessed_addresses,
@ -139,6 +145,9 @@ func gasExtCodeCopyEIP2929(evm *EVM, contract *Contract, stack *Stack, mem *Memo
return gas, nil return gas, nil
} }
// gasEip2929AccountCheck은 address가 access list에 있는지 확인한다.
// 있으면 0을 리턴하고, 없으면 cold-warm gas(추가비용)를 리턴한다.
// 이더리움 네트워크에서 계정 액세스에 대한 가스 비용을 동적으로 조절
// gasEip2929AccountCheck checks whether the first stack item (as address) is present in the access list. // gasEip2929AccountCheck checks whether the first stack item (as address) is present in the access list.
// If it is, this method returns '0', otherwise 'cold-warm' gas, presuming that the opcode using it // If it is, this method returns '0', otherwise 'cold-warm' gas, presuming that the opcode using it
// is also using 'warm' as constant factor. // is also using 'warm' as constant factor.
@ -158,6 +167,7 @@ func gasEip2929AccountCheck(evm *EVM, contract *Contract, stack *Stack, mem *Mem
return 0, nil return 0, nil
} }
// EIP2929에 따라 계산되는 gas 비용
func makeCallVariantGasCallEIP2929(oldCalculator gasFunc) gasFunc { func makeCallVariantGasCallEIP2929(oldCalculator gasFunc) gasFunc {
return func(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { return func(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {
addr := common.Address(stack.Back(1).Bytes20()) addr := common.Address(stack.Back(1).Bytes20())
@ -225,6 +235,7 @@ var (
gasSStoreEIP3529 = makeGasSStoreFunc(params.SstoreClearsScheduleRefundEIP3529) gasSStoreEIP3529 = makeGasSStoreFunc(params.SstoreClearsScheduleRefundEIP3529)
) )
// makeSelfdestructGasFn은 selfdestruct의 dynamic gas func를 생성한다.
// makeSelfdestructGasFn can create the selfdestruct dynamic gas function for EIP-2929 and EIP-3529 // makeSelfdestructGasFn can create the selfdestruct dynamic gas function for EIP-2929 and EIP-3529
func makeSelfdestructGasFn(refundsEnabled bool) gasFunc { func makeSelfdestructGasFn(refundsEnabled bool) gasFunc {
gasFunc := func(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { gasFunc := func(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) {

View file

@ -120,6 +120,10 @@ const (
ExtcodeCopyBaseFrontier uint64 = 20 ExtcodeCopyBaseFrontier uint64 = 20
ExtcodeCopyBaseEIP150 uint64 = 700 ExtcodeCopyBaseEIP150 uint64 = 700
// CreateBySelfdestructGas는 selfdestruct 연산에서 환불 계정이 존재하지 않을 때 사용되는 가스 비용을 나타낸다.
// selfdestruct는 컨트랙트를 소멸시키고, 해당 컨트랙트의 잔액을 지정된 계정으로 전송한다.
// 이때, 환불계정이 존재하지 않는 경우에는 계정 생성에 따른 추가적인 가스 비용이 발생함
// DoS공격 방지, 일관성유지
// CreateBySelfdestructGas is used when the refunded account is one that does // CreateBySelfdestructGas is used when the refunded account is one that does
// not exist. This logic is similar to call. // not exist. This logic is similar to call.
// Introduced in Tangerine Whistle (Eip 150) // Introduced in Tangerine Whistle (Eip 150)