이더리움
이더리움에는 두가지 종류의 account가 존재한다.
- ETH를 저장하는 계좌
- smart contracts를 보관하는 계좌smart contracts를 보관하는 계좌여기에 ETH를 보냄으로서 스마트 컨트랙트를 활성화 시킬 수 있다.
스마트 컨트랙트가 업로드되면, 그 주소에서 계속 존재하며, 사용되길 기다린다.
모든 계좌는 20byte로 구성된다.
이더리움의 message-passing framework에 의하여 서로 상호작용할 수 있는 다양한 계좌들로 구성되어 있다.
각 계좌는 상태가 존재하며 특정 주소와 연결되어 있다.
- externally owned accounts: 개인 키에 의해 관리되며 코드는 없다
- contract accounts: contract code에 의해 관리되며 관련된 코드가 있다. 누군가가 호출하기 전까지는 독자적으로 돌아가지 않는다.
Ethereum accounts
externally owned account는 트랜잭션을 생성하고 private key로 서명함으로써 externally owned accounts와 contract accounts 모두에게 메세지를 보낼 수 있다.
- EOA끼리 주고 받는 메세지는 value transfer이다.
- EOA가 contract account에게 보내는 메세지는 contract account의 code를 실행시키는 것이며 다양한 행동을 하게 한다.
- 또한 참고로 contract account는 다른 contract account에 의하여 작동할 수도 있다.
하지만 어떤 contract account도 그것을 호출한 것을 따라가보면 최상위에서는 EOA가 있다.
Externally-Owned Accounts and Key Pairs
비트코인과 마찬가지로 account는 private key와 public key으로 구성되어 있다.
거래가 sender에 의하여 sign되었다는 것을 증명하기 위하여 사용된다.
Ethereum Accounts
account에는 여러 필드가 있다.
- nonce
- balance
- storageRoot
- codeHash
- world state
nonce
externally owned account에서는 해당 계좌에서 발생한 트랜잭션의 수, 즉 시퀀스 넘버, 각계좌에서 주어진 nonce값으로는 단 한개의 transaction만 실행될 수 있다. 이릍 통하여 replay attack을 막을 수 있다.
예를 들어 현재 논스가 100인데 누군가 78을 다시 뿌리면 이는 채굴자노드들이 현재를 알고 있으므로 무시
contract account에서는 이 account에 의하여 만들어진 contracts의 숫자
balance
이 계좌가 소유하는 wei의 숫자(10^18wei 는 1ether이다)
storageRoot
머클 파트리샤 트리(계좌의 보관중인 contents들을 encode한 것)의 root노드의 해시 값
codeHash
이는 이 계좌의 EVM 코드에 대한 해시 값이다.
즉 contract account에서 코드는 codeHash에 의하여 해쉬되어 보관된다.
그리고 externally owend account에서는 빈문자열을 해쉬하여 보관한다.
worldstate(Ethereum's global state)
account address와 account state(머클 패트리샤 트리에 기록된)사이의 매핑
world state는 모든 계정과 계약의 상태를 포함하고 있으며, 블록이 생성될 때마다 갱신된다. 이 world state는 모든 노드들이 서로 공유한다.
위의 PREVHASH, STATE_ROOT, TIMESTAMP, NUMBER가 하나의 블럭이다.
밑의 NONCE, BALANCE, CODEHASH, STORAGE_ROOT가 하나의 account이다.
이게 머클 패트리샤 트리이다.
다만 이렇게 블럭마다 전체 계좌와 상태를 다시 저장하는 것은 메모리적으로 좋지 않다. 따라서 기존 블럭에서 변화된 것만 반영한다.
위와 같이,Account 175만 바뀌었을 때 이중에 바뀐 거만 갱신하고, 나머지는 이전 블럭의 위치를 가리킨다.
패트리샤 트리
패트리샤 트리는 비슷한 것들을 저장하려고 할 때 유용하다.
즉 루트에 같은 부분을 적고, 자식에는 다른 부분을 적어나간다.
Merkle Patricia Tree(머클 패트리샤 트리)
- shared nibble에는 공통된 것을 적는다.
- branch node에는 다음 한 글자로 구분한다.
- 1, f 는 뒤가 서로 다르므로 key-end에 나머지를 모두 적어준다.
- a77d337과 a77d397은 d3이 같으므로 초록색에 d3을 적어준다.
- 다음 branch노드에는 한글자. 3, 9로 구분하고 나머지는 key end에 적어준다.
- 참고로 여기서 각 노드들은 자신의 해시값을 위에 저장한다.
Account Creation
계좌를 생성할 때 대부분의 라이브러리는 생성한 사람한테 random한 private key를 만들어 준다.
이 private key는 64 개의 hex character로 구성되어 있으며, password에 의하여 암호화될 수 있다.(참고로 ff는 2개의 hex character)
또한 public key는 ECDSA알고리즘에 의하여 private key로 부터 생성할 수 있다.
또한 public address는 public key의 keccak256으로 해쉬한 값에서 마지막 20byte(160bit)를 취해 얻을 수 있다.
contract accounts
contract account 또한 42개char의 hex address를 갖는다.
예를들어 0x11같은 경우는 4char이지만, 여기서 주소는 0x를 제외한 11이므로 2char이며, 1char은 4bit(16진수)이므로 주소는 1byte이다. 즉 42개의 char는 주소가 40char이며, 20byte이므로, 위의 public address와 길이가 동일하다.
이러한 contract account는 contract가 블록체인에 배포될 때 만들어지며, 이 주소는 만든 사람의 주소와 nonce를 활용하여 만들어진다.
'블록체인' 카테고리의 다른 글
[블록체인] 이더리움, smart contract와 탈중앙화 애플리케이션 (1) | 2023.12.17 |
---|---|
[블록체인] 이더리움-트랜잭션(transaction)과 블럭(block) (1) | 2023.12.17 |
[블록체인] 이더리움이란? (1) | 2023.12.17 |
[블록체인] 라이트닝 네트워크와 비트코인 비교 (1) | 2023.12.17 |
[블록체인] 라이트닝 네트워크-pathfinding과 onion routing (0) | 2023.12.17 |