ENS(Ethereum Name Service)

2023. 6. 15. 10:10Blockchain/Ethereum

728x90
반응형

※ 원글 작성 : 22년 11월 21일

ENS

ENS(Ethereum Name Service) 란 웹서비스를 위한 DNS처럼 human-readable한 이름(도메인)을 ethereum address와 mapping하여, 이름 검색 시 연결된 ethereum address를 확인해 주는 서비스이다.
.eth 같은 TLD(Top Level Domain)의 하위에 'alice.eth'처럼 하위 도메인을 구성할 수 있고, 이 도메인을 소유한 사람은 'pay.alice.eth'처럼 여러 하위 도메인을 생성/제어 가능하다. 또한 다른 NFT처럼 도메인을 구매하고 OpenSea 등에서 판매도 할 수 있다. ENS는 EIP-137에서도 제안 되어졌다.
요즘같은 대하락 시대의 코인판에서도 ENS는 "나름" 선방하고 있다.

 


ENS의 아키텍처와 특이점에 대해 살펴보려 한다.

ENS Architecture

ens docs

ENS 컨트랙트내에는 크게 Registry와 Registrar, Resolver의 component가 존재한다.
Registry는 모든 도메인 목록을 유지/관리하며 도메인의 owner 주소 저장, 해당 도메인을 관리하는 resolver, 도메인의 모든 record에 대한 caching TTL(Time To Live)를 가지고 있다.
Registrar는 도메인을 할당하며, ENS를 업데이트할 수 있는 유일한 entity이다. ENS registry에 있는 노드의 소유자는 해당 registrar이다.
Resolver는 도메인에 대한 inquiry를 수행한다. Resolver는 ethereum account외에도 contract address나 hash, IP 주소를 반환할 수 있다.

ENS에서의 도메인에 mapping된 metadata를 확인하는 과정은 아래와 같다.

ens docs

일반 사용자의 앱이 'foo.eth'를 ENS Registry에 검색하면, registry는 해당 도메인을 실제적으로 조회 가능한 resolver의 주소를 return해주고, 앱에서 다시 'foo.eth'를 request했을 시 mapping 되어 있는 실제 ethereum account address를 전달하는 구조이다.

Registrar

Registrar는 controller를 사용하여 말 그대로 ENS 상의 name에 관련된 record를 control 할 수 있다. Registrar owner는 controller를 추가 및 제거할 수 있으며, controller를 통해 새 도메인을 등록하고, 기존 도메인의 expire를 연장/갱신할 수 있다. 하지만 소유권을 변경하거나 기존 도메인 expiration을 단축시킬 수는 없다.

alice.eth와 같이 second-level 도메인은 .eth permanent registrar에서 관리된다. Registrar에서 name을 구입하면 ENS에서 owner에게 소유권을 부여하고 registrar는 독립적으로 누가 registration을 소유했는지 추적한다. Registrant(registration의 소유자)의 컨셉은 .eth permanent registrar에서 유일(unique)하다. name을 소유하고 있는 registrantregistration을 다른 account로 이전할 수 있고, ENS 이름의 소유권을 registrant로 재설정하는 reclaim을 호출하여 소유권을 다시 되찾아 올 수 있다. Name 소유(owning a name)와 registration 소유(owning a registration)의 개념을 분리하면 ENS 시스템의 업데이트에 대한 자동화를 더 효율적으로 할 수 있다. Registrant는 name의 소유권을 다른 account나 records, 하위 도메인을 관리하는 smart contract게 전달(transfer)할 수 있으며 upgrade 또는 compromise의 경우 소유권을 복구 할 수 있는 기능을 계속 가질 수 있다.

Controller

Registrar 내의 controller는 name 등록에 대한 제어를 담당한다. 클라이언트는 새로운 name을 등록할 때에 controller에게 commitment에 대한 제출이 필요하ek. 이는 먼저 등록을 신청한 유저에게 우선권을 주기 위함이며 제출된 임의의 commitment를 똑같이 제출이 가능한 클라이언트에게 name 등록 권한을 부여한다. Controller에는 commitment와 관련된 MIN_COMMITMENT_AGE (commitment가 공개되는 최소 기간), MAX_COMMITMENT_AGE (commitment가 유효한 최대 기간)을 관리할 뿐 아니라 MIN_REGSTRATION_DURATION (name의 최소 등록 기간)과 이름의 유효성(valid) 및 가용성(available)을 확인한다. 기존의 특정 도메인에 대해 등록한 기간을 연장하기 위해서도 controller에서 제어한다.

Registry

Registry는 모든 ENS를 조회할 시 query되는 contract이다. Registry는 모든 도메인의 목록을 유지/관리하고, 각 도메인에 대한 owner, resolver 및 TTL을 기록하며, 해당 도메인 소유자가 데이터를 변경 가능하도록 한다. 또한 기존 도메인의 하위 도메인에 대한 생성, 레코드 설정 등을 관리한다.

Name hash

Namehash는 ENS에서 도메인을 관리하기 위한 record 방식을 정의한다. Contract의 리소스 제약으로 인해 ENS는 human readable name이 아닌 256비트 암호화 해시를 사용한다. 예를 들어, 'alice.eth'의 해시는 0x787192fc5378cc32aa956ddfdedbf26b24e8d78e40109add0eea2c1a012c3dec이다. Name hash는 유효한 domain에 대해 고유 hash를 생성하는 recursive 프로세스로서 'alice.eth'의 name hash로 부터 원래 name을 알 필요 없이 'iam.alice.eth'와 같은 모든 하위 도메인의 name hash를 파생할 수 있다. Name hash로 변환되기 전에 name은 먼저 UTS-46을 이용하여 정규화된다. 이를 통해 대문자, 소문자 이름이 동등하게 취급되고 잘못된 문자가 금지된다. 모든 application이 동일한 정규화 및 유효성 검사를 따르는 것이 매우 중요한데, 동일한 이름을 두개의 다른 ENS name으로 해석될 수 있기 떄문이다.

위 예시와 같은 'alice.eth'를 도메인이라 하고, 이 도메인을 구성하며, .으로 나뉘는 alice나 eth 같은 단위를 label이라 한다. 이 label에 적용된 keccak256 hash를 적용한 것을 label hash라 하며, eth의 label hash는 keccak256(‘eth’) = 0x4f5b812789fc606be1b3b16908db13fc7ca72641f84d75b47069d3d7f0이다. Name hash는 아래와 같이 reculsive 된다.

namehash([]) = 0x0000000000000000000000000000000000000000000000000000000000000000
namehash([label, …]) = keccak256(namehash(…), keccak256(label))

이를 python으로 표현하면 아래와 같다.

def namehash(name):
  if name == '':
    return '\0' * 32
  else:
    label, _, remainder = name.partition('.')
    return sha3(namehash(remainder) + sha3(label))

Conclusion

초기 인터넷에서 IP address를 통한 접속 방식은 서버에 대한 IP를 외우는 방식이 너무 불편하였고, DNS라는 개념이 생기고난 후 human readable한 도메인을 통해 유저가 클라이언트를 통해 서버에 접속하는 방식이 매우 편리해졌다. 이와 비슷하게 블록체인의 주소는 외우기 매우 어렵고 연상도 잘 되지 않으며 human error가 종종 발생하여 자산을 잃어버리는 경우도 왕왕 생기고 있다. 블록체인 주소를 기억하기 쉬운 단어와 mapping하여 이를 이용한 자금 전송, 컨트랙트 접근 등이 일반화 된다면 블록체인을 사용하는 일반 유저 입장에서 조금 더 친숙하게 각 블록체인에 다가갈 수 있지 않을까 하는 생각이 든다.

참고
https://docs.ens.domains/
https://eips.ethereum.org/EIPS/eip-137

728x90
반응형

'Blockchain > Ethereum' 카테고리의 다른 글

Ethereum의 PoS 전환을 반기며  (0) 2023.06.15
Ethereum Gas  (0) 2023.06.15
Ethereum Bootnode 기능 확인  (0) 2023.06.14
Ethereum [5] (Go-Ethereum)  (0) 2023.06.13
Ethereum [4] (EVM)  (0) 2023.06.13