‘이더리움 댑 개발’ 세미나 보조 교재 – 이더리움 디앱 개발(Building Ethereum Dapps) 3부
이번 보조 교재 같이 읽기는 3부. 다양한 이더리움 생태계 입니다.
- 9장. 이더리움 생태계
- 10장. 모카로 컨트랙트 단위 테스트하기
- 11장. 트러플로 개발주기 단축하기
- 12장. 투표 디앱 개발하기: 총정리
9장. 이더리움 생태계
그림 9.1에 표현된 요소들과 그들 사이의 관계를 설명해 봅니다.
그림 9.2에 추가적으로 표현된 요소들과 관계들에 대해 설명할 수 있어야 합니다. 특히 추가 인프라 요소들에 주의를 기울입니다.
- ENS(Ethereum Name Service)
- 0x829bd824b016326a401d083b33d092293333a830와 같은 이더리움 주소는 사람이 쉽게 읽고 기억하기에 쉽지 않습니다. ENS는 이더리움 주소를 roberto.manning.eth와 같이 사람이 쉽게 읽고 기억할 수 있는 도메인 형태로 사용할 수 있도록 하는 컨트랙트 입니다.
- 스웜, IPFS
- 탈중앙화 스토리지
- 스웜은 이더리움 기반입니다. IPFS는 특정 블록체인에 종속되지 않고 유사한 기능을 제공합니다.
- 스웜은 이더리움 댑에 탈중앙화된 스토리지 제공을 목표로 하는 컨텐츠 배포 플랫폼입니다.
- 스웜에서 스토리지는 P2P 네트워크로 탈중앙화 되어 있습니다.
- 이더리움 블록체인 트랜잭션에서 해시 id나 ENS를 활용한 읽을 수 있는 이름으로 참조할 수 있습니다.
- 그림 9.7, 9.8, 9.9, 9.10을 설명할 수 있도록 합니다.
- 위스퍼
- 탈중앙화 메시지 네트워크입니다. 이더리움 스마트 컨트랙트에서 발생할 수 있는 장애에 강하고 프라이버시 보호가 주요 특징인 비동기 P2P 통신입니다. 위스퍼 API를 사용하면 컨트랙트에서 메시지를 보낼 때 추적 가능한 평문에서 추적 불가한 암호문까지 다양한 수준의 보안 및 개인 정보를 보낼 수 있습니다.
- 오라클 프레임워크
- 실세계 데이터(off-chain data)를 인증되고 일관되게 사용할 수 있도록 하는 컨트랙트 프레임워크입니다.
- 예) Oraclize
- 실세계 데이터(off-chain data)를 인증되고 일관되게 사용할 수 있도록 하는 컨트랙트 프레임워크입니다.
ENS
- 마침표로 구분되어 계층적으로 구성됩니다.
- 마침표로 구분되는 도메인 이름의 각 부분을 레이블이라고 합니다.
- 주소 뿐만 아니라 스웜 컨텐츠 해시와 같은 다른 리소스에도 사용할 수 있습니다.
- 서브도메인.도메인.루트도메인 형태로 작성됩니다.
- eth – 이더리움 메인넷, test – 이더리움 테스트넷, swarm – 스웜
- 레지스트라(registra), 리졸더(resolver), 레지스트리(registry)가 주요 구성요소 입니다. 그림 9.5, 9.6와 표 9.1을 설명할 수 있어야 합니다.
- 레지스트라
- 도메인 소유권을 관리하는 컨트랙트입니다.
- 리졸버
- 도메인 이름을 리소스 식별자로 변환하는 컨트랙트입니다.
- 레지스트리
- 도메인 이름과 도메인 리졸버 매핑입니다.
- 레지스트라
- 도메인 이름 등록
- ENS 자바스크립트 유틸리티 라이브러리를 다운로드 합니다.
- 테스트넷 네트워크에 도메인을 등록하려면 ensutils-testnet.js를 사용합니다. 자바 스크립트를 로드합니다.
- 만기일을 확인함으로 도메인 소유권이 등록되어 있는지를 확인합니다.
-
123var domainHash = web3.sha3('manning');var domainExpiryEpoch = testRegistrar.expiryTimes(domainHash).toNumber() * 1000;var domainExpiryDate = new Date(domainExpiryEpoch);
- manning 도메인이 테스트넷에 등록되어 있는지를 확인하는 예입니다.
- domainExpiryDate가 오늘보다 이전이면 해당 도메인을 사용할 수 있습니다.
-
- 도메인 소유권 등록을 요청합니다.
- testRegistrar의 register 함수를 사용해서 소유권 등록을 요청합니다.
- 어떤 도메인을 어떤 계정이 소유하는 것으로 등록할 것인지
-
1var tx1 = testRegistrar.register(domainHash, eth.accounts[0], {from: eth.accounts[0]});
- testRegistrar의 register 함수를 사용해서 소유권 등록을 요청합니다.
- 도메인 소유권 등록 요청 트랜잭션이 채굴되면 도메인을 리졸버(컨트랙트 주소)에 매핑합니다.
-
1tx2 = ens.setResolver(namehash('manning.test'), publicResolver.address, {from: eth.accounts[0]});
-
- 트랜잭션이 채굴되면 리졸버에 주소를 설정합니다.
-
12publicResolver.setAddr(namehash('manning.test'),eth.accounts[1], {from: eth.accounts[0]});
-
- 서브 도메인을 등록합니다.
- 레지스트리로 서브 도메인 소유권을 등록합니다.
-
12ens.setSubnodeOwner(namehash('manning.test'),web3.sha3('roberto'), eth.accounts[2], {from: eth.accounts[0]});
-
- 도메인과 리졸버를 매핑합니다.
-
1ens.setResolver(namehash('roberto.manning.test'), publicResolver.address, {from: eth.accounts[2]});
-
- 도메인 이름을 대상 주소와 연결합니다.
-
1publicResolver.setAddr(namehash('manning.test'), eth.accounts[3], {from: eth.accounts[2]});
-
- 레지스트리로 서브 도메인 소유권을 등록합니다.
- 도메인 이름을 주소로 변환합니다.
-
1234var domainName = 'manning.test';var domainNamehash = namehash(domainName);var resolverAddress = ens.resolver(domainNamehash);resolverContract.at(resolverAddress).addr(namehash(domainNamehash));
- 다음과 같이 할 수도 있습니다.
- getAddr(domainName);
- 다음과 같이 할 수도 있습니다.
-
- 메인넷 도메인은 commit-reveal 입찰로 등록할 수 있습니다.
오라클로 외부 데이터 접근하기
오라클에 기반하여 데이터를 공급하는 솔루션의 주요 구성요소는 다음과 같습니다.
- 컨트랙트
- 데이터를 가져오기 위해 쿼리를 실행합니다.
- 오라클
- 컨트랙트와 데이터 공급자를 연결합니다. 쿼리를 보내고 조회된 데이터를 받아 컨트랙트에 보냅니다.
- 데이터 소스
- REST API, 레거시 웹 서비스, 온라인 랜덤 생성기, 온라인 계산기 등이 사용될 수 있습니다.
- TLSNotary
- 온라인 데이터의 암호화 증명을 생성합니다.
- IPFS 저장소
- 필요할 때 오프 블록체인에서 검증하기 위해 반환된 데이터가 진위 증명과 함께 저장됩니다.
그림 9.15를 설명할 수 있도록 합니다.
10장. 모카로 컨트랙트 단위 테스트하기
이미 세미나에서 다룬 내용들이므로 건너뛰어도 됩니다.
11장. 트러플로 개발주기 단축하기
대부분 이미 세미나에서 다룬 내용이므로 아래 정리한 내용만 확인하고 넘어가도 됩니다.
- 컨트랙트 배포 계정을 명시하고 싶을 때
- networks의 개별 네트워크 설정에서 from에 배포 주소를 명시합니다.
-
12345678910module.exports = {networks: {development: {host: "localhost",port: 8545,from: "0xf17f52151ebef6c7334fad080c5704d77216b732",network_id: "*"}}};
- 명시하지 않은 경우 account[0]을 사용합니다.
-
- networks의 개별 네트워크 설정에서 from에 배포 주소를 명시합니다.
12장. 투표 디앱 개발하기: 총정리
세미나를 통해 학습한 내용을 기반으로 본문 내용을 참고해서 직접 투표 댑을 개발해 봅니다.