Couchdb ?
NoSQL 기반으로 구성된 오픈소스 데이터베이스 소프트웨어이다.
특징은 json을 사용하여 데이터를 저장하고 JS를 쿼리 언어로 사용한다. 나는 이 couchdb를 hyperledger-fabric에 적용하여 블록체인 네트워크에서 사용하는 데이터베이스를 구축할 것이다.
블록체인 네트워크의 데이터베이스를 하나 더 만들게 되면 DB를 2개나 관리하는 번거로움이 생기지만, 이번 프로젝트의 핵심 요소인 '개인문서'를 Backend(nodejs, mariadb)에서 접근하는 것은 옳치 않은 아키텍쳐라고 판단하여 이렇게 진행하기로 결정하였다
공식문서는 couchdb 사용을 권장한다.
before apply
couchdb를 셋팅하기 전 몇 가지 알아야할 점이 있다.
1. You will need to setup one CouchDB container per peer (피어당 하나의 couchdb를 갖는다).
2. couchdb는 index를 기준으로 각 row를 분류하는 것같다..? (번역을 잘 이해하지 못했...ㄷr)
유심히 봐야할 점은 1번 내용일 것 같다. 한 개의 데이터베이스를 여러개의 peer 혹은 org에서 접근하는 것이 아니라 각각의 peer 에서 각기 다른 DB를 관리하는 것이다. 기존 네트워크를 구성하는 방식과는 사뭇 다른 방식이다. 장부의 분산을 실현시키기 위해 이렇게 진행하는 것 같다.
이렇게 구현되면 요청 처리 순서는 아래와 같다.
- 사용자가 query 혹은 invoke를 요청한다.
- orderer peer가 내용을 확인하고 block 생성 후 정렬한다
- 업데이트된 정보를 ledger peer에게 전달하고 해당 정보를 조직의 참여자에게 공유한다.
apply
> couchdb는 docke에 설치되어있는 상태라고 가정하고 진행한다.
1. network 깨운다. 단 깨울 때 couchdb와 함께 깨운다.
./network.sh up createChannel -s couchdb
2. smart contract를 배포한다.
./network.sh deployCC -ccn ledger -ccp ../asset-transfer-ledger-queries/chaincode-go/ -ccl go -ccep "OR('Org1MSP.peer','Org2MSP.peer')"
자세히 보면, go language로 작성된 chaincode를 배포한다는 것을 유추할 수 있다. 참고로 fabric-samples에는 java, javascript, ts, go 로 작성된 test-app, chaincode 등이 있다.
3. 환경변수 설정
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051
4. excute query
4-1. change owner
peer chaincode query -C mychannel -n ledger -c '{"Args":["QueryAssets", "{\"selector\":{\"docType\":\"asset\",\"owner\":\"tom\"}, \"use_index\":[\"_design/indexOwnerDoc\", \"indexOwner\"]}"]}'
document에선 모든 asset의 소유자를 tom으로 바꾸는 command 라고 하는데 무슨 말인지 잘 모르겠다..
4-2. The asset transfer ledger queries chaincode was installed with the indexOwnerDoc index.
export CHANNEL_NAME=mychannel
peer chaincode query -C $CHANNEL_NAME -n ledger -c '{"Args":["QueryAssets", "{\"selector\":{\"docType\":\"asset\",\"owner\":\"tom\"}, \"use_index\":[\"indexOwnerDoc\", \"indexOwner\"]}"]}'
4-3. insert data
peer chaincode query -C $CHANNEL_NAME -n ledger -c '{"Args":["QueryAssets", "{\"selector\":{\"$or\":[{\"docType\":\"asset\",\"owner\":\"tom\"},{\"color\":\"yellow\"}]}, \"use_index\":[\"indexOwnerDoc\", \"indexOwner\"]}"]}'
그 후 http://localhost:7984/_utils/#/_all_dbs 로 접근하여 데이터베이스를 확인해보면 아래와 같이 나온다. 데이터베이스에 insert한 데이터가 잘 추가된 것을 확인할 수 있다.
불친절한 정보도 많고 틀린 정보도 많을 것 같아 꼬집어주실 부분은 꼬집어주시면 좋겠습니다 :) 감사합니다.
'WINK-(Web & App)' 카테고리의 다른 글
[2024 여름방학 React.js 스터디] 이가인 #1주차 (0) | 2024.07.19 |
---|---|
[2023 신입부원 기초 스터디] 박승환 #7주차 - 오랜만이다 js야 (0) | 2023.06.25 |
[2023 신입부원 심화 스터디] 이정욱 #2주차 - 기초 문법 Part.2, 3 (0) | 2023.04.14 |