[Go lang] 체인코드 배포 & 트랜잭션 발생, 확인 / couchdb
chaincode/ docker / invoke / query / fabric-couchdb
⭐ 하이퍼레저 패브릭 1.4 ver 기준
체인코드 배포 (관리자의 관점)
배포 명령어 순서
docker-compose -f docker-compose.yml up -d cli
docker exec cli peer chaincode install -n fabcar -v 1.0 -p github.com/fabcar/go
docker exec cli peer chaincode instantiate -o orderer.example.com:7050 -n fabcar -v 1.0 -c ‘{“Args”:[]}’ -C mychannel -P “OR (‘Org1MSP.member’,’Org2MSP.member’)”
docker exec cli peer chaincode invoke -o orderer.example.com:7050 -n fabcar -c ‘{“Args”:[“initLedger”]}’ -C mychannel
docker exec cli peer chaincode query -n fabcar -c ‘{“Args”:[“queryAllCars”]}’ -C mychannel
docker exec cli peer chaincode invoke -o orderer.example.com:7050 -n fabcar -c ‘{“Args”:[“createCar”,”CAR12”,”sm”,”sm3”,”red”,”shin”]}’ -C mychannel
docker exec cli peer chaincode query -n fabcar -c ‘{“Args”:[“queryCar”,”CAR12”]}’ -C mychannel
-1. docker-compose -f docker-compose.yml up -d cli
👉 -d
옵션을 안주면 컨테이너를 생성하고 무한루프에 갇힌다
👉 cli
라는 컨테이너 생성
-2. cli
컨테이너는 하이퍼레저 블록체인 네트워크를 관리하는 콘솔 역할 (peer 에게 명령을 주는 관리자)
👆 cli 컨테이너 설정 (관리자용 콘솔)
environment (환경변수)
- 체인코드에 대한 설치 배포명령
GOPATH 환경변수
- 연결할 peer 의 정보 (컨테이너 이름 or IP주소 or 도메인주소 등)
- 컨테이너와 통신하는데 필요한 PORT 번호
- 어떤 멤버십으로 연결을 할지 (조직멤버십)
- 어떤 권한으로 peer 에게 접근할지 (멤버십 경로)
- 어떤 권한으로 peer 에게 트랜잭션을 일으킬것인지
(키와 인증서를 이용하여 권한 획득)volumes
- 리눅스 → 도커 → 이미지 → 컨테이너 생성
- 컨테이너들이 사용할 세부적인 설정내용 / 파일은 이미지에 들어가지 않는다
- 이런 경우에는 리눅스 시스템에 있는 디렉토리에서 세부값을 가져온다
/var/run/ : /host/var/run/
’ : ‘ 를 기준으로
앞에는 리눅스 디렉토리 경로
뒤에는 도커 컨테이너 저장 경로
-3. docker exec cli peer chaincode install -n fabcar -v 1.0 -p github.com/fabcar/go
- 도커 cli로 (관리자권한) 명령어 실행
peer chaincode install
체인코드 설치- 체인코드의 이름은
fabcar
- 버전관리를 위해 버전정보
v 1.0
- 체인코드가 어떤 디렉토리에 있는지 지정
-p github.com/fabcar/go
docker exec cli peer chaincode list --installed
성공적으로 설치가 되었는지 확인 👆
-4. docker exec cli peer chaincode instantiate -o orderer.example.com:7050 -n fabcar -v 1.0 -c '{"Args":[]}' -C mychannel -P "OR ('Org1MSP.member','Org2MSP.member')"
- 도커 cli로 (관리자권한) 명령어 실행
peer chaincode instantiate
체인코드 배포- 체인코드 배포는 채널 전체에 영향을 준다 ⭐
- 체인코드 ‘설치’는 peer 마다 해줘야하지만 ‘배포’는 채널에 한번만 해주면 된다
-o orderer.example.com:7050
배포가 되면 orderer 로 전달이 되어야 한다- 어떤 체인코드를 배포할지 이름
-n fabcar
- 버전관리를 위해 버전정보
v 1.0
-c '{"Args":[]}'
체인코드에 ‘Init’ 함수 원장의 초기값 설정 (key-value 값)-C mychannel
배포 될 채널 이름-P "OR ('Org1MSP.member','Org2MSP.member')"
👉-P
는 정책, orderer에 이 내용이 들어간다
👉 “OR” 어떤 조직이라도 트랜잭션을 승인하면 블록화 시킨다
👉 “AND” 두 조직 모두 트랜잭션을 승인하면 블록화 시킨다
docker exec cli peer chaincode list --instantiated -C mychannel
성공적으로 설치가 되었는지 확인 👆
- 체인코드 이름 / 버전 / 경로
-5. docker exec cli peer chaincode invoke -o orderer.example.com:7050 -n fabcar -c '{"Args":["initLedger"]}' -C mychannel
- 도커 cli로 (관리자권한) 명령어 실행
peer chaincode invoke
체인코드로 트랜잭션을 발생시킨다-o orderer.example.com:7050
트랜잭션이 발생하면 블록이 생성되는데 블록이 생성이되려면 ‘orderer’ 의 정보가 필요하다- 어떤 체인코드를 동작시킬지
-n fabcar
-c '{"Args":["initLedger"]}'
어떤 트랙잭션을 발생시킬지 내용값- 어떤 채널에 있는지
-C mychannel
docker exec cli peer chaincode query -n fabcar -c '{"Args":["queryAllCars"]}' -C mychannel
성공적으로 트랜잭션이 발생했는지 확인 👆
peer chaincode query
트랜잭션 내용 전달 (확인)
-6. docker exec cli peer chaincode invoke -o orderer.example.com:7050 -n fabcar -c '{"Args":["createCar","CAR12","sm","sm3","red","shin"]}' -C mychannel
- 도커 cli로 (관리자권한) 명령어 실행
peer chaincode invoke
체인코드로 트랜잭션을 발생시킨다-o orderer.example.com:7050
트랜잭션이 발생하면 블록이 생성되는데 블록이 생성이되려면 orderer의 정보가 필요하다- 어떤 체인코드를 동작시킬지
-n fabcar
-c '{"Args":["createCar","CAR12","sm","sm3","red","shin"]}'
어떤 트랙잭션을 발생시킬지 내용값- 어떤 채널에 있는지
-C mychannel
docker exec cli peer chaincode query -n fabcar -c '{"Args":["queryCar","CAR12"]}' -C mychannel
성공적으로 트랜잭션이 발생했는지 확인 👆
-7. fabric-couchdb
를 이용하고 있어서 ‘월드스테이트’ 를 볼수있다
http://localhost:5984/_utils
(👆 월드스테이트 로컬호스트 주소)
👆 ‘월드스테이트’ 데이터 베이스
‘이더스캔’ , ‘클레이스코프’ 와 같이
트랜잭션 발생 내용을 UI 로 확인할 수 있다
👆 ‘CAR12’ Metadata
체인코드로 트랜잭션을 발생시킨 값이
key-value 데이터로 잘 담긴걸 확인 할 수 있다
👆 ‘CAR12’ json
체인코드로 트랜잭션을 발생시킨
"CAR12","sm","sm3","red","shin"
데이터가
JSON 형식으로 잘 담긴걸 확인 할 수 있다