NoSQL 기반으로 구성된 오픈소스 데이터베이스 소프트웨어이다.
특징은 json을 사용하여 데이터를 저장하고 JS를 쿼리 언어로 사용한다. 나는 이 couchdb를 hyperledger-fabric에 적용하여 블록체인 네트워크에서 사용하는 데이터베이스를 구축할 것이다.
블록체인 네트워크의 데이터베이스를 하나 더 만들게 되면 DB를 2개나 관리하는 번거로움이 생기지만, 이번 프로젝트의 핵심 요소인 '개인문서'를 Backend(nodejs, mariadb)에서 접근하는 것은 옳치 않은 아키텍쳐라고 판단하여 이렇게 진행하기로 결정하였다
공식문서는 couchdb 사용을 권장한다.
couchdb를 셋팅하기 전 몇 가지 알아야할 점이 있다.
1. You will need to setup one CouchDB container per peer
피어당 하나의 couchdb를 갖는다.
2. couchdb는 index를 기준으로 각 row를 분류하는 것같다..? (번역을 잘 이해하지 못했...ㄷr)
유심히 봐야할 점은 1번 내용일 것 같다. 한 개의 데이터베이스를 여러개의 peer 혹은 org에서 접근하는 것이 아니라 각각의 peer 에서 각기 다른 DB를 관리하는 것이다. 기존 네트워크를 구성하는 방식과는 사뭇 다른 방식이다. 장부의 분산을 실현시키기 위해 이렇게 진행하는 것 같다.
이렇게 구현되면 요청 처리 순서는 아래와 같다.
1. 사용자가 query 혹은 invoke를 요청한다.
2. order가 내용을 확인하고 block 생성 후 정렬한다.
3. 업데이트된 정보를 ledger peer에게 전달하고 해당 정보를 조직의 참여자에게 공유한다.
couchdb는 docke에 설치되어있는 상태라고 가정하고 진행한다.
./network.sh up createChannel -s couchdb
위에 언급한 것 처럼, peer 하나당 하나의 couchdb가 연결되어 있다.
./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 등이 있다.
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
org1으로 hyperledger 설정을 변경한다.
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 로 접근하여 데이터베이스를 확인해보면 아래와 같이 나온다.
불친절한 정보도 많고 틀린 정보도 많을 것 같아 꼬집어주실 부분은 꼬집어주시면 좋겠습니다 :) 감사합니다.