일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- ethers type
- 오블완
- 티스토리챌린지
- rust 기초
- 프록시배포구조
- 러스트기초
- 컨트렉트 동일한 함수이름 호출
- ethers websocket
- 체인의정석
- 스마트컨트렉트프록시
- 러스트 기초
- 컨트렉트 배포 자동화
- ambiguous function description
- ethers typescript
- nest.js설명
- 머신러닝기초
- 스마트컨트렉트테스트
- SBT표준
- chainlink 설명
- git rebase
- ethers
- multicall
- 스마트 컨트렉트 함수이름 중복
- Vue.js
- Vue
- ethers v6
- 스마트컨트렉트 함수이름 중복 호출
- 스마트컨트렉트 예약어 함수이름 중복
- vue기초
- 러스트 기초 학습
- Today
- Total
체인의정석
ENS Namehash 만들고 Namehash로 컨트렉트에서 실제 지갑주소 뽑아보기 본문
ENS는 실제로 어떻게 주소를 관리하고 실제 주소를 뽑아낼까? 실제로는 namehash라는 해시값을 통해서 컨트렉트에서 조회를 하고 상호작용을 하게 된다. 이번에는 Namehash를 실제로 만들어보고 이를 통해 공식 컨트렉트로 지갑 주소를 도출하는 로직을 만들어 보도록 하겠다.
Name hash 만들기
https://www.npmjs.com/package/@ensdomains/eth-ens-namehash
name hash는 다음 라이브러리에서 확인이 가능하다.
var namehash = require('@ensdomains/eth-ens-namehash')
var hash = namehash.hash('foo.eth')
console.log("hash >>", hash);
// '0xde9b09fd7c5f901e23a3f19fecc54828e9c848539801e86591bd9801b019f84f'
// Also supports normalizing strings to ENS compatibility:
var input = 'chainstone.eth'
var input2 = 'chainstone.eth!!!'
var normalized = namehash.normalize(input)
console.log("normalized >>", normalized);
var normalized2 = namehash.normalize(input)
console.log("normalized2 >>", normalized2);
결국 namehash 라이브러리에서는 다음과 같이 네임해시를 만드는 부분과 네임해시를 만들기 전에 normalize를 체크하는 부분이 있어서 다음과 같이하니 확인이 가능하였다.
ERC137 Ethereum Domain Name Service
https://eips.ethereum.org/EIPS/eip-137
해당 ENS의 함수에 대한 설명은 아래 링크에서 확인할 수 있다.
Registry 에서 Reslover 함수로 조회해보기
https://docs.ens.domains/contract-api-reference/ens
먼저 resolver를 찾아야 한다.
function resolver(bytes32 node) external view returns (address);
resolver에 해당하는 node 주소가 나오게 되면 해당 resolver에다가 다시 요청을 하게 될 경우 해당 ens가 나와야 한다.
일단 실제 이더리움 메인네트워크에서 실제로 해당 로직대로 작동하는지 체크를 해보기 위하여서 먼저 Registry컨트렉트를 찾아보았다.
https://etherscan.io/address/0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e#readContract
/**
* @dev Returns the address of the resolver for the specified node.
* @param node The specified node.
* @return address of the resolver.
*/
function resolver(bytes32 node) public view override returns (address) {
if (!recordExists(node)) {
return old.resolver(node);
}
return super.resolver(node);
}
저 node가 무엇인지에 대해 고민을 하다가 정답을 소스 코드에서 찾았다. 바로 namehash였다.
https://github.com/ensdomains/reverse-records/blob/master/contracts/ReverseRecords.sol
해당 코드를 좀 뜯어보면
resolver에 namehash를 넣어서 지갑주소를 역산하는것을 볼 수 있다.
그렇다면 저 resolver안에 들어간 입력값은? 바로 namehash였다.
Reslover에서 addr 함수로 지갑주소 뽑아내기
그래서 위의 Resigstry 컨트렉트에서 resolver로 resolver주소를 뽑아냈고 해당 resolver에 들어가서
https://etherscan.io/address/0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63#readProxyContract
addr안에 namehash를 넣었더니 실제 내가 발급한 ENS주소가 나왔다.
실제활용?
하지만 우린 서비스를 만들때 아래 링크에 있는 정말 다양한 모듈들을 써서 주소를 조회해올 수가 있기 때문에 직접 위의 과정을 코드로 구현할 필요가 없다.
https://docs.ens.domains/dapp-developer-guide/working-with-ens
'블록체인 > NFT & BRIDGE' 카테고리의 다른 글
ERC7638 - 크로스체인 전송 규격 (0) | 2024.04.22 |
---|---|
ENS 살펴보기 - 공식문서 살펴보기 (0) | 2023.11.23 |
IPFS에 데이터 올리는 방법 (0) | 2023.10.19 |
Chainlink functions 사용해보기 (0) | 2023.10.13 |
SBT와 관련된 표준 ERC 정리) ERC-6239: Semantic Soulbound Tokens (0) | 2023.09.16 |