Successfully reported this slideshow.
Your SlideShare is downloading. ×

Hyperledger fabric practice(pdf)

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in โ€ฆ3
×

Check these out next

1 of 67 Ad

More Related Content

Slideshows for you (20)

Similar to Hyperledger fabric practice(pdf) (20)

Advertisement

Recently uploaded (20)

Advertisement

Hyperledger fabric practice(pdf)

  1. 1. hyperledger fabric V1.4
  2. 2. environment setup ! ubuntu 16.04 or higher ! root ๊ถŒํ•œ์œผ๋กœ ์„ค์น˜ ! apt-get update ! apt-get install curl ! apt-get install python-pip ! apt-get install libltdl-dev ! apt-get install make gcc g++ libtool ! apt-get install tree
  3. 3. environment setup ! git apt-get install -y git git version ! Python: 2.7.x python โ€“version (apt-get install -y python) ! Go lang Version 1.11.x wget https://dl.google.com/go/go1.11.4.linux-amd64.tar.gz tar -C /usr/local/ -xvf go1.11.4.linux-amd64.tar.gz ! Go ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • vi /etc/profile export GOROOT=/usr/local/go export PATH=$PATH:$GOROOT/bin source /etc/profile go version source : https://hyperledger-fabric.readthedocs.io/en/release-1.4/prereqs.html
  4. 4. environment setup ! Docker Engine: Version 17.06.2-ce or higher wget https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/docker- ce_17.06.2~ce-0~ubuntu_amd64.deb dpkg -i docker-ce_17.06.2~ce-0~ubuntu_amd64.deb docker --version ! Docker-Compose: Version 1.14 or higher curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose- `uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose docker-compose version ! Node.js (Version 8.9 or higher (no version 9.0 support) / npm (Version 6.x) curl -sL http://deb.nodesource.com/setup_8.x | bash - apt-get install nodejs node -v npm -v source : https://hyperledger-fabric.readthedocs.io/en/release-1.4/prereqs.html
  5. 5. environment setup ! Hyperledger Fabric curl -sSL http://bit.ly/2ysbOFE | bash -s 1.4.0 1.4.0 0.4.10 (curl -sSL https://goo.gl/6wtTN5 | bash -s 1.4.1 1.4.1 0.4.10) (curl -sSL https://bit.ly/2KLpv5d | bash -s 1.4.0 โ€“d -s) ! ! vi /etc/profile export FABRIC_HOME=/home/fabric/fabric-samples export PATH=$PATH:$FABRIC_HOME/bin source /etc/profile [์ฐธ๊ณ ] ์ตœ์‹  ๋ฒ„์ „ ์„ค์น˜์‹œ(2.0) ์•„๋ž˜ ๋ช…๋ น์œผ๋กœ ์‹คํ–‰ (V2.0์—์„œ๋Š” ๋ณธ ๊ต์•ˆ์—์„œ ์„ค๋ช…ํ•˜๋Š” ์˜ˆ์ œ๊ฐ€ ์ •์ƒ ์‹คํ–‰๋˜์ง€ ์•Š์Œ. ์˜ˆ์ œ์˜ ๋ฒ„์ „์ด 2.0 ๊ธฐ์ค€์œผ๋กœ ์ˆ˜์ •๋˜์–ด์•ผ ํ•จ) v2.0์€ ์ฒด์ธ์ฝ”๋“œ ๋ผ์ดํ”„์‹ธ์ดํด์ด ๋” ์ƒ์„ธํ•ด์ง curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s https://hyperledger-fabric.readthedocs.io/en/release-1.4/samples.html#binaries | bash -s <fabric> <fabric-ca> <thirdparty> source : https://hyperledger-fabric.readthedocs.io/en/release-1.4/install.html
  6. 6. Build your first network
  7. 7. ๊ฐœ์š” ! The build your first network (BYFN) scenario provisions a sample Hyperledger Fabric network consisting of two organizations, each maintaining two peer nodes. It also will deploy a โ€œSoloโ€ ordering service by default, though other ordering service implementations are available. source : https://hyperledger-fabric.readthedocs.io/en/release-1.4/build_network.html
  8. 8. configtx.yaml ! ์ฑ„๋„ ์ƒ์„ฑ์„ ์œ„ํ•œ Peer ์ •๋ณด ( Host, Port), MSP ์ •๋ณด, Consortiums(๋ช‡ ๊ฐœ์˜ Org๋กœ ๊ตฌ์„ฑํ•  ๊ฒƒ์ธ์ง€) ์„ค์ •โ€จ - ๋ธ”๋Ÿญ ์ƒ์„ฑ ํฌ๊ธฐ ๋“ฑ๊ณผ ๊ด€๋ จ๋œ ์„ค์ •โ€จ BatchTimeout, โ€จ BatchSize - MaxMessageCountโ€จ AbsoluteMaxBytesโ€จ PreferredMaxBytes ! 3๊ฐ€์ง€ ํŒŒ์ผ์„ ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ƒ์„ฑโ€จ - ์ตœ์ดˆ ๋ธ”๋ก ์ •๋ณด genesis.block - ์•ต์ปค ํ”ผ์–ด ์ •๋ณด anchor.tx (Org1MSPanchor.tx, Org2MSPanchor.tx) - ์ฑ„๋„ ๊ตฌ์„ฑ ์ •๋ณด channel.tx
  9. 9. crypto-config.yaml ! ์ธ์ฆ์„œ ์ƒ์„ฑ์„ ์œ„ํ•œ ์กฐ์ง๊ณผ Peer ๊ฐœ์ˆ˜, ์‚ฌ์šฉ์ž(์–ด๋“œ๋ฏผ ์ œ์™ธ) ์ˆ˜ ์„ค์ •
  10. 10. byfn.sh
  11. 11. ./byfn.sh generate root@ubuntu:~/fabric-samples/first-network# ./byfn.sh generate Generating certs and genesis block for channel 'mychannel' with CLI timeout of '10' seconds and CLI delay of '3' seconds Continue? [Y/n] Y proceeding ... /root/fabric-samples/first-network/../bin/cryptogen ########################################################## ##### Generate certificates using cryptogen tool ######### ########################################################## + cryptogen generate --config=./crypto-config.yaml org1.example.com org2.example.com + res=0 + set +x /root/fabric-samples/first-network/../bin/configtxgen ########################################################## ######### Generating Orderer Genesis block ############## ########################################################## CONSENSUS_TYPE=solo + '[' solo == solo ']' + configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block 2020-02-03 22:57:08.847 KST [common.tools.configtxgen] main -> INFO 001 Loading configuration 2020-02-03 22:57:08.905 KST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 002 orderer type: solo 2020-02-03 22:57:08.906 KST [common.tools.configtxgen.localconfig] Load -> INFO 003 Loaded configuration: /root/fabric-samples/first-network/configtx.yaml 2020-02-03 22:57:08.961 KST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 004 orderer type: solo 2020-02-03 22:57:08.962 KST [common.tools.configtxgen.localconfig] LoadTopLevel -> INFO 005 Loaded configuration: /root/fabric-samples/first-network/configtx.yaml 2020-02-03 22:57:08.965 KST [common.tools.configtxgen] doOutputBlock -> INFO 006 Generating genesis block 2020-02-03 22:57:08.966 KST [common.tools.configtxgen] doOutputBlock -> INFO 007 Writing genesis block + res=0 + set +x ################################################################# ### Generating channel configuration transaction 'channel.tx' ### ################################################################# + configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel 2020-02-03 22:57:09.005 KST [common.tools.configtxgen] main -> INFO 001 Loading configuration 2020-02-03 22:57:09.048 KST [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /root/fabric-samples/first-network/configtx.yaml 2020-02-03 22:57:09.089 KST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 003 orderer type: solo 2020-02-03 22:57:09.090 KST [common.tools.configtxgen.localconfig] LoadTopLevel -> INFO 004 Loaded configuration: /root/fabric-samples/first-network/configtx.yaml 2020-02-03 22:57:09.090 KST [common.tools.configtxgen] doOutputChannelCreateTx -> INFO 005 Generating new channel configtx 2020-02-03 22:57:09.092 KST [common.tools.configtxgen] doOutputChannelCreateTx -> INFO 006 Writing new channel tx + res=0 ์ œ๋„ค์‹œ์Šค ๋ธ”๋ก ์ƒ์„ฑ ์ฑ„๋„ ํ™˜๊ฒฐ์„ค์ • ์•ต์ปคํ”ผ์–ด ์„ค์ • ๋ชจ๋‘/channel-artifacts/ ํ•˜์œ„์— ๊ฒฐ๊ณผํŒŒ์ผ๋กœ ์ €์žฅ
  12. 12. [results] ./byfn.sh generate
  13. 13. CA ์‹ฌํ™”
  14. 14. ! ์ธ์ฆ๊ธฐ๊ด€(CA), ๊ณต๊ฐœํ‚ค, ๊ฐœ์ธํ‚ค, ์ธ์ฆ์„œ(CRT) source : http://soul0.tistory.com/372 intro CA ์‚ดํŽด๋ณด๊ธฐ
  15. 15. hyperledger์˜ ์ธ์ฆ ! ํ•˜์ด๋ŸฌํŽ˜์ €๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋“ค์ด ์ž์‹ ๋“ค์˜ ์ธ์ฆ์„ CA๋ฅผ ํ†ตํ•ด ๋ฐ›๋Š”๋‹ค. ! Root CA ! ์ž์‹ CA ! * ! ์•ž์„œ ์‚ดํŽด๋ณธ cryptogen ์„ ํ†ตํ•ด์„œ CA๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Œโ€จ (Fabric CA Server๋ฅผ ํ†ตํ•ด์„œ๋„ CA๊ตฌ์„ฑ ๊ฐ€๋Šฅ, Fabric-CA Client ๋˜๋Š” Fabric SDK๋ฅผ ํ†ตํ•ด ์„œ๋„ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๋ฐ ์กฐํšŒ ๋“ฑ์˜ ์„œ๋น„์Šค ์ด์šฉ๊ฐ€๋Šฅ) ! ์ธ์ฆ ๋Œ€์ƒโ€จ - ์ „์ฒด ๋„คํŠธ์›Œํฌ, ์ฑ„๋„, ์กฐ์ง(Org), ์กฐ์ง ๊ด€๋ฆฌ์ž(Admin), ์‚ฌ์šฉ์ž(User), Peer source : https://hyperledger-fabric-ca.readthedocs.io/en/latest/users-guide.html CA ์‚ดํŽด๋ณด๊ธฐ
  16. 16. hyperledger MSP ! MSP (Membership Service Provider)๋Š” ๋ฉค๋ฒ„์‰ฝ ์„œ๋น„์Šค ์ œ๊ณต ๋ชฉ์ ์˜ ์ปดํฌ๋„ŒํŠธ ! ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰/์กฐํšŒ/๊ฒ€์ฆํ•˜๋Š” ๋“ฑ ์‚ฌ์šฉ์ž ๋ฐ ์„œ๋น„์Šค์˜ ์ธ์ฆ์— ๋Œ€ํ•œ ์ž‘์—… ! ์กฐ์ง๋งˆ๋‹ค ๋ณดํ†ต ํ•˜๋‚˜์˜ MSP๊ฐ€ ์žˆ์œผ๋ฉฐ MSP ID๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. - ์ „์ฒด ๋„คํŠธ์›Œํฌ, ์ฑ„๋„, ์กฐ์ง(Org), ์กฐ์ง ๊ด€๋ฆฌ์ž(Admin), ์‚ฌ์šฉ์ž(User), Peer // mspID ์™€ certCN ์„ ์กฐ๊ฑด์œผ๋กœ ๊ฒ€์‚ฌํ•˜์—ฌ ํ•จ์ˆ˜์˜ ์‚ฌ์šฉ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์Œ func authenticateOrg(mspID string, certCN string) bool { return (mspID == "Org1MSP") && (certCN == "ca.example.com") } CA ์‚ดํŽด๋ณด๊ธฐ source : https://github.com/hyperledger/fabric/blob/release-1.4/msp/msp.go
  17. 17. check private key ! root@ubuntu:~/fabric-samples/first-network# find | grep -E '/ca.*_sk' | sort ./crypto-config/ordererOrganizations/example.com/ca/d6c3aff453b6947f13e189a3d3cb60f1d42addf2295acca28aed14f3d4827c21_sk ./crypto-config/peerOrganizations/org1.example.com/ca/c9681f8d01403a2be7a2df7b2bd2ebdc691288d64ae0209b6270facf822fa7e1_sk ./crypto-config/peerOrganizations/org2.example.com/ca/36ea9dbed56ffa19a337c3f3b838682ebd11edd84b51fe6e0f700f7e1a3a4044_sk CA ์‚ดํŽด๋ณด๊ธฐ
  18. 18. โ”œโ”€โ”€ ordererOrganizations โ”‚ย ย  โ””โ”€โ”€ example.com โ”‚ย ย  โ”œโ”€โ”€ ca โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ 5a4cfffc67e06260ef685ffa0559975f54912df5127d9bbf0ece4c7b83f9caeb_sk โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ca.example.com-cert.pem โ”‚ย ย  โ”œโ”€โ”€ msp โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ admincerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Admin@example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ cacerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ca.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tlscacerts โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tlsca.example.com-cert.pem โ”‚ย ย  โ”œโ”€โ”€ orderers โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ orderer.example.com โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ msp โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ admincerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Admin@example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ cacerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ca.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ keystore โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ 829584340955b187ecc5b1cef386736fd3666ffcd0600ef3f4bc2015c2e36d34_sk โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ signcerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ orderer.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tlscacerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tlsca.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tls โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ca.crt โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ server.crt โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ server.key โ”‚ย ย  โ”œโ”€โ”€ tlsca โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ 419de30afd02a9ac15cc62acf07509c9497c792cc938d19cbac7484c6ff7455b_sk โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tlsca.example.com-cert.pem โ”‚ย ย  โ””โ”€โ”€ users โ”‚ย ย  โ””โ”€โ”€ Admin@example.com โ”‚ย ย  โ”œโ”€โ”€ msp โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ admincerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Admin@example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ cacerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ca.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ keystore โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ cbd8cba235aafc20622a3056b153129a8dd7efea1a11c0b9b3d75cd94ea47ebd_sk โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ signcerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Admin@example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tlscacerts โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tlsca.example.com-cert.pem โ”‚ย ย  โ””โ”€โ”€ tls โ”‚ย ย  โ”œโ”€โ”€ ca.crt โ”‚ย ย  โ”œโ”€โ”€ client.crt โ”‚ย ย  โ””โ”€โ”€ client.key example.com์˜ ๋น„๋ฐ€ํ‚ค์™€ ์ธ์ฆ์„œ [MSP] ๊ด€๋ฆฌ์ž์šฉ ์ธ์ฆ์„œ [MSP] CA์‹๋ณ„ ์ธ์ฆ์„œ [MSP] TLS ํ†ต์‹ ์šฉ ์ธ์ฆ์„œ orderer.example.com example.com ์ƒ์œ„ ์กฐ์ง์˜ ์–ด๋“œ๋ฏผ ์ธ์ฆ์„œ์™€ CA ์ธ์ฆ์„œ๋ฅผ ๋ณต์‚ฌ org.example.com์˜ ๋น„๋ฐ€ํ‚ค์™€ ์ธ์ฆ์„œ ๊ฐ ๋…ธ๋“œ์˜ HTTPS ํ†ต์‹ ์šฉ ์ธ์ฆ์„œ์™€ ๋น„๋ฐ€ํ‚ค ๊ฐ ์‚ฌ์šฉ์ž์˜์˜ HTTPS ํ†ต์‹ ์šฉ ์ธ์ฆ์„œ์™€ ๋น„๋ฐ€ํ‚ค ๋™์ผ ํŒŒ์ผ ๋™์ผ ํŒŒ์ผ CA ์‚ดํŽด๋ณด๊ธฐ
  19. 19. โ””โ”€โ”€ peerOrganizations โ”œโ”€โ”€ org1.example.com โ”‚ย ย  โ”œโ”€โ”€ ca โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ b6f3f5b3d200ec42cbbe11cff35d7d588b680a0fa10d650d99a7ef1b8470f855_sk โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ca.org1.example.com-cert.pem โ”‚ย ย  โ”œโ”€โ”€ msp โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ admincerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Admin@org1.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ cacerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ca.org1.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ config.yaml โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tlscacerts โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tlsca.org1.example.com-cert.pem โ”‚ย ย  โ”œโ”€โ”€ peers โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ peer0.org1.example.com โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ msp โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ admincerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Admin@org1.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ cacerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ca.org1.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ config.yaml โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ keystore โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ 81d0884d3094c1a56799c113a76a1ddb9989fda14d96e0f793d3e696f23dca2b_sk โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ signcerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ peer0.org1.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tlscacerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tlsca.org1.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tls โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ca.crt โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ server.crt โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ server.key โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ peer1.org1.example.com โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ msp โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ admincerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Admin@org1.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ cacerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ca.org1.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ config.yaml โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ keystore โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ dfc4d5a95b62a6fa6aa0a45f822d068139756b2b40e8b392173491e3f768f6f9_sk โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ signcerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ peer1.org1.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tlscacerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tlsca.org1.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tls โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ca.crt โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ server.crt โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ server.key โ”‚ย ย  โ”œโ”€โ”€ tlsca org*.example.com example.com peer*.org*.example.com โ””โ”€โ”€ users โ”‚ย ย  โ”œโ”€โ”€ Admin@org1.example.com โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ msp โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ admincerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Admin@org1.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ cacerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ca.org1.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ keystore โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ 9e3ebb8985cc6f6c053297825d6bbef822f4c43ea5a7e7d277dd96be1f80e9ec_sk โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ signcerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ Admin@org1.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tlscacerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tlsca.org1.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tls โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ ca.crt โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ client.crt โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ client.key โ”‚ย ย  โ””โ”€โ”€ User1@org1.example.com โ”‚ย ย  โ”œโ”€โ”€ msp โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ admincerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ User1@org1.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ cacerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ ca.org1.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ keystore โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ 0a9f665b540e722ea214dd280904f9a92cbac7b647b4853124174ecf2973c898_sk โ”‚ย ย  โ”‚ย ย  โ”œโ”€โ”€ signcerts โ”‚ย ย  โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ User1@org1.example.com-cert.pem โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tlscacerts โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ tlsca.org1.example.com-cert.pem โ”‚ย ย  โ””โ”€โ”€ tls โ”‚ย ย  โ”œโ”€โ”€ ca.crt โ”‚ย ย  โ”œโ”€โ”€ client.crt โ”‚ย ย  โ””โ”€โ”€ client.key NodeOUs: Enable: true ClientOUIdentifier: Certificate: cacerts/ca.org1.example.com-cert.pem OrganizationalUnitIdentifier: client PeerOUIdentifier: Certificate: cacerts/ca.org1.example.com-cert.pem OrganizationalUnitIdentifier: peer CA ์‚ดํŽด๋ณด๊ธฐ
  20. 20. [์ฐธ๊ณ ] ์ธ์ฆ์„œ ์‚ดํŽด๋ณด๊ธฐ root@fabric:/home/fabric/fabric-samples/first-network/crypto-config/ordererOrganizations/example.com/ca# openssl x509 -text -noout -in ca.example.com-cert.pem Certificate: Data: Version: 3 (0x2) Serial Number: d9:d9:d3:61:6d:0d:28:6f:e2:5d:30:05:82:01:cd:38 Signature Algorithm: ecdsa-with-SHA256 Issuer: C = US, ST = California, L = San Francisco, O = example.com, CN = ca.example.com Validity Not Before: Mar 12 03:40:00 2020 GMT Not After : Mar 10 03:40:00 2030 GMT Subject: C = US, ST = California, L = San Francisco, O = example.com, CN = ca.example.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: 04:c1:e2:fd:33:bc:3d:b9:6b:1b:6a:da:5e:a0:36: 9a:dd:c2:23:9c:c8:7a:ec:b9:e7:54:c4:72:11:19: 85:33:1f:6a:62:e4:1d:c9:ae:e4:e0:2e:12:a0:5e: 7a:d6:c5:51:5c:70:21:29:27:5d:59:d0:17:2b:f9: 4c:0b:f6:9f:d4 ASN1 OID: prime256v1 NIST CURVE: P-256 X509v3 extensions: X509v3 Key Usage: critical Digital Signature, Key Encipherment, Certificate Sign, CRL Sign X509v3 Extended Key Usage: TLS Web Client Authentication, TLS Web Server Authentication X509v3 Basic Constraints: critical CA:TRUE X509v3 Subject Key Identifier: A6:EE:42:3F:D2:81:13:DB:1A:12:3E:5D:57:75:92:43:BD:D8:C4:AE:8C:51:3D:86:28:F9:69:BD:B4:F7:37:0A Signature Algorithm: ecdsa-with-SHA256 30:44:02:20:77:12:a9:2b:27:dd:7e:d7:a5:1f:f4:44:c2:00: b5:e8:ff:b4:cf:07:aa:e4:e5:d2:68:0f:f3:f2:0b:6c:17:c4: 02:20:28:cc:a1:82:4b:e1:0c:38:fa:9e:e8:a9:62:27:29:16: 5a:20:e2:58:bb:b9:2d:ea:f9:f9:5f:a1:b8:c7:2e:e4 CA ์‚ดํŽด๋ณด๊ธฐ
  21. 21. [์ฐธ๊ณ ] hyperledger fabric ca ์‹ค์Šต ! CA Server, Client ์„ค์น˜ ๋ฐ ์‹ค์Šต https://ovila.tistory.com/68 ! Hyperledger Fabric ๋ฉ€ํ‹ฐํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ•ย  https://leejonggun.tistory.com/15 CA ์‚ดํŽด๋ณด๊ธฐ
  22. 22. peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tls --cafile ~์ค‘๋žต~/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem [์ฑ„๋„ ์ƒ์„ฑ ์š”์ฒญ] orderer์— ์ƒ์„ฑ ์š”์ฒญ์‹œ TLS ํ†ต์‹  ์‚ฌ์šฉํ•˜๋ฉฐ TLS์ธ์ฆ์„œ ์œ„์น˜๋ฅผ ์ง€์ •ํ•จ(tlsca.example.com-cert.pem) CORE_PEER_MSPCONFIGPATH =~์ค‘๋žต~/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp CORE_PEER_ADDRESS=peer0.org1.example.com:7051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=~์ค‘๋žต~/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt peer channel join -b mychannel.block [์ฑ„๋„ ์กฐ์ธ ์š”์ฒญ] CORE_PEER_MSPCONFIGPATH =~์ค‘๋žต~/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp CORE_PEER_ADDRESS=peer0.org1.example.com:7051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE =~์ค‘๋žต~/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt export CHANNEL_NAME=mychannel peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile ~์ค‘๋žต~/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem [์ฑ„๋„ ์—…๋ฐ์ดํŠธ ์š”์ฒญ ] orderer์— ์ฑ„๋„ ์—…๋ฐ์ดํŠธ ์š”์ฒญ org1์˜ peer0, peer1 org2์˜ peer0, peer1 ๋ฐฉ์‹ ๋™์ผํ•˜๊ฒŒ ๋ชจ๋‘ ์ˆ˜ํ–‰ /scripts/util.sh ์˜ setGlobalsํ•จ์ˆ˜๋‚ด ์„ค์ • ์ฝ”๋“œ ์ฐธ์กฐ ์ „์ฒด ์‹คํ–‰ ์ˆœ์„œ (1/2) CA ์‚ดํŽด๋ณด๊ธฐ
  23. 23. peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile ~์ค‘๋žต~/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -l golang -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P 'AND ('''Org1MSP.peer''','''Org2MSP.peer''')' [์ฒด์ธ์ฝ”๋“œ ์ธ์Šคํ„ด์Šคํ™”] orderer๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile ~์ค‘๋žต~/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles ~์ค‘๋žต~/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles ~์ค‘๋žต~/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt โ€“c '{"Args":["invoke","a","b","10"]}' [์ฒด์ธ์ฝ”๋“œ ์‹คํ–‰] orderer๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ CORE_PEER_MSPCONFIGPATH=~์ค‘๋žต~/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp CORE_PEER_ADDRESS=peer0.org1.example.com:7051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=~์ค‘๋žต~/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/ [์ฒด์ธ์ฝ”๋“œ ์ธ์Šคํ†จ] peer๋ฅผ ํ†ตํ•ด ์„ค์น˜ ๊ฐ org์˜ anchor peer์— ์„ค์น˜โ€จ org1์˜ peer0 org2์˜ peer0 ๋ฐฉ์‹ ๋™์ผํ•˜๊ฒŒ ๋ชจ๋‘ ์ˆ˜ํ–‰ ์ „์ฒด ์‹คํ–‰ ์ˆœ์„œ (2/2) CA ์‚ดํŽด๋ณด๊ธฐ
  24. 24. docker-compose ์„ค์ • ํŒŒ์ผ ํ™•์ธ docker-compose-cli.yaml์˜ base๊ฐ€ ๋˜๋Š” base/docker-compose-base.yaml์—์„œ๋Š” ./byfn.sh generat๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ์ธ์ฆ์„œ ์ •๋ณด๋ฅผ ๋ณผ๋ฅจ ๋งˆ์šดํŠธํ•˜๊ณ  ๋งˆ์šดํŠธ๋œ ๋„์ปค ์ด๋ฏธ์ง€์˜ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •์„ ํ•จ
  25. 25. ./byfn.sh up ===================== Chaincode is installed on peer0.org2 ===================== Instantiating chaincode on peer0.org2... + res=0 + set +x + peer chaincode instantiate -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc -l golang -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P 'AND ('''Org1MSP.peer''','''Org2MSP.peer''')' โ€ฆ. ์ƒ๋žต โ€ฆ ===================== Chaincode is instantiated on peer0.org2 on channel 'mychannel' ===================== Querying chaincode on peer0.org1... ===================== Querying on peer0.org1 on channel 'mychannel'... ===================== + res=0 + set +x + peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}' Attempting to Query peer0.org1 ...3 secs + res=0 + set +x 100 ===================== Query successful on peer0.org1 on channel 'mychannel' ===================== Sending invoke transaction on peer0.org1 peer0.org2... + peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/ tls/ca.crt --peerAddresses peer0.org2.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt โ€“c '{"Args":["invoke","a","b","10"]}' 2020-02-04 06:05:19.250 UTC [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Chaincode invoke successful. result: status:200 ===================== Invoke transaction successful on peer0.org1 peer0.org2 on channel 'mychannel' ===================== Installing chaincode on peer1.org2... + res=0 + set +x + peer chaincode install -n mycc -v 1.0 -l golang -p github.com/chaincode/chaincode_example02/go/ โ€ฆ. ์ƒ๋žต โ€ฆ ===================== Chaincode is installed on peer1.org2 ===================== Querying chaincode on peer1.org2... ===================== Querying on peer1.org2 on channel 'mychannel'... ===================== + res=0 + set +x
  26. 26. docker-compose-cli ์‚ดํŽด๋ณด๊ธฐ Org1์˜ Peer0์ธ ํ”ผ์–ด์— ์ ‘์†ํ•˜๋„๋ก ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋จ ํ•ด๋‹น ํ”ผ์–ด์— ์ฑ„๋„ ์ƒ์„ฑ, ์ฐธ๊ฐ€, ์•ต์ปค ํ”ผ์–ด ๊ฐฑ์‹ , ์ฒด์ธ์ฝ”๋“œ ์„ค์น˜/์ดˆ๊ธฐํ™”/์งˆ์˜/ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. (createChannel, joinChannel, updateAnchorPeers, installChaincode, instantiateChaincode, chaincodeQuery, chaincodeInvoke) createChannel, joinChannel, updateAnchorPeers, installChaincode, instantiateChaincode, chaincodeQuery, chaincodeInvoke ๋ช…๋ น์€ byfn.sh์˜ networkUpํ•จ์ˆ˜๋‚ด์—์„œ docker exec cli scripts/script.sh $CHANNEL_NAME $CLI_DELAY $LANGUAGE $CLI_TIMEOUT $VERBOSE ๋กœ ํ˜ธ์ถœ๋จ scripts.sh์€ cli ๋„์ปค์— ๋ณผ๋ฅจ ๋งˆ์šดํŠธ๋จ์œผ๋กœ cli ์—์„œ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•จ
  27. 27. chaincode ์œ„์น˜ ํ™•์ธ environment: - GOPATH=/opt/gopath volumes: - /var/run/:/host/var/run/ - ./../chaincode/:/opt/gopath/src/github.com/chaincode - ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ - ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/ - ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts CC_SRC_PATH="github.com/chaincode/chaincode_example02/go/" peer chaincode install -n mycc -v ${VERSION} -l ${LANGUAGE} -p ${CC_SRC_PATH} >&log.txt peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -l ${LANGUAGE} -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer') util.sh script.sh
  28. 28. chaincode ์ˆ˜์ • ๋ฐ ๋ฐฐํฌํ•˜๊ธฐ ./bynf.sh ์—์„œ script.sh์„ docker exec cli scripts/script.sh $CHANNEL_NAME $CLI_DELAY $LANGUAGE $CLI_TIMEOUT $VERBOSE ๋กœ ์‹คํ–‰ํ•จ. ์ฆ‰, cli ๋„์ปค์—์„œ ์ฒด์ธ์ฝ”๋“œ install/instantiate๋ฅผ ์ˆ˜ํ–‰ํ•จ ์ฒด์ธ์ฝ”๋“œ๋ฅผ ์ˆ˜์ • - invoke(stub shim.ChaincodeStubInterface, args []string) ํ•จ์ˆ˜์—์„œโ€จ ์šฐ์ธก ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด -10 ์„ ์ถ”๊ฐ€ ./byfn.sh down ./byfn.sh up ===================== Querying on peer1.org2 on channel 'mychannel'... ===================== + res=0 + set +x + peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}' Attempting to Query peer1.org2 ...3 secs + res=0 + set +x 80 !!!!!!!!!!!!!!! Query result on peer1.org2 is INVALID !!!!!!!!!!!!!!!! ์ˆ˜ํ–‰๊ฒฐ๊ณผ util.sh์˜ chaincodeQueryํ•จ์ˆ˜์—์„œ ๊ธฐ๋Œ€ํ•œ ๊ฒฐ๊ณผ์ธ 90์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์—๋Ÿฌ๋กœ ํ‘œ์‹œํ•˜์˜€์œผ๋‚˜, ์ฒด์ธ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ ์˜๋„์™€ ๋ถ€ํ•ฉํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ docker-compose-cli.yaml์— cli ์ปจํ…Œ์ด๋„ˆ ์ •์˜๋ถ€๋ถ„์— volumes: ../../chaincode/:/opt/gopath/src/github.com/chaincode ์œผ๋กœ ๋ณ€๊ฒฝํ•œ ์ฒด์ธ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ cli ์ปจํ…Œ์ด๋„ˆ์— ๋ณผ๋ฅจ ๋งˆ์šดํŠธํ•˜๋ฏ€๋กœ ๋„์ปค๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ๋ฅผ cli์—์„œ installํ•  ์ˆ˜ ์žˆ์Œ
  29. 29. couchdb ์‚ฌ์šฉํ•˜๊ธฐ ! ./byfn.sh up -c mychannel -s couchdb ๊ฐ’ โ€™90โ€™ ํ™•์ธ๊ฐ€๋Šฅ couch db+fabric tutorial : https://hyperledger-fabric.readthedocs.io/en/release-1.4/couchdb_tutorial.html 4๊ฐœ์˜ couch db๊ฐ€ 4๊ฐœ์˜ peer์— ์—ฐ๊ฒฐ๋˜๋Š” ๊ตฌ์กฐ๋กœ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋™
  30. 30. chaincode docker devmode
  31. 31. ์‚ฌ์ „ ์ค€๋น„ ! docker rm โ€“f $(docker ps โ€“a -q) ! ์ƒ˜ํ”Œ์˜ˆ์ œ๊ฐ€ ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™(fabric-samples/chaincode-docker-devmode) ! 3๊ฐœ์˜ ํ„ฐ๋ฏธ๋„์„ ์˜คํ”ˆํ•˜์—ฌ ์ƒ๊ธฐ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ ! docker-compose-simple.yaml ๊ตฌ์„ฑ ํ™•์ธโ€จ - orderer, peer, cli(์ฒด์ธ์ฝ”๋“œ ์ธ์Šคํ†จ ๋ฐ ์ธํ„ฐ๋ž™์…˜), chaincode(์ฒด์ธ์ฝ”๋“œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ) ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ตฌ์„ฑ cli: container_name: cli image: hyperledger/fabric-tools tty: true โ€ฆ์ค‘๋žตโ€ฆ working_dir: /opt/gopath/src/chaincodedev command: /bin/bash -c './script.sh' volumes: โ€ฆ์ค‘๋žตโ€ฆ - ./../chaincode:/opt/gopath/src/chaincodedev/chaincode - ./:/opt/gopath/src/chaincodedev/ chaincode: container_name: chaincode image: hyperledger/fabric-ccenv tty: true environment: โ€ฆ์ค‘๋žตโ€ฆ - CORE_PEER_ADDRESS=peer:7051 โ€ฆ์ค‘๋žตโ€ฆ working_dir: /opt/gopath/src/chaincode command: /bin/bash -c 'sleep 6000000' volumes: โ€ฆ์ค‘๋žตโ€ฆ - ./../chaincode:/opt/gopath/src/chaincode source : https://github.com/hyperledger/fabric-samples/tree/release-1.4/chaincode-docker-devmode
  32. 32. Terminal 1 - Start the network ! docker-compose -f docker-compose-simple.yaml up source : https://github.com/hyperledger/fabric-samples/tree/release-1.4/chaincode-docker-devmode
  33. 33. Terminal 2 - Build & start the chaincode ! docker exec -it chaincode sh ! cd /opt/gopath/src/chaincode ! cd chaincode_example02/go ! go build -o chaincode_example02 ! CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:0 ./chaincode_example02 docker exec โ€“it chaincode /bin/bash source : https://github.com/hyperledger/fabric-samples/tree/release-1.4/chaincode-docker-devmode Normally chaincodes are started and maintained by peer. However in โ€œdev mode", chaincode is built and started by the user. ! BYFN ์—์„œ๋Š” peer๋ฅผ ํ†ตํ•ด ์‹œ์ž‘/๊ด€๋ฆฌํ•˜๊ณ  cli ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ฒด์ธ์ฝ”๋“œ ์„ค์น˜ ๋ฐ ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜์˜€์œผ๋‚˜, ๋ณธ ์˜ˆ์ œ์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์œ„ ๋ช…๋ น์„ ํ†ตํ•ด ์ฒด์ธ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์‹คํ–‰ ์ƒํƒœ๋กœ ๋งŒ๋“ ๋‹ค. docker-compose-simple.yaml ์˜ peer ์ปจํ…Œ์ด๋„ˆ Command ์„น์…˜์— โ€”peer-chaincodedev = true ๋ผ๊ณ  ์„ค์ •๋จ
  34. 34. Terminal 3 - Use the chaincode ! docker exec -it cli bash ! peer chaincode install -p chaincodedev/chaincode/chaincode_example02/go -n mycc -v 0 ! peer chaincode instantiate -n mycc -v 0 -c '{"Args":["init","a","100","b","200"]}' -C myc ! peer chaincode invoke -n mycc -c '{"Args":["invoke","a","b","10"]}' -C myc ! peer chaincode query -n mycc -c '{"Args":["query","a"]}' -C myc source : https://github.com/hyperledger/fabric-samples/tree/release-1.4/chaincode-docker-devmode source : https://nick-fabric.readthedocs.io/en/latest/commands/peerchaincode.html ์—ฌ๊ธฐ๊นŒ์ง€๋Š” Build Your First Network ์ฒด์ธ์ฝ”๋“œ์™€ ๋™์ผํ•˜๋‹ค. ์ด์ œ ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค์‹œ ๋ฐฐํฌํ•ด ๋ณด์ž. terminal2 ์—์„œ chaincode๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ๋ฐœ์ƒ
  35. 35. local development env. ! visual studio code ์„ค์น˜ + GO addon ์ถ”๊ฐ€ ์„ค์น˜ ! visual studio code ์—์„œ ์†Œ์Šค ์ถ”์  ๋ฐ ๋นŒ๋“œ ๊ฐ€๋Šฅ $GOROOT/src/ ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด hlf ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ mkdir -p github.com/hyperledger cd github.com/hyperledger/ git clone -b release-1.4 https://github.com/wonyongHwang/fabric.git ์šฐ์ธก ๊ทธ๋ฆผ์˜ ์†Œ์Šค๋Š” $GOPATH/src/[์ž„์˜ ํด๋”๋ช…]/chiancode_example.go์— ์œ„์น˜์‹œํ‚ด % pwd /Users/hwang-won-yong/go/src/sacc % ls chaincode_example02.go Visual studio Go extension์˜ settings.jon ์„ค์ •๋‚ด์šฉ: { "go.formatTool": "goimports", "go.useLanguageServer": true } ์ƒ๊ธฐ ์„ค์ • ์ดํ›„ VS ์žฌ์‹œ์ž‘ โ€”> ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋ฐ‘ ์ค„์ด ๋ณด์ด๊ณ , ํ•ด๋‹น ์ •์˜๋ถ€๋กœ ์ด๋™๋„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋จ
  36. 36. chaincode download/upload via sftp ! ftp root access/login ํ—ˆ์šฉ ! Visual Studio Code์— ftp simple plugin ์„ค์น˜ ! F1์„ ๋ˆ„๋ฅธ ๋‹ค์Œ ย ftp-simple:Config - FTP connection setting ๋ฅผ ์„ ํƒํ•˜๊ณ  ์šฐ์ธกโ€จ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ํŽธ์ง‘ ! F1์„ ๋ˆ„๋ฅธ ๋‹ค์Œ tp-simple:Open - Open the file directly from FTP server๋ฅผ ์„ ํƒโ€จ ํ•˜๊ณ  localhost๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ ‘์†๋จ ! ์ ‘์† ์ดํ›„ ์ฒด์ธ์ฝ”๋“œ ํด๋ฆญํ•˜์—ฌ ํŽธ์ง‘์ฐฝ์—์„œ ์˜คํ”ˆ ! $GOPATHSRCchaincode_example02 ํด๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ โ€จ ํ•ด๋‹น ํด๋” ํ•˜์œ„์— chaincode_example02.go ํŒŒ์ผ๋กœ save asโ€ฆ ํ•œ๋‹ค. (์†Œ์Šค ๋ถ„์„์šฉ) visual studio code ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ ์ถœ์ฒ˜ : https://www.manualfactory.net/10964
  37. 37. chaincode ์ˆ˜์ • ! ๊ณต์‹ ํŠœํ† ๋ฆฌ์–ผ์„ ์ฐธ์กฐํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ • ๊ณต์‹ ํŠœํ† ๋ฆฌ์–ผ : https://hyperledger-fabric.readthedocs.io/en/release-1.4/chaincode4ade.html#terminal-1-start-the-network funcย (tย *SimpleChaincode)ย Invoke(stubย shim.ChaincodeStubInterface)ย pb.Responseย { ย ย ย ย fmt.Println("ex02ย Invoke") ย ย ย ย function,ย argsย :=ย stub.GetFunctionAndParameters() ย ย ย ย ifย functionย ==ย "invoke"ย { ย ย ย ย ย ย ย ย //ย Makeย paymentย ofย Xย unitsย fromย Aย toย B ย ย ย ย ย ย ย ย returnย t.invoke(stub,ย args) ย ย ย ย }ย elseย ifย functionย ==ย "delete"ย { ย ย ย ย ย ย ย ย //ย Deletesย anย entityย fromย itsย state ย ย ย ย ย ย ย ย returnย t.delete(stub,ย args) ย ย ย ย }ย elseย ifย functionย ==ย "query"ย { ย ย ย ย ย ย ย ย //ย theย oldย "Query"ย isย nowย implemtnedย inย invoke ย ย ย ย ย ย ย ย returnย t.query(stub,ย args) ย ย ย ย }ย elseย ifย functionย ==ย "set"ย { ย ย ย ย ย ย ย ย //ย theย oldย "Query"ย isย nowย implemtnedย inย invoke ย ย ย ย ย ย ย ย returnย t.set(stub,ย args) ย ย ย ย } ย ย ย ย returnย shim.Error("Invalidย invokeย functionย name.ย Expectingย "invoke"ย "delete"ย "query"") } funcย (tย *SimpleChaincode)ย set(stubย shim.ChaincodeStubInterface,ย argsย []string)ย pb.Responseย { ย ย ย ย varย Aย string ย ย ย ย varย Avalย int ย ย ย ย varย errย error ย ย ย ย ifย len(args)ย !=ย 2ย { ย ย ย ย ย ย ย ย returnย shim.Error("Incorrectย numberย ofย arguments.ย Expectingย 2") ย ย ย ย } ย ย ย ย Aย =ย args[0] ย ย ย ย Aval,ย errย =ย strconv.Atoi(args[1]) ย ย ย ย fmt.Printf("###################ย Avalย =ย %d",ย Aval) ย ย ย ย ifย errย !=ย nilย { ย ย ย ย ย ย ย ย returnย shim.Error("ITย ISย NOTย ANย INTEGERย VALUE") ย ย ย ย } ย ย ย ย errย =ย stub.PutState(A,ย []byte(args[1])) ย ย ย ย ifย errย !=ย nilย { ย ย ย ย ย ย ย ย returnย shim.Error(err.Error()) ย ย ย ย } ย ย ย ย returnย shim.Success(nil) } ์ฝ”๋“œ ์ˆ˜์ • ํ›„ ๋นŒ๋“œ ํ…Œ์ŠคํŠธ
  38. 38. chaincode ๋ฐฐํฌ ๋ฐ ํ…Œ์ŠคํŠธ ! docker-compose โ€“f docker-compose-simple.yaml down ! docker-compose โ€“f docker-compose-simple.yaml up ! ์ด์ „ terminal2, terminal3์—์„œ ์ˆ˜ํ–‰ํ–ˆ๋˜ ๋‚ด์šฉ ๋™์ผ ๋ฐ˜๋ณตํ•˜๊ณ  ์ฝ”๋“œ์—์„œ ์ถ”๊ฐ€ํ•œ set ๋ช…๋ น ์— ๋Œ€ํ•ด ์ถ”๊ฐ€๋กœ ํ™•์ธ peer chaincode instantiate -n mycc -v 0 -c '{"Args":["init","a","100","b","200"]}' -C myc peer chaincode invoke -n mycc -c '{"Args":["invoke","a","b","10"]}' -C myc peer chaincode query -n mycc -c '{"Args":["query","a"]}' -C myc peer chaincode invoke -n mycc -c '{"Args":["set","a","1000"]}' -C myc peer chaincode query -n mycc -c '{"Args":["query",โ€œa"]}' -C myc Aval = 100, Bval = 200 ex02 Invoke Aval = 80, Bval = 210 ex02 Invoke Query Response:{"Name":"a","Amount WOW":"80"} ex02 Invoke ################### Aval = 1000 ex02 Invoke Query Response:{"Name":"a","Amount WOW":"1000"} terminal2 terminal3
  39. 39. [์ฐธ๊ณ ] peer chaincode upgrade ! ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋™ ์ƒํƒœ์—์„œ ์ฒด์ธ์ฝ”๋“œ ์—…๊ทธ๋ ˆ์ด๋“œ ์‹ค์‹œ ! VS CODE ์—์„œ ์†Œ์Šค ๋ณ€๊ฒฝ ๋ฐ ์ €์žฅ/์—…๋กœ๋“œ terminal2 go build -o chaincode_example02 CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mycc:1 ./chaincode_example02 terminal3 peer chaincode install -p chaincodedev/chaincode/chaincode_example02/go -n mycc -v 1 peer chaincode upgrade -p chaincodedev/chaincode/chaincode_example02/go -n mycc -v1 -C myc -c '{"Args":["init","a","100","b","200"]}' peer chaincode invoke -n mycc -c '{"Args":["invoke","a","b","10"]}' -C myc peer chaincode query -n mycc -c '{"Args":["query","a"]}' -C myc peer chaincode invoke -n mycc -c '{"Args":["set","a","1000"]}' -C myc ์†Œ์Šค ์ˆ˜์ • -> ๋กœ์ปฌ ๋นŒ๋“œ -> FTP ์—…๋กœ๋“œ ์ƒˆ๋กœ์šด terminal์„ ๋„์›Œ์„œ ์œ„ terminal2์˜ ๋‚ด์šฉ์„ ์ˆ˜ํ–‰ํ•จ ๊ธฐ์กด terminal2๋Š” ์—…๊ทธ๋ ˆ์ด๋“œ ์™„๋ฃŒ์‹œ peer์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋” ์ด์ƒ ํ•˜์ง€ ์•Š๊ฒŒ ๋จ
  40. 40. [chaincode dev.] PutState ์‹ค์Šต func (t *SimpleChaincode) more(stub shim.ChaincodeStubInterface, param []string) pb.Response { if len(param) != 3 { return shim.Error("# of parameter mismatching") } title, text, code := param[0], param[1], param[2] codeNum, err := strconv.ParseInt(code, 10, 32) if err != nil { return shim.Error("code error") } if len(title) == 0 || len(text) == 0 || len(code) == 0 { return shim.Error("value of paramter is not properly formatted") } // make my data of AdditionalInfo addInfo := &AdditionalInfo{Title: title, Text: text, code: codeNum} addInfoBytes, err := json.Marshal(addInfo) if err != nil { return shim.Error("failed to convert bytes " + err.Error()) } err = stub.PutState(title, addInfoBytes) // key value์— ๊ณต๋ฐฑ ๋“ค์–ด๊ฐ€๋ฉด ์กฐํšŒ์‹œ ๊ฐ’์„ ์ฐพ์ง€ ๋ชปํ•จ if err != nil { return shim.Error("PutState failure " + err.Error()) } return shim.Success([]byte("invoke success")) } invoke์— more ํ•จ์ˆ˜ ์ถ”๊ฐ€ํ•˜๊ณ  ๋กœ์ปฌ๋นŒ๋“œ -> ftp ์—…๋กœ๋“œ -> Terminal2์—์„œ ์„œ๋ฒ„๋นŒ๋“œ ๋ฐ ์‹คํ–‰ -> Terminal3์—์„œ CC์ธ์Šคํ†จ ๋ฐ ์—…๊ทธ๋ ˆ์ด๋“œ -> ์•„๋ž˜์™€ ๊ฐ™์ด ํ…Œ์ŠคํŠธ peer chaincode invoke -n mycc -c '{"Args":["more","tt","Here your are, this is a book 2","1200"]}' -C myc type AdditionalInfo struct { Title string "json:"title"" Text string "json:"text"" code int64 "json:"code"" }
  41. 41. [chaincode dev.] GetState ์‹ค์Šต func (t *SimpleChaincode) morequery(stub shim.ChaincodeStubInterface, args []string) pb.Response { var A string // Entities var err error if len(args) != 1 { return shim.Error("Incorrect number of arguments. Expecting name of the person to query") } A = args[0] // Get the state from the ledger valbytes, err := stub.GetState(A) if err != nil { jsonResp := "{"Error":"Failed to get state for " + A + ""}" return shim.Error(jsonResp) } valueStr := &AdditionalInfo{} err = json.Unmarshal(valbytes, &valueStr) if err != nil { jsonResp := "{"Error":"Failed to Unmarshal " + A + ""}" return shim.Error(jsonResp) } jsonResp := "{"Title":"" + A + "","Text":"" + string(valueStr.Text) + ""}" fmt.Printf("Query Response:%sn", jsonResp) // history iter, _ := stub.GetHistoryForKey(A) fmt.Println("Here is History for " + A) for iter.HasNext() { kv, _ := iter.Next() fmt.Println(string(kv.GetValue()) + " " + kv.GetTimestamp().String()) } return shim.Success([]byte(string(valueStr.code))) } query์— morequery ํ•จ์ˆ˜ ์ถ”๊ฐ€ํ•˜๊ณ  ๋กœ์ปฌ๋นŒ๋“œ -> ftp ์—…๋กœ๋“œ -> Terminal2์—์„œ ์„œ๋ฒ„๋นŒ๋“œ ๋ฐ ์‹คํ–‰ -> Terminal3์—์„œ CC์ธ์Šคํ†จ ๋ฐ ์—…๊ทธ๋ ˆ์ด๋“œ -> ์•„๋ž˜์™€ ๊ฐ™์ด ํ…Œ์ŠคํŠธ peer chaincode query -n mycc -c '{"Args":["morequery","tt"]}' -C myc GetHistoryForKey ํ•จ์ˆ˜๋กœ ๋ณ€๊ฒฝ ์ด๋ ฅ ์กฐํšŒ Git hub : https://github.com/wonyongHwang/chaincode-tutorial/blob/master/kopoChainCode.go
  42. 42. [์ฐธ๊ณ ] ๊ณต์‹ ํŠœํ† ๋ฆฌ์–ผ ์ฒด์ธ์ฝ”๋“œ์—์„œโ€ฆ source : https://hyperledger-fabric.readthedocs.io/en/release-1.4/chaincode4ade.html#terminal-1-start-the-network main ํ•จ์ˆ˜์—์„œ fabric chaincode์˜ Start ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ์ด ๋•Œ ์ „๋‹ฌ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” type SimpleAsset struct{} ์˜ ๊ฐ์ฒด์ž„. ์†Œ์Šค์ฝ”๋“œ์ƒ SimpleAsset์˜ Init,Invoke ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์œผ๋ฏ€๋กœ ChainCode ๊ฐ์ฒด๋กœ ์ „๋‹ฌ ๊ฐ€๋Šฅ
  43. 43. [์ฐธ๊ณ ] ์ฒด์ธ์ฝ”๋“œ ํ˜ธ์ถœ ! ๋™์ผ ์ฑ„๋„์—์„œ ๊ฐ™์€/๋‹ค๋ฅธ Chaincode ํ˜ธ์ถœ(invoke/query) ๊ฐ€๋Šฅ ! ๋‹ค๋ฅธ ์ฑ„๋„์˜ chaincode๋Š” ์กฐํšŒ(query)๋งŒ ๊ฐ€๋Šฅ -์˜ˆ์‹œ- channel := stub.GetChannelID() stub.InvokeChaincode(chaincodeName, args, channel)
  44. 44. Hyperledger fabric SDK
  45. 45. Balance transfer example (๊ฐœ์š”) ! 2 CA, x Orderer, 2 Peer ๋กœ ๊ตฌ์„ฑ ! ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” Build Your Network First์™€ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ์ด๋‚˜, ์—ฌ๊ธฐ์„œ๋Š” cli ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—†์Œ. ๋Œ€์‹  Hyperledger fabric SDK๋ฅผ ์ด์šฉํ•œ node.js๊ตฌํ˜„์ฒด๋ฅผ ํ†ตํ•ด์„œ ์ฑ„๋„์ƒ์„ฑ, ์ฒด์ธ์ฝ”๋“œ ์„ค์น˜ ๋“ฑ์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋จ. ! Build Your Network First์˜ ๊ธฐ๋ณธ ์‹คํ–‰ ๊ตฌ์กฐ์—์„œ๋Š” CA ์„œ๋ฒ„ ์—†์ด cryptogen์„ ํ†ตํ•ด ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด ๋†“์€ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์‹  ํ•˜์˜€์œผ๋‚˜, ์ด๋ฒˆ ์˜ˆ์ œ๋Š” ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•œ ์ธ์ฆ์„œ ์ •๋ณด๋ฅผ ํ† ๋Œ€๋กœ CA์„œ๋ฒ„๋ฅผ ๊ธฐ๋™ํ•˜๊ณ , Node.js Client์—์„œ ์š”์ฒญํ•˜๋Š” ์‚ฌ์šฉ์ž ๋“ฑ๋ก์„ CA ์„œ๋ฒ„์—์„œ ์ธ์ฆํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ตฌ์„ฑ ๋˜์—ˆ์Œ * ํ•ด๋‹น ์˜ˆ์ œ ํด๋”์— ์œ„์น˜ํ•œ ~e2e.yaml ๋กœ ์‹คํ–‰์‹œ ca ์„œ๋ฒ„ ๊ธฐ๋™๋จ
  46. 46. Balance transfer example (์‹คํ–‰ ์ค€๋น„) ! ๋…ธ๋“œ ๋ฒ„์ „ ํ™•์ธ(node -v) balance transfer ์˜ˆ์ œ๋Š” ๋…ธ๋“œ ๋ฒ„์ „ 10.x ์ด์ƒ์—์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ -> 8.* ๋˜๋Š” 9.* ์„ค์น˜ ๊ธฐ์กด node.js ์‚ญ์ œ์‹œ : apt-get --purge remove nodejs node.js ์„ค์น˜ : curl -sL http://deb.nodesource.com/setup_9.x | bash - apt-get install node.js * ํ•ด๋‹น ์˜ˆ์ œ๋Š” fabric 2.0 ๊ธฐ๋ณธ ์ƒ˜ํ”Œ์˜ˆ์ œ์—์„œ ์‚ญ์ œ๋จ(fabric 1.4์—์„œ ์‹คํ–‰๊ถŒ์žฅ) ! ์ปจํ…Œ์ด๋„ˆ ๋ฐ ์ด๋ฏธ์ง€ ๋“ฑ ๋„์ปค๊ด€๋ จ ํŒŒ์ผ ์‚ญ์ œ (์ถฉ๋Œ๋ฐฉ์ง€) docker rm -f $(docker ps -a -q) docker rmi -f $(docker images -a -q) docker volume prune docker system prune docker network prune
  47. 47. Balance transfer example (fabric ์‹คํ–‰) ! ./runApp.sh ์‹คํ–‰
  48. 48. Balance transfer example (REST ํ˜ธ์ถœ) ./testAPIs.sh ์„ ์‹คํ–‰ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๋“ฑ๋ก~์ฒด์ธ์ฝ”๋“œ ์‹คํ–‰๊นŒ์ง€ ์ •์ƒ ์ง„ํ–‰ ๋˜๋Š”์ง€ ํ™•์ธ * chaincode instantiate ์‹คํ–‰์‹œ time out ์œผ๋กœ ์˜ค๋ฅ˜๋ฐœ์ƒ๋˜๋Š” ๊ฒฝ์šฐ, ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด testAPIs.sh์˜ ์ผ๋ถ€๋ถ„์„ ์ˆ˜์ • (timeout ์˜ต์…˜ ์ถ”๊ฐ€)
  49. 49. [์‹ฌํ™”] ๋” ์‚ดํŽด๋ณผ ํฌ์ธํŠธ ! ./testAPIs.sh ์˜ REST CALL ํ˜ธ์ถœ ์ˆœ์„œ์™€ ๋‚ด์šฉ์„ ํ™•์ธ ! Node ์†Œ์Šค๋Š” app.js๊ฐ€ ์‹œ์ž‘์  ! ์‚ฌ์šฉ์ž ๋“ฑ๋ก์„ ์œ„ํ•ด /users ํ˜ธ์ถœ์‹œ์—๋Š” fabric ca server๋ฅผ ํ†ตํ•ด ์‹ ๊ทœ ์‚ฌ์šฉ์ž ๋“ฑ๋ก์„ ํ•˜๊ณ  ํ† ํฐ์„ ๋ถ€์—ฌํ•จ ! /users ์ด์™ธ์˜ ํ˜ธ์ถœ ์ฃผ์†Œ๋Š” JWT ํ† ํฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์ด๋ฃจ์–ด์ง ! Proposal์„ ๋จผ์ € endorsing peer์— ๋ณด๋‚ด๊ณ , ํ•ด๋‹น ํ”ผ์–ด์—์„œ ์‚ฌ์ „ ๊ฒ€์ฆํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ณ  orderer์—๊ฒŒ ๊ฒ€์ฆ๊ฒฐ๊ณผ์™€ ํŠธ๋žœ์žญ์…˜ ๋ฐ˜์˜์š”์ฒญ์„ ํ•˜๋Š” ๋ถ€๋ถ„ โ€”> invoke-tansaction.js์˜ sendTransactionProposal ๋ฐ sendTransaction ํ˜ธ์ถœ ์ฝ”๋“œ ์ฐธ์กฐโ€จ
  50. 50. [์‹ฌํ™”] sdk๋ฅผ ์ด์šฉํ•œ ์‚ฌ์šฉ์ž ๋“ฑ๋ก ๊ณผ์ • ! ๊ธฐ ๋ฐœ๊ธ‰๋ฐ›์€ ์ธ์ฆ์„œ๋ฅผ ์ด์šฉ ! app.post('/users', async function(req, res) { โ€ฆ let response = await helper.getRegisteredUser(username, orgName, true); โ€ฆ} app.js Network-config.yaml๊ณผ org1.yaml ์„ค์ •ํŒŒ์ผ์„ ๋กœ๋”ฉํ•˜์—ฌ initCredential์„ ์ˆ˜ํ–‰ ๋“ฑ๋ก๋œ ์‚ฌ์šฉ์ž ์—†๋Š” ๊ฒฝ์šฐ; config.json์˜ admin/adminpw ๊ณ„์ •์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋ฅผ ๋“ฑ๋ก(getCertificateAuthority๋กœ ์ธ์ฆ์„œ ๋กœ๋”ฉ)
  51. 51. [์‹ฌํ™”] fabric ca container Node sdk client์˜ config.js์— ์„ค์ •๋œ ๊ณ„์ •์ •๋ณด์™€ ์ผ์น˜ํ•ด์•ผ ํ•จ "admins":[ { "username":"admin", "secret":"adminpw" } ]
  52. 52. [์ฐธ๊ณ ] fabric server <-> node.js(SDK) local โ€”> ๋กœ์ปฌ์—์„œ node.js ๋””๋ฒ„๊น…์„ visual studio๋กœ ํŽธํ•˜๊ฒŒ ์ง„ํ–‰ ๊ฐ€๋Šฅํ•จ
  53. 53. [์ฐธ๊ณ ] fabric server <-> node.js(SDK) local ์‚ฌ์ „ ์ค€๋น„์‚ฌํ•ญ - local pc visual studio code ์„ค์น˜ nvm ์„ค์น˜(https://gofnrk.tistory.com/32) balance transfer ์˜ˆ์ œ local ๋ณต์‚ฌ + npm rebuild virtual box ํฌํŠธ ์˜คํ”ˆ (์œ ์ € ๋“ฑ๋ก์„ ์œ„ํ•ด์„œ ca ์„œ๋ฒ„ ์ ‘์†ํ•„์š”โ€”> 7054 ํฌํŠธ ์—ฐ๊ฒฐ ์„ค์ •) (์ฒด์ธ์ฝ”๋“œ ์‹คํ–‰ ๋ฐ ์ฟผ๋ฆฌ ๋“ฑ์„ ์œ„ํ•ด์„œ ์˜ค๋”๋Ÿฌ(7050) ๋“ฑ ํ•„์š”์‹œ ์ถ”๊ฐ€๋กœ ํฌํŠธ ์—ฐ๊ฒฐ ์„ค์ •ํ•ด์•ผ ํ•จ) - ์ˆ˜ํ–‰ ์ˆœ์„œ fabric server ๊ธฐ๋™(./runApp.sh) -> ๋กœ์ปฌ์—์„œ node ์‹คํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์„œ๋ฒ„์ธก์—์„œ๋Š” node ์‹คํ–‰๋ถ€๋ถ„ ์ฃผ์„์ฒ˜๋ฆฌ local์˜ balance transfer ์˜ˆ์ œ ํด๋” ์ค‘ ์ธ์ฆํ† ํฐ๊ณผ ๊ด€๋ จ๋œ ํด๋” ์‚ญ์ œ rm -rf fabric-client-kv-org* REST ํ˜ธ์ถœ ์ˆ˜ํ–‰ hwang-won-yong@hwang-won-yong-ui-MacBookPro balance-transfer % curl -s -X POST http://localhost:4000/users -H "content-type: application/x-www-form-urlencoded" -d 'username=Jim&orgName=Org1' {"success":true,"secret":"","message":"Jim enrolled Successfully","token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1ODQyMjU1NjMsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Ik9yZzEiLCJpYXQiOjE1ODQxODk1NjN9.h2v6HzQJdDSUryGEsqPyUbV9SK91GGgTF4_7LCzg "}% ์‚ฌ์šฉ์ž ๋“ฑ๋ก
  54. 54. hwang-won-yong@hwang-won-yong-ui-MacBookPro balance-transfer % curl -s -X POST http://localhost:4000/channels -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1ODQyMjc3OTIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Ik9yZzEiLCJpYXQiOjE1ODQxOTE3OTJ9.dnZ7eBzsC4v cQtIiHSHtuLFY2U-E4FH2zcUJ2sftKP0" -H "content-type: application/json" -d '{ "channelName":"mychannel", "channelConfigPath":"../artifacts/channel/mychannel.tx" }' {"success":true,"message":"Channel 'mychannel' created Successfully"}% hwang-won-yong@hwang-won-yong-ui-MacBookPro balance-transfer % curl -s -X POST http://localhost:4000/channels/mychannel/peers -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1ODQyMjc3OTIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Ik9yZzEiLCJpYXQiOjE1ODQxOTE3OTJ9.dnZ7eBzsC4v cQtIiHSHtuLFY2U-E4FH2zcUJ2sftKP0" -H "content-type: application/json" -d '{ "peers": ["peer0.org1.example.com","peer1.org1.example.com"] }' {"success":true,"message":"Successfully joined peers in organization Org1 to the channel:mychannel"} Create channel์„ ์œ„ํ•ด์„œ ์˜ค๋”๋Ÿฌ์— ํ•ด๋‹นํ•˜๋Š” 7050 ํฌํŠธ ์„ค์ • ํ•„์š” Join channel์„ ์œ„ํ•ด์„œ ํ”ผ์–ด์— ํ•ด๋‹นํ•˜๋Š” 7051์™€ 7056 ํฌํŠธ ์„ค์ • ํ•„์š” [์ฐธ๊ณ ] fabric server <-> node.js(SDK) local
  55. 55. hwang-won-yong@hwang-won-yong-ui-MacBookPro balance-transfer % curl -s -X POST http://localhost:4000/channels/mychannel/anchorpeers -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1ODQyMjc3OTIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Ik9yZzEiLCJpYXQiOjE1ODQxOTE3OTJ9.dnZ7eBzsC4v cQtIiHSHtuLFY2U-E4FH2zcUJ2sftKP0" -H "content-type: application/json" -d '{ "configUpdatePath":"../artifacts/channel/Org1MSPanchors.tx" }' {"success":true,"message":"Successfully update anchor peers in organization Org1 to the channel 'mychannel'"}% [์ฐธ๊ณ ] fabric server <-> node.js(SDK) local Anchor Peer Update hwang-won-yong@hwang-won-yong-ui-MacBookPro node % curl -s -X POST http://localhost:4000/chaincodes -H "authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1ODQyMjc3OTIsInVzZXJuYW1lIjoiSmltIiwib3JnTmFtZSI6Ik9yZzEiLCJpYXQiOjE1ODQxOTE3OTJ9.dnZ7eBzsC4vcQtIiHSHtuLFY2U-E4FH2zcUJ2sftKP0" -H "content-type: application/json" -d "{ "peers": ["peer0.org1.example.com","peer1.org1.example.com"], "chaincodeName":"mycc", "chaincodePath":"/github.com/example_cc/node", "chaincodeType": "golang", "chaincodeVersion":"v0" }" {"success":true,"message":"Successfully installed chaincode"}% Install Chaincode โ€”> ๋‚˜๋จธ์ง€ REST Call๋„ ํ•„์š”์‹œ ํฌํŠธ ์„ค์ •ํ•ด๊ฐ€๋ฉด์„œ ํ…Œ์ŠคํŠธ ๋ฐ ๋””๋ฒ„๊น… ์ง„ํ–‰~
  56. 56. Thanksโ€ฆ wyhwang@kopo.ac.kr
  57. 57. chaincode dev. setup from docs FAILED
  58. 58. source : https://openblockchain.readthedocs.io/en/latest/dev-setup/devenv/#setting-up-the-development-environment FAILED
  59. 59. git clone -b release-1.4 https://github.com/wonyongHwang/fabric.git FAILED
  60. 60. v2.0 ๋ถ€ํ„ฐ devenv ๋””๋ ‰ํ† ๋ฆฌ ์—†์Œ vagrant ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•จ FAILED
  61. 61. v1.4 v2.0์—์„œ๋Š” deprecated make ๋กœ ๋ฐ”๋กœ ๋นŒ๋“œ ์ˆ˜ํ–‰ vagrant@vagrant:~/go/src/github.com/hyperledger/fabric$ cd build/bin vagrant@vagrant:~/go/src/github.com/hyperledger/fabric/build/bin$ ll total 160944 drwxrwxrwx 1 vagrant vagrant 4096 Feb 11 12:44 ./ drwxrwxrwx 1 vagrant vagrant 0 Feb 11 12:53 ../ -rwxrwxrwx 1 vagrant vagrant 20399368 Feb 11 12:44 configtxgen* -rwxrwxrwx 1 vagrant vagrant 17444176 Feb 11 12:44 configtxlator* -rwxrwxrwx 1 vagrant vagrant 13358893 Feb 11 12:44 cryptogen* -rwxrwxrwx 1 vagrant vagrant 19139370 Feb 11 12:44 discover* -rwxrwxrwx 1 vagrant vagrant 12375285 Feb 11 12:44 idemixgen* -rwxrwxrwx 1 vagrant vagrant 32163704 Feb 11 12:44 orderer* -rwxrwxrwx 1 vagrant vagrant 49909440 Feb 11 12:33 peer* vagrant@vagrant:~/go/src/github.com/hyperledger/fabric/build/bin$ ./peer FAILED
  62. 62. sudo mkdir -p /var/hyperledger/production sudo chown -R $(whoami):$(whoami) /var/hyperledger FAILED
  63. 63. local development setting FAILED
  64. 64. ! https://golang.org/dl/ ! https://hub.docker.com/editions/community/docker-ce-desktop-windows window-build-tools IBM Blockchain Platform ์„ค์น˜๋Š” ๊ฐ€์žฅ ๋‚˜์ค‘์— ํ•ด์•ผ ํ•จ FAILED
  65. 65. visual studio code ์„ค์ • ํŽธ์ง‘ ๋ฐ โ€จ ์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ! create project ! go ! browse chaincode.go ์˜ init, invoke ํ•จ์ˆ˜ ํ™•์ธ FAILED
  66. 66. ํŒจํ‚ค์ง€๋ช…, ๋ฒ„์ „๋ช… : 1 fabric ๊ธฐ๋™ FAILED

ร—