SlideShare a Scribd company logo
hyperledger fabric
V2.0
Precondition
! Ubuntu 18.04 LTS or Above
! Docker Install (Latest version)
apt-get install libltdl-dev
! 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
! curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-
compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
dockerโ€“compose โ€“version
https://phoenixnap.com/kb/install-docker-compose-ubuntu
environment setup
! ubuntu 16.04 or higher (weโ€™ve installed ubuntu 18.04โ€ฆ)
! root ๊ถŒํ•œ์œผ๋กœ ์„ค์น˜
! apt-get update
! apt-get install curl
! apt-get install python-pip
! apt-get install make gcc g++ libtool
! apt-get install tree
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.13.12.linux-amd64.tar.gz
tar -C /usr/local/ -xvf go1.13.12.linux-amd64.tar.gz
! Go ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • vi /etc/profile
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
source /etc/profile
go version
environment setup
! 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
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
curl -sSL https://bit.ly/2ysbOFE | bash -s
Build your first network
๊ฐœ์š”
! 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
Org1MSP - Peer 0
- Peer 1
Org2MSP - Peer 0
- Peer 1
crypto-config.yaml
! ์ธ์ฆ์„œ ์ƒ์„ฑ์„ ์œ„ํ•œ ์กฐ์ง๊ณผ Peer ๊ฐœ์ˆ˜, ์‚ฌ์šฉ์ž(์–ด๋“œ๋ฏผ ์ œ์™ธ) ์ˆ˜ ์„ค์ •
Note that theย crypto-config.yamlย ๏ฌle lists ๏ฌve orderers as being tied to the orderer organization. While theย cryptogenย tool will create
certi๏ฌcates for all ๏ฌve of these orderers.ย 
Orderer
orderer2
orderer3
orderer4
orderer5
peer0.org0
peer1.org0
peer0.org1
peer1.org1
configtx.yaml
! ์ฑ„๋„ ์ƒ์„ฑ์„ ์œ„ํ•œ Peer ์ •๋ณด ( Host, Port), MSP ์ •๋ณด,
Consortiums(๋ช‡ ๊ฐœ์˜ Org๋กœ ๊ตฌ์„ฑํ•  ๊ฒƒ์ธ์ง€) ์„ค์ •โ€จ
- ๋ธ”๋Ÿญ ์ƒ์„ฑ ํฌ๊ธฐ ๋“ฑ๊ณผ ๊ด€๋ จ๋œ ์„ค์ •โ€จ
BatchTimeout, โ€จ
BatchSize - MaxMessageCountโ€จ
AbsoluteMaxBytesโ€จ
PreferredMaxBytes
! 3๊ฐ€์ง€ ํŒŒ์ผ์„ ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ƒ์„ฑโ€จ
- ์ตœ์ดˆ ๋ธ”๋ก ์ •๋ณด genesis.block
- ์•ต์ปค ํ”ผ์–ด ์ •๋ณด anchor.tx
(Org1MSPanchor.tx, Org2MSPanchor.tx)
- ์ฑ„๋„ ๊ตฌ์„ฑ ์ •๋ณด channel.tx
T
echo "##########################################################"
echo "######### Generating Orderer Genesis block ##############"
echo "##########################################################"
# Note: For some unknown reason (at least for now) the block file can't be
# named orderer.genesis.block or the orderer will fail to launch!
set -x
configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.bloc
res=$?
set +x
if [ $res -ne 0 ]; then
echo "Failed to generate orderer genesis block..."
exit 1
fi
echo
echo "#################################################################"
echo "### Generating channel configuration transaction 'channel.tx' ###"
echo "#################################################################"
set -x
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAM
res=$?
set +x
if [ $res -ne 0 ]; then
echo "Failed to generate channel configuration transaction..."
exit 1
fi
TwoOrgsChannel์€ ์ฝ˜์†Œ์‹œ์—„์œผ๋กœ ๊ตฌ์„ฑ๋œ
Org1๊ณผ Org2์˜ ์ฑ„๋„์— ๊ด€ํ•œ ๋ช…์„ธ์ด๋ฉฐ
SampleMultiNodeEtcdRaft๋Š” ๋ธ”๋ก์ฒด์ธ์„
๊ตฌ์„ฑํ•˜๋Š” ์˜ค๋”๋Ÿฌ์˜ ์ •๋ณด๋ฅผ ๋ช…์„ธํ•˜๋ฉฐ ์ด ์ •๋ณด๊ฐ€
genesisBlock์— ํฌํ•จ๋œ๋‹ค.
byfn.sh
echo "##########################################################"
echo "######### Generating Orderer Genesis block ##############"
echo "##########################################################"
# Note: For some unknown reason (at least for now) the block file can't be
# named orderer.genesis.block or the orderer will fail to launch!
configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
echo "#################################################################"
echo "### Generating channel configuration transaction 'channel.tx' ###"
echo "#################################################################"
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
echo "#################################################################"
echo "####### Generating anchor peer update for Org1MSP ##########"
echo "#################################################################"
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
echo "#################################################################"
echo "####### Generating anchor peer update for Org2MSP ##########"
echo "#################################################################"
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
##########################################################
##### Generate certificates using cryptogen tool #########
##########################################################
+ cryptogen generate --config=./crypto-config.yaml
org1.example.com
org2.example.com
+ res=0
+ set +x
Generate CCP files for Org1 and Org2
/root/fabric-samples/first-network/../bin/configtxgen
##########################################################
######### Generating Orderer Genesis block ##############
##########################################################
+ configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
2020-06-04 01:45:15.992 UTC [common.tools.configtxgen] main -> INFO 001 Loading configuration
2020-06-04 01:45:16.015 UTC [common.tools.configtxgen.localconfig] completeInitialization -> INFO 002 orderer type: etcdraft
2020-06-04 01:45:16.015 UTC [common.tools.configtxgen.localconfig] completeInitialization -> INFO 003 Orderer.EtcdRaft.Options unset, setting to tick_interval:"500ms" election_tick:10 heartbeat_tick:1 max_inflight_blocks:5 snapshot_interval_size:16777216
2020-06-04 01:45:16.016 UTC [common.tools.configtxgen.localconfig] Load -> INFO 004 Loaded configuration: /root/fabric-samples/first-network/configtx.yaml
2020-06-04 01:45:16.017 UTC [common.tools.configtxgen] doOutputBlock -> INFO 005 Generating genesis block
2020-06-04 01:45:16.018 UTC [common.tools.configtxgen] doOutputBlock -> INFO 006 Writing genesis block
+ res=0
+ set +x
#################################################################
### Generating channel configuration transaction 'channel.tx' ###
#################################################################
+ configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
2020-06-04 01:45:16.033 UTC [common.tools.configtxgen] main -> INFO 001 Loading configuration
2020-06-04 01:45:16.053 UTC [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /root/fabric-samples/first-network/configtx.yaml
2020-06-04 01:45:16.054 UTC [common.tools.configtxgen] doOutputChannelCreateTx -> INFO 003 Generating new channel configtx
2020-06-04 01:45:16.056 UTC [common.tools.configtxgen] doOutputChannelCreateTx -> INFO 004 Writing new channel tx
+ res=0
+ set +x
#################################################################
####### Generating anchor peer update for Org1MSP ##########
#################################################################
+ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
2020-06-04 01:45:16.071 UTC [common.tools.configtxgen] main -> INFO 001 Loading configuration
2020-06-04 01:45:16.092 UTC [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /root/fabric-samples/first-network/configtx.yaml
2020-06-04 01:45:16.092 UTC [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 003 Generating anchor peer update
2020-06-04 01:45:16.093 UTC [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 004 Writing anchor peer update
+ res=0
+ set +x
#################################################################
####### Generating anchor peer update for Org2MSP ##########
#################################################################
+ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP
2020-06-04 01:45:16.108 UTC [common.tools.configtxgen] main -> INFO 001 Loading configuration
2020-06-04 01:45:16.129 UTC [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /root/fabric-samples/first-network/configtx.yaml
2020-06-04 01:45:16.129 UTC [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 003 Generating anchor peer update
2020-06-04 01:45:16.132 UTC [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 004 Writing anchor peer update
+ res=0
+ set +x
./byfn.sh generate
์ œ๋„ค์‹œ์Šค ๋ธ”๋ก ์ƒ์„ฑ
์ฑ„๋„ ํ™˜๊ฒฐ์„ค์ •
์•ต์ปคํ”ผ์–ด ์„ค์ •
๋ชจ๋‘/channel-artifacts/ ํ•˜์œ„์— ๊ฒฐ๊ณผํŒŒ์ผ๋กœ ์ €์žฅ
[results] ./byfn.sh generate
v2.0 ๋ถ€ํ„ฐ priv_sk ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณ€๊ฒฝ
CA ์‹ฌํ™”
! ์ธ์ฆ๊ธฐ๊ด€(CA), ๊ณต๊ฐœํ‚ค, ๊ฐœ์ธํ‚ค, ์ธ์ฆ์„œ(CRT)
source : http://soul0.tistory.com/372
intro
CA ์‚ดํŽด๋ณด๊ธฐ
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 ์‚ดํŽด๋ณด๊ธฐ
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
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 ์‚ดํŽด๋ณด๊ธฐ
โ”œโ”€โ”€ 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
example.com์˜ ๋น„๋ฐ€ํ‚ค์™€ ์ธ์ฆ์„œ
[MSP] ๊ด€๋ฆฌ์ž์šฉ ์ธ์ฆ์„œ
[MSP] CA์‹๋ณ„ ์ธ์ฆ์„œ
[MSP] TLS ํ†ต์‹ ์šฉ ์ธ์ฆ์„œ
orderer.example.com
example.com
์ƒ์œ„ ์กฐ์ง์˜ ์–ด๋“œ๋ฏผ ์ธ์ฆ์„œ์™€
CA ์ธ์ฆ์„œ๋ฅผ ๋ณต์‚ฌ
orderer.example.com์˜ ๋น„๋ฐ€ํ‚ค์™€ ์ธ์ฆ์„œ
๊ฐ ๋…ธ๋“œ์˜ HTTPS ํ†ต์‹ ์šฉ ์ธ์ฆ์„œ์™€ ๋น„๋ฐ€ํ‚ค
๊ฐ ์‚ฌ์šฉ์ž์˜์˜ HTTPS ํ†ต์‹ ์šฉ ์ธ์ฆ์„œ์™€ ๋น„๋ฐ€ํ‚ค๋™์ผ ํŒŒ์ผ
๋™์ผ ํŒŒ์ผ
CA ์‚ดํŽด๋ณด๊ธฐ
Client -> sever request
Server send server.crt
Client verify server.crt with ca.crt(pub. Key included)
Client get public key of server
Client send encrypted message to server
Server decrypt message by its own private key(sercer.key)
server.key = ์ƒ์„ฑ๋œ MSP์˜ ๊ฐœ์ธํ‚ค์™€ ๋™์ผ ํŒŒ์ผ
โ””โ”€โ”€ 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
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 ์‚ดํŽด๋ณด๊ธฐ
[์ฐธ๊ณ ] ์ธ์ฆ์„œ ์‚ดํŽด๋ณด๊ธฐ
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 ์‚ดํŽด๋ณด๊ธฐ
[์ฐธ๊ณ ] hyperledger fabric ca ์‹ค์Šต
! CA Server, Client ์„ค์น˜ ๋ฐ ์‹ค์Šต
https://ovila.tistory.com/68
! Hyperledger Fabric ๋ฉ€ํ‹ฐํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ•ย 
https://leejonggun.tistory.com/15
CA ์‚ดํŽด๋ณด๊ธฐ
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/5)
CA ์‚ดํŽด๋ณด๊ธฐ
cli์ปจํ…Œ์ด๋„ˆ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” preface๋Š” utils.sh์—์„œ ์ „๋‹ฌ๋ฐ›์€ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋”ฐ๋ผ
setGlobalํ•จ์ˆ˜๋‚ด์—์„œ ์žฌ์ •์˜๋จ
peer lifecycle chaincode install mycc.tar.gz
[์ฒด์ธ์ฝ”๋“œ ์ธ์Šคํ†จ]
peer lifecycle chaincode queryinstalled
[์ฒด์ธ์ฝ”๋“œ ์„ค์น˜ํ™•์ธ] orderer๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰
Cli ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ˆ˜ํ–‰, Org1-Peer0์— ์„ค์น˜
peer lifecycle chaincode package mycc.tar.gz --path github.com/hyperledger/fabric-samples/chaincode/abstore/go/ --lang golang --label mycc_1
[์ฒด์ธ์ฝ”๋“œ ํŒจํ‚ค์ง•] peer๋ฅผ ํ†ตํ•ด ์„ค์น˜
๊ฐ org์˜ anchor peer์— ์„ค์น˜โ€จ
org1์˜ peer0
org2์˜ peer0
๋ฐฉ์‹ ๋™์ผํ•˜๊ฒŒ ๋ชจ๋‘ ์ˆ˜ํ–‰
์ „์ฒด ์‹คํ–‰ ์ˆœ์„œ (2/5)
CA ์‚ดํŽด๋ณด๊ธฐ
์ •์ƒ์ธ ๊ฒฝ์šฐ ํŒจํ‚ค์ง• ๊ณ ์œ ๋ฒˆํ˜ธ ํ™•์ธ ๊ฐ€๋Šฅ
Package ID: mycc_1:0dcea8280752b53a2a534f280445e36fa4cb32f648c2d7729589821f300d74be, Label: mycc_1
peer lifecycle chaincode approveformyorg --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 --channelID mychannel --name mycc --version 1 --init-required --package-id
mycc_1:0dcea8280752b53a2a534f280445e36fa4cb32f648c2d7729589821f300d74be --sequence 1 --waitForEvent
[์ฒด์ธ์ฝ”๋“œ ์Šน์ธ] orderer๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰
์˜ˆ์ œ์—์„œ๋Š” Org1-Peer0 ์„ ํ†ตํ•ด ์Šน์ธ ์š”์ฒญ
์ „์ฒด ์‹คํ–‰ ์ˆœ์„œ (3/5)
peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name mycc --version 1 --sequence 1 --output json --init-required
[์ฒด์ธ์ฝ”๋“œ ์ปค๋ฐ‹๊ฐ€๋Šฅ์—ฌ๋ถ€ ํ™•์ธ]
์˜ˆ์ œ์—์„œ๋Š” Org1-Peer0 ์„ ํ†ตํ•ด ์Šน์ธ(์ด์ „ ์žฅ์—์„œ)ํ–ˆ์œผ๋ฏ€๋กœ
{
"approvals": {
"Org1MSP": true,
"Org2MSP": false
}
}
๋กœ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
peer lifecycle chaincode approveformyorg -โ€ฆ
[์ฒด์ธ์ฝ”๋“œ ์Šน์ธ] orderer๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰
์ด์ œ Org2-Peer0 ๋˜ํ•œ ์Šน์ธ ์š”์ฒญ
peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name mycc --version 1 --sequence 1 --output json --init-required
[์ฒด์ธ์ฝ”๋“œ ์ปค๋ฐ‹๊ฐ€๋Šฅ์—ฌ๋ถ€ ํ™•์ธ]
์ด์ œ๋Š” ๋ชจ๋‘ ์ปค๋ฐ‹ true
{
"approvals": {
"Org1MSP": true,
"Org2MSP": true
}
}
๋กœ ๊ฒฐ๊ณผ ์ถœ๋ ฅ
peer lifecycle chaincode commit -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 --channelID mychannel --name 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:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --version 1 --sequence 1 --init-required
[์ฒด์ธ์ฝ”๋“œ ์ปค๋ฐ‹] Org1 peer0, org2 peer0์— commit (anchor peer)
์ „์ฒด ์‹คํ–‰ ์ˆœ์„œ (4/5)
peer lifecycle chaincode querycommitted --channelID mychannel --name mycc
[์ฒด์ธ์ฝ”๋“œ ์ปค๋ฐ‹ ์„ฑ๊ณต์—ฌ๋ถ€ ์กฐํšŒ]
๊ฒฐ๊ณผ:
Committed chaincode definition for chaincode 'mycc' on channel 'mychannel':
Version: 1, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc, Approvals: [Org1MSP: true, Org2MSP: true]
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 /op
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:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/
peer0.org2.example.com/tls/ca.crt --isInit -c '{"Args":["Init","a","100","b","100"]}'
[์ฒด์ธ์ฝ”๋“œ Invoke]
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
[์ฒด์ธ์ฝ”๋“œ query]
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:9051 --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"]}'
[์ฒด์ธ์ฝ”๋“œ Invoke]
A = 100
B = 100
A = ?
A์—์„œ B๋กœ 10 ์ด๋™
์ „์ฒด ์‹คํ–‰ ์ˆœ์„œ (5/5)
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
[์ฒด์ธ์ฝ”๋“œ Query] A == 90 ?
chaincode๋ฅผ org2-peer1 ์—๋„ ์„ค์น˜ํ•ด์„œ ์กฐํšŒํ•ด๋ณด์ž, ๊ณผ์—ฐ ๊ฐ™์€ ์›์žฅ์„ ์กฐํšŒํ•˜์—ฌ A==90?
==================== Query successful on peer0.org1 on channel 'mychannel' =====================
Installing chaincode on peer1.org2...
peer lifecycle chaincode install mycc.tar.gz
===================== Querying on peer1.org2 on channel 'mychannel'... =====================
peer chaincode query -C mychannel -n mycc -c โ€˜{"Args":["query","a"]}'
90
org1, org2 ์— ๋ชจ๋‘ approve, commit ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ธ์Šคํ†จ ํ›„ ๋ฐ”๋กœ ์ฒด์ธ์ฝ”๋“œ ์กฐํšŒ ๊ฐ€๋Šฅํ•จ
docker-compose ์„ค์ • ํŒŒ์ผ ํ™•์ธ
docker-compose-cli.yaml์˜
base๊ฐ€ ๋˜๋Š” base/docker-compose-base.yaml์—์„œ๋Š”
./byfn.sh generate๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ์ธ์ฆ์„œ ์ •๋ณด๋ฅผ ๋ณผ๋ฅจ ๋งˆ์šดํŠธํ•˜๊ณ 
๋งˆ์šดํŠธ๋œ ๋„์ปค ์ด๋ฏธ์ง€์˜ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •์„ ํ•จ
docker-compose -f docker-compose-cli.yaml -f docker-compose-etcdraft2.yaml up -d
./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
V1.4
docker-compose-cli ์‚ดํŽด๋ณด๊ธฐ
Org1์˜ Peer0์ธ ํ”ผ์–ด์— ์ ‘์†ํ•˜๋„๋ก ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋จ
ํ•ด๋‹น ํ”ผ์–ด์— ์ฑ„๋„ ์ƒ์„ฑ, ์ฐธ๊ฐ€, ์•ต์ปค ํ”ผ์–ด ๊ฐฑ์‹ , ์ฒด์ธ์ฝ”๋“œ ์„ค์น˜/์ดˆ๊ธฐํ™”/์งˆ์˜/ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
(createChannel, joinChannel, updateAnchorPeers, packageChaincode, installChaincode, approveForMyOrg, checkCommitReadiness,
commitChaincodeDefinition, queryCommitted)
์œ„์˜ ์ˆ˜ํ–‰ํ•จ์ˆ˜๋Š” byfn.sh์˜ networkUpํ•จ์ˆ˜๋‚ด์—์„œ
docker exec cli scripts/script.sh $CHANNEL_NAME $CLI_DELAY $LANGUAGE $CLI_TIMEOUT $VERBOSE ๋กœ ํ˜ธ์ถœ๋จ
scripts.sh์€ cli ๋„์ปค์— ๋ณผ๋ฅจ ๋งˆ์šดํŠธ๋จ์œผ๋กœ cli ์—์„œ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•จ
chaincode lifecycle
https://hyperledger-fabric.readthedocs.io/en/release-2.0/chaincode_lifecycle.html#step-one-packaging-the-smart-contract
chaincode ์œ„์น˜ ํ™•์ธ
environment:
- GOPATH=/opt/gopath
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
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/hyperledger/fabric-samples/chaincode/abstore/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
2๊ฐœ์˜ path๋ฅผ ์กฐํ•ฉํ•˜์—ฌ go ๋ชจ๋“ˆ์„ ์‹คํ–‰
(go๋Š” GOPATH/src ํ•˜์œ„ ํด๋”๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ๋ฅผ ์žก๋Š” ๊ทœ์น™์ด ์žˆ์Œ)
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 peer0.org1 is INVALID !!!!!!!!!!!!!!!!
================== ERROR !!! FAILED to execute End-2-End Scenario ==================
์ˆ˜ํ–‰๊ฒฐ๊ณผ
util.sh์˜ chaincodeQueryํ•จ์ˆ˜์—์„œ
๊ธฐ๋Œ€ํ•œ ๊ฒฐ๊ณผ์ธ 90์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ
์—๋Ÿฌ๋กœ ํ‘œ์‹œํ•˜์˜€์œผ๋‚˜,
์ฒด์ธ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ ์˜๋„์™€ ๋ถ€ํ•ฉํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ
docker-compose-cli.yaml์— cli ์ปจํ…Œ์ด๋„ˆ ์ •์˜๋ถ€๋ถ„์—
volumes:
../../chaincode/:/opt/gopath/src/github.com/chaincode
์œผ๋กœ ๋ณ€๊ฒฝํ•œ ์ฒด์ธ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ cli ์ปจํ…Œ์ด๋„ˆ์— ๋ณผ๋ฅจ ๋งˆ์šดํŠธํ•˜๋ฏ€๋กœ
๋„์ปค๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ๋ฅผ cli์—์„œ installํ•  ์ˆ˜ ์žˆ์Œ
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์— ์—ฐ๊ฒฐ๋˜๋Š” ๊ตฌ์กฐ๋กœ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋™
Virtual box port forwarding setting : inbound/outbound open 5984
Open db : ex> mychannel/mycc
[์ฐธ๊ณ ] block data (orderer)
docker cp -a orderer.example.com:/var/hyperledger/production/orderer ./
Docker-compose-base ์—์„œ
Volume create๋กœ ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฏ€๋กœ bind mount์™€๋Š” ๋‹ค๋ฅด๊ฒŒ
์šด์˜์ฒด์ œ>docker ์ „์šฉ ํŒŒ์ผ๊ด€๋ฆฌ ์˜์—ญ์—์„œ ์œ„์™€ ๊ฐ™์ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋ฉฐ
์ปจํ…Œ์ด๋„ˆ๊ฐ„์—๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜์–ด๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•จ
[์ฐธ๊ณ ] block data (peer)
docker cp -a peer0.org1.example.com:/var/hyperledger/production ./
cd production/
more ledgersData/chains/chains/mychannel/blockfile_000000
chaincode docker devmode
์‚ฌ์ „ ์ค€๋น„
! 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/master/chaincode-docker-devmode
Terminal 1 - Start the network
! docker-compose -f docker-compose-simple.yaml up
source : https://github.com/hyperledger/fabric-samples/tree/master/chaincode-docker-devmode
Terminal 2 - Build & start the
chaincode
! docker exec -it โ€”user root chaincode sh
! cd abstore/go
! go build -o abstore
! CORE_CHAINCODE_ID_NAME=mycc:0 CORE_PEER_TLS_ENABLED=false ./abstore -peer.address peer:7052
source : https://github.com/hyperledger/fabric-samples/tree/master/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 ๋ผ๊ณ  ์„ค์ •๋จ
Terminal 3 - Use the chaincode
! docker exec -it cli bash
! peer chaincode install -p chaincodedev/chaincode/abstore/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/master/chaincode-docker-devmode
source : https://nick-fabric.readthedocs.io/en/latest/commands/peerchaincode.html
์—ฌ๊ธฐ๊นŒ์ง€๋Š” Build Your First Network ์ฒด์ธ์ฝ”๋“œ์™€ ๋™์ผํ•˜๋‹ค.
์ด์ œ ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค์‹œ ๋ฐฐํฌํ•ด ๋ณด์ž.
terminal2 ์—์„œ chaincode๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ๋ฐœ์ƒ
local development env.
! ์„ค์น˜ ํ›„ ํ„ฐ๋ฏธ๋„์—์„œ go env ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ GOPATH ๊ฒฝ๋กœ๋ฅผ ํ™•์ธ
! GOPATH ๊ฒฝ๋กœ ํ•˜๋‹จ์— /go/src ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
์˜ˆ>~iMac:src sf29$ pwd
/Users/sf29/go/src
! visual studio code ์„ค์น˜ + GO addon ์ถ”๊ฐ€ ์„ค์น˜
! ์šฐ์ธก ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด $GOPATH/go/src ๋””๋ ‰ํ† ๋ฆฌ์—์„œ
์ž„์˜ go ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ํ…Œ์ŠคํŠธ
์‚ฌ์ „์— GO ์„ค์น˜ ํ•„์š”
- https://golang.org/dl/
Visual studio
Go extension์˜ settings.jon ์„ค์ •๋‚ด์šฉ:
{
"go.formatTool": "goimports",
"go.useLanguageServer": true
}
local development env.
! visual studio code ์—์„œ ์†Œ์Šค ์ถ”์  ๋ฐ ๋นŒ๋“œ ๊ฐ€๋Šฅ
! ๊ฐœ๋ณ„ ํŒŒ์ผ๋กœ ์˜คํ”ˆ X, ํด๋”๋ฅผ ์›Œํฌ์ŠคํŽ˜์ด๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•จ(์ค‘์š”)
$GOROOT/src/ ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด hlf ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€
mkdir -p github.com/hyperledger
cd github.com/hyperledger/
git clone -b release-2.0 https://github.com/hyperledger/fabric.git
์šฐ์ธก ๊ทธ๋ฆผ์˜ ์†Œ์Šค๋Š” $GOPATH/src/[์ž„์˜ ํด๋”๋ช…]/chiancode_example.go์— ์œ„์น˜์‹œํ‚ด
% pwd
/Users/hwang-won-yong/go/src/sacc
% go get
% go run sacc.go
์ƒ๊ธฐ ์„ค์ • ์ดํ›„ VS ์žฌ์‹œ์ž‘
โ€”> ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋ฐ‘ ์ค„์ด ๋ณด์ด๊ณ , ํ•ด๋‹น ์ •์˜๋ถ€๋กœ ์ด๋™๋„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋จ
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๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ ‘์†๋จ (chaincode ๋””๋ ‰ํ† ๋ฆฌ์—์„œ abstore.go๋ฅผ ๋‹ค์šด๋กœ๋“œ)
! ์ ‘์† ์ดํ›„ ์ฒด์ธ์ฝ”๋“œ ํด๋ฆญํ•˜์—ฌ ํŽธ์ง‘์ฐฝ์—์„œ ์˜คํ”ˆ
! $GOPATHSRCabstore ํด๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ โ€จ
ํ•ด๋‹น ํด๋” ํ•˜์œ„์— abstrore.go ํŒŒ์ผ๋กœ save asโ€ฆ ํ•œ๋‹ค. (์†Œ์Šค ๋ถ„์„์šฉ)
visual studio code ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ ์ถœ์ฒ˜ : https://www.manualfactory.net/10964
chaincode ์ˆ˜์ •
! ๊ณต์‹ ํŠœํ† ๋ฆฌ์–ผ์„ ์ฐธ์กฐํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •
๊ณต์‹ ํŠœํ† ๋ฆฌ์–ผ : https://github.com/hyperledger/fabric-samples/tree/master/chaincode-docker-devmode
func (t *ABstore) Set(ctx contractapi.TransactionContextInterface, user string, value int) error {
fmt.Println("ABstore Set")
var A string
var Aval int
var err error
A = user
Aval = value
fmt.Printf("################### Aval = %d", Aval)
err = ctx.GetStub().PutState(A, []byte(strconv.Itoa(value)))
if err != nil {
return err
}
return nil
}
์ฝ”๋“œ ์ˆ˜์ • ํ›„ ๋นŒ๋“œ ํ…Œ์ŠคํŠธ FTP upload (overwrite)
chaincode ๋ฐฐํฌ ๋ฐ ํ…Œ์ŠคํŠธ
! docker-compose โ€“f docker-compose-simple.yaml down
! docker-compose โ€“f docker-compose-simple.yaml up
! ์ด์ „ terminal2, terminal3์—์„œ ์ˆ˜ํ–‰ํ–ˆ๋˜ ๋‚ด์šฉ ๋™์ผ ๋ฐ˜๋ณตํ•˜๊ณ  ์ฝ”๋“œ์—์„œ ์ถ”๊ฐ€ํ•œ set ๋ช…๋ น
์— ๋Œ€ํ•ด ์ถ”๊ฐ€๋กœ ํ™•์ธ
peer chaincode install -p chaincodedev/chaincode/abstore/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
peer chaincode invoke -n mycc -c '{"Args":["Set","a","1000"]}' -C myc
peer chaincode query -n mycc -c '{"Args":["query","a"]}' -C myc
ABstore Init
Aval = 100, Bval = 200
Aval = 90, Bval = 210
Query Response:{"Name":"a","Amount":"90"}
ABstore Set
################### Aval = 1000
Query Response:{โ€œName":"a","Amount":"1000"}
terminal2 terminal3
[์ฐธ๊ณ ] peer chaincode upgrade
! ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋™ ์ƒํƒœ์—์„œ ์ฒด์ธ์ฝ”๋“œ ์—…๊ทธ๋ ˆ์ด๋“œ ์‹ค์‹œ
! VS CODE ์—์„œ ์†Œ์Šค ๋ณ€๊ฒฝ ๋ฐ ์ €์žฅ/์—…๋กœ๋“œ
terminal2
docker exec -it --user root chaincode sh
go build -o abstore
CORE_CHAINCODE_ID_NAME=mycc:1 CORE_PEER_TLS_ENABLED=false ./abstore -peer.address peer:7052
terminal3
peer chaincode install -p chaincodedev/chaincode/abstore/go -n mycc -v 1
peer chaincode upgrade -p chaincode/abstore/go -n mycc -v 1 -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์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋” ์ด์ƒ ํ•˜์ง€ ์•Š๊ฒŒ ๋จ
chaincode tutorial
Chaincode tutorial (Basic)
https://hyperledger-fabric.readthedocs.io/en/release-2.0/chaincode4ade.html#
HW
build & deploy
Add or modify chain code + build/deploy
Chaincode tutorial (Advance)
! Code review
! Build and deploy
- ftp upload (to newly created directory. Eg> saccnew)
- [Terminal 2] go get
- [Terminal 2] go build -o saccnew
- [Terminal 2] CORE_CHAINCODE_ID_NAME=mycc:0 CORE_PEER_TLS_ENABLED=false ./saccnew -peer.address peer:7052
! Chaincode install/run on Terminal 3
- go get github.com/hyperledger/fabric-chaincode-go/shim
Git hub : https://github.com/wonyongHwang/chaincode-tutorial/blob/master/kopoChainCode.go
peer chaincode install -p chaincodedev/chaincode/saccnew -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":["more","tt","Here your are, this is a book 2","1200"]}' -C myc
peer chaincode query -n mycc -c '{"Args":["morequery","tt"]}' -C myc
Chaincode tutorial (Advance)
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())
}
type AdditionalInfo struct {
Title string "json:"title""
Text string "json:"text""
code int64 "json:"code""
}
Chaincode tutorial (Advance)
- GetState, GetHistoryForKey
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)))
}
GetHistoryForKey ํ•จ์ˆ˜๋กœ ๋ณ€๊ฒฝ ์ด๋ ฅ ์กฐํšŒ
๊ธฐ์กด์— ๋ณ€๊ฒฝ๋œ ์ด๋ ฅ์ด ์žˆ๋Š” ๊ฒฝ์šฐ
๋ชจ๋‘ ์กฐํšŒ ๊ฐ€๋Šฅ
[์ฐธ๊ณ ] ๊ณต์‹ ํŠœํ† ๋ฆฌ์–ผ ์ฒด์ธ์ฝ”๋“œ์—์„œโ€ฆ
source : https://hyperledger-fabric.readthedocs.io/en/release-2.0/chaincode4ade.html#chaincode-api
main ํ•จ์ˆ˜์—์„œ fabric chaincode์˜ Start ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
์ด ๋•Œ ์ „๋‹ฌ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” type SimpleAsset struct{} ์˜
๊ฐ์ฒด์ž„. ์†Œ์Šค์ฝ”๋“œ์ƒ SimpleAsset์˜ Init,Invoke ํ•จ์ˆ˜๋ฅผ
๊ตฌํ˜„ํ•˜์˜€์œผ๋ฏ€๋กœ ChainCode ๊ฐ์ฒด๋กœ ์ „๋‹ฌ ๊ฐ€๋Šฅ
[์ฐธ๊ณ ] ์ฒด์ธ์ฝ”๋“œ ํ˜ธ์ถœ
! ๋™์ผ ์ฑ„๋„์—์„œ ๊ฐ™์€/๋‹ค๋ฅธ Chaincode ํ˜ธ์ถœ(invoke/query) ๊ฐ€๋Šฅ
! ๋‹ค๋ฅธ ์ฑ„๋„์˜ chaincode๋Š” ์กฐํšŒ(query)๋งŒ ๊ฐ€๋Šฅ
-์˜ˆ์‹œ-
channel := stub.GetChannelID()
stub.InvokeChaincode(chaincodeName, args, channel)
Hyperledger fabric SDK
Balance transfer example (๊ฐœ์š”)
! 2 CA, 1 Orderer, 2Org (2 Peers on each Org.) ๋กœ ๊ตฌ์„ฑ
! ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” Build Your Network First์™€ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ์ด๋‚˜, ์—ฌ๊ธฐ์„œ๋Š” cli ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—†์Œ.
๋Œ€์‹  Hyperledger fabric SDK๋ฅผ ์ด์šฉํ•œ node.js๊ตฌํ˜„์ฒด๋ฅผ ํ†ตํ•ด์„œ ์ฑ„๋„์ƒ์„ฑ, ์ฒด์ธ์ฝ”๋“œ ์„ค์น˜ ๋“ฑ์„
์ง„ํ–‰ํ•˜๊ฒŒ ๋จ.
! Build Your Network First์˜ ๊ธฐ๋ณธ ์‹คํ–‰ ๊ตฌ์กฐ์—์„œ๋Š” CA ์„œ๋ฒ„ ์—†์ด cryptogen์„ ํ†ตํ•ด ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด ๋†“์€
์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์‹  ํ•˜์˜€์œผ๋‚˜, ์ด๋ฒˆ ์˜ˆ์ œ๋Š” ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•œ ์ธ์ฆ์„œ ์ •๋ณด๋ฅผ ํ† ๋Œ€๋กœ CA์„œ๋ฒ„๋ฅผ ๊ธฐ๋™ํ•˜๊ณ ,
Node.js Client์—์„œ ์š”์ฒญํ•˜๋Š” ์‚ฌ์šฉ์ž ๋“ฑ๋ก์„ CA ์„œ๋ฒ„์—์„œ ์ธ์ฆํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ตฌ์„ฑ ๋˜์—ˆ์Œ
(org1 -> ca1, org2 -> ca2_
* ํ•ด๋‹น ์˜ˆ์ œ ํด๋”์— ์œ„์น˜ํ•œ ~e2e.yaml ๋กœ ์‹คํ–‰์‹œ ca ์„œ๋ฒ„ ๊ธฐ๋™๋จ
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 ๊ธฐ๋ณธ ์ƒ˜ํ”Œ์˜ˆ์ œ์—์„œ ์‚ญ์ œ๋˜์—ˆ์œผ๋‚˜ 2.0์ด 1.4์˜ SDK๋„ ์ง€์›ํ•˜๋ฏ€๋กœ ์ •์ƒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•จ
! ์ปจํ…Œ์ด๋„ˆ ๋ฐ ์ด๋ฏธ์ง€ ๋“ฑ ๋„์ปค๊ด€๋ จ ํŒŒ์ผ ์‚ญ์ œ (์ถฉ๋Œ๋ฐฉ์ง€)
docker rm -f $(docker ps -a -q)
docker rmi -f $(docker images -a -q)
docker volume prune
docker system prune
docker network prune
git clone -b release-1.4 https://github.com/hyperledger/fabric-samples.git
Balance transfer example (fabric ์‹คํ–‰)
! ./runApp.sh ์‹คํ–‰
Balance transfer example (REST ํ˜ธ์ถœ)
./testAPIs.sh ์„ ์‹คํ–‰ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๋“ฑ๋ก~์ฒด์ธ์ฝ”๋“œ ์‹คํ–‰๊นŒ์ง€ ์ •์ƒ ์ง„ํ–‰ ๋˜๋Š”์ง€ ํ™•์ธ
* chaincode instantiate ์‹คํ–‰์‹œ time out ์œผ๋กœ ์˜ค๋ฅ˜๋ฐœ์ƒ๋˜๋Š” ๊ฒฝ์šฐ,
์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด testAPIs.sh์˜ ์ผ๋ถ€๋ถ„์„ ์ˆ˜์ • (timeout ์˜ต์…˜ ์ถ”๊ฐ€)
apt-get install jq ํ•„์š”
[์‹ฌํ™”] ๋” ์‚ดํŽด๋ณผ ํฌ์ธํŠธ
! ./testAPIs.sh ์˜ REST CALL ํ˜ธ์ถœ ์ˆœ์„œ์™€ ๋‚ด์šฉ์„ ํ™•์ธ
! Node ์†Œ์Šค๋Š” app.js๊ฐ€ ์‹œ์ž‘์ 
! ์‚ฌ์šฉ์ž ๋“ฑ๋ก์„ ์œ„ํ•ด /users ํ˜ธ์ถœ์‹œ์—๋Š” fabric ca server๋ฅผ ํ†ตํ•ด ์‹ ๊ทœ ์‚ฌ์šฉ์ž ๋“ฑ๋ก์„ ํ•˜๊ณ  ํ† ํฐ์„ ๋ถ€์—ฌํ•จ
! /users ์ด์™ธ์˜ ํ˜ธ์ถœ ์ฃผ์†Œ๋Š” JWT ํ† ํฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์ด๋ฃจ์–ด์ง
! Proposal์„ ๋จผ์ € endorsing peer์— ๋ณด๋‚ด๊ณ , ํ•ด๋‹น ํ”ผ์–ด์—์„œ ์‚ฌ์ „
๊ฒ€์ฆํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ณ  orderer์—๊ฒŒ ๊ฒ€์ฆ๊ฒฐ๊ณผ์™€ ํŠธ๋žœ์žญ์…˜
๋ฐ˜์˜์š”์ฒญ์„ ํ•˜๋Š” ๋ถ€๋ถ„
โ€”> invoke-tansaction.js์˜ sendTransactionProposal ๋ฐ
sendTransaction ํ˜ธ์ถœ ์ฝ”๋“œ ์ฐธ์กฐโ€จ
[์‹ฌํ™”] 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๋กœ ์ธ์ฆ์„œ ๋กœ๋”ฉ)
[์‹ฌํ™”] fabric ca container
Node sdk client์˜ config.js์— ์„ค์ •๋œ ๊ณ„์ •์ •๋ณด์™€ ์ผ์น˜ํ•ด์•ผ ํ•จ
"admins":[
{
"username":"admin",
"secret":"adminpw"
}
]
fabric server <-> node.js(SDK) local
Fabric Server(Docker/Ubuntu/VM) Fabric SDK(local)
Client(local)
Fabric SDK๋ฅผ ๋กœ์ปฌ ๊ฐœ๋ฐœํ™˜๊ฒฝ์—์„œ
๋””๋ฒ„๊น…์„ ํ†ตํ•ด ๋ถ„์„ํ•ด ๋ณด์ž.
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
"}%
์‚ฌ์šฉ์ž ๋“ฑ๋ก For mac>
Brew install jq
fabric server <-> node.js(SDK) local
โ€”> ๋กœ์ปฌ์—์„œ node.js ๋””๋ฒ„๊น…์„ visual studio๋กœ ์ง„ํ–‰
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
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๋„ ํ•„์š”์‹œ ํฌํŠธ ์„ค์ •ํ•ด๊ฐ€๋ฉด์„œ ํ…Œ์ŠคํŠธ ๋ฐ ๋””๋ฒ„๊น… ์ง„ํ–‰~
[์ฐธ๊ณ ] Mac - nvm ์„ค์น˜ (1/2)
! ๋ณธ ์˜ˆ์ œ๋Š” node 8.x ์—์„œ ์ •์ƒ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ(node 10.x ๋Š” tls ๊ด€๋ จ ์˜ค๋ฅ˜ ๋ฐœ์ƒ)
๊ธฐ์กด์— ์ด๋ฏธ ์„ค์น˜ํ•œ ๋…ธ๋“œ ์‚ญ์ œ
/usr/local/lib ์— ์žˆ๋Š” node์™€ node_modules๋ฅผ ์‚ญ์ œ
/usr/local/include ์— ์žˆ๋Š” node์™€ node_modules๋ฅผ ์‚ญ์ œ
Homebrew๋กœ ์„ค์น˜ํ•˜์…จ๋‹ค๋ฉด, brew uninstall node๋ฅผ ์‹คํ–‰
~/local ๋˜๋Š” ~/lib ๋˜๋Š” ~/include ๋””๋ ‰ํ† ๋ฆฌ ๋ฐ‘์— ์กด์žฌํ•˜๋Š” node์™€ node_modules ์‚ญ์ œ
/usr/local/bin ์— ์žˆ๋Š” node ๊ด€๋ จ ์‹คํ–‰ํŒŒ์ผ๋“ค ์‚ญ์ œ
์ถ”๊ฐ€๋กœ, ํ•„์š”์— ๋”ฐ๋ผ ์•„๋ž˜ ๋ช…๋ น์–ด๋“ค์„ ์‹คํ–‰ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
sudo rm /usr/local/bin/npm
sudo rm /usr/local/share/man/man1/node.1
sudo rm /usr/local/lib/dtrace/node.d
sudo rm -rf ~/.npm
sudo rm -rf ~/.node-gyp
sudo rm /opt/local/bin/node
sudo rm /opt/local/include/node
sudo rm -rf /opt/local/lib/node_modules
(์ถœ์ฒ˜ : http://junsikshim.github.io/2016/01/29/Mac%EC%97%90%EC%84%9C-Node.js-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0.html)
! Nvm ์„ค์น˜ (์ผ๋ฐ˜ ๊ณ„์ •, not root)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
source ~/.bash_profile
์„ค์น˜ ํ›„ .bash_profile ์— nvm๊ด€๋ จ ์„ค์ • ์ˆ˜๋™ ์ถ”๊ฐ€
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion" # This loads nvm bash_completion
[์ฐธ๊ณ ] Mac - nvm ์„ค์น˜ (2/2)
! Visual Studio CODE ์—์„œ ๋””๋ฒ„๊น…์‹œ ๊ธฐ์กด์— ์„ค์น˜๋˜์—ˆ๋˜ node๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ
์•„๋ž˜์™€ ๊ฐ™์ด launch.json์— node์˜ ์œ„์น˜๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•จ
(which node๋กœ ์ฐพ์€ ๊ฒฝ๋กœ๋ฅผ ๊ธฐ์ž…)
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}/app.js"
"runtimeExecutable": "/Users/sf29/.nvm/versions/node/v8.17.0/bin/node"
}
]
}
[์ฐธ๊ณ ] port forwardingโ€ฆ
Visual Studio Code +
IBM BlockChain Platform
Install extension
Check dependencies
! VS Code version 1.38.0 or higher (code โ€”version)
! Node v8.x or v10.x and npm v6.x or greater
node โ€”version
npm โ€”version
! Go version V1.12 or greater
go version
! Docker version v17.06.02-ce or greater
docker โ€”version
! Docker Compose v1.14.0 or greater
docker-compose โ€”version
nvm์„ ์‚ฌ์šฉ ์ค‘์ธ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ๋…ธ๋“œ ๋ฒ„์ „์„ alias ์„ค์ •ํ•˜์—ฌ
default๋‚˜ global๋กœ ๋„ค์ด๋ฐ ํ•ด์ค˜์•ผ ํ•จ
Letโ€™s Test (1/4)
๊ธฐ๋ณธ ์ฒด์ธ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•œ๋‹ค.
๊ธฐ๋ณธ ๋™์ž‘์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„ ์ฝ”๋”ฉ์€ ์—†์ด ์ง„ํ–‰ํ•œ๋‹ค.
Fabric Environments ์„น์…˜์— ์ตœ์ƒ๋‹จ 1 Org๋ฅผ ํด๋ฆญํ•˜๋ฉด
๋กœ์ปฌํ™˜๊ฒฝ์—์„œ ๋„์ปค๊ฐ€ ์‹คํ–‰๋˜๊ณ  fabric peer/orderer/ca ๋“ฑ์ด ์‹คํ–‰๋œ๋‹ค.
์ด์ „ ์žฅ์—์„œ ํŒจํ‚ค์ง•ํ•œ ์ฒด์ธ์ฝ”๋“œ๋ฅผ ์ธ์Šคํ†จ -> ์ธ์Šคํ„ด์Šคํ™” ํ•œ๋‹ค.
Letโ€™s Test (2/4)
Fabric Gateways ์„น์…˜์—์„œ mychannel์„ ํ™•์žฅํ•˜๋ฉด
์ด์ „ ์žฅ์—์„œ ์ธ์Šคํ„ด์Šคํ™”์— ์„ฑ๊ณตํ•œ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ๊ฐ€ ๋ณด์ธ๋‹ค.
์šฐ์ธก ๋งˆ์šฐ์Šค ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด๋ฅผ ์—ด์–ด์„œ
Submit Transaction์„ ์„ ํƒํ•œ๋‹ค.
์ƒ๋‹จ์—์„œ ํ•จ์ˆ˜๋ช…๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๋Š” ์ฐฝ์ด ์˜คํ”ˆ๋  ๋•Œ,
์ž„์˜์˜ ํ•จ์ˆ˜๋ช…(queryTest)๊ณผ ์ž„์˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ([โ€œqueryโ€,โ€eeeโ€])๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.
์ฒด์ธ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํด๋ฆญํ•˜๋ฉด
์•„๋ž˜์™€ ๊ฐ™์ด ์œ„์—์„œ ์ž…๋ ฅํ•œ ํ•จ์ˆ˜๋ช…๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ •์ƒ ์ถœ๋ ฅ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Œ
- ์ฒด์ธ์ฝ”๋“œ์—์„œ fmt.Println("Invoke()", fcn, params) ์— ํ•ด๋‹น๋˜๋Š” ๋ถ€๋ถ„
Letโ€™s Test (3/4)
๋„์ปค ์ปจํ…Œ์ด๋„ˆ ์ •์ง€
STOP
Letโ€™s Test (4/4)
[practice] KopoVote
Git address : https://github.com/wonyongHwang/kopoVote.git
Overall Architecture
Node.js
Docker
runApp.sh๋กœ ๊ตฌ๋™
- docker run
prepareFabric.sh๋กœ
์‚ฌ์šฉ์ž ๋“ฑ๋ก/์ฑ„๋„ ์ƒ์„ฑ/์ฒด์ธ์ฝ”๋“œ ์ธ์Šคํ†จ
Vue.js
Backend
VM
Frontend
Chaincode
invoke/query
! Balance Transfer๋ฅผ ํ™œ์šฉํ•œ ๋ธ”๋ก์ฒด์ธ ํˆฌํ‘œ ์‹œ์Šคํ…œ
Preparation
! Balance-Transfer example was built on SDK v1.4
! But at the fabric 2.0, we should use SDK v2.0
! Work around
1) remove docker images of ccenv 2.x and reinstall ccenv 1.4
docker pull hyperledger/fabric-ccenv:1.4
https://jira.hyperledger.org/browse/FABN-1357
Preview (KopoVote)
Frontend source reference : https://github.com/IBM/evote
https://www.youtube.com/watch?v=r6bnpPPif5E&t=10s
Local chaincode develop environment setup
! 1. VS CODE -> IBM BlockChain -> Create New Project
! 2 .ํ”„๋กœ์ ํŠธ ์ €์žฅ ์œ„์น˜๋Š” $GOPATH/src/ ํ•˜์œ„์— ์ž„์˜ ํด๋”๋ช…์œผ๋กœ ์œ„์น˜์‹œ์ผœ์•ผ ํ•จ
! 3. ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด IBM BlockChain ์—์„œ Package Open Project -> Install -
Instantiate -> Fabric GateWay์—์„œ admin role๋กœ ์ฑ„๋„ ์ƒ์„ฑ
์—ฌ๊ธฐ๊นŒ์ง€ ๋ฌธ์ œ ์—†์œผ๋ฉด Good
! 4. Chaincode.go ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ํˆฌํ‘œ ๊ธฐ๋ก์šฉ ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝ
! 5. 3๋ฒˆ ๋‹ค์‹œ ์ˆ˜ํ–‰(Instantiate์™€ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜ ์ฐธ์กฐ)
Instantiate : Init -> [โ€œAโ€,โ€100โ€,โ€Bโ€,โ€100โ€]
Fabric G/W > Submit Tx : query -> [โ€œAโ€]
> Evaluate Tx : query ->[โ€œAโ€]
Chaincode
ํˆฌํ‘œ ํ•ญ๋ชฉ 3๊ฐœ(A, B, C)์— ๋Œ€ํ•ด
Init ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐ๊ฐ’ 0์œผ๋กœ ์„ค์ •ํ•˜๊ณ 
voteํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ ํˆฌํ‘œํ•ญ๋ชฉ์— ๋Œ€ํ•ด +1์„ ๊ธฐ๋กํ•˜๋„๋ก ํ•จ
Packaging project
Install Chaincode
Instantiate Chaincode
Invoke Chaincode
Query Chaincode
Upgrade Chaincode ! ์ฒด์ธ์ฝ”๋“œ ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐฐํฌ์‹œ Init ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋จ
-> Init ํ•จ์ˆ˜๋‚ด ์ดˆ๊ธฐํ™” ๋กœ์ง์„ ์ตœ์ดˆ ๋ฐฐํฌ์‹œ์™€ ์—…๊ทธ๋ ˆ์ด๋“œ์‹œ 2๊ฐ€์ง€ ๋ชจ๋‘ ๊ณ ๋ คํ•ด์•ผ ํ•จ
Commit Chaincode
! Upload chaincode(chaincode.go & main.go) to servers(fabric server, node.js server)
Commit Chaincode
! ์ฒด์ธ์ฝ”๋“œ์—์„œ ํ•„์š”ํ•œ ์ตœ์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ go get ๋ช…๋ น์–ด ์ถ”๊ฐ€(base.yaml)
command: >
sh -c "peer node start
&& go get github.com/hyperledger/fabric-chaincode-go/shim
&& go get github.com/hyperledger/fabric-protos-go/peer"
Prepare shell script for booting up
! POST request Enroll on Org1/Org2
! POST request Create channel โ€ฆ
! POST request Join channel on Org1/Org2
! POST request Update anchor peers on Org1/Org2
! POST Install chaincode on Org1/Org2
! POST instantiate chaincode on Org1
Frontend coding
! Vote
! queryAll
Source reference : https://github.com/IBM/evote
Frontend coding
! REST Call using Axios
์‚ฌ์šฉ์ž ๋“ฑ๋ก
ํˆฌํ‘œ(invoke)
๊ฒฐ๊ณผ ์กฐํšŒ(query)
Source reference : https://github.com/IBM/evote
Frontend coding
! ์ธ์ฆ ํ† ํฐ ์ฒ˜๋ฆฌ
์‚ฌ์šฉ์ž ๋“ฑ๋ก์‹œ ์‘๋‹ต์œผ๋กœ
๋ฐ›์€ ํ† ํฐ์„ ์ €์žฅํ•˜๊ณ  ์ด๋ฅผ
ํˆฌํ‘œํ™”๋ฉด์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ ์ „๋‹ฌ
Source reference : https://github.com/IBM/evote
Frontend coding
! ์ธ์ฆ ํ† ํฐ ์ฒ˜๋ฆฌ
์ด์ „ ํ™”๋ฉด์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ
์ „๋‹ฌํ•œ ํ† ํฐ์„ ์ €์žฅ
ํ† ํฐ๊ณผ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ
ํˆฌํ‘œ ๊ฒฐ๊ณผ๋ฅผ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ
์„œ๋ฒ„์—์„œ ์ •์ƒ ์‘๋‹ต์ธ ๊ฒฝ์šฐ,
ํˆฌํ‘œ์กฐํšŒ ๊ฒฐ๊ณผ ํ™”๋ฉด์œผ๋กœ ์ด๋™
(ํ† ํฐ์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ)
Source reference : https://github.com/IBM/evote
Frontend coding
! ์ธ์ฆ ํ† ํฐ ์ฒ˜๋ฆฌ
์ด์ „ ํ™”๋ฉด์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ
์ „๋‹ฌํ•œ ํ† ํฐ์„ ์ €์žฅ
Fabric runtime์— query
(w/ auth. Token)
๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ํ‘œํ˜„์„œ๋ฒ„์˜ chaincode ์ค‘
Query ์‘๋‹ต ๋ถ€๋ถ„
Source reference : https://github.com/IBM/evote
Todo
! ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์ถ• ๋ฐ ์ธ์ฆ ๋กœ์ง
! ์›์žฅ์— ํˆฌํ‘œํ•œ ์‚ฌ์šฉ์ž ๊ธฐ๋ก ๋ฐ ์กฐํšŒ (์ด์ค‘ ํˆฌํ‘œ ๋ฐฉ์ง€ ๋ชฉ์ )
! ํˆฌํ‘œ ์กฐ์ง(org1)๊ณผ ๊ฒ€์ฆ ์กฐ์ง(org2)์˜ ๋ถ„๋ฆฌ
Git address : https://github.com/wonyongHwang/kopoVote.git
Source reference : https://github.com/IBM/evote
This doesnโ€™t work well but it should be
okay.
! ์ฒด์ธ์ฝ”๋“œ ๋ณ€๊ฒฝ (library hierarchy changed on fabric 2.0)
! GOPATH ์„ค์ • ๋ฐ ์ฒด์ธ์ฝ”๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜
- ์„ค์ • ํ›„ source /etc/profile ์‹คํ–‰
- go get
- go build
import (
"fmt"
"strconv"
"github.com/hyperledger/fabric/core/chaincode/shim"
pb "github.com/hyperledger/fabric/protos/peer"
)
import (
"fmt"
"strconv"
โ€œgithub.com/hyperledger/fabric-chaincode-go/shim"
pb "github.com/hyperledger/fabric-protos-go/peer"
)
export GOROOT=/usr/local/go
export GOPATH=$HOME
export GOBIN=$GOPATH/bin
export FABRIC_HOME=/root/fabric-samples
export PATH=$PATH:$GOROOT/bin:$FABRIC_HOME/bin
Thanksโ€ฆ
wyhwang@kopo.ac.kr
๋ฉ€ํ‹ฐ ๋…ธ๋“œ์—์„œ ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑํ•˜๊ธฐ (1/3)
(Hyperledger Korea User Group https://github.com/hlkug/meetup/tree/master/201903)
! BYFN ์˜ˆ์ œ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ๋ฉ€ํ‹ฐ ๋…ธ๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํžŒ๋‹ค.
! ์‚ฌ์ „ ์ž‘์—…
- Virtual Box, Ubuntu, Docker, Docker-Compose, HLF ๋“ฑ ๊ธฐ๋ณธ ์„ค์น˜
- 2 nodes ์ด๋ฏ€๋กœ ๊ฐ VM์˜ ๋„คํŠธ์›Œํฌ๋Š” ๊ธฐ๋ณธ NAT + ํ˜ธ์ŠคํŠธ ์ „์šฉ ์–ด๋Œ‘ํ„ฐ์ด๋ฉฐ, ๊ฐ ํ˜ธ์ŠคํŠธ ์ •๋ณด IP๋ฅผ ๋ณ„๋„ ์„ค์ •ํ•ด์•ผ ํ•จ
๋ฉ€ํ‹ฐ ๋…ธ๋“œ์—์„œ ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑํ•˜๊ธฐ (2/3)
(Hyperledger Korea User Group https://github.com/hlkug/meetup/tree/master/201903)
๋ฉ€ํ‹ฐ ๋…ธ๋“œ์—์„œ ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑํ•˜๊ธฐ (3/3)
(Hyperledger Korea User Group https://github.com/hlkug/meetup/tree/master/201903)
์ดํ›„ ์ง„ํ–‰์€ BYFN๊ณผ ์œ ์‚ฌํ•จ.
์˜ˆ์ œ์˜ ์ „์ฒด์†Œ์Šค๋Š” ์ƒ๋‹จ์˜ ๋งํฌ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐ.

More Related Content

What's hot

[2019.04] ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ๋ฐ˜ ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋„คํŠธ์›Œํฌ ๊ตฌ์ถ•ํ•˜๊ธฐ
[2019.04] ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ๋ฐ˜ ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋„คํŠธ์›Œํฌ ๊ตฌ์ถ•ํ•˜๊ธฐ[2019.04] ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ๋ฐ˜ ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋„คํŠธ์›Œํฌ ๊ตฌ์ถ•ํ•˜๊ธฐ
[2019.04] ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ๋ฐ˜ ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋„คํŠธ์›Œํฌ ๊ตฌ์ถ•ํ•˜๊ธฐHyperledger Korea User Group
ย 
แ„‰แ…ณแ„‘แ…ณแ„…แ…ตแ†ผ แ„‰แ…ตแ„แ…ฒแ„…แ…ตแ„แ…ต แ„€แ…ฎแ„Œแ…ฉ แ„‹แ…ตแ„’แ…ข
แ„‰แ…ณแ„‘แ…ณแ„…แ…ตแ†ผ แ„‰แ…ตแ„แ…ฒแ„…แ…ตแ„แ…ต แ„€แ…ฎแ„Œแ…ฉ แ„‹แ…ตแ„’แ…ขแ„‰แ…ณแ„‘แ…ณแ„…แ…ตแ†ผ แ„‰แ…ตแ„แ…ฒแ„…แ…ตแ„แ…ต แ„€แ…ฎแ„Œแ…ฉ แ„‹แ…ตแ„’แ…ข
แ„‰แ…ณแ„‘แ…ณแ„…แ…ตแ†ผ แ„‰แ…ตแ„แ…ฒแ„…แ…ตแ„แ…ต แ„€แ…ฎแ„Œแ…ฉ แ„‹แ…ตแ„’แ…ขbeom kyun choi
ย 
Docker Basics
Docker BasicsDocker Basics
Docker BasicsDuckDuckGo
ย 
Docker 101: An Introduction
Docker 101: An IntroductionDocker 101: An Introduction
Docker 101: An IntroductionPOSSCON
ย 
Distributed fun with etcd
Distributed fun with etcdDistributed fun with etcd
Distributed fun with etcdAbdulaziz AlMalki
ย 
Docker Introduction
Docker IntroductionDocker Introduction
Docker IntroductionJeffrey Ellin
ย 
[2019] ๋ฐ”๋ฅด๊ฒŒ, ๋น ๋ฅด๊ฒŒ! Reactive๋ฅผ ํ’ˆ์€ Spring Kafka
[2019] ๋ฐ”๋ฅด๊ฒŒ, ๋น ๋ฅด๊ฒŒ! Reactive๋ฅผ ํ’ˆ์€ Spring Kafka[2019] ๋ฐ”๋ฅด๊ฒŒ, ๋น ๋ฅด๊ฒŒ! Reactive๋ฅผ ํ’ˆ์€ Spring Kafka
[2019] ๋ฐ”๋ฅด๊ฒŒ, ๋น ๋ฅด๊ฒŒ! Reactive๋ฅผ ํ’ˆ์€ Spring KafkaNHN FORWARD
ย 
Hyperledger Indy tutorial
Hyperledger Indy tutorialHyperledger Indy tutorial
Hyperledger Indy tutorialssuser3993f3
ย 
ํด๋ผ์šฐ๋“œ์˜ ๋Œ€์„ธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ž€ ๋ฌด์—‡์ธ๊ฐ€?(์œค์„ฑํ›ˆ ํด๋ผ์šฐ๋“œ ์†”๋ฃจ์…˜ ์•„ํ‚คํ…ํŠธ) - Webinar
ํด๋ผ์šฐ๋“œ์˜ ๋Œ€์„ธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ž€ ๋ฌด์—‡์ธ๊ฐ€?(์œค์„ฑํ›ˆ ํด๋ผ์šฐ๋“œ ์†”๋ฃจ์…˜ ์•„ํ‚คํ…ํŠธ) - Webinarํด๋ผ์šฐ๋“œ์˜ ๋Œ€์„ธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ž€ ๋ฌด์—‡์ธ๊ฐ€?(์œค์„ฑํ›ˆ ํด๋ผ์šฐ๋“œ ์†”๋ฃจ์…˜ ์•„ํ‚คํ…ํŠธ) - Webinar
ํด๋ผ์šฐ๋“œ์˜ ๋Œ€์„ธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ž€ ๋ฌด์—‡์ธ๊ฐ€?(์œค์„ฑํ›ˆ ํด๋ผ์šฐ๋“œ ์†”๋ฃจ์…˜ ์•„ํ‚คํ…ํŠธ) - WebinarNAVER CLOUD PLATFORMใ…ฃ๋„ค์ด๋ฒ„ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ
ย 
์™œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” systemd๋กœ cgroup์„ ๊ด€๋ฆฌํ•˜๋ ค๊ณ  ํ• ๊นŒ์š”
์™œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” systemd๋กœ cgroup์„ ๊ด€๋ฆฌํ•˜๋ ค๊ณ  ํ• ๊นŒ์š”์™œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” systemd๋กœ cgroup์„ ๊ด€๋ฆฌํ•˜๋ ค๊ณ  ํ• ๊นŒ์š”
์™œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” systemd๋กœ cgroup์„ ๊ด€๋ฆฌํ•˜๋ ค๊ณ  ํ• ๊นŒ์š”Jo Hoon
ย 
Spring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsSpring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsJulien Wittouck
ย 
GitLab๊ณผ Kubernetes๋ฅผ ํ†ตํ•œ CI/CD ๊ตฌ์ถ•
GitLab๊ณผ Kubernetes๋ฅผ ํ†ตํ•œ CI/CD ๊ตฌ์ถ•GitLab๊ณผ Kubernetes๋ฅผ ํ†ตํ•œ CI/CD ๊ตฌ์ถ•
GitLab๊ณผ Kubernetes๋ฅผ ํ†ตํ•œ CI/CD ๊ตฌ์ถ•์ฒ ๊ตฌ ๊น€
ย 
Container Network Interface: Network Plugins for Kubernetes and beyond
Container Network Interface: Network Plugins for Kubernetes and beyondContainer Network Interface: Network Plugins for Kubernetes and beyond
Container Network Interface: Network Plugins for Kubernetes and beyondKubeAcademy
ย 
ํ•˜์ดํผ๋ ˆ์ € ํ”„๋กœ์ ํŠธ ๊ฐœ์š”
ํ•˜์ดํผ๋ ˆ์ € ํ”„๋กœ์ ํŠธ ๊ฐœ์š”ํ•˜์ดํผ๋ ˆ์ € ํ”„๋กœ์ ํŠธ ๊ฐœ์š”
ํ•˜์ดํผ๋ ˆ์ € ํ”„๋กœ์ ํŠธ ๊ฐœ์š”TIMEGATE
ย 
[MeetUp][1st] ์˜ค๋ฆฌ๋Ž…์ด์˜_์ฟ ๋ฒ„๋„คํ‹ฐ์Šค_๋„คํŠธ์›Œํ‚น
[MeetUp][1st] ์˜ค๋ฆฌ๋Ž…์ด์˜_์ฟ ๋ฒ„๋„คํ‹ฐ์Šค_๋„คํŠธ์›Œํ‚น[MeetUp][1st] ์˜ค๋ฆฌ๋Ž…์ด์˜_์ฟ ๋ฒ„๋„คํ‹ฐ์Šค_๋„คํŠธ์›Œํ‚น
[MeetUp][1st] ์˜ค๋ฆฌ๋Ž…์ด์˜_์ฟ ๋ฒ„๋„คํ‹ฐ์Šค_๋„คํŠธ์›Œํ‚นInfraEngineer
ย 
Introduction to docker
Introduction to dockerIntroduction to docker
Introduction to dockerJohn Willis
ย 

What's hot (20)

[2019.04] ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ๋ฐ˜ ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋„คํŠธ์›Œํฌ ๊ตฌ์ถ•ํ•˜๊ธฐ
[2019.04] ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ๋ฐ˜ ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋„คํŠธ์›Œํฌ ๊ตฌ์ถ•ํ•˜๊ธฐ[2019.04] ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ๋ฐ˜ ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋„คํŠธ์›Œํฌ ๊ตฌ์ถ•ํ•˜๊ธฐ
[2019.04] ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ๋ฐ˜ ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋„คํŠธ์›Œํฌ ๊ตฌ์ถ•ํ•˜๊ธฐ
ย 
แ„‰แ…ณแ„‘แ…ณแ„…แ…ตแ†ผ แ„‰แ…ตแ„แ…ฒแ„…แ…ตแ„แ…ต แ„€แ…ฎแ„Œแ…ฉ แ„‹แ…ตแ„’แ…ข
แ„‰แ…ณแ„‘แ…ณแ„…แ…ตแ†ผ แ„‰แ…ตแ„แ…ฒแ„…แ…ตแ„แ…ต แ„€แ…ฎแ„Œแ…ฉ แ„‹แ…ตแ„’แ…ขแ„‰แ…ณแ„‘แ…ณแ„…แ…ตแ†ผ แ„‰แ…ตแ„แ…ฒแ„…แ…ตแ„แ…ต แ„€แ…ฎแ„Œแ…ฉ แ„‹แ…ตแ„’แ…ข
แ„‰แ…ณแ„‘แ…ณแ„…แ…ตแ†ผ แ„‰แ…ตแ„แ…ฒแ„…แ…ตแ„แ…ต แ„€แ…ฎแ„Œแ…ฉ แ„‹แ…ตแ„’แ…ข
ย 
Docker Basics
Docker BasicsDocker Basics
Docker Basics
ย 
Docker 101: An Introduction
Docker 101: An IntroductionDocker 101: An Introduction
Docker 101: An Introduction
ย 
Jenkins
JenkinsJenkins
Jenkins
ย 
Distributed fun with etcd
Distributed fun with etcdDistributed fun with etcd
Distributed fun with etcd
ย 
Docker Introduction
Docker IntroductionDocker Introduction
Docker Introduction
ย 
[2019] ๋ฐ”๋ฅด๊ฒŒ, ๋น ๋ฅด๊ฒŒ! Reactive๋ฅผ ํ’ˆ์€ Spring Kafka
[2019] ๋ฐ”๋ฅด๊ฒŒ, ๋น ๋ฅด๊ฒŒ! Reactive๋ฅผ ํ’ˆ์€ Spring Kafka[2019] ๋ฐ”๋ฅด๊ฒŒ, ๋น ๋ฅด๊ฒŒ! Reactive๋ฅผ ํ’ˆ์€ Spring Kafka
[2019] ๋ฐ”๋ฅด๊ฒŒ, ๋น ๋ฅด๊ฒŒ! Reactive๋ฅผ ํ’ˆ์€ Spring Kafka
ย 
Docker by Example - Basics
Docker by Example - Basics Docker by Example - Basics
Docker by Example - Basics
ย 
Hyperledger Indy tutorial
Hyperledger Indy tutorialHyperledger Indy tutorial
Hyperledger Indy tutorial
ย 
ํด๋ผ์šฐ๋“œ์˜ ๋Œ€์„ธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ž€ ๋ฌด์—‡์ธ๊ฐ€?(์œค์„ฑํ›ˆ ํด๋ผ์šฐ๋“œ ์†”๋ฃจ์…˜ ์•„ํ‚คํ…ํŠธ) - Webinar
ํด๋ผ์šฐ๋“œ์˜ ๋Œ€์„ธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ž€ ๋ฌด์—‡์ธ๊ฐ€?(์œค์„ฑํ›ˆ ํด๋ผ์šฐ๋“œ ์†”๋ฃจ์…˜ ์•„ํ‚คํ…ํŠธ) - Webinarํด๋ผ์šฐ๋“œ์˜ ๋Œ€์„ธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ž€ ๋ฌด์—‡์ธ๊ฐ€?(์œค์„ฑํ›ˆ ํด๋ผ์šฐ๋“œ ์†”๋ฃจ์…˜ ์•„ํ‚คํ…ํŠธ) - Webinar
ํด๋ผ์šฐ๋“œ์˜ ๋Œ€์„ธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ž€ ๋ฌด์—‡์ธ๊ฐ€?(์œค์„ฑํ›ˆ ํด๋ผ์šฐ๋“œ ์†”๋ฃจ์…˜ ์•„ํ‚คํ…ํŠธ) - Webinar
ย 
์™œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” systemd๋กœ cgroup์„ ๊ด€๋ฆฌํ•˜๋ ค๊ณ  ํ• ๊นŒ์š”
์™œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” systemd๋กœ cgroup์„ ๊ด€๋ฆฌํ•˜๋ ค๊ณ  ํ• ๊นŒ์š”์™œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” systemd๋กœ cgroup์„ ๊ด€๋ฆฌํ•˜๋ ค๊ณ  ํ• ๊นŒ์š”
์™œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” systemd๋กœ cgroup์„ ๊ด€๋ฆฌํ•˜๋ ค๊ณ  ํ• ๊นŒ์š”
ย 
Docker swarm
Docker swarmDocker swarm
Docker swarm
ย 
Spring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'tsSpring Boot & Containers - Do's & Don'ts
Spring Boot & Containers - Do's & Don'ts
ย 
GitLab๊ณผ Kubernetes๋ฅผ ํ†ตํ•œ CI/CD ๊ตฌ์ถ•
GitLab๊ณผ Kubernetes๋ฅผ ํ†ตํ•œ CI/CD ๊ตฌ์ถ•GitLab๊ณผ Kubernetes๋ฅผ ํ†ตํ•œ CI/CD ๊ตฌ์ถ•
GitLab๊ณผ Kubernetes๋ฅผ ํ†ตํ•œ CI/CD ๊ตฌ์ถ•
ย 
Container Network Interface: Network Plugins for Kubernetes and beyond
Container Network Interface: Network Plugins for Kubernetes and beyondContainer Network Interface: Network Plugins for Kubernetes and beyond
Container Network Interface: Network Plugins for Kubernetes and beyond
ย 
ํ•˜์ดํผ๋ ˆ์ € ํ”„๋กœ์ ํŠธ ๊ฐœ์š”
ํ•˜์ดํผ๋ ˆ์ € ํ”„๋กœ์ ํŠธ ๊ฐœ์š”ํ•˜์ดํผ๋ ˆ์ € ํ”„๋กœ์ ํŠธ ๊ฐœ์š”
ํ•˜์ดํผ๋ ˆ์ € ํ”„๋กœ์ ํŠธ ๊ฐœ์š”
ย 
Kubernetes Basics
Kubernetes BasicsKubernetes Basics
Kubernetes Basics
ย 
[MeetUp][1st] ์˜ค๋ฆฌ๋Ž…์ด์˜_์ฟ ๋ฒ„๋„คํ‹ฐ์Šค_๋„คํŠธ์›Œํ‚น
[MeetUp][1st] ์˜ค๋ฆฌ๋Ž…์ด์˜_์ฟ ๋ฒ„๋„คํ‹ฐ์Šค_๋„คํŠธ์›Œํ‚น[MeetUp][1st] ์˜ค๋ฆฌ๋Ž…์ด์˜_์ฟ ๋ฒ„๋„คํ‹ฐ์Šค_๋„คํŠธ์›Œํ‚น
[MeetUp][1st] ์˜ค๋ฆฌ๋Ž…์ด์˜_์ฟ ๋ฒ„๋„คํ‹ฐ์Šค_๋„คํŠธ์›Œํ‚น
ย 
Introduction to docker
Introduction to dockerIntroduction to docker
Introduction to docker
ย 

Similar to Hyperledger Fabric practice (v2.0)

Hyperledger fabric practice(pdf)
Hyperledger fabric practice(pdf)Hyperledger fabric practice(pdf)
Hyperledger fabric practice(pdf)wonyong hwang
ย 
20141029 ํ•˜๋‘ก2.5์™€ hive์„ค์น˜ ๋ฐ ์˜ˆ์ œ
20141029 ํ•˜๋‘ก2.5์™€ hive์„ค์น˜ ๋ฐ ์˜ˆ์ œ20141029 ํ•˜๋‘ก2.5์™€ hive์„ค์น˜ ๋ฐ ์˜ˆ์ œ
20141029 ํ•˜๋‘ก2.5์™€ hive์„ค์น˜ ๋ฐ ์˜ˆ์ œTae Young Lee
ย 
Kafka slideshare
Kafka   slideshareKafka   slideshare
Kafka slidesharewonyong hwang
ย 
ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐLogpresso
ย 
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Nginx jboss ์—ฐ๋™๊ฐ€์ด๋“œ__v1
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Nginx jboss ์—ฐ๋™๊ฐ€์ด๋“œ__v1[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Nginx jboss ์—ฐ๋™๊ฐ€์ด๋“œ__v1
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Nginx jboss ์—ฐ๋™๊ฐ€์ด๋“œ__v1Ji-Woong Choi
ย 
PCF Installation Guide
PCF Installation GuidePCF Installation Guide
PCF Installation Guideseungdon Choi
ย 
Deploying Hyperledger Fabric on Kubernetes.pptx
Deploying Hyperledger Fabric on Kubernetes.pptxDeploying Hyperledger Fabric on Kubernetes.pptx
Deploying Hyperledger Fabric on Kubernetes.pptxwonyong hwang
ย 
๋„์ปค์—†์ด ์ปจํ…Œ์ด๋„ˆ ๋งŒ๋“ค๊ธฐ 1ํŽธ
๋„์ปค์—†์ด ์ปจํ…Œ์ด๋„ˆ ๋งŒ๋“ค๊ธฐ 1ํŽธ๋„์ปค์—†์ด ์ปจํ…Œ์ด๋„ˆ ๋งŒ๋“ค๊ธฐ 1ํŽธ
๋„์ปค์—†์ด ์ปจํ…Œ์ด๋„ˆ ๋งŒ๋“ค๊ธฐ 1ํŽธSam Kim
ย 
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoMario Cho
ย 
KAFKA 3.1.0.pdf
KAFKA 3.1.0.pdfKAFKA 3.1.0.pdf
KAFKA 3.1.0.pdfwonyong hwang
ย 
Internship backend
Internship backendInternship backend
Internship backendYein Sim
ย 
Apache Tomcat ( ์•„ํŒŒ์น˜ ํ†ฐ์บฃ ) ์„ค์น˜ ๊ฐ€์ด๋“œ
Apache Tomcat ( ์•„ํŒŒ์น˜ ํ†ฐ์บฃ ) ์„ค์น˜ ๊ฐ€์ด๋“œApache Tomcat ( ์•„ํŒŒ์น˜ ํ†ฐ์บฃ ) ์„ค์น˜ ๊ฐ€์ด๋“œ
Apache Tomcat ( ์•„ํŒŒ์น˜ ํ†ฐ์บฃ ) ์„ค์น˜ ๊ฐ€์ด๋“œOpennaru, inc.
ย 
Puppetแ„€แ…ช แ„Œแ…กแ„ƒแ…ฉแ†ผแ„’แ…ชแ„ƒแ…ฌแ†ซ แ„‰แ…ตแ„‰แ…ณแ„แ…ฆแ†ท แ„€แ…ชแ†ซแ„…แ…ต
Puppetแ„€แ…ช แ„Œแ…กแ„ƒแ…ฉแ†ผแ„’แ…ชแ„ƒแ…ฌแ†ซ แ„‰แ…ตแ„‰แ…ณแ„แ…ฆแ†ท แ„€แ…ชแ†ซแ„…แ…ตPuppetแ„€แ…ช แ„Œแ…กแ„ƒแ…ฉแ†ผแ„’แ…ชแ„ƒแ…ฌแ†ซ แ„‰แ…ตแ„‰แ…ณแ„แ…ฆแ†ท แ„€แ…ชแ†ซแ„…แ…ต
Puppetแ„€แ…ช แ„Œแ…กแ„ƒแ…ฉแ†ผแ„’แ…ชแ„ƒแ…ฌแ†ซ แ„‰แ…ตแ„‰แ…ณแ„แ…ฆแ†ท แ„€แ…ชแ†ซแ„…แ…ตKeon Ahn
ย 
Build the OpenStack Cloud with Neutron Networing, IceHouse
Build the OpenStack Cloud with Neutron Networing, IceHouseBuild the OpenStack Cloud with Neutron Networing, IceHouse
Build the OpenStack Cloud with Neutron Networing, IceHousejieun kim
ย 
oVirt installation guide_v4.3
oVirt installation guide_v4.3oVirt installation guide_v4.3
oVirt installation guide_v4.3CheolHee Han
ย 
Tensorflow service & Machine Learning
Tensorflow service & Machine LearningTensorflow service & Machine Learning
Tensorflow service & Machine LearningJEEHYUN PAIK
ย 
๊ฐœ๋ฐœ์‚ฌ๋Š” ๋ชจ๋ฅด๋Š” ํผ๋ธ”๋ฆฌ์…”์˜ ๋’ท ์ด์•ผ๊ธฐ
๊ฐœ๋ฐœ์‚ฌ๋Š” ๋ชจ๋ฅด๋Š” ํผ๋ธ”๋ฆฌ์…”์˜ ๋’ท ์ด์•ผ๊ธฐ๊ฐœ๋ฐœ์‚ฌ๋Š” ๋ชจ๋ฅด๋Š” ํผ๋ธ”๋ฆฌ์…”์˜ ๋’ท ์ด์•ผ๊ธฐ
๊ฐœ๋ฐœ์‚ฌ๋Š” ๋ชจ๋ฅด๋Š” ํผ๋ธ”๋ฆฌ์…”์˜ ๋’ท ์ด์•ผ๊ธฐDavid Kim
ย 
Nginx basic configurations
Nginx basic configurationsNginx basic configurations
Nginx basic configurationsJohn Kim
ย 
XECon2015 :: [1-5] ๊น€ํ›ˆ๋ฏผ - ์„œ๋ฒ„ ์šด์˜์ž๊ฐ€ ๊ผญ ์•Œ์•„์•ผ ํ•  Docker
XECon2015 :: [1-5] ๊น€ํ›ˆ๋ฏผ - ์„œ๋ฒ„ ์šด์˜์ž๊ฐ€ ๊ผญ ์•Œ์•„์•ผ ํ•  DockerXECon2015 :: [1-5] ๊น€ํ›ˆ๋ฏผ - ์„œ๋ฒ„ ์šด์˜์ž๊ฐ€ ๊ผญ ์•Œ์•„์•ผ ํ•  Docker
XECon2015 :: [1-5] ๊น€ํ›ˆ๋ฏผ - ์„œ๋ฒ„ ์šด์˜์ž๊ฐ€ ๊ผญ ์•Œ์•„์•ผ ํ•  DockerXpressEngine
ย 

Similar to Hyperledger Fabric practice (v2.0) (20)

Hyperledger fabric practice(pdf)
Hyperledger fabric practice(pdf)Hyperledger fabric practice(pdf)
Hyperledger fabric practice(pdf)
ย 
20141029 ํ•˜๋‘ก2.5์™€ hive์„ค์น˜ ๋ฐ ์˜ˆ์ œ
20141029 ํ•˜๋‘ก2.5์™€ hive์„ค์น˜ ๋ฐ ์˜ˆ์ œ20141029 ํ•˜๋‘ก2.5์™€ hive์„ค์น˜ ๋ฐ ์˜ˆ์ œ
20141029 ํ•˜๋‘ก2.5์™€ hive์„ค์น˜ ๋ฐ ์˜ˆ์ œ
ย 
Kafka slideshare
Kafka   slideshareKafka   slideshare
Kafka slideshare
ย 
ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
ย 
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Nginx jboss ์—ฐ๋™๊ฐ€์ด๋“œ__v1
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Nginx jboss ์—ฐ๋™๊ฐ€์ด๋“œ__v1[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Nginx jboss ์—ฐ๋™๊ฐ€์ด๋“œ__v1
[์˜คํ”ˆ์†Œ์Šค์ปจ์„คํŒ…]Nginx jboss ์—ฐ๋™๊ฐ€์ด๋“œ__v1
ย 
PCF Installation Guide
PCF Installation GuidePCF Installation Guide
PCF Installation Guide
ย 
Deploying Hyperledger Fabric on Kubernetes.pptx
Deploying Hyperledger Fabric on Kubernetes.pptxDeploying Hyperledger Fabric on Kubernetes.pptx
Deploying Hyperledger Fabric on Kubernetes.pptx
ย 
๋„์ปค์—†์ด ์ปจํ…Œ์ด๋„ˆ ๋งŒ๋“ค๊ธฐ 1ํŽธ
๋„์ปค์—†์ด ์ปจํ…Œ์ด๋„ˆ ๋งŒ๋“ค๊ธฐ 1ํŽธ๋„์ปค์—†์ด ์ปจํ…Œ์ด๋„ˆ ๋งŒ๋“ค๊ธฐ 1ํŽธ
๋„์ปค์—†์ด ์ปจํ…Œ์ด๋„ˆ ๋งŒ๋“ค๊ธฐ 1ํŽธ
ย 
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
ย 
KAFKA 3.1.0.pdf
KAFKA 3.1.0.pdfKAFKA 3.1.0.pdf
KAFKA 3.1.0.pdf
ย 
Internship backend
Internship backendInternship backend
Internship backend
ย 
Apache Tomcat ( ์•„ํŒŒ์น˜ ํ†ฐ์บฃ ) ์„ค์น˜ ๊ฐ€์ด๋“œ
Apache Tomcat ( ์•„ํŒŒ์น˜ ํ†ฐ์บฃ ) ์„ค์น˜ ๊ฐ€์ด๋“œApache Tomcat ( ์•„ํŒŒ์น˜ ํ†ฐ์บฃ ) ์„ค์น˜ ๊ฐ€์ด๋“œ
Apache Tomcat ( ์•„ํŒŒ์น˜ ํ†ฐ์บฃ ) ์„ค์น˜ ๊ฐ€์ด๋“œ
ย 
ARTIK 710 IoT class 02
ARTIK 710 IoT class 02ARTIK 710 IoT class 02
ARTIK 710 IoT class 02
ย 
Puppetแ„€แ…ช แ„Œแ…กแ„ƒแ…ฉแ†ผแ„’แ…ชแ„ƒแ…ฌแ†ซ แ„‰แ…ตแ„‰แ…ณแ„แ…ฆแ†ท แ„€แ…ชแ†ซแ„…แ…ต
Puppetแ„€แ…ช แ„Œแ…กแ„ƒแ…ฉแ†ผแ„’แ…ชแ„ƒแ…ฌแ†ซ แ„‰แ…ตแ„‰แ…ณแ„แ…ฆแ†ท แ„€แ…ชแ†ซแ„…แ…ตPuppetแ„€แ…ช แ„Œแ…กแ„ƒแ…ฉแ†ผแ„’แ…ชแ„ƒแ…ฌแ†ซ แ„‰แ…ตแ„‰แ…ณแ„แ…ฆแ†ท แ„€แ…ชแ†ซแ„…แ…ต
Puppetแ„€แ…ช แ„Œแ…กแ„ƒแ…ฉแ†ผแ„’แ…ชแ„ƒแ…ฌแ†ซ แ„‰แ…ตแ„‰แ…ณแ„แ…ฆแ†ท แ„€แ…ชแ†ซแ„…แ…ต
ย 
Build the OpenStack Cloud with Neutron Networing, IceHouse
Build the OpenStack Cloud with Neutron Networing, IceHouseBuild the OpenStack Cloud with Neutron Networing, IceHouse
Build the OpenStack Cloud with Neutron Networing, IceHouse
ย 
oVirt installation guide_v4.3
oVirt installation guide_v4.3oVirt installation guide_v4.3
oVirt installation guide_v4.3
ย 
Tensorflow service & Machine Learning
Tensorflow service & Machine LearningTensorflow service & Machine Learning
Tensorflow service & Machine Learning
ย 
๊ฐœ๋ฐœ์‚ฌ๋Š” ๋ชจ๋ฅด๋Š” ํผ๋ธ”๋ฆฌ์…”์˜ ๋’ท ์ด์•ผ๊ธฐ
๊ฐœ๋ฐœ์‚ฌ๋Š” ๋ชจ๋ฅด๋Š” ํผ๋ธ”๋ฆฌ์…”์˜ ๋’ท ์ด์•ผ๊ธฐ๊ฐœ๋ฐœ์‚ฌ๋Š” ๋ชจ๋ฅด๋Š” ํผ๋ธ”๋ฆฌ์…”์˜ ๋’ท ์ด์•ผ๊ธฐ
๊ฐœ๋ฐœ์‚ฌ๋Š” ๋ชจ๋ฅด๋Š” ํผ๋ธ”๋ฆฌ์…”์˜ ๋’ท ์ด์•ผ๊ธฐ
ย 
Nginx basic configurations
Nginx basic configurationsNginx basic configurations
Nginx basic configurations
ย 
XECon2015 :: [1-5] ๊น€ํ›ˆ๋ฏผ - ์„œ๋ฒ„ ์šด์˜์ž๊ฐ€ ๊ผญ ์•Œ์•„์•ผ ํ•  Docker
XECon2015 :: [1-5] ๊น€ํ›ˆ๋ฏผ - ์„œ๋ฒ„ ์šด์˜์ž๊ฐ€ ๊ผญ ์•Œ์•„์•ผ ํ•  DockerXECon2015 :: [1-5] ๊น€ํ›ˆ๋ฏผ - ์„œ๋ฒ„ ์šด์˜์ž๊ฐ€ ๊ผญ ์•Œ์•„์•ผ ํ•  Docker
XECon2015 :: [1-5] ๊น€ํ›ˆ๋ฏผ - ์„œ๋ฒ„ ์šด์˜์ž๊ฐ€ ๊ผญ ์•Œ์•„์•ผ ํ•  Docker
ย 

More from wonyong hwang

Hyperledger Explorer.pptx
Hyperledger Explorer.pptxHyperledger Explorer.pptx
Hyperledger Explorer.pptxwonyong hwang
ย 
ํ•˜์ดํผ๋ ˆ์ € ํŽ˜์ด์ง€ ๋‹จ์œ„ ๋ธ”๋ก ์กฐํšŒ
ํ•˜์ดํผ๋ ˆ์ € ํŽ˜์ด์ง€ ๋‹จ์œ„ ๋ธ”๋ก ์กฐํšŒํ•˜์ดํผ๋ ˆ์ € ํŽ˜์ด์ง€ ๋‹จ์œ„ ๋ธ”๋ก ์กฐํšŒ
ํ•˜์ดํผ๋ ˆ์ € ํŽ˜์ด์ง€ ๋‹จ์œ„ ๋ธ”๋ก ์กฐํšŒwonyong hwang
ย 
ํ† ํฐ ์ฆ๊ถŒ ๊ฐœ์š”.pptx
ํ† ํฐ ์ฆ๊ถŒ ๊ฐœ์š”.pptxํ† ํฐ ์ฆ๊ถŒ ๊ฐœ์š”.pptx
ํ† ํฐ ์ฆ๊ถŒ ๊ฐœ์š”.pptxwonyong hwang
ย 
Vue.js ๊ธฐ์ดˆ ์‹ค์Šต.pptx
Vue.js ๊ธฐ์ดˆ ์‹ค์Šต.pptxVue.js ๊ธฐ์ดˆ ์‹ค์Šต.pptx
Vue.js ๊ธฐ์ดˆ ์‹ค์Šต.pptxwonyong hwang
ย 
k8s practice 2023.pptx
k8s practice 2023.pptxk8s practice 2023.pptx
k8s practice 2023.pptxwonyong hwang
ย 
HyperLedger Fabric V2.5.pdf
HyperLedger Fabric V2.5.pdfHyperLedger Fabric V2.5.pdf
HyperLedger Fabric V2.5.pdfwonyong hwang
ย 
Ngrok์„ ์ด์šฉํ•œ Nginx Https ์ ์šฉํ•˜๊ธฐ.pptx
Ngrok์„ ์ด์šฉํ•œ Nginx Https ์ ์šฉํ•˜๊ธฐ.pptxNgrok์„ ์ด์šฉํ•œ Nginx Https ์ ์šฉํ•˜๊ธฐ.pptx
Ngrok์„ ์ด์šฉํ•œ Nginx Https ์ ์šฉํ•˜๊ธฐ.pptxwonyong hwang
ย 
Nginx Https ์ ์šฉํ•˜๊ธฐ.pptx
Nginx Https ์ ์šฉํ•˜๊ธฐ.pptxNginx Https ์ ์šฉํ•˜๊ธฐ.pptx
Nginx Https ์ ์šฉํ•˜๊ธฐ.pptxwonyong hwang
ย 
Kafka JDBC Connect Guide(Postgres Sink).pptx
Kafka JDBC Connect Guide(Postgres Sink).pptxKafka JDBC Connect Guide(Postgres Sink).pptx
Kafka JDBC Connect Guide(Postgres Sink).pptxwonyong hwang
ย 
Nginx Reverse Proxy with Kafka.pptx
Nginx Reverse Proxy with Kafka.pptxNginx Reverse Proxy with Kafka.pptx
Nginx Reverse Proxy with Kafka.pptxwonyong hwang
ย 
Kafka Rest.pptx
Kafka Rest.pptxKafka Rest.pptx
Kafka Rest.pptxwonyong hwang
ย 
Kafka monitoring using Prometheus and Grafana
Kafka monitoring using Prometheus and GrafanaKafka monitoring using Prometheus and Grafana
Kafka monitoring using Prometheus and Grafanawonyong hwang
ย 
์ฃผ๊ฐ€ ์ •๋ณด ๋‹ค๋ฃจ๊ธฐ.pdf
์ฃผ๊ฐ€ ์ •๋ณด ๋‹ค๋ฃจ๊ธฐ.pdf์ฃผ๊ฐ€ ์ •๋ณด ๋‹ค๋ฃจ๊ธฐ.pdf
์ฃผ๊ฐ€ ์ •๋ณด ๋‹ค๋ฃจ๊ธฐ.pdfwonyong hwang
ย 
App development with quasar (pdf)
App development with quasar (pdf)App development with quasar (pdf)
App development with quasar (pdf)wonyong hwang
ย 
kubernetes practice
kubernetes practicekubernetes practice
kubernetes practicewonyong hwang
ย 
Docker practice
Docker practiceDocker practice
Docker practicewonyong hwang
ย 
Hyperledger composer
Hyperledger composerHyperledger composer
Hyperledger composerwonyong hwang
ย 
BlockChain implementation by python
BlockChain implementation by pythonBlockChain implementation by python
BlockChain implementation by pythonwonyong hwang
ย 
Block chain introduction slideshare
Block chain introduction   slideshareBlock chain introduction   slideshare
Block chain introduction slidesharewonyong hwang
ย 

More from wonyong hwang (19)

Hyperledger Explorer.pptx
Hyperledger Explorer.pptxHyperledger Explorer.pptx
Hyperledger Explorer.pptx
ย 
ํ•˜์ดํผ๋ ˆ์ € ํŽ˜์ด์ง€ ๋‹จ์œ„ ๋ธ”๋ก ์กฐํšŒ
ํ•˜์ดํผ๋ ˆ์ € ํŽ˜์ด์ง€ ๋‹จ์œ„ ๋ธ”๋ก ์กฐํšŒํ•˜์ดํผ๋ ˆ์ € ํŽ˜์ด์ง€ ๋‹จ์œ„ ๋ธ”๋ก ์กฐํšŒ
ํ•˜์ดํผ๋ ˆ์ € ํŽ˜์ด์ง€ ๋‹จ์œ„ ๋ธ”๋ก ์กฐํšŒ
ย 
ํ† ํฐ ์ฆ๊ถŒ ๊ฐœ์š”.pptx
ํ† ํฐ ์ฆ๊ถŒ ๊ฐœ์š”.pptxํ† ํฐ ์ฆ๊ถŒ ๊ฐœ์š”.pptx
ํ† ํฐ ์ฆ๊ถŒ ๊ฐœ์š”.pptx
ย 
Vue.js ๊ธฐ์ดˆ ์‹ค์Šต.pptx
Vue.js ๊ธฐ์ดˆ ์‹ค์Šต.pptxVue.js ๊ธฐ์ดˆ ์‹ค์Šต.pptx
Vue.js ๊ธฐ์ดˆ ์‹ค์Šต.pptx
ย 
k8s practice 2023.pptx
k8s practice 2023.pptxk8s practice 2023.pptx
k8s practice 2023.pptx
ย 
HyperLedger Fabric V2.5.pdf
HyperLedger Fabric V2.5.pdfHyperLedger Fabric V2.5.pdf
HyperLedger Fabric V2.5.pdf
ย 
Ngrok์„ ์ด์šฉํ•œ Nginx Https ์ ์šฉํ•˜๊ธฐ.pptx
Ngrok์„ ์ด์šฉํ•œ Nginx Https ์ ์šฉํ•˜๊ธฐ.pptxNgrok์„ ์ด์šฉํ•œ Nginx Https ์ ์šฉํ•˜๊ธฐ.pptx
Ngrok์„ ์ด์šฉํ•œ Nginx Https ์ ์šฉํ•˜๊ธฐ.pptx
ย 
Nginx Https ์ ์šฉํ•˜๊ธฐ.pptx
Nginx Https ์ ์šฉํ•˜๊ธฐ.pptxNginx Https ์ ์šฉํ•˜๊ธฐ.pptx
Nginx Https ์ ์šฉํ•˜๊ธฐ.pptx
ย 
Kafka JDBC Connect Guide(Postgres Sink).pptx
Kafka JDBC Connect Guide(Postgres Sink).pptxKafka JDBC Connect Guide(Postgres Sink).pptx
Kafka JDBC Connect Guide(Postgres Sink).pptx
ย 
Nginx Reverse Proxy with Kafka.pptx
Nginx Reverse Proxy with Kafka.pptxNginx Reverse Proxy with Kafka.pptx
Nginx Reverse Proxy with Kafka.pptx
ย 
Kafka Rest.pptx
Kafka Rest.pptxKafka Rest.pptx
Kafka Rest.pptx
ย 
Kafka monitoring using Prometheus and Grafana
Kafka monitoring using Prometheus and GrafanaKafka monitoring using Prometheus and Grafana
Kafka monitoring using Prometheus and Grafana
ย 
์ฃผ๊ฐ€ ์ •๋ณด ๋‹ค๋ฃจ๊ธฐ.pdf
์ฃผ๊ฐ€ ์ •๋ณด ๋‹ค๋ฃจ๊ธฐ.pdf์ฃผ๊ฐ€ ์ •๋ณด ๋‹ค๋ฃจ๊ธฐ.pdf
์ฃผ๊ฐ€ ์ •๋ณด ๋‹ค๋ฃจ๊ธฐ.pdf
ย 
App development with quasar (pdf)
App development with quasar (pdf)App development with quasar (pdf)
App development with quasar (pdf)
ย 
kubernetes practice
kubernetes practicekubernetes practice
kubernetes practice
ย 
Docker practice
Docker practiceDocker practice
Docker practice
ย 
Hyperledger composer
Hyperledger composerHyperledger composer
Hyperledger composer
ย 
BlockChain implementation by python
BlockChain implementation by pythonBlockChain implementation by python
BlockChain implementation by python
ย 
Block chain introduction slideshare
Block chain introduction   slideshareBlock chain introduction   slideshare
Block chain introduction slideshare
ย 

Hyperledger Fabric practice (v2.0)

  • 2. Precondition ! Ubuntu 18.04 LTS or Above ! Docker Install (Latest version) apt-get install libltdl-dev ! 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 ! curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker- compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose dockerโ€“compose โ€“version https://phoenixnap.com/kb/install-docker-compose-ubuntu
  • 3. environment setup ! ubuntu 16.04 or higher (weโ€™ve installed ubuntu 18.04โ€ฆ) ! root ๊ถŒํ•œ์œผ๋กœ ์„ค์น˜ ! apt-get update ! apt-get install curl ! apt-get install python-pip ! apt-get install make gcc g++ libtool ! apt-get install tree
  • 4. 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.13.12.linux-amd64.tar.gz tar -C /usr/local/ -xvf go1.13.12.linux-amd64.tar.gz ! Go ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • vi /etc/profile export GOROOT=/usr/local/go export PATH=$PATH:$GOROOT/bin source /etc/profile go version
  • 5. environment setup ! 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
  • 6. 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 curl -sSL https://bit.ly/2ysbOFE | bash -s
  • 8. ๊ฐœ์š” ! 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 Org1MSP - Peer 0 - Peer 1 Org2MSP - Peer 0 - Peer 1
  • 9. crypto-config.yaml ! ์ธ์ฆ์„œ ์ƒ์„ฑ์„ ์œ„ํ•œ ์กฐ์ง๊ณผ Peer ๊ฐœ์ˆ˜, ์‚ฌ์šฉ์ž(์–ด๋“œ๋ฏผ ์ œ์™ธ) ์ˆ˜ ์„ค์ • Note that theย crypto-config.yamlย ๏ฌle lists ๏ฌve orderers as being tied to the orderer organization. While theย cryptogenย tool will create certi๏ฌcates for all ๏ฌve of these orderers.ย  Orderer orderer2 orderer3 orderer4 orderer5 peer0.org0 peer1.org0 peer0.org1 peer1.org1
  • 10. configtx.yaml ! ์ฑ„๋„ ์ƒ์„ฑ์„ ์œ„ํ•œ Peer ์ •๋ณด ( Host, Port), MSP ์ •๋ณด, Consortiums(๋ช‡ ๊ฐœ์˜ Org๋กœ ๊ตฌ์„ฑํ•  ๊ฒƒ์ธ์ง€) ์„ค์ •โ€จ - ๋ธ”๋Ÿญ ์ƒ์„ฑ ํฌ๊ธฐ ๋“ฑ๊ณผ ๊ด€๋ จ๋œ ์„ค์ •โ€จ BatchTimeout, โ€จ BatchSize - MaxMessageCountโ€จ AbsoluteMaxBytesโ€จ PreferredMaxBytes ! 3๊ฐ€์ง€ ํŒŒ์ผ์„ ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ƒ์„ฑโ€จ - ์ตœ์ดˆ ๋ธ”๋ก ์ •๋ณด genesis.block - ์•ต์ปค ํ”ผ์–ด ์ •๋ณด anchor.tx (Org1MSPanchor.tx, Org2MSPanchor.tx) - ์ฑ„๋„ ๊ตฌ์„ฑ ์ •๋ณด channel.tx
  • 11. T echo "##########################################################" echo "######### Generating Orderer Genesis block ##############" echo "##########################################################" # Note: For some unknown reason (at least for now) the block file can't be # named orderer.genesis.block or the orderer will fail to launch! set -x configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.bloc res=$? set +x if [ $res -ne 0 ]; then echo "Failed to generate orderer genesis block..." exit 1 fi echo echo "#################################################################" echo "### Generating channel configuration transaction 'channel.tx' ###" echo "#################################################################" set -x configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAM res=$? set +x if [ $res -ne 0 ]; then echo "Failed to generate channel configuration transaction..." exit 1 fi TwoOrgsChannel์€ ์ฝ˜์†Œ์‹œ์—„์œผ๋กœ ๊ตฌ์„ฑ๋œ Org1๊ณผ Org2์˜ ์ฑ„๋„์— ๊ด€ํ•œ ๋ช…์„ธ์ด๋ฉฐ SampleMultiNodeEtcdRaft๋Š” ๋ธ”๋ก์ฒด์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ์˜ค๋”๋Ÿฌ์˜ ์ •๋ณด๋ฅผ ๋ช…์„ธํ•˜๋ฉฐ ์ด ์ •๋ณด๊ฐ€ genesisBlock์— ํฌํ•จ๋œ๋‹ค.
  • 12. byfn.sh echo "##########################################################" echo "######### Generating Orderer Genesis block ##############" echo "##########################################################" # Note: For some unknown reason (at least for now) the block file can't be # named orderer.genesis.block or the orderer will fail to launch! configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block echo "#################################################################" echo "### Generating channel configuration transaction 'channel.tx' ###" echo "#################################################################" configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME echo "#################################################################" echo "####### Generating anchor peer update for Org1MSP ##########" echo "#################################################################" configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP echo "#################################################################" echo "####### Generating anchor peer update for Org2MSP ##########" echo "#################################################################" configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
  • 13. ########################################################## ##### Generate certificates using cryptogen tool ######### ########################################################## + cryptogen generate --config=./crypto-config.yaml org1.example.com org2.example.com + res=0 + set +x Generate CCP files for Org1 and Org2 /root/fabric-samples/first-network/../bin/configtxgen ########################################################## ######### Generating Orderer Genesis block ############## ########################################################## + configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block 2020-06-04 01:45:15.992 UTC [common.tools.configtxgen] main -> INFO 001 Loading configuration 2020-06-04 01:45:16.015 UTC [common.tools.configtxgen.localconfig] completeInitialization -> INFO 002 orderer type: etcdraft 2020-06-04 01:45:16.015 UTC [common.tools.configtxgen.localconfig] completeInitialization -> INFO 003 Orderer.EtcdRaft.Options unset, setting to tick_interval:"500ms" election_tick:10 heartbeat_tick:1 max_inflight_blocks:5 snapshot_interval_size:16777216 2020-06-04 01:45:16.016 UTC [common.tools.configtxgen.localconfig] Load -> INFO 004 Loaded configuration: /root/fabric-samples/first-network/configtx.yaml 2020-06-04 01:45:16.017 UTC [common.tools.configtxgen] doOutputBlock -> INFO 005 Generating genesis block 2020-06-04 01:45:16.018 UTC [common.tools.configtxgen] doOutputBlock -> INFO 006 Writing genesis block + res=0 + set +x ################################################################# ### Generating channel configuration transaction 'channel.tx' ### ################################################################# + configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel 2020-06-04 01:45:16.033 UTC [common.tools.configtxgen] main -> INFO 001 Loading configuration 2020-06-04 01:45:16.053 UTC [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /root/fabric-samples/first-network/configtx.yaml 2020-06-04 01:45:16.054 UTC [common.tools.configtxgen] doOutputChannelCreateTx -> INFO 003 Generating new channel configtx 2020-06-04 01:45:16.056 UTC [common.tools.configtxgen] doOutputChannelCreateTx -> INFO 004 Writing new channel tx + res=0 + set +x ################################################################# ####### Generating anchor peer update for Org1MSP ########## ################################################################# + configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP 2020-06-04 01:45:16.071 UTC [common.tools.configtxgen] main -> INFO 001 Loading configuration 2020-06-04 01:45:16.092 UTC [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /root/fabric-samples/first-network/configtx.yaml 2020-06-04 01:45:16.092 UTC [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 003 Generating anchor peer update 2020-06-04 01:45:16.093 UTC [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 004 Writing anchor peer update + res=0 + set +x ################################################################# ####### Generating anchor peer update for Org2MSP ########## ################################################################# + configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP 2020-06-04 01:45:16.108 UTC [common.tools.configtxgen] main -> INFO 001 Loading configuration 2020-06-04 01:45:16.129 UTC [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /root/fabric-samples/first-network/configtx.yaml 2020-06-04 01:45:16.129 UTC [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 003 Generating anchor peer update 2020-06-04 01:45:16.132 UTC [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 004 Writing anchor peer update + res=0 + set +x ./byfn.sh generate ์ œ๋„ค์‹œ์Šค ๋ธ”๋ก ์ƒ์„ฑ ์ฑ„๋„ ํ™˜๊ฒฐ์„ค์ • ์•ต์ปคํ”ผ์–ด ์„ค์ • ๋ชจ๋‘/channel-artifacts/ ํ•˜์œ„์— ๊ฒฐ๊ณผํŒŒ์ผ๋กœ ์ €์žฅ
  • 15. v2.0 ๋ถ€ํ„ฐ priv_sk ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณ€๊ฒฝ
  • 17. ! ์ธ์ฆ๊ธฐ๊ด€(CA), ๊ณต๊ฐœํ‚ค, ๊ฐœ์ธํ‚ค, ์ธ์ฆ์„œ(CRT) source : http://soul0.tistory.com/372 intro CA ์‚ดํŽด๋ณด๊ธฐ
  • 18. 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 ์‚ดํŽด๋ณด๊ธฐ
  • 19. 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
  • 20. 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 ์‚ดํŽด๋ณด๊ธฐ
  • 21. โ”œโ”€โ”€ 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 example.com์˜ ๋น„๋ฐ€ํ‚ค์™€ ์ธ์ฆ์„œ [MSP] ๊ด€๋ฆฌ์ž์šฉ ์ธ์ฆ์„œ [MSP] CA์‹๋ณ„ ์ธ์ฆ์„œ [MSP] TLS ํ†ต์‹ ์šฉ ์ธ์ฆ์„œ orderer.example.com example.com ์ƒ์œ„ ์กฐ์ง์˜ ์–ด๋“œ๋ฏผ ์ธ์ฆ์„œ์™€ CA ์ธ์ฆ์„œ๋ฅผ ๋ณต์‚ฌ orderer.example.com์˜ ๋น„๋ฐ€ํ‚ค์™€ ์ธ์ฆ์„œ ๊ฐ ๋…ธ๋“œ์˜ HTTPS ํ†ต์‹ ์šฉ ์ธ์ฆ์„œ์™€ ๋น„๋ฐ€ํ‚ค ๊ฐ ์‚ฌ์šฉ์ž์˜์˜ HTTPS ํ†ต์‹ ์šฉ ์ธ์ฆ์„œ์™€ ๋น„๋ฐ€ํ‚ค๋™์ผ ํŒŒ์ผ ๋™์ผ ํŒŒ์ผ CA ์‚ดํŽด๋ณด๊ธฐ Client -> sever request Server send server.crt Client verify server.crt with ca.crt(pub. Key included) Client get public key of server Client send encrypted message to server Server decrypt message by its own private key(sercer.key) server.key = ์ƒ์„ฑ๋œ MSP์˜ ๊ฐœ์ธํ‚ค์™€ ๋™์ผ ํŒŒ์ผ
  • 22. โ””โ”€โ”€ 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 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 ์‚ดํŽด๋ณด๊ธฐ
  • 23. [์ฐธ๊ณ ] ์ธ์ฆ์„œ ์‚ดํŽด๋ณด๊ธฐ 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 ์‚ดํŽด๋ณด๊ธฐ
  • 24. [์ฐธ๊ณ ] hyperledger fabric ca ์‹ค์Šต ! CA Server, Client ์„ค์น˜ ๋ฐ ์‹ค์Šต https://ovila.tistory.com/68 ! Hyperledger Fabric ๋ฉ€ํ‹ฐํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ•ย  https://leejonggun.tistory.com/15 CA ์‚ดํŽด๋ณด๊ธฐ
  • 25. 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/5) CA ์‚ดํŽด๋ณด๊ธฐ cli์ปจํ…Œ์ด๋„ˆ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” preface๋Š” utils.sh์—์„œ ์ „๋‹ฌ๋ฐ›์€ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋”ฐ๋ผ setGlobalํ•จ์ˆ˜๋‚ด์—์„œ ์žฌ์ •์˜๋จ
  • 26. peer lifecycle chaincode install mycc.tar.gz [์ฒด์ธ์ฝ”๋“œ ์ธ์Šคํ†จ] peer lifecycle chaincode queryinstalled [์ฒด์ธ์ฝ”๋“œ ์„ค์น˜ํ™•์ธ] orderer๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ Cli ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ˆ˜ํ–‰, Org1-Peer0์— ์„ค์น˜ peer lifecycle chaincode package mycc.tar.gz --path github.com/hyperledger/fabric-samples/chaincode/abstore/go/ --lang golang --label mycc_1 [์ฒด์ธ์ฝ”๋“œ ํŒจํ‚ค์ง•] peer๋ฅผ ํ†ตํ•ด ์„ค์น˜ ๊ฐ org์˜ anchor peer์— ์„ค์น˜โ€จ org1์˜ peer0 org2์˜ peer0 ๋ฐฉ์‹ ๋™์ผํ•˜๊ฒŒ ๋ชจ๋‘ ์ˆ˜ํ–‰ ์ „์ฒด ์‹คํ–‰ ์ˆœ์„œ (2/5) CA ์‚ดํŽด๋ณด๊ธฐ ์ •์ƒ์ธ ๊ฒฝ์šฐ ํŒจํ‚ค์ง• ๊ณ ์œ ๋ฒˆํ˜ธ ํ™•์ธ ๊ฐ€๋Šฅ Package ID: mycc_1:0dcea8280752b53a2a534f280445e36fa4cb32f648c2d7729589821f300d74be, Label: mycc_1 peer lifecycle chaincode approveformyorg --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 --channelID mychannel --name mycc --version 1 --init-required --package-id mycc_1:0dcea8280752b53a2a534f280445e36fa4cb32f648c2d7729589821f300d74be --sequence 1 --waitForEvent [์ฒด์ธ์ฝ”๋“œ ์Šน์ธ] orderer๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ ์˜ˆ์ œ์—์„œ๋Š” Org1-Peer0 ์„ ํ†ตํ•ด ์Šน์ธ ์š”์ฒญ
  • 27. ์ „์ฒด ์‹คํ–‰ ์ˆœ์„œ (3/5) peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name mycc --version 1 --sequence 1 --output json --init-required [์ฒด์ธ์ฝ”๋“œ ์ปค๋ฐ‹๊ฐ€๋Šฅ์—ฌ๋ถ€ ํ™•์ธ] ์˜ˆ์ œ์—์„œ๋Š” Org1-Peer0 ์„ ํ†ตํ•ด ์Šน์ธ(์ด์ „ ์žฅ์—์„œ)ํ–ˆ์œผ๋ฏ€๋กœ { "approvals": { "Org1MSP": true, "Org2MSP": false } } ๋กœ ๊ฒฐ๊ณผ ์ถœ๋ ฅ peer lifecycle chaincode approveformyorg -โ€ฆ [์ฒด์ธ์ฝ”๋“œ ์Šน์ธ] orderer๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰ ์ด์ œ Org2-Peer0 ๋˜ํ•œ ์Šน์ธ ์š”์ฒญ peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name mycc --version 1 --sequence 1 --output json --init-required [์ฒด์ธ์ฝ”๋“œ ์ปค๋ฐ‹๊ฐ€๋Šฅ์—ฌ๋ถ€ ํ™•์ธ] ์ด์ œ๋Š” ๋ชจ๋‘ ์ปค๋ฐ‹ true { "approvals": { "Org1MSP": true, "Org2MSP": true } } ๋กœ ๊ฒฐ๊ณผ ์ถœ๋ ฅ peer lifecycle chaincode commit -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 --channelID mychannel --name 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:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt --version 1 --sequence 1 --init-required [์ฒด์ธ์ฝ”๋“œ ์ปค๋ฐ‹] Org1 peer0, org2 peer0์— commit (anchor peer)
  • 28. ์ „์ฒด ์‹คํ–‰ ์ˆœ์„œ (4/5) peer lifecycle chaincode querycommitted --channelID mychannel --name mycc [์ฒด์ธ์ฝ”๋“œ ์ปค๋ฐ‹ ์„ฑ๊ณต์—ฌ๋ถ€ ์กฐํšŒ] ๊ฒฐ๊ณผ: Committed chaincode definition for chaincode 'mycc' on channel 'mychannel': Version: 1, Sequence: 1, Endorsement Plugin: escc, Validation Plugin: vscc, Approvals: [Org1MSP: true, Org2MSP: true] 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 /op 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:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/ peer0.org2.example.com/tls/ca.crt --isInit -c '{"Args":["Init","a","100","b","100"]}' [์ฒด์ธ์ฝ”๋“œ Invoke] peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}' [์ฒด์ธ์ฝ”๋“œ query] 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:9051 --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"]}' [์ฒด์ธ์ฝ”๋“œ Invoke] A = 100 B = 100 A = ? A์—์„œ B๋กœ 10 ์ด๋™
  • 29. ์ „์ฒด ์‹คํ–‰ ์ˆœ์„œ (5/5) peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}' [์ฒด์ธ์ฝ”๋“œ Query] A == 90 ? chaincode๋ฅผ org2-peer1 ์—๋„ ์„ค์น˜ํ•ด์„œ ์กฐํšŒํ•ด๋ณด์ž, ๊ณผ์—ฐ ๊ฐ™์€ ์›์žฅ์„ ์กฐํšŒํ•˜์—ฌ A==90? ==================== Query successful on peer0.org1 on channel 'mychannel' ===================== Installing chaincode on peer1.org2... peer lifecycle chaincode install mycc.tar.gz ===================== Querying on peer1.org2 on channel 'mychannel'... ===================== peer chaincode query -C mychannel -n mycc -c โ€˜{"Args":["query","a"]}' 90 org1, org2 ์— ๋ชจ๋‘ approve, commit ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ธ์Šคํ†จ ํ›„ ๋ฐ”๋กœ ์ฒด์ธ์ฝ”๋“œ ์กฐํšŒ ๊ฐ€๋Šฅํ•จ
  • 30. docker-compose ์„ค์ • ํŒŒ์ผ ํ™•์ธ docker-compose-cli.yaml์˜ base๊ฐ€ ๋˜๋Š” base/docker-compose-base.yaml์—์„œ๋Š” ./byfn.sh generate๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ์ธ์ฆ์„œ ์ •๋ณด๋ฅผ ๋ณผ๋ฅจ ๋งˆ์šดํŠธํ•˜๊ณ  ๋งˆ์šดํŠธ๋œ ๋„์ปค ์ด๋ฏธ์ง€์˜ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •์„ ํ•จ docker-compose -f docker-compose-cli.yaml -f docker-compose-etcdraft2.yaml up -d
  • 31. ./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 V1.4
  • 32. docker-compose-cli ์‚ดํŽด๋ณด๊ธฐ Org1์˜ Peer0์ธ ํ”ผ์–ด์— ์ ‘์†ํ•˜๋„๋ก ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ์„ค์ •๋จ ํ•ด๋‹น ํ”ผ์–ด์— ์ฑ„๋„ ์ƒ์„ฑ, ์ฐธ๊ฐ€, ์•ต์ปค ํ”ผ์–ด ๊ฐฑ์‹ , ์ฒด์ธ์ฝ”๋“œ ์„ค์น˜/์ดˆ๊ธฐํ™”/์งˆ์˜/ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. (createChannel, joinChannel, updateAnchorPeers, packageChaincode, installChaincode, approveForMyOrg, checkCommitReadiness, commitChaincodeDefinition, queryCommitted) ์œ„์˜ ์ˆ˜ํ–‰ํ•จ์ˆ˜๋Š” byfn.sh์˜ networkUpํ•จ์ˆ˜๋‚ด์—์„œ docker exec cli scripts/script.sh $CHANNEL_NAME $CLI_DELAY $LANGUAGE $CLI_TIMEOUT $VERBOSE ๋กœ ํ˜ธ์ถœ๋จ scripts.sh์€ cli ๋„์ปค์— ๋ณผ๋ฅจ ๋งˆ์šดํŠธ๋จ์œผ๋กœ cli ์—์„œ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•จ
  • 34. chaincode ์œ„์น˜ ํ™•์ธ environment: - GOPATH=/opt/gopath working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer 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/hyperledger/fabric-samples/chaincode/abstore/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 2๊ฐœ์˜ path๋ฅผ ์กฐํ•ฉํ•˜์—ฌ go ๋ชจ๋“ˆ์„ ์‹คํ–‰ (go๋Š” GOPATH/src ํ•˜์œ„ ํด๋”๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ๋ฅผ ์žก๋Š” ๊ทœ์น™์ด ์žˆ์Œ)
  • 35. 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 peer0.org1 is INVALID !!!!!!!!!!!!!!!! ================== ERROR !!! FAILED to execute End-2-End Scenario ================== ์ˆ˜ํ–‰๊ฒฐ๊ณผ util.sh์˜ chaincodeQueryํ•จ์ˆ˜์—์„œ ๊ธฐ๋Œ€ํ•œ ๊ฒฐ๊ณผ์ธ 90์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์—๋Ÿฌ๋กœ ํ‘œ์‹œํ•˜์˜€์œผ๋‚˜, ์ฒด์ธ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ ์˜๋„์™€ ๋ถ€ํ•ฉํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ docker-compose-cli.yaml์— cli ์ปจํ…Œ์ด๋„ˆ ์ •์˜๋ถ€๋ถ„์— volumes: ../../chaincode/:/opt/gopath/src/github.com/chaincode ์œผ๋กœ ๋ณ€๊ฒฝํ•œ ์ฒด์ธ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ cli ์ปจํ…Œ์ด๋„ˆ์— ๋ณผ๋ฅจ ๋งˆ์šดํŠธํ•˜๋ฏ€๋กœ ๋„์ปค๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ๋ฅผ cli์—์„œ installํ•  ์ˆ˜ ์žˆ์Œ
  • 36. 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์— ์—ฐ๊ฒฐ๋˜๋Š” ๊ตฌ์กฐ๋กœ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋™ Virtual box port forwarding setting : inbound/outbound open 5984 Open db : ex> mychannel/mycc
  • 37. [์ฐธ๊ณ ] block data (orderer) docker cp -a orderer.example.com:/var/hyperledger/production/orderer ./ Docker-compose-base ์—์„œ Volume create๋กœ ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฏ€๋กœ bind mount์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์šด์˜์ฒด์ œ>docker ์ „์šฉ ํŒŒ์ผ๊ด€๋ฆฌ ์˜์—ญ์—์„œ ์œ„์™€ ๊ฐ™์ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ปจํ…Œ์ด๋„ˆ๊ฐ„์—๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜์–ด๋„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•จ
  • 38. [์ฐธ๊ณ ] block data (peer) docker cp -a peer0.org1.example.com:/var/hyperledger/production ./ cd production/ more ledgersData/chains/chains/mychannel/blockfile_000000
  • 40. ์‚ฌ์ „ ์ค€๋น„ ! 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/master/chaincode-docker-devmode
  • 41. Terminal 1 - Start the network ! docker-compose -f docker-compose-simple.yaml up source : https://github.com/hyperledger/fabric-samples/tree/master/chaincode-docker-devmode
  • 42. Terminal 2 - Build & start the chaincode ! docker exec -it โ€”user root chaincode sh ! cd abstore/go ! go build -o abstore ! CORE_CHAINCODE_ID_NAME=mycc:0 CORE_PEER_TLS_ENABLED=false ./abstore -peer.address peer:7052 source : https://github.com/hyperledger/fabric-samples/tree/master/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 ๋ผ๊ณ  ์„ค์ •๋จ
  • 43. Terminal 3 - Use the chaincode ! docker exec -it cli bash ! peer chaincode install -p chaincodedev/chaincode/abstore/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/master/chaincode-docker-devmode source : https://nick-fabric.readthedocs.io/en/latest/commands/peerchaincode.html ์—ฌ๊ธฐ๊นŒ์ง€๋Š” Build Your First Network ์ฒด์ธ์ฝ”๋“œ์™€ ๋™์ผํ•˜๋‹ค. ์ด์ œ ์ผ๋ถ€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค์‹œ ๋ฐฐํฌํ•ด ๋ณด์ž. terminal2 ์—์„œ chaincode๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ๋ฐœ์ƒ
  • 44. local development env. ! ์„ค์น˜ ํ›„ ํ„ฐ๋ฏธ๋„์—์„œ go env ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ GOPATH ๊ฒฝ๋กœ๋ฅผ ํ™•์ธ ! GOPATH ๊ฒฝ๋กœ ํ•˜๋‹จ์— /go/src ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ ์˜ˆ>~iMac:src sf29$ pwd /Users/sf29/go/src ! visual studio code ์„ค์น˜ + GO addon ์ถ”๊ฐ€ ์„ค์น˜ ! ์šฐ์ธก ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด $GOPATH/go/src ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ž„์˜ go ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ํ…Œ์ŠคํŠธ ์‚ฌ์ „์— GO ์„ค์น˜ ํ•„์š” - https://golang.org/dl/ Visual studio Go extension์˜ settings.jon ์„ค์ •๋‚ด์šฉ: { "go.formatTool": "goimports", "go.useLanguageServer": true }
  • 45. local development env. ! visual studio code ์—์„œ ์†Œ์Šค ์ถ”์  ๋ฐ ๋นŒ๋“œ ๊ฐ€๋Šฅ ! ๊ฐœ๋ณ„ ํŒŒ์ผ๋กœ ์˜คํ”ˆ X, ํด๋”๋ฅผ ์›Œํฌ์ŠคํŽ˜์ด๋กœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•จ(์ค‘์š”) $GOROOT/src/ ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด hlf ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ mkdir -p github.com/hyperledger cd github.com/hyperledger/ git clone -b release-2.0 https://github.com/hyperledger/fabric.git ์šฐ์ธก ๊ทธ๋ฆผ์˜ ์†Œ์Šค๋Š” $GOPATH/src/[์ž„์˜ ํด๋”๋ช…]/chiancode_example.go์— ์œ„์น˜์‹œํ‚ด % pwd /Users/hwang-won-yong/go/src/sacc % go get % go run sacc.go ์ƒ๊ธฐ ์„ค์ • ์ดํ›„ VS ์žฌ์‹œ์ž‘ โ€”> ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋ฐ‘ ์ค„์ด ๋ณด์ด๊ณ , ํ•ด๋‹น ์ •์˜๋ถ€๋กœ ์ด๋™๋„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋จ
  • 46. 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๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ ‘์†๋จ (chaincode ๋””๋ ‰ํ† ๋ฆฌ์—์„œ abstore.go๋ฅผ ๋‹ค์šด๋กœ๋“œ) ! ์ ‘์† ์ดํ›„ ์ฒด์ธ์ฝ”๋“œ ํด๋ฆญํ•˜์—ฌ ํŽธ์ง‘์ฐฝ์—์„œ ์˜คํ”ˆ ! $GOPATHSRCabstore ํด๋”๋ฅผ ์ƒ์„ฑํ•˜๊ณ โ€จ ํ•ด๋‹น ํด๋” ํ•˜์œ„์— abstrore.go ํŒŒ์ผ๋กœ save asโ€ฆ ํ•œ๋‹ค. (์†Œ์Šค ๋ถ„์„์šฉ) visual studio code ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ ์ถœ์ฒ˜ : https://www.manualfactory.net/10964
  • 47. chaincode ์ˆ˜์ • ! ๊ณต์‹ ํŠœํ† ๋ฆฌ์–ผ์„ ์ฐธ์กฐํ•˜์—ฌ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ • ๊ณต์‹ ํŠœํ† ๋ฆฌ์–ผ : https://github.com/hyperledger/fabric-samples/tree/master/chaincode-docker-devmode func (t *ABstore) Set(ctx contractapi.TransactionContextInterface, user string, value int) error { fmt.Println("ABstore Set") var A string var Aval int var err error A = user Aval = value fmt.Printf("################### Aval = %d", Aval) err = ctx.GetStub().PutState(A, []byte(strconv.Itoa(value))) if err != nil { return err } return nil } ์ฝ”๋“œ ์ˆ˜์ • ํ›„ ๋นŒ๋“œ ํ…Œ์ŠคํŠธ FTP upload (overwrite)
  • 48. chaincode ๋ฐฐํฌ ๋ฐ ํ…Œ์ŠคํŠธ ! docker-compose โ€“f docker-compose-simple.yaml down ! docker-compose โ€“f docker-compose-simple.yaml up ! ์ด์ „ terminal2, terminal3์—์„œ ์ˆ˜ํ–‰ํ–ˆ๋˜ ๋‚ด์šฉ ๋™์ผ ๋ฐ˜๋ณตํ•˜๊ณ  ์ฝ”๋“œ์—์„œ ์ถ”๊ฐ€ํ•œ set ๋ช…๋ น ์— ๋Œ€ํ•ด ์ถ”๊ฐ€๋กœ ํ™•์ธ peer chaincode install -p chaincodedev/chaincode/abstore/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 peer chaincode invoke -n mycc -c '{"Args":["Set","a","1000"]}' -C myc peer chaincode query -n mycc -c '{"Args":["query","a"]}' -C myc ABstore Init Aval = 100, Bval = 200 Aval = 90, Bval = 210 Query Response:{"Name":"a","Amount":"90"} ABstore Set ################### Aval = 1000 Query Response:{โ€œName":"a","Amount":"1000"} terminal2 terminal3
  • 49. [์ฐธ๊ณ ] peer chaincode upgrade ! ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋™ ์ƒํƒœ์—์„œ ์ฒด์ธ์ฝ”๋“œ ์—…๊ทธ๋ ˆ์ด๋“œ ์‹ค์‹œ ! VS CODE ์—์„œ ์†Œ์Šค ๋ณ€๊ฒฝ ๋ฐ ์ €์žฅ/์—…๋กœ๋“œ terminal2 docker exec -it --user root chaincode sh go build -o abstore CORE_CHAINCODE_ID_NAME=mycc:1 CORE_PEER_TLS_ENABLED=false ./abstore -peer.address peer:7052 terminal3 peer chaincode install -p chaincodedev/chaincode/abstore/go -n mycc -v 1 peer chaincode upgrade -p chaincode/abstore/go -n mycc -v 1 -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์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋” ์ด์ƒ ํ•˜์ง€ ์•Š๊ฒŒ ๋จ
  • 52. Chaincode tutorial (Advance) ! Code review ! Build and deploy - ftp upload (to newly created directory. Eg> saccnew) - [Terminal 2] go get - [Terminal 2] go build -o saccnew - [Terminal 2] CORE_CHAINCODE_ID_NAME=mycc:0 CORE_PEER_TLS_ENABLED=false ./saccnew -peer.address peer:7052 ! Chaincode install/run on Terminal 3 - go get github.com/hyperledger/fabric-chaincode-go/shim Git hub : https://github.com/wonyongHwang/chaincode-tutorial/blob/master/kopoChainCode.go peer chaincode install -p chaincodedev/chaincode/saccnew -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":["more","tt","Here your are, this is a book 2","1200"]}' -C myc peer chaincode query -n mycc -c '{"Args":["morequery","tt"]}' -C myc
  • 53. Chaincode tutorial (Advance) 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()) } type AdditionalInfo struct { Title string "json:"title"" Text string "json:"text"" code int64 "json:"code"" }
  • 54. Chaincode tutorial (Advance) - GetState, GetHistoryForKey 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))) } GetHistoryForKey ํ•จ์ˆ˜๋กœ ๋ณ€๊ฒฝ ์ด๋ ฅ ์กฐํšŒ ๊ธฐ์กด์— ๋ณ€๊ฒฝ๋œ ์ด๋ ฅ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋ชจ๋‘ ์กฐํšŒ ๊ฐ€๋Šฅ
  • 55. [์ฐธ๊ณ ] ๊ณต์‹ ํŠœํ† ๋ฆฌ์–ผ ์ฒด์ธ์ฝ”๋“œ์—์„œโ€ฆ source : https://hyperledger-fabric.readthedocs.io/en/release-2.0/chaincode4ade.html#chaincode-api main ํ•จ์ˆ˜์—์„œ fabric chaincode์˜ Start ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ์ด ๋•Œ ์ „๋‹ฌ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” type SimpleAsset struct{} ์˜ ๊ฐ์ฒด์ž„. ์†Œ์Šค์ฝ”๋“œ์ƒ SimpleAsset์˜ Init,Invoke ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์œผ๋ฏ€๋กœ ChainCode ๊ฐ์ฒด๋กœ ์ „๋‹ฌ ๊ฐ€๋Šฅ
  • 56. [์ฐธ๊ณ ] ์ฒด์ธ์ฝ”๋“œ ํ˜ธ์ถœ ! ๋™์ผ ์ฑ„๋„์—์„œ ๊ฐ™์€/๋‹ค๋ฅธ Chaincode ํ˜ธ์ถœ(invoke/query) ๊ฐ€๋Šฅ ! ๋‹ค๋ฅธ ์ฑ„๋„์˜ chaincode๋Š” ์กฐํšŒ(query)๋งŒ ๊ฐ€๋Šฅ -์˜ˆ์‹œ- channel := stub.GetChannelID() stub.InvokeChaincode(chaincodeName, args, channel)
  • 58. Balance transfer example (๊ฐœ์š”) ! 2 CA, 1 Orderer, 2Org (2 Peers on each Org.) ๋กœ ๊ตฌ์„ฑ ! ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” Build Your Network First์™€ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ์ด๋‚˜, ์—ฌ๊ธฐ์„œ๋Š” cli ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—†์Œ. ๋Œ€์‹  Hyperledger fabric SDK๋ฅผ ์ด์šฉํ•œ node.js๊ตฌํ˜„์ฒด๋ฅผ ํ†ตํ•ด์„œ ์ฑ„๋„์ƒ์„ฑ, ์ฒด์ธ์ฝ”๋“œ ์„ค์น˜ ๋“ฑ์„ ์ง„ํ–‰ํ•˜๊ฒŒ ๋จ. ! Build Your Network First์˜ ๊ธฐ๋ณธ ์‹คํ–‰ ๊ตฌ์กฐ์—์„œ๋Š” CA ์„œ๋ฒ„ ์—†์ด cryptogen์„ ํ†ตํ•ด ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด ๋†“์€ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์‹  ํ•˜์˜€์œผ๋‚˜, ์ด๋ฒˆ ์˜ˆ์ œ๋Š” ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•œ ์ธ์ฆ์„œ ์ •๋ณด๋ฅผ ํ† ๋Œ€๋กœ CA์„œ๋ฒ„๋ฅผ ๊ธฐ๋™ํ•˜๊ณ , Node.js Client์—์„œ ์š”์ฒญํ•˜๋Š” ์‚ฌ์šฉ์ž ๋“ฑ๋ก์„ CA ์„œ๋ฒ„์—์„œ ์ธ์ฆํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ตฌ์„ฑ ๋˜์—ˆ์Œ (org1 -> ca1, org2 -> ca2_ * ํ•ด๋‹น ์˜ˆ์ œ ํด๋”์— ์œ„์น˜ํ•œ ~e2e.yaml ๋กœ ์‹คํ–‰์‹œ ca ์„œ๋ฒ„ ๊ธฐ๋™๋จ
  • 59. 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 ๊ธฐ๋ณธ ์ƒ˜ํ”Œ์˜ˆ์ œ์—์„œ ์‚ญ์ œ๋˜์—ˆ์œผ๋‚˜ 2.0์ด 1.4์˜ SDK๋„ ์ง€์›ํ•˜๋ฏ€๋กœ ์ •์ƒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•จ ! ์ปจํ…Œ์ด๋„ˆ ๋ฐ ์ด๋ฏธ์ง€ ๋“ฑ ๋„์ปค๊ด€๋ จ ํŒŒ์ผ ์‚ญ์ œ (์ถฉ๋Œ๋ฐฉ์ง€) docker rm -f $(docker ps -a -q) docker rmi -f $(docker images -a -q) docker volume prune docker system prune docker network prune git clone -b release-1.4 https://github.com/hyperledger/fabric-samples.git
  • 60. Balance transfer example (fabric ์‹คํ–‰) ! ./runApp.sh ์‹คํ–‰
  • 61. Balance transfer example (REST ํ˜ธ์ถœ) ./testAPIs.sh ์„ ์‹คํ–‰ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๋“ฑ๋ก~์ฒด์ธ์ฝ”๋“œ ์‹คํ–‰๊นŒ์ง€ ์ •์ƒ ์ง„ํ–‰ ๋˜๋Š”์ง€ ํ™•์ธ * chaincode instantiate ์‹คํ–‰์‹œ time out ์œผ๋กœ ์˜ค๋ฅ˜๋ฐœ์ƒ๋˜๋Š” ๊ฒฝ์šฐ, ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด testAPIs.sh์˜ ์ผ๋ถ€๋ถ„์„ ์ˆ˜์ • (timeout ์˜ต์…˜ ์ถ”๊ฐ€) apt-get install jq ํ•„์š”
  • 62. [์‹ฌํ™”] ๋” ์‚ดํŽด๋ณผ ํฌ์ธํŠธ ! ./testAPIs.sh ์˜ REST CALL ํ˜ธ์ถœ ์ˆœ์„œ์™€ ๋‚ด์šฉ์„ ํ™•์ธ ! Node ์†Œ์Šค๋Š” app.js๊ฐ€ ์‹œ์ž‘์  ! ์‚ฌ์šฉ์ž ๋“ฑ๋ก์„ ์œ„ํ•ด /users ํ˜ธ์ถœ์‹œ์—๋Š” fabric ca server๋ฅผ ํ†ตํ•ด ์‹ ๊ทœ ์‚ฌ์šฉ์ž ๋“ฑ๋ก์„ ํ•˜๊ณ  ํ† ํฐ์„ ๋ถ€์—ฌํ•จ ! /users ์ด์™ธ์˜ ํ˜ธ์ถœ ์ฃผ์†Œ๋Š” JWT ํ† ํฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์ด๋ฃจ์–ด์ง ! Proposal์„ ๋จผ์ € endorsing peer์— ๋ณด๋‚ด๊ณ , ํ•ด๋‹น ํ”ผ์–ด์—์„œ ์‚ฌ์ „ ๊ฒ€์ฆํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ณ  orderer์—๊ฒŒ ๊ฒ€์ฆ๊ฒฐ๊ณผ์™€ ํŠธ๋žœ์žญ์…˜ ๋ฐ˜์˜์š”์ฒญ์„ ํ•˜๋Š” ๋ถ€๋ถ„ โ€”> invoke-tansaction.js์˜ sendTransactionProposal ๋ฐ sendTransaction ํ˜ธ์ถœ ์ฝ”๋“œ ์ฐธ์กฐโ€จ
  • 63. [์‹ฌํ™”] 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๋กœ ์ธ์ฆ์„œ ๋กœ๋”ฉ)
  • 64. [์‹ฌํ™”] fabric ca container Node sdk client์˜ config.js์— ์„ค์ •๋œ ๊ณ„์ •์ •๋ณด์™€ ์ผ์น˜ํ•ด์•ผ ํ•จ "admins":[ { "username":"admin", "secret":"adminpw" } ]
  • 65. fabric server <-> node.js(SDK) local Fabric Server(Docker/Ubuntu/VM) Fabric SDK(local) Client(local) Fabric SDK๋ฅผ ๋กœ์ปฌ ๊ฐœ๋ฐœํ™˜๊ฒฝ์—์„œ ๋””๋ฒ„๊น…์„ ํ†ตํ•ด ๋ถ„์„ํ•ด ๋ณด์ž.
  • 66. 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 "}% ์‚ฌ์šฉ์ž ๋“ฑ๋ก For mac> Brew install jq
  • 67. fabric server <-> node.js(SDK) local โ€”> ๋กœ์ปฌ์—์„œ node.js ๋””๋ฒ„๊น…์„ visual studio๋กœ ์ง„ํ–‰
  • 68. 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
  • 69. 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๋„ ํ•„์š”์‹œ ํฌํŠธ ์„ค์ •ํ•ด๊ฐ€๋ฉด์„œ ํ…Œ์ŠคํŠธ ๋ฐ ๋””๋ฒ„๊น… ์ง„ํ–‰~
  • 70. [์ฐธ๊ณ ] Mac - nvm ์„ค์น˜ (1/2) ! ๋ณธ ์˜ˆ์ œ๋Š” node 8.x ์—์„œ ์ •์ƒ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ(node 10.x ๋Š” tls ๊ด€๋ จ ์˜ค๋ฅ˜ ๋ฐœ์ƒ) ๊ธฐ์กด์— ์ด๋ฏธ ์„ค์น˜ํ•œ ๋…ธ๋“œ ์‚ญ์ œ /usr/local/lib ์— ์žˆ๋Š” node์™€ node_modules๋ฅผ ์‚ญ์ œ /usr/local/include ์— ์žˆ๋Š” node์™€ node_modules๋ฅผ ์‚ญ์ œ Homebrew๋กœ ์„ค์น˜ํ•˜์…จ๋‹ค๋ฉด, brew uninstall node๋ฅผ ์‹คํ–‰ ~/local ๋˜๋Š” ~/lib ๋˜๋Š” ~/include ๋””๋ ‰ํ† ๋ฆฌ ๋ฐ‘์— ์กด์žฌํ•˜๋Š” node์™€ node_modules ์‚ญ์ œ /usr/local/bin ์— ์žˆ๋Š” node ๊ด€๋ จ ์‹คํ–‰ํŒŒ์ผ๋“ค ์‚ญ์ œ ์ถ”๊ฐ€๋กœ, ํ•„์š”์— ๋”ฐ๋ผ ์•„๋ž˜ ๋ช…๋ น์–ด๋“ค์„ ์‹คํ–‰ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. sudo rm /usr/local/bin/npm sudo rm /usr/local/share/man/man1/node.1 sudo rm /usr/local/lib/dtrace/node.d sudo rm -rf ~/.npm sudo rm -rf ~/.node-gyp sudo rm /opt/local/bin/node sudo rm /opt/local/include/node sudo rm -rf /opt/local/lib/node_modules (์ถœ์ฒ˜ : http://junsikshim.github.io/2016/01/29/Mac%EC%97%90%EC%84%9C-Node.js-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0.html) ! Nvm ์„ค์น˜ (์ผ๋ฐ˜ ๊ณ„์ •, not root) curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash source ~/.bash_profile ์„ค์น˜ ํ›„ .bash_profile ์— nvm๊ด€๋ จ ์„ค์ • ์ˆ˜๋™ ์ถ”๊ฐ€ export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm [ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion" # This loads nvm bash_completion
  • 71. [์ฐธ๊ณ ] Mac - nvm ์„ค์น˜ (2/2) ! Visual Studio CODE ์—์„œ ๋””๋ฒ„๊น…์‹œ ๊ธฐ์กด์— ์„ค์น˜๋˜์—ˆ๋˜ node๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด launch.json์— node์˜ ์œ„์น˜๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•จ (which node๋กœ ์ฐพ์€ ๊ฒฝ๋กœ๋ฅผ ๊ธฐ์ž…) { // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "Launch Program", "skipFiles": [ "<node_internals>/**" ], "program": "${workspaceFolder}/app.js" "runtimeExecutable": "/Users/sf29/.nvm/versions/node/v8.17.0/bin/node" } ] }
  • 73. Visual Studio Code + IBM BlockChain Platform
  • 75. Check dependencies ! VS Code version 1.38.0 or higher (code โ€”version) ! Node v8.x or v10.x and npm v6.x or greater node โ€”version npm โ€”version ! Go version V1.12 or greater go version ! Docker version v17.06.02-ce or greater docker โ€”version ! Docker Compose v1.14.0 or greater docker-compose โ€”version nvm์„ ์‚ฌ์šฉ ์ค‘์ธ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•  ๋…ธ๋“œ ๋ฒ„์ „์„ alias ์„ค์ •ํ•˜์—ฌ default๋‚˜ global๋กœ ๋„ค์ด๋ฐ ํ•ด์ค˜์•ผ ํ•จ
  • 76. Letโ€™s Test (1/4) ๊ธฐ๋ณธ ์ฒด์ธ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•œ๋‹ค. ๊ธฐ๋ณธ ๋™์ž‘์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„ ์ฝ”๋”ฉ์€ ์—†์ด ์ง„ํ–‰ํ•œ๋‹ค.
  • 77. Fabric Environments ์„น์…˜์— ์ตœ์ƒ๋‹จ 1 Org๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋กœ์ปฌํ™˜๊ฒฝ์—์„œ ๋„์ปค๊ฐ€ ์‹คํ–‰๋˜๊ณ  fabric peer/orderer/ca ๋“ฑ์ด ์‹คํ–‰๋œ๋‹ค. ์ด์ „ ์žฅ์—์„œ ํŒจํ‚ค์ง•ํ•œ ์ฒด์ธ์ฝ”๋“œ๋ฅผ ์ธ์Šคํ†จ -> ์ธ์Šคํ„ด์Šคํ™” ํ•œ๋‹ค. Letโ€™s Test (2/4)
  • 78. Fabric Gateways ์„น์…˜์—์„œ mychannel์„ ํ™•์žฅํ•˜๋ฉด ์ด์ „ ์žฅ์—์„œ ์ธ์Šคํ„ด์Šคํ™”์— ์„ฑ๊ณตํ•œ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ๊ฐ€ ๋ณด์ธ๋‹ค. ์šฐ์ธก ๋งˆ์šฐ์Šค ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ์ปจํ…์ŠคํŠธ ๋ฉ”๋‰ด๋ฅผ ์—ด์–ด์„œ Submit Transaction์„ ์„ ํƒํ•œ๋‹ค. ์ƒ๋‹จ์—์„œ ํ•จ์ˆ˜๋ช…๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๋Š” ์ฐฝ์ด ์˜คํ”ˆ๋  ๋•Œ, ์ž„์˜์˜ ํ•จ์ˆ˜๋ช…(queryTest)๊ณผ ์ž„์˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ([โ€œqueryโ€,โ€eeeโ€])๋ฅผ ์ž…๋ ฅํ•œ๋‹ค. ์ฒด์ธ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํด๋ฆญํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์œ„์—์„œ ์ž…๋ ฅํ•œ ํ•จ์ˆ˜๋ช…๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ •์ƒ ์ถœ๋ ฅ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Œ - ์ฒด์ธ์ฝ”๋“œ์—์„œ fmt.Println("Invoke()", fcn, params) ์— ํ•ด๋‹น๋˜๋Š” ๋ถ€๋ถ„ Letโ€™s Test (3/4)
  • 80. [practice] KopoVote Git address : https://github.com/wonyongHwang/kopoVote.git
  • 81. Overall Architecture Node.js Docker runApp.sh๋กœ ๊ตฌ๋™ - docker run prepareFabric.sh๋กœ ์‚ฌ์šฉ์ž ๋“ฑ๋ก/์ฑ„๋„ ์ƒ์„ฑ/์ฒด์ธ์ฝ”๋“œ ์ธ์Šคํ†จ Vue.js Backend VM Frontend Chaincode invoke/query ! Balance Transfer๋ฅผ ํ™œ์šฉํ•œ ๋ธ”๋ก์ฒด์ธ ํˆฌํ‘œ ์‹œ์Šคํ…œ
  • 82. Preparation ! Balance-Transfer example was built on SDK v1.4 ! But at the fabric 2.0, we should use SDK v2.0 ! Work around 1) remove docker images of ccenv 2.x and reinstall ccenv 1.4 docker pull hyperledger/fabric-ccenv:1.4 https://jira.hyperledger.org/browse/FABN-1357
  • 83. Preview (KopoVote) Frontend source reference : https://github.com/IBM/evote https://www.youtube.com/watch?v=r6bnpPPif5E&t=10s
  • 84. Local chaincode develop environment setup ! 1. VS CODE -> IBM BlockChain -> Create New Project ! 2 .ํ”„๋กœ์ ํŠธ ์ €์žฅ ์œ„์น˜๋Š” $GOPATH/src/ ํ•˜์œ„์— ์ž„์˜ ํด๋”๋ช…์œผ๋กœ ์œ„์น˜์‹œ์ผœ์•ผ ํ•จ ! 3. ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด IBM BlockChain ์—์„œ Package Open Project -> Install - Instantiate -> Fabric GateWay์—์„œ admin role๋กœ ์ฑ„๋„ ์ƒ์„ฑ ์—ฌ๊ธฐ๊นŒ์ง€ ๋ฌธ์ œ ์—†์œผ๋ฉด Good ! 4. Chaincode.go ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ํˆฌํ‘œ ๊ธฐ๋ก์šฉ ์ฝ”๋“œ๋กœ ๋ณ€๊ฒฝ ! 5. 3๋ฒˆ ๋‹ค์‹œ ์ˆ˜ํ–‰(Instantiate์™€ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜ ์ฐธ์กฐ) Instantiate : Init -> [โ€œAโ€,โ€100โ€,โ€Bโ€,โ€100โ€] Fabric G/W > Submit Tx : query -> [โ€œAโ€] > Evaluate Tx : query ->[โ€œAโ€]
  • 85. Chaincode ํˆฌํ‘œ ํ•ญ๋ชฉ 3๊ฐœ(A, B, C)์— ๋Œ€ํ•ด Init ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ดˆ๊ธฐ๊ฐ’ 0์œผ๋กœ ์„ค์ •ํ•˜๊ณ  voteํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ ํˆฌํ‘œํ•ญ๋ชฉ์— ๋Œ€ํ•ด +1์„ ๊ธฐ๋กํ•˜๋„๋ก ํ•จ
  • 91. Upgrade Chaincode ! ์ฒด์ธ์ฝ”๋“œ ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐฐํฌ์‹œ Init ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋จ -> Init ํ•จ์ˆ˜๋‚ด ์ดˆ๊ธฐํ™” ๋กœ์ง์„ ์ตœ์ดˆ ๋ฐฐํฌ์‹œ์™€ ์—…๊ทธ๋ ˆ์ด๋“œ์‹œ 2๊ฐ€์ง€ ๋ชจ๋‘ ๊ณ ๋ คํ•ด์•ผ ํ•จ
  • 92. Commit Chaincode ! Upload chaincode(chaincode.go & main.go) to servers(fabric server, node.js server)
  • 93. Commit Chaincode ! ์ฒด์ธ์ฝ”๋“œ์—์„œ ํ•„์š”ํ•œ ์ตœ์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ go get ๋ช…๋ น์–ด ์ถ”๊ฐ€(base.yaml) command: > sh -c "peer node start && go get github.com/hyperledger/fabric-chaincode-go/shim && go get github.com/hyperledger/fabric-protos-go/peer"
  • 94. Prepare shell script for booting up ! POST request Enroll on Org1/Org2 ! POST request Create channel โ€ฆ ! POST request Join channel on Org1/Org2 ! POST request Update anchor peers on Org1/Org2 ! POST Install chaincode on Org1/Org2 ! POST instantiate chaincode on Org1
  • 95. Frontend coding ! Vote ! queryAll Source reference : https://github.com/IBM/evote
  • 96. Frontend coding ! REST Call using Axios ์‚ฌ์šฉ์ž ๋“ฑ๋ก ํˆฌํ‘œ(invoke) ๊ฒฐ๊ณผ ์กฐํšŒ(query) Source reference : https://github.com/IBM/evote
  • 97. Frontend coding ! ์ธ์ฆ ํ† ํฐ ์ฒ˜๋ฆฌ ์‚ฌ์šฉ์ž ๋“ฑ๋ก์‹œ ์‘๋‹ต์œผ๋กœ ๋ฐ›์€ ํ† ํฐ์„ ์ €์žฅํ•˜๊ณ  ์ด๋ฅผ ํˆฌํ‘œํ™”๋ฉด์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ ์ „๋‹ฌ Source reference : https://github.com/IBM/evote
  • 98. Frontend coding ! ์ธ์ฆ ํ† ํฐ ์ฒ˜๋ฆฌ ์ด์ „ ํ™”๋ฉด์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•œ ํ† ํฐ์„ ์ €์žฅ ํ† ํฐ๊ณผ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ํˆฌํ‘œ ๊ฒฐ๊ณผ๋ฅผ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ ์„œ๋ฒ„์—์„œ ์ •์ƒ ์‘๋‹ต์ธ ๊ฒฝ์šฐ, ํˆฌํ‘œ์กฐํšŒ ๊ฒฐ๊ณผ ํ™”๋ฉด์œผ๋กœ ์ด๋™ (ํ† ํฐ์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ) Source reference : https://github.com/IBM/evote
  • 99. Frontend coding ! ์ธ์ฆ ํ† ํฐ ์ฒ˜๋ฆฌ ์ด์ „ ํ™”๋ฉด์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•œ ํ† ํฐ์„ ์ €์žฅ Fabric runtime์— query (w/ auth. Token) ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ํ‘œํ˜„์„œ๋ฒ„์˜ chaincode ์ค‘ Query ์‘๋‹ต ๋ถ€๋ถ„ Source reference : https://github.com/IBM/evote
  • 100. Todo ! ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์ถ• ๋ฐ ์ธ์ฆ ๋กœ์ง ! ์›์žฅ์— ํˆฌํ‘œํ•œ ์‚ฌ์šฉ์ž ๊ธฐ๋ก ๋ฐ ์กฐํšŒ (์ด์ค‘ ํˆฌํ‘œ ๋ฐฉ์ง€ ๋ชฉ์ ) ! ํˆฌํ‘œ ์กฐ์ง(org1)๊ณผ ๊ฒ€์ฆ ์กฐ์ง(org2)์˜ ๋ถ„๋ฆฌ Git address : https://github.com/wonyongHwang/kopoVote.git Source reference : https://github.com/IBM/evote
  • 101. This doesnโ€™t work well but it should be okay. ! ์ฒด์ธ์ฝ”๋“œ ๋ณ€๊ฒฝ (library hierarchy changed on fabric 2.0) ! GOPATH ์„ค์ • ๋ฐ ์ฒด์ธ์ฝ”๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ - ์„ค์ • ํ›„ source /etc/profile ์‹คํ–‰ - go get - go build import ( "fmt" "strconv" "github.com/hyperledger/fabric/core/chaincode/shim" pb "github.com/hyperledger/fabric/protos/peer" ) import ( "fmt" "strconv" โ€œgithub.com/hyperledger/fabric-chaincode-go/shim" pb "github.com/hyperledger/fabric-protos-go/peer" ) export GOROOT=/usr/local/go export GOPATH=$HOME export GOBIN=$GOPATH/bin export FABRIC_HOME=/root/fabric-samples export PATH=$PATH:$GOROOT/bin:$FABRIC_HOME/bin
  • 103. ๋ฉ€ํ‹ฐ ๋…ธ๋“œ์—์„œ ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑํ•˜๊ธฐ (1/3) (Hyperledger Korea User Group https://github.com/hlkug/meetup/tree/master/201903) ! BYFN ์˜ˆ์ œ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ๋ฉ€ํ‹ฐ ๋…ธ๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํžŒ๋‹ค.
  • 104. ! ์‚ฌ์ „ ์ž‘์—… - Virtual Box, Ubuntu, Docker, Docker-Compose, HLF ๋“ฑ ๊ธฐ๋ณธ ์„ค์น˜ - 2 nodes ์ด๋ฏ€๋กœ ๊ฐ VM์˜ ๋„คํŠธ์›Œํฌ๋Š” ๊ธฐ๋ณธ NAT + ํ˜ธ์ŠคํŠธ ์ „์šฉ ์–ด๋Œ‘ํ„ฐ์ด๋ฉฐ, ๊ฐ ํ˜ธ์ŠคํŠธ ์ •๋ณด IP๋ฅผ ๋ณ„๋„ ์„ค์ •ํ•ด์•ผ ํ•จ ๋ฉ€ํ‹ฐ ๋…ธ๋“œ์—์„œ ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑํ•˜๊ธฐ (2/3) (Hyperledger Korea User Group https://github.com/hlkug/meetup/tree/master/201903)
  • 105. ๋ฉ€ํ‹ฐ ๋…ธ๋“œ์—์„œ ํ•˜์ดํผ๋ ˆ์ € ํŒจ๋ธŒ๋ฆญ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑํ•˜๊ธฐ (3/3) (Hyperledger Korea User Group https://github.com/hlkug/meetup/tree/master/201903) ์ดํ›„ ์ง„ํ–‰์€ BYFN๊ณผ ์œ ์‚ฌํ•จ. ์˜ˆ์ œ์˜ ์ „์ฒด์†Œ์Šค๋Š” ์ƒ๋‹จ์˜ ๋งํฌ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐ.