What is EVM ?
스마트 컨트랙트의 런타임의 환경이다.
특징
- 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**"
' 스마트 컨트랙트가 스마트 컨트랙트를 생성할 수 있다. '
- 생성한 스마트 컨트랙트의 코드는 호출한 스마트 컨트랙트의 Storage, sender를 공유한다.
- 생성한 스마트 컨트랙트의 코드는 호출한 컨트랙트에서 실행된다.
실행결과는 코드로 저장된다. --> 새로운 스마트 컨트랙트의 코드가 된다. - 호출자(생성자)에게 새롱누 컨트랙트 주소를 제공한다.
- 호출자는 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 범위의 주소에 있을 것이라서 크게 상관없음.
'BlockChain' 카테고리의 다른 글
BlockChain) NFT의 진짜 의미 (신분 증명, 사물 증명) (5) | 2024.07.24 |
---|---|
[Solidity] solc 컴파일러 의 가스비 절약을 위한 함수 분할 (0) | 2024.03.06 |
이더리움이란? (Ethereum) (0) | 2024.02.18 |
Bitcoin의 매커니즘 (0) | 2024.02.16 |
Bitcoin의 역사 (0) | 2024.02.16 |