MS사의 ION 설치를 진행하면서 이후 설치가 또 필요할 경우를 고려하여 정리해두었다.
DID의 구현인 ION을 Bitcoin Core testnet 상에서 사용하는 방법이다. ION은 Bitcoin Core, IPFS, MongoDB에 의존성을 가지고 실행된다.
아래 정리된 내용은 Ubuntu 기준의 설치 방법이다.
구축 환경
2024년 3월 14일 기준으로 아래와 같이 진행하였다. ION은 여러 패키지에 의존성이 있어, 그때마다 버전에 맞게 약간의 수정 사항이 생길 듯하다.
Hardware
아래는 공식 문서에서 권장하는 최소 권장 사양이다.
- i5 processor (2017+ models)
- 6GB of RAM
- 1TB of storage
위의 권장 사항에 맞추어 진행해주었다. 스토리지를 위해 1TB의 SSD를 연결해주었다. + HDD를 사용해서 혹시 몰라 /home도 1TB 용량을 가지도록 했다 (이건 굳이 필요없다).
(추가 스토리지 연결을 하지 않고 진행해보았는데, 용량이 부족하다는 에러가 발생하여 더 이상 추가로 진행할 수 없었다. 초기 세팅부터 SSD 또는 HDD를 연결하여 사용하는 것이 좋을 듯하다.)
Software
- Ubuntu 22.04
- ION v1.0.4
- Bitcoin Core v25.0
- IPFS v0.33.0
- MongoDB v7.0.6
구축 절차
ION 공식 설치 가이드를 참고하여 진행하였다.
[ION 설치 가이드 공식 홈페이지] https://identity.foundation/ion/install-guide/
[ION 설치 가이드 GitHub] https://github.com/decentralized-identity/ion/blob/master/install-guide.md
공식 홈페이지 버전은 중간에 문서가 깨진 부분이 있어 GitHub 버전으로 보는 것이 이해하기에 좋을 듯하다.
1. 환경 세팅
Snap
몇 가지 서비스의 설치를 단순화하기 위해 snap을 사용한다. Terminal을 열어 아래의 명령을 실행한다.
sudo apt install snapd
snap의 설치가 완료되면 환경 변수에 경로 (path)를 추가해주어야 한다. 공식 문서에서는 .bash_profile에 추가하라고 되어 있는데, Ubuntu의 유저가 한 명일 경우에는 (거의 대부분이 이 상황에 해당할 것...) .bash_profile 파일이 없을 것이다. 그러면 .bashrc나 .profile에 추가해줘도 되고, 나는 .bash_profile을 직접 만들어서 경로를 추가해주었다.
위의 로그와 함께 보자. 먼저 우리도 현재 내가 가지고 있는 파일을 확인해보자. -a 옵션을 꼭 추가해주어야 숨겨진 파일도 확인할 수 있다 (.bash_profile은 앞의 .으로 인해 숨겨진 파일이다).
ls -a
대부분 .bash_profile이 없을 것이다. 그럼 vi나 nano 등의 텍스트 에디터를 통해 .bash_profile 파일을 생성하여 다음의 내용을 입력해주자.
vi .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/snap/bin
export PATH
지금 내 .bash_profile에는 다른 경로도 추가되어 있는데, 그것은 이후 과정에서 찬찬히 진행할테니 일단은 snap의 경로 (PATH=$PATH:/snap/bin)만을 추가해주자. 추가하는 방법에는 여러가지가 있는데, 나는 PATH에 :를 통해 경로를 추가해주었다.
변경된 경로를 사용할 수 있도록 보장해주자.
source ~/.bash_profile
Node.js
ION 서비스는 Node.js version 14에 의존한다. 따라서 Node v14를 설치해주도록 하자.
sudo snap install node --classic --channel=14
build-essential
ION을 빌드하기 위해서는 Ubuntu의 'build-essential'과 비슷한 패키지가 필요하다. 설치해주자.
sudo apt install build-essential
Inbound 포트 열기
ION DID 연산을 위해서는 라우터의 nP2P를 사용하거나, 4002와 4003 포트를 열어서 데이터 파일이 IPFS를 통해 전달되어야 한다. 나는 4002와 4003 포트를 열어주었다.
sudo iptables -A INPUT -p tcp --dport 4002 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 4003 -j ACCEPT
룰을 추가하고 저장해준다.
sudo iptables-save
2. Bitcoin Core 세팅
ION 노드는 ION transactions를 패치하고 쓰기 위해 신뢰할 수 있는 Bitcoin peer가 필요하다.
자동 설치
자동적으로 설치하고 싶다면 Sidetree를 사용하면 된다.
[Sidetree] https://github.com/decentralized-identity/sidetree
수동 설치
나는 이 방식말고 직접 Bitcoin core를 설치해주었다. 다운로드 페이지의 Linux (tgz)를 설치하면 된다.
[Bitcoin Core] https://bitcoin.org/en/bitcoin-core/
(우리 학교의 네트워크는 보안이 걸려있어서... 모바일 핫스팟으로 진행해주었다...)
설치를 완료하고 압축을 풀어준다. 나는 /home 디렉토리에 파일을 놓아주었다.
bitcoin-25.0 디렉토리를 들어가보면 bitcoin.conf 파일이 보일 것이다. bitcoin의 configuration 파일이다. 이를 사용하여 bitcoin을 실행해줄 것이다. 클릭하여 들어가주자.
파일에 여러가지 내용들이 적혀있을 것이다 (사실은 모두 주석 처리되어 있지만). 여기서 아래 항목들을 수정해주자. 주석을 풀어주는 것도 잊지 말자! ctrl+f를 사용하여 항목을 찾은 후에 주석을 풀고 값을 수정해주면 된다.
수정해야할 값:
- testnet=1
- server=1
- datadir=[bitcoin block을 저장할 디렉토리. 넓은 공간이 있는 SSD 등을 추천한다.]
- rpcuser=[rpc 유저 이름. 대충 예쁘게 지어주자!]
- rpcpassword=[마찬가지로 사용할 비밀번호를 입력해주자!]
- txindex=1
rpcuser, rpcpassword, datadir는 따옴표 "로 닫아주지 않아야 한다. 문자열 그대로 입력해주자.
rpcuser와 rpcpassword는 나중에 ION 세팅에서 똑같이 적어야하므로 기억해두고 있자!
datadir의 경로는 되도록이면 SSD로 설정해주는 것이 좋다. 초기에 ION을 설치할 때, 이 경로를 /home 디렉토리로 해둬서 용량이 초과하여 실행 도중에 중단되어 버렸다...
수정을 마쳤다면 저장한 후, 홈에 .bitcoin 디렉토리를 하나 만든다.
sudo mkdir .bitcoin
해당 디렉토리에 방금 만든 bitcoin.conf를 복사/붙여넣기 하자.
sudo cp ~/bitcoin-25.0/bitcoin.conf ~/.bitcoin/
그러면 .bitcoin 디렉토리에 bitcoin.conf 파일이 있을 것이다.
자, 그럼 configuration까지 마쳤으니 본격적으로 Bitcoin Core를 실행하여 sync를 진행하자. 이때, bitcoin-25.0 디렉토리로 먼저 이동한 후 진행해주면 된다.
cd bitcoin-25.0
./bin/bitcoind -conf=bitcoin.conf
그럼 synchronization이 시작되며 2~3시간 정도 소요된다 (내 데이터....).
3. Kubo (IPFS) 설치
IPFS를 설치는 IPFS desktop으로 UI를 제공해주는 버전으로 설치했다.
[IPFS Ubunut 설치 가이드] https://docs.ipfs.tech/install/ipfs-desktop/#ubuntu
[IPFS 다운로드 페이지] https://github.com/ipfs/ipfs-desktop#linuxfreebsd
위 페이지에서 Debian 버전을 설치해주면 된다. 설치가 완료되면 아래의 명령어를 실행하여 압축을 풀어주자. 각 버전에 맞게 이름을 수정해주는 것을 잊지 말자!
sudo dpkg -i ./ipfs-desktop-0.33.0-linux-amd64.deb
그러면 Ubuntu 상단에 IPFS 아이콘이 생성될 것이다. 들어가면 이렇게 UI로 IPFS를 확인할 수 있다.
4. MongoDB 세팅
데이터를 로컬에 저장하기 위해 MongoDB를 사용해준다.
[MongoDB 설치] https://www.mongodb.com/try/download/community
위 사이트에서 Community Server의 Select package 버튼을 눌러준다.
본인 platform을 버전에 맞게 선택하여 설치해주면 된다. Package는 server를 선택해준다.
[MongoDB 설치 가이드] https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-ubuntu/
이제 설치 가이드에 따라 MongoDB를 세팅해주면 된다.
먼저 gnupg와 curl을 설치한다.
sudo apt-get install gnupg curl
그 후, public GPG 키를 가져온다.
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | \
sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg \
--dearmor
리스트 파일을 생성해준다.
sudo touch /etc/apt/sources.list.d/mongodb-org-7.0.list
MongoDB의 APT 저장소 정보를 시스템의 저장소 목록에 추가한다.
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
패키지 데이터베이스를 업데이트 한 후, MongoDB 패키지를 설치한다.
sudo apt-get update
sudo apt-get install -y mongodb-org
자, 이제 설치는 완료되었다. 그러면 실행을 시켜보자. 먼저 사용하는 platform의 init system을 확인하자.
ps --no-headers -o comm 1
나온 출력이 systemd이면 아래 내용대로 실행하면 된다. 출력이 init이라면 위의 MongoDB의 설치 가이드에 자세한 내용이 나와있으면 해당 문서를 참고하여 진행하면 된다.
MongoDB를 시작한다.
sudo systemctl start mongod
제대로 시작하였는지 확인해보자.
sudo systemctl status mongod
초록색 점으로 active 상태로 나오면 제대로 실행되고 있는 것이다.
잘 활성화가 된 것을 확인하면 이제 실행해보자.
mongosh
멈추려면 아래의 명령을 입력하면 된다.
sudo systemctl stop mongod
마지막으로 많은 양의 데이터를 다루어야 하므로 용량이 큰 SSD로 연산을 수행하도록 경로를 변경해주자.
mkdir ~/[SSD로 가는 경로]/db
mongod --dbpath ~/[SSD로 가는 경로]/db
db 디렉토리에서 연산이 수행될 수 있도록 변경해주면 끝!
5. Configure & ION Microservices 빌드
본 경로를 git clone 하기
[ION GitHub] https://github.com/decentralized-identity/ion
sudo install git
git clone https://github.com/decentralized-identity/ion
Configuration 파일 업데이트
홈 디렉토리에 ion이라는 디렉토리 생성되었을 것이다. ion 디렉토리 안의 config 디렉토리에 들어간다.
testnet-bitcoin-config.json과 testnet-bitcoin-versioning.json 파일을 복사해준다.
그 후, /etc/ion 디렉토리를 하나 만들어준다.
sudo mkdir /etc/ion/
그 디렉토리 안에 복사한 파일을 붙여넣어 준다.
자, 그러면 붙여넣은 config 파일을 본격적으로 세팅해보자.
먼저 testnet-bitcoin-config.json을 들어가주자.
sudo vi /etc/ion/testnet-bitcoin-config.json
수정해야 할 사항:
- "bitcoinPeerUri": "http://localhost:18332"
- "bitcoinDataDirectory": "[SSD로 가는 경로]/testnet3"
- "bitcoinWalletImportString": "[bitcoin wallet 주소]"
- "bitcoinRpcUsername": "[bitcoin.conf에서 설정했던 rpcuser 이름]"
- "bitcoinRpcPassword": "[bitcoin.conf에서 설정했던 rpcpassword]"
bitcoin wallet 주소는 직접 bitcoin wallet을 생성해도 되고, 아래 사이트에서 임의로 생성해서 그 string을 넣어도 된다.
[WIF 생성] https://learnmeabitcoin.com/technical/keys/private-key/wif/
Testnet 버전으로 체크 박스를 선택하여 생성하는 것을 잊지 말자! 아래의 WIF private key를 복사하여 입력해주면 된다.
직접 wallet을 생성하여 private key를 입력하고 싶다면 먼저 bitcoin-qt를 통해 GUI로 들어가준다 (CLI가 실행되고 있다면 종료한 후에 실행해야 한다!). 아래 실행문은 bitcoin-25.0 디렉토리에서 실행해야 한다.
./bin/bitcoin-qt
만약 library를 공유하고 있다는 에러가 뜬다면 다음과 같이 추가적으로 패키지를 설치해주고 다시 실행하면 된다.
sudo apt-get install libxcb-xinerama0
제대로 실행하면 이와 같은 화면이 출력되며 GUI가 켜진다...!
중요! 이후에 sidetreeDefaultWallet이 지정된 wallet으로 실행되는데, legacy wallet이 아니여서 에러가 발생한다. 이 값을 defalut가 아닌 wallet으로 설정하는 방법을 도무지 찾지 못했다. 따라서 다음의 GUI 과정에서 wallet을 생성할 때, 이름을 sidetreeDefaultWallet으로 생성해야 한다. 이미 default wallet이 생성되어 있다면, 해당 wallet 디렉토리를 삭제한 후 (이전에 지정해주었던 SSD 경로: [SSD로 가는 경로]/testnet3에 들어가면 wallets라는 디렉토리가 있을 것이다. 해당 디렉토리에 내가 생성한 wallet들의 디렉토리가 각각 생성되어 있을텐데 sidetreeDefaultWallet을 삭제하면 된다), 다시 생성해준다.
먼저 File>Create Wallet을 선택하여 Wallet을 생성한다. legacy wallet으로 생성해야 private key를 받을 수 있다 (이 부분에 대해서는 정확하게 모르겠지만 CLI로 무수히 시도했지만 잘 되지 않았다). Encrypt Wallet과 Descriptor wallet 모두 선택 해제시킨다. Wallet의 이름은 sidetreeDefaultWallet으로 지정해주고, Create를 눌러 wallet을 생성한다.
Wallet을 생성한 후, Window>Console에 들어간다.
자, 그러면 이 console 창에서 private key를 받아보도록 하자. 먼저 새로운 address를 생성해준다.
getnewaddress
그러면 일련의 string으로 이루어진 문자열을 출력할 것이다. 이 주소를 copy한다. 이제 private key를 얻어보자. [address] 부분에 아까 복사해두었던 주소를 붙여주면 된다.
dumpprivkey "[address]"
그러면 출력으로 private key를 받을 수 있다.
이 private key를 bitcoinWalletOrImportString에 입력하면 된다.
최종 완성된 config 파일은 아래와 같다!
추가적으로 ion/config/testnet-core-config.json의 다음 항목도 변경하면 된다.
- "didMethodName": "ion:test"
변경 후, 그대로 저장하면 된다. 변경된 파일 내용은 아래와 같다 (사실 그냥 그대로 놔둬도 된다. 이미 파일이 그렇게 적용되어 있다...).
이제 ION을 빌드해보자.
npm i
npm install tsc
npm run build
만약 경로 오류 같은 게 나면 아래의 코드로 대신 실행해보자.
npm run build --scripts-prepend-node-path
6. ION Bitcoin microservice 실행
환경 변수를 더 추가해주자.
이전에 생성하였던 ~/.bash_profile에 편집기를 통해 들어가자.
sudo vi ~/.bash_profile
다음의 경로를 추가해주자.
ION_BITCOIN_CONFIG_FILE_PATH=/etc/ion/testnet-bitcoin-config.json
ION_BITCOIN_VERSIONING_CONFIG_FILE_PATH=/etc/ion/testnet-bitcoin-versioning.json
최종 완성된 .bash_profile은 다음과 같다.
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/snap/bin
ION_BITCOIN_CONFIG_FILE_PATH=/etc/ion/testnet-bitcoin-config.json
ION_BITCOIN_VERSIONING_CONFIG_FILE_PATH=/etc/ion/testnet-bitcoin-versioning.json
export PATH
export ION_BITCOIN_CONFIG_FILE_PATH
export ION_BITCOIN_VERSIONING_CONFIG_FILE_PATH
잊지 말고 변경된 경로를 적용해주자.
source ~/.bash_profile
이제 bitcoin을 실행하자.
npm run bitcoin
경로 오류가 생긴다면 아래의 명령어로 실행하자.
npm run bitcoin --scripts-prepend-node-path
Blockchain을 모두 확인하기 위해 시간이 좀 걸린다.
bitcoin-cli 창에서 progress=1.0000이 되면 완료된 것이다. 이로써 Bitcoin service가 정상적으로 실행된다. 이 부분이 제대로 실행되지 않으면 아래의 ION core service도 실행되지 않을 것이다.
7. ION core 서비스 실행
이제 마지막으로 ION core service를 실행한다.
npm run core
마찬가지로 위가 실행되지 않으면 아래와 같이 입력하자.
npm rum core --scripts-prepend-node-path
Bitcoin service에서 발견된 DID와 IPFS의 정보를 대조하기 때문에 이 동작도 시간이 걸린다 (내... 데이터...).
이를 통해 최종적으로 5개의 프로세스가 ION 노드를 통해 실행될 것이다.
- MongoDB daemon
- Bitcoin Core
- Sidetree Bitcoin Service
- Sidetree IPFS Service
- Sidetree Core
8. ION 검증
마지막으로 제대로 ION이 실행되고 있는지 검증해보자 (드디어!!).
curl을 통해서 확인해본다 (웹 브라우저로 직접 확인해봐도 된다). resolve할 수 있는 DID는 ION 버전마다 다르니 각 버전의 설치 가이드에 나온 주소를 사용해주자.
참고! core service가 시작된 후, 잠시 기다려야 DID를 resolve할 수 있다.
curl http://localhost:3000/identifiers/did:ion:test:EiClWZ1MnE8PHjH6y4e4nCKgtKnI1DK1foZiP61I86b6pw
DID가 뭔가 달라졌는지 찾아지지는 않지만, 성공적으로 들어갈 수는 있었다 (이후 포스팅에서 원인을 찾았다. DID operation 및 resolution 포스팅을 참고하자).
브라우저를 통해 확인도 해봤다.
다음 포스팅은 ION 환경을 통해 직접 DID를 생성하여 DID operation 및 resolution을 시도해볼 것이다.
2024.03.15 - [열정/연구 일지] - ION DID operation 및 resolution
참고 문헌
ION을 사용하는 방법에 대한 글이 많지 않아, 환경 구축에 약간의 어려움이 있었다. 아래는 내가 환경 구축을 하면서 많은 도움을 받았던 주요 문헌이다.
[1] ION 공식 설치 가이드. 사실상 이 글에 따라 제대로 실행하면 ION 환경 구축에 크게 어려움은 없을 것이다.
https://github.com/decentralized-identity/ion/blob/master/install-guide.md
[2] 세부적으로 과정을 설명해주며, DID operation과 resolution 방법까지 설명해주었다. 2020년 포스팅이라 outdated되어 실행되지 않는 코드도 많지만 해당 명령어의 의미를 해석해주어 도움이 되었다.
https://tsmatz.wordpress.com/2020/09/01/did-sidetree-ion/
[3] 일본의 어느 블로거. Google 번역을 사용하여 읽어주었다. 2022년 구현이라 비교적 최근이지만, 여전히 실행되지 않는 명령문들이 존재한다 (bitcoin private key 생성 파트). 깔끔하게 과정을 정리해주어 도움이 되었다.
https://chike0905.hatenablog.com/entry/2022/01/11/134205
[4] ChatGPT. 항상 큰 도움 받고 있습니다...
'열정 > 연구 일지' 카테고리의 다른 글
Scene Graph Perturbations with VG dataset (0) | 2024.04.29 |
---|---|
ION DID operation 및 resolution (1) | 2024.03.15 |
[Linux/Ubuntu] 디스크 (HDD, SSD)로 용량 추가하기 (0) | 2024.03.11 |
Flickr8k, Conceptual Captions 3M, Visual Genome 데이터 세트 (1) | 2024.02.29 |
CC3M 데이터 세트 다운로드 (1) | 2024.02.26 |