Ethereum Virtual Machine (EVM) 의 3 가지 요소

What is EVM ?

스마트 컨트랙트의 런타임의 환경이다.

특징

  1. completly isolated.

-> So, code running inside the Ev,m has no access to network, filesystem.

[[Smart contracts]] even have limited access to other smart contracts. ??

EVM에서 중요한 3가지가 있다.

Storage , Memory , Stack

 

 

Storage

Every account has a persistent key-value store mapping 256-bit words to 256-bit words called **storage**.

  • 컨트랙트 내에서는 스토리지 전부 열거할 수 없다. read 코스트가 많이 드니까.
  • 사실 쓸 필요도 없음.

 

Memory

스마트 컨트랙트가 실행 중에 임시로 저장하는 공간이다.

contract obtains a freshly cleared instance for each message call.

  • 각 메세지 호출마다 컨트랙트가 새롭게 초기화된 메모리 인스턴스를 얻는다.
  • 일시적으로 사용되고, 메시지 호출이 종료되면 데이터가 사라진다.

읽니는 256비트로 제한된다. 쓰기는 8~256비트까지, 읽기 확장시 가스비용 지불해야한다. 즉 메모리가 커질 수록 가스비가 늘어난다.

 

Stack

EVM 은 register machine 이 아니라 stack machine 이다.
- all Computations are performed on a data area called the stack.

최대 사이즈는 1024 elements and contain words of 256 bits.

 

 

topmost two.

! 모든 연산은 스택에서 최상위 2개 (그이상 가능) 가져와 결과를 스택에 push 하는 방식이다. . memory , storage로 옮길 수 있다.
(만약, 더 아래의 스택에 접근하고 싶으면, 스택의 윗부분을 제거해야만 가능하다. 인덱스 접근방식같은건 없다.)

 

 

Instruction Set

스마트 컨트랙트를 실행하는 데 필요한 기본 명령어들의 집합(set).

합의 문제를 일으키는 부정확한 implementation을 막기 위해서 EVM의 명령 세트가 존재한다.

종류

->산술,비트,논리,비교,조건부점프,무조건 점프,블록 속성

  • 모든 명령은 256비트 word 또는 Memory 조각(또는 bite Array) 에서 작동한다.
  • 조건부 점프와 무조건 점프가 가능하다.
  • 조건에 따라 점프하는 명령어
  • 무조건 점프는 항상 특정 위치로 점프하는 명령어
  • 블록 속성 접근 : 스마트 컨트랙트는 블록의 속성(block number, timestamp)에 접근할 수 있다.

 

정리

Storage 와 memory를 활용하여 스마트컨트랙트의 상태를 관리하고,
Stack을 이용하여 연산을 수행한다. (명령은 Imstruction set )

(Example)
For a complete list, please see the list of opcodes](https://docs.soliditylang.org/en/v0.8.24/yul.html#opcodes))as part of the inline assembly documentation.

 

 

Message Calls

스마트 컨트랙트 간 상호작용을 가능하게 해주는 방법이다. (또는 Ether를 스마트컨트랙트가 아닌 계정으로 전송하는 방법이다.)
Contracts can call other contracts or send Ether to non-contract accounts by the means of message calls.

  • Transaction 하고 비슷하다.
  • data, source , payload, gas .. 가 있음
  • Transaction 하고 뭐가 다른데??
  • 모든 Transaction 은 top-level message call로 구성된다. 이 메세지 호출은 다른 메세지 호출을 생성할 수 있다.

 

Delegate Call

    • 정의
      EVM 에서 사용되는 저수준 함수로써
      다른 스마트 컨트랙트의 코드를 호출하는 기능을 한다.
      호출한 스마트 컨트랙트의 storage 와 message(sender)를 공유한다.
    • 영어 정의
      named delegatecall which is identical to a message call apart from the fact that the code at the target address is executed in the context (i.e. at the address)

호출한 주소의 코드가 해당 주소에서 실행된다.

  • 호출한 스마트 컨트랙트의 저장소와 메세지를 공유한다.
  • 호출한 스마트 컨트랙트의 코드가 호출한 스마트컨트랙트의 저장소와 메세지를 공유한다.
  • 따라서 스마트 컨트랙트의 상태를 변경할 수 있는 것이다.
    다른 주소의 런타임에서 변경이 된다!

호출한 스마트 컨트랙트의 저장소와 메세지를 공유하여 다른 스마트 컨트랙트의 코드를 실행하는 방법이다.

example of delegateCall (추후 업로드)

 

 

Logs

블럭수준까지 맵핑되는 데이터 구조에 데이터 저장할 수 있음.
이 기능을 logs 라고 한다.

 

 

왜 만들어졌나? ->

event 를 구현하기 위해서 [events](https://docs.soliditylang.org/en/v0.8.24/contracts.html#events)..)
event 를 기록하기 위해서
Contracts cannot access log data after it has been created, but they can be efficiently accessed from outside the blockchain.
-> 컨트랙트는 로그 데이터가 생성된 후에는 로그데이터에 접근할 수 없다. 하지만
블록체인 밖에서 접근 가능하다.

  • 로그 데이터의 일부는 블룸필터에 저장되기 때문에 효율적이고 암호학적으로 안전한 방식으로 데이터를 검색할 수 있다. [bloom filters](https://en.wikipedia.org/wiki/Bloom_filter),,)
  • 따라서 전체 블록체인을 다운 받지 않아도 네트워크 피어("light client)도 로그를 찾을 수 있는것이다.
  • 발생한 이벤트는 recipt trie 에 기록된다. ( 로컬로 evm 노드와 함께 저장되는 로그 레코드임)
  • log trie 는 block header 의 receipt root로 기록된다.

 

Create

"Contracts can even create other contracts using a **special opcode**"
' 스마트 컨트랙트가 스마트 컨트랙트를 생성할 수 있다. '

  1. 생성한 스마트 컨트랙트의 코드는 호출한 스마트 컨트랙트의 Storage, sender를 공유한다.
  2. 생성한 스마트 컨트랙트의 코드는 호출한 컨트랙트에서 실행된다.
    실행결과는 코드로 저장된다. --> 새로운 스마트 컨트랙트의 코드가 된다.
  3. 호출자(생성자)에게 새롱누 컨트랙트 주소를 제공한다.
  4. 호출자는 Stack에 새로운 스마트 컨트랙트의 주소를 받는다. (최소한의 정보에 속하는 주소)

일반 메세지 호출과 차이점은 payload data가 실행되고 결과가 코드로 저장되며 호출자/ 생성자가스택에서 새계약의 주소를 수신한다는 것이다 수신한다는 것이다.

 

 

Deactivate and Self-destruct

블록체인에서 코드를 지우는 방법은 컨트랙트가 자기자신을 파괴하는 operation을 수행하는 방법.

The only way to remove code from the blockchain is when a contract at that address performs the `selfdestruct` operation.

selfdestruct(address payable recipient);  

The remaining Ether stored at that address is sent to a designated target and then the storage and code is removed from the state
-> 이렇게 해야만 작은 용량 유지가능

 

문제점.

Removing the contract in theory sounds like a good idea, but it is potentially dangerous, as if someone sends Ether to removed contracts, the Ether is forever lost.
-> 하지만.. 어떤 바보가 삭제된 계정에 보내버리는 순간... 영원히 사라진다.
--> 그래서 사용하길 권하지 않고 있다. [EIP-6049](https://eips.ethereum.org/EIPS/eip-6049)..) 바뀔지 모르는 것이기 때문이다.

Even if a contract is removed by `selfdestruct`, it is still part of the history of the blockchain and probably retained by most Ethereum nodes. So using `selfdestruct` is not the same as deleting data from a hard disk.
-> selfdestruct 를 해도 블록체인에는 기록되어있다. 데이터를 완전히 날려버리는건 아니라는 것이다.

아래는 중국인분이 올려주신 selfdestuct() 활용 코드이다.

pragma solidity ^0.8.0;   
contract MyContract {  

address payable owner; constructor() { owner = payable(msg.sender); }   

function destroy() public {  
 require(msg.sender == owner, "Only the owner can destroy this contract.");  
 selfdestruct(owner);   
 }  
}  

作者:MerkleJqueryRu    
链接:[https://juejin.cn/post/7229877486171635772](https://juejin.cn/post/7229877486171635772)   
来源:稀土掘金    
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。  

gpt나 AI 들이 중국 리소스를 많이 가져와주는 걸로 봐서는 블록체인에 있어서
중국 글들이 신뢰성이 있는것 같다.
[솔리디티 기술력 향상 - MerkleJqueryRu의 칼럼 - Nuggets (juejin.cn)](https://juejin.cn/column/7229178458072678457))

 

 

Precompiled Contracts

1~8까지 주소 범위를 가진 특별한 스마트 컨트랙트이다.
호출가능하다.
하지만 동작(gas 소비량)은 evm의 코드로 정의되지 않는다.(우리가 적을 코드 없음)
-> 대신 EVM 실행 환경 자체에서 구현된다.

Q. 그럼 EVM 달라지면 의존성 어떻게 해결하나?  

precompiled contracts 의 set이 좀 달라질 순 있음. 그래서 PC가 달라질 순 있는데 이게 항상 1에서 0xffff 범위의 주소에 있을 것이라서 크게 상관없음.