[블록체인 개발 공부] 블록체인 개발하기 PART 5 : IPFS 프로토콜
이 글은 아래 블로그(Coral Health)의 내용을 번역한 것입니다.
https://medium.com/@mycoralhealth/learn-to-securely-share-files-on-the-blockchain-with-ipfs-219ee47df54c
이번 포스팅에서는 블록체인에서 IPFS프로토콜을 이용하여 파일을 안전하게 공유하는 방법을 알아봅시다.
시작하기 전에 이해를 위해 이전 포스팅을 읽어 보시길 바랍니다.
PART1 기본 블록체인 개발
PART2 블록체인 네트워킹개발
PART3 POW(작업증명방식)개발
PART4 POS(지분증명방식)개발
최근 블록체인에 대한 관심이 많아 졌습니다. 대부분 암호화폐나 ICO같은 것에 대한 관심이 많지만 블록체인 기술 자체도 굉장히 흥미롭습니다. 이미 블록체인은 신뢰성과 검증된 프로토콜을 가지고 있어 은행업계에 영향을 미치고 있으며 헬스케어, 금융서비스, 소셜 앱 등 많은 분야에 적용될 것으로 보입니다.
그러나 기술적관점에서 블록체인은 완벽하다고 볼 수 없습니다. 현재 작업증명방식(Proof of Work)은 트랜잭션 속도를 떨어 뜨리고 있습니다. 비트코인 트랜잭션이 완료될 때까지 플랫폼을 무용지물로 만들고 있어 심각한 상태입니다. 그리고 크립토 키티는 이더리움 네트워크를 거의 중단했습니다.
블록체인에는 데이터를 저장하거나 대용량 파일들을 저장할 수 없습니다. 두사람 간의 거래가 발생하는 단순한 내용의 문자열만 겨우 유지하는데 어떻게 대용량파일이나 이미지를 저장 할 수 있을까요? 블록체인에 겨우 이런 작은 데이터만 가질 수 있도록 하는것에 만족해야 할까요?
IPFS
현재 가장 가능성 있는 해결방법은 IPFS(Interplanetary File System)입니다. IPFS는 Protocol 연구실 사람들에 의해 만들어 졌습니다. IPFS는 각 노드에 해시 파일을 저장하는 P2P 프로토콜 입니다. 어떠한 파일이 필요한 사용자가 추상레이어에 접근하여 파일의 해시를 호출합니다. 그러면 IPFS는 노드에서 파일을 찾아 사용자에게 전달합니다.
예를들어 Torrent와 비슷하다고 생각하시면 됩니다. 이 방식은 파일을 분산화 하여 저장하고 참조할 수 있지만 프로그래밍적으로 고려하면 더 효율적으로 사용할 수 있을것으로 보입니다. 아래에 IPFS의 WorkFlow 그림이 있습니다.
- A라는 사람이 PDF파일을 IPFS에 올립니다.
- A는 자신의 워킹 디렉토리에 파일을 놓습니다.
- IPFS에게 파일을 등록하길 원한다고 요청하면 파일의 해시를 생성합니다.
- IPFS네트워크에서 누구나 해시 값을 알면 파일을 접근 할수 있습니다.
A라는 사람이 IPFS를 통하여 B라는 친구에게 파일을 공유한다고 생각해봅시다. A는 친구에게 Step3에서 얻은 해시를 알려줄 것입니다. 그리고나서 위에 있는 순서의 반대로 B라는 친구는 해시 값을 IPFS에 요청 할 것입니다. 그리고 B라는 친구는 PDF파일을 복사하여 얻게 될 것입니다.
보안문제
IPFS에는 보안적인 문제가 있습니다. 어느 누구나 파일의 해시를 얻을수 있기 때문에 쉽게 해당 파일을 가질수 있습니다. 그래서 민감한 정보가 담긴 파일은 IPFS에 어울리지 않습니다. 이런 파일에 무언가를 하지 않는 이상 IPFS에 민간함 정보가 있는 파일은 공유할 수 없습니다.
비대칭 암호화
IPFS에 파일을 올리기 전에 파일을 보호할 수 있는 툴을 사용할 것입니다. 비대칭암호는 공개키를 이용하여 파일을 암호화 하여 IPFS 네트워크에 올립니다. 그러면 IPFS에서 파일을 다운로드 받아 복호화 하여 볼수 있습니다. 만약에 악의적인 사람이 파일을 다운로드 받고 복호화 키가 없기 때문에 파일을 볼 수 없습니다. 이번 포스팅에서는 GPG라는 툴을 이용하겠습니다.
암호화와 복호화를 통하여 파일을 공유하는 workflow는 아래 그림과 같습니다.
- A가 파일을 IPFS에 올려 B라는 친구만 보기를 원합니다.
- A는 워킹디렉토리에 PDF파일을 놓고 친구 B의 공개키로 암호화합니다.
- A는 IPFS에 암호화된 PDF를 추가하고 암호화된 파일의 해시 값을 생성합니다.
- 친구 B는 IPFS네트워크에서 파일에 접근할 수 있게 됩니다.
- 친구 B가 파일의 해시를 호출하여 파일을 다운 받습니다. 그리고 공캐키의 개인키를 가지고 파일을 복호화합니다.
- 악의적인 사용자가 파일에 접근하려고 해도 친구 B의 개인키가 없기 때문에 접근 할수 없습니다.
블록체인
블록체인에 IPFS가 어디에 활용될수 있을까요?
오늘날 모든 블록체인은 코인이 전송되는 량과 송수신자의 정보를 텍스트형태로 블록에 저장하는데만 사용하고 있습니다. 블록체인은 이런 간단한 정보만 블록에 기록하고 블록의 해시를 계산하고 이전 블록의 해시를 비교하며 무결성을 유지하는데도 벅찹니다. 때문에 대용량의 파일이나 엄청난 량의 데이터를 블록체인의 블록에 담는 것은 매우 어려운 일입니다.
하지만 IPFS를 활용한다면 블록체인은 엄청난 힘을 가지게 됩니다. 위 그림의 BPM 대신에 파일의 해시를 저장해 봅시다. 그러면 블록체인에 간단한 데이터 크기기만 유지하면서 IPFS의 파일 스토리지와 탈중앙화된 P2P속성도 이용할수 있게 됬습니다. 또한 비대칭 암호화 (GPG)로 보안 기능을 추가 하고 블록 체인에 대용량 데이터와 파일 저장, 암호화 및 공유를 할 수 있게 됩니다.
이제 IPFS와 비대칭키를 이용하여 테스트 해봅시다.
테스트를 위하여 아래 항목들의 작업을 해야합니다.
- GPG 설치
- IPFS설치
- 공개키로 파일 암호화
- IPFS에 암호화된 파일 업로드
- 다른 컴퓨터에서 파일 다운로드 후 복호화
실습을 하기 위해서는 2개의 컴퓨터가 필요합니다.
다른 컴퓨터 또는 가상머신이 필요합니다.
저는 Docker를 이용하여 테스트 할것입니다.
도커 설치와 사용법은 인터넷에 검색하여 셋팅하시기 바랍니다.
GPG
GPG를 설치 해봅시다. brew install gnupg
를 입력하여 설치합니다. 참고로 brew명렁어는 MacOs에서만 사용 가능합니다.
gpg --gen-key
리눅스는 apt-get install gnupg
를 입력하세요.
위와 같이 입력하면 키를 생성할 수 있습니다.
docker에서 키를 생성하시고 아래 명령어로 키파일을 생성합니다.
MAC : gpg --export --armor [email protected] > evasioner.asc
Docker : gpg --export --armor [email protected] > dockevasioner.asc
키 생성 후 도커에서 생성한 키를 다음과 같이 복사해 옵시다.
docker cp ubuntu:/root/dockevasioner.asc dockevasioner.asc
IPFS
아래 링크를 통해 IPFS를 다운로드 하여 설치합니다.
https://ipfs.io/docs/install/
도커 리눅스에서는 에서 설치는 다음과 같이 합니다.
wget https://dist.ipfs.io/go-ipfs/v0.4.14/go-ipfs_v0.4.14_linux-amd64.tar.gz
tar xvf go-ipfs_v0.4.14_linux-amd64.tar.gz
IPFS 네트워크 사용을 위해 두개(MAC, DOCKER) 모두 아래 명령어를 실행합니다.
ipfs init
ipfs daemon
암호화
먼저 도커에서 키를 복사 해옵시다.
pdf파일을 암호화 해봅시다. 아래 명령어를 이용하여 파일을 암호화 하면됩니다.
도커에서 GPG 키를 생성 할때 Real Name에 작성했던 이름 "dockevasioner"대신에 입력하시면 됩니다. ex)"yourname"
gpg --encrypt --recipient "dockevsioner" evasioner.pdf
위 명령어를 실행 하면 evasioner.pdf.gpg라는 파일이 생성됩니다.
IPFS에 업로드
IPFS네트워크에 파일 등록은 아래 명령어로 실행하시면 됩니다.
ipfs add evasioner.pdf.gpg
ipfs pin ls
입력하시면 파일 목록이 나타납니다.
IPFS에서 다운로드
Docker 에서 아래 명령어를 입력하여 파일을 다운로드합니다.
ipfs get QmXMoG52f4taR5B8TFLjde83WrKTv1aQXcdhTprrBaby9C
복호화
아래 명령어를 이용하여 복호화 하면 evasioner.pdf파일이 나타납니다. 입력하면 비밀번호 입력하시면 됩니다.
gpg --decryptQmXMoG52f4taR5B8TFLjde83WrKTv1aQXcdhTprrBaby9C > evasioner.pdf
NEXT STEP
오늘 포스팅은 여기 까지입니다.
다음 포스팅 부터는 현재 작성한 GO언어 대신에 블록체인 JAVA 버전과 이더리움 Dapp 등을 개발을 해보도록 하겠습니다.
감사합니다.
좋습니다/~!!
엄청난 글이네요... 언제 날 잡아서 처음부터 읽어봐야겠습니다...
초보도 배울 수 있을까요?^^
네 초보도 배울 수 있어요
좋은글이네요