Tech Talk: Ethereum Naming Service (ENS)

1. ENS가 무엇일까?


ENS를 이해하기 위해서는 먼저 DNS의 개념에 대해 알아야 합니다.

사람이 읽을 수 있는 도메인 이름을 웹 서버의 IP 주소로 바꿔주는 시스템을 DNS(Domain Name System)라고 합니다. 웹의 초기에는 사이트에 접속하기 위해서 주소창에 도메인이 아닌 IP를 입력해야 했습니다. 사용자들은 각 사이트마다 IP 주소를 외우거나 메모를 해놓아야 했기에 불편함이 많았으나, DNS가 도입된 이후 인터넷을 보다 편리하게 사용할 수 있게 되었습니다. 예를 들면, 예전에 구글에 접속하기 위해서는 142.250.199.110를 주소창에 입력해서 접속을 해야했지만, DNS가 도입된 현재는 IP 대신에 google.com 라는 도메인 이름을 입력하여 접속하고 있습니다.

이와 마찬가지로 ENS는 Ethereum Name Service의 약자로 이더리움 네트워크에 DNS를 발행하는 서비스입니다. 예를 들어 “luniverse.eth”라는 도메인 이름은 “0x1234567890abcdef”와 같은 이더리움 주소로 변환됩니다. 이를 통해서 사용자는 길고 어려운 이더리움 주소 대신에 ENS 도메인 이름을 입력하여 암호화폐를 보다 쉽게 주고 받을 수 있게 되었습니다.

또한 2021년 이더리움 네트워크 뿐만 아니라 1300개가 넘는 최상위 도메인 이름(.com, .org, .io 등)이 있는 사이트가 ENS와 통합되도록 허용되면서 사용처가 더욱 확대되었습니다.

2. ENS의 특징


 

2-1. 단순화

먼저 복잡한 42자리의 주소를 적어서 암호화폐를 전송하는 것 보다 간단한 방식인 ENS를 사용하면 송금 실수가 줄어들어 안전한 거래가 가능합니다.

사용자는 길고 복잡한 이더리움 주소를 공유하는 대신 단순하고 사람이 읽을 수 있는 도메인 이름을 공유할 수 있습니다. 이렇게 하면 사용자가 암호화 통화를 보내고 받고 분산 응용 프로그램(dApps)과 상호 작용할 수 있습니다.

2-2. 안전함

도메인 이름에 이더리움 주소와 연결하는 분산된 변조 방지 방법을 제공하여 피싱 및 기타 악의적인 활동으로부터 사용자를 보호할 수 있습니다.

사용자가 월렛 또는 브라우저에 도메인 이름을 입력하면 ENS Smart Contract는 도메인 이름이 올바른 Ethereum 주소와 연결되어 있는지 확인을 하게 됩니다. 이 과정 덕분에 사용자가 피싱 웹 사이트에 연결되는 것을 방지할 수 있습니다.

또한, 유명인이나 기업 등이 자신이 원하는 이름으로 도메인을 등록한다면 홍보 효과도 있을 뿐만 아니라, 공식 지갑으로 사용할 수 있습니다.

하지만 먼저 취득한 사람이 도메인의 주인이 되기 때문에, 악용될 수 있으므로 이 점은 주의해야 합니다.

https://twitter.com/VitalikButerin

2-3. 정기적인 갱신 필요

일반적으로 도메인 등록 비용은 주소의 길이에 따라 달라집니다. 현재 공식 홈페이지에서 안내하고 있는 비용은 다음과 같습니다.

  • 5+ character .eth names : $5 in ETH per year.
  • 4 character .eth names : $160 in ETH per year.
  • 3 character .eth names : $640 in ETH per year.

기간이 만료된 후에는 다시 등록할 수 있는 90일간의 유예기간이 주어지며, 이 기간동안에는 레코드 수정이 불가능합니다.

2-4. NFT 기능 (ERC-721 표준)

ENS 도메인을 구입한다면 해당 도메인 이름을 NFT로 소유를 하게 됩니다. 즉, Domain Registrant는 ’~.eth’를 소유한 계정(Owner)이고, 2차 판매로 소유권을 다른 계정에게 넘길 수 있습니다. 또한 NFT 타입으로 생성된 도메인 이름은 IPFS(InterPlanetary File System)에 저장할 수 있습니다.

2-5. 계층적 시스템

DNS와 마찬가지로 ENS 도메인 소유자는 하위 도메인을 제어할 수 있습니다. luniverse.eth라는 도메인은 one.luniverse.eth, two.luniverse.eth 등 하위 도메인을 만들 수 있습니다.

2-6. 대소문자 구분이 없다.

도메인 이름으로 대소문자 모두 사용할 수 있지만, 소문자로 변경을 한 후 해시화가 진행되기 때문에 동일한 namehash를 생성합니다. 예를 들어, namehash(”LUNIVERSE.eth”)와 namehash(”luniverse.eth”)의 값은 동일합니다.

3. ENS의 구조


 

ENS는 크게 세 가지의 요소로 구성되어 있습니다.

  • Registry
  • Resolvers
  • Registrars

각각의 요소에 대해서 하나씩 살펴보겠습니다.

https://docs.ens.domains/

3-1. Registry

ENS Registry는 모든 도메인과 서브 도메인을 관리하는 컨트랙트로, 각 도메인에 대한 중요 정보를 저장하고 있습니다. 각 도메인에 대한 주요 정보를 가진 구조체를 Record라 하며, 아래 코드와 같이 owner, resolver, 그리고 ttl(time-to-live)를 담고 있습니다.

  • owner: 도메인의 소유자(registrar) 주소
  • resolver: 도메인의 Resolver 컨트랙트 주소
  • ttl(time-to-live): 도메인에 대한 모든 Record의 캐싱

이처럼 각 도메인은 Record형식의 정보와 매핑되어 저장되는데, 이때의 도메인은 namehash 과정을 거친 값을 입력합니다. namehash에 대한 자세한 내용은 4장에서 더 자세히 다루겠습니다.

각 도메인의 소유자는 해당 도메인에 대한 정보를 변경할 수 있는 권한을 가집니다. 그 중 setSubnodeOwner 함수를 통해 자식 도메인(서브 도메인)을 생성할 수 있으며, 해당 서브 도메인에 대한 소유자를 설정할 수 있습니다. 이때 서브 도메인의 소유자는 부모 도메인의 소유자와 동일하지 않아도 됩니다. 만약 도메인이 이미 존재한다면, 소유권은 재할당 되지만 Resolver 주소와 TTL은 변경되지 않습니다.

ENS Registry는 EIP-137에 정의되어 있으며, 자세한 사항은 링크를 참고하시기 바랍니다.

 

3-2. Resolver

Resolver는 도메인에 매핑된 리소스를 조회합니다. 조회 결과로 반환되는 리소스는 Resolver가 지원하는 인터페이스에 따라 contract address, content hash, 또는 IP address가 될 수도 있습니다.

Resolver는 어떤 리소스를 제공하는가에 따라 다양한 버전의 Resolver가 존재합니다. 여기서는 범용적으로 사용되는 Public Resolver를 살펴보겠습니다. Public Resolver는 아래 표와 같이 다양한 EIP에 의해 정의되어 있습니다.

다양한 Resolver가 존재하기 때문에, 메서드를 호출하기 전에 Resolver가 사용하려는 인터페이스가 지원 되는지 확인할 필요가 있습니다. 이때 사용하는 것이 supportsInterface 함수 입니다.

supportsInterface 함수는 ERC-165에 정의되어 있으며, interface ID를 입력하여 지원 여부에 따라 true 혹은 false를 반환합니다. 여기서 Interface ID는 인터페이스에 포함된 함수의 4바이트 함수 식별자를 배타적 논리합(exclusive-or)으로 계산한 값입니다. 예를 들어, addr(bytes32)의 interface ID는 0x3b3b57de 입니다. Public Resolver는 해당 함수를 지원하기 때문에, supportsInterface(0x3b3b57de)를 호출한다면 true를 반환하게 됩니다. 또한, supportsInterface의 interface ID는 0x01ffc9a7이기 때문에, ERC-165를 지원하는 모든 컨트랙트의 supportsInterface(0x01ffc9a7)은 true를 반환합니다.

 

3-3. Registrar

Registrar는 도메인을 사용자에게 배정하는 역할을 하며, ENS를 수정할 수 있는 유일한 요소입니다. 도메인에 대한 namehash를 node라 하며, node에 대한 소유자를 Registrar라 부릅니다. Registrar는 컨트랙트가 될 수도, 혹은 EOA(Externally Owned Account)가 될수도 있지만, 서브 도메인이 존재한다면 최상위 도메인에 대한 Registrar는 컨트랙트여야 합니다.

Registrar는 도메인을 소유하고 서브 도메인 할당에 대한 규칙이 있는 컨트랙트이며, 이 규칙은 사용자가 직접 설정할 수 있습니다. 만약 먼저 등록한 사람에게 소유권을 주는 규칙(FIFS, First In Frist Served)을 가진 간단한 컨트랙트를 작성한다면 아래 코드와 같습니다.

이처럼 규칙을 작성하는 것은 전적으로 사용자에게 달려있습니다.

 

4. 동작 방식


 

4-1. Namehash

ENS를 사용하기 전에 도메인 이름을 해시화하는 과정을 진행해야 합니다. 이 과정에서 사용되는 것이 namehash 알고리즘입니다. 이 알고리즘은 도메인 이름을 구성하는 요소들을 반복적으로 해시화하는 과정이며, 최종적으로 node라고 불리는 해시값을 출력합니다.

예를 들어, “luniverse.eth”에 namehash 과정을 진행한다면 아래와 같이 진행이 됩니다.

각 과정의 해시값을 확인해보면 아래와 같습니다.

namehash('') = 0x0000000000000000000000000000000000000000000000000000000000000000
namehash('eth') = 0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae
namehash('luniverse.eth') = 0x8e0af5c371f0b0705d67f189029150cc70189e4746dad8ca2d1d48a9eb8e2e40

그렇다면 왜 ENS에 도메인 이름을 직접 기록하지 않을까요? namehash를 사용하면 아래와 같은 이점을 얻을 수 있기 때문입니다.

    1. 일관성: namehash는 도메인 이름을 고유 해시 값으로 변환하는 일관되고 표준화된 방법을 제공하며, 이는 ENS가 제대로 작동하는 데 필요합니다.
    2. 확장성: namehash는 확장성이 뛰어나도록 설계돼 있어 많은 수의 도메인 이름 등록과 해결을 문제 없이 처리할 수 있다.
    3. 효율성: namehash를 사용함으로써 시스템 속도를 저하시킬 수 있는 look-up 및 기타 프로세스의 필요성을 줄여주기 때문에 ENS가 더 효율적이고 더 적은 리소스로 작업할 수 있습니다.

4-2. ENS Process

https://docs.ens.domains/

ENS를 통해 리소스를 불러오려면 다음 과정이 필요합니다.

    1. Registry에 호출하기 전, 도메인 이름에 대한 namehash를 진행합니다.
    2. 1번 과정의 결과를 Registry에 요청하여 Resolver의 주소를 얻습니다.
    3. 2번 과정으로 얻은 Resolver에서 원하는 리소스를 출력하는 메소드를 호출합니다.

예를 들어, luniverse.eth에 저장된 content hash를 불러오는 과정을 수행한다고 가정하겠습니다.

먼저 luniverse.eth의 namehash 과정을 진행 합니다.

Registry로부터 Resolver 주소를 반환 받습니다.

그리고 해당 Resolver로 content hash를 요청합니다.

5. 결론


 

Web2에서 처음 DNS가 등장한 이후 시간이 지남에 따라 현재는 모두가 사용하게 되는 서비스가 되었습니다. 이와 마찬가지로 최근 Web 3.0가 가시화되면서 ENS에 등록된 도메인 이름 수가 빠르게 늘어나고 있습니다. Web3 시장에 접근하려는 기업들의 관심이 늘고있는 점도 한 몫하고 있습니다.

하지만 이더리움 네트워크에서는 가스비에 대한 부담 때문에 ENS를 활용하기 어려울 수 있습니다. 따라서 ENS를 Private 네트워크에 배포한다면 가스비 없이 다양한 테스트를 진행할 수 있습니다. 루니버스를 이용하여 손쉽게 자신만의 네트워크를 생성할 수 있습니다. 또한 EVM과 호환 되기 때문에 솔리디티로 작성된 모든 ENS 컨트랙트를 수정없이 배포하여 활용해 볼 수 있습니다. 루니버스 Sidechain에서 ENS를 배포하는 방법은 아래와 같습니다.

  1. 루니버스 콘솔에서 Sidechain을 생성하여 나만의 Private Network를 생성합니다.
  2. 1번 과정에서 생성한 Sidechain에 ENS 컨트랙트를 배포합니다. 이 작업은 루니버스 콘솔을 이용하면 쉽게 배포할 수 있습니다.
  3. ENS Registry에 도메인 이름을 등록합니다. 이는 Sidescan 위에서 ENS 컨트랙트의 ‘등록’ 기능을 호출하고 거래를 전송하는 방식으로 가능합니다.
  4. ENS 컨트랙트의 ‘setAddress’ 함수를 호출하여 도메인 이름을 개인 네트워크의 특정 주소로 지정합니다.
  5. ENS 도메인 이름을 사용하여 컨트랙트 또는 Sidechain 내의 다른 주소와 상호 작용합니다.
ENS를 Private Network에 배포를 위한 더 자세한 내용은 ENS 공식 문서를 참고하시기 바랍니다.