์•ˆ๋…•ํ•˜์„ธ์š”?

์˜ค๋Š˜์€ ์ง€๋‚œ ํฌ์ŠคํŒ…์ธ Hyperledger Fabric ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ตฌ์„ฑ ์— ์ด์–ด ๊ฐœ๋ฐœ๋ชจ๋“œ๋กœ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™(์ดํ•˜, ์ฒด์ธ์ฝ”๋“œ) ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ํ™˜๊ฒฝ ์„ค๋ช…์„ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ์‚ฌ์ „ ์ค€๋น„ ์‚ฌํ•ญ

2. Fabric ์†Œ์Šค ์ค€๋น„

์ฒด์ธ์ฝ”๋“œ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด์„œ๋Š” ๊ฐœ๋ฐœ PC์— Fabric์˜ ์†Œ์Šค๋ฅผ Golang ๋ฐ”์ด๋„ˆ๋ฆฌ ์„ค์น˜ ์‹œ ์„ค์ •ํ•œ GOPATH ์•„๋ž˜์— ๋„ฃ๊ณ  ๋นŒ๋“œํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.
๋‹ค์Œ์˜ ๋ช…๋ น์–ด๋ฅผ ์ฐธ์กฐํ•˜์—ฌ GOPATH ํ•˜์œ„์— ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

  • MacOS
$ mkdir -p $GOPATH/src/github.com/hyperledger
$ cd $GOPATH/src/github.com/hyperledger
$ git clone https://github.com/hyperledger/fabric.git
$ cd fabric
$ git checkout v0.6.1-preview
  • Windows
> mkdir %GOPATH%\src\github.com\hyperledger
> cd %GOPATH%\src\github.com\hyperledger
> git clone https://github.com/hyperledger/fabric.git
> cd fabric
> git checkout v0.6.1-preview

3. ์ฒด์ธ์ฝ”๋“œ ๋นŒ๋“œ ๋ฐ ์‹คํ–‰

์†Œ์Šค๋ฅผ ๋ชจ๋‘ ๋ฐ›์•˜์œผ๋ฉด ์šฐ์„  ์ƒ˜ํ”Œ ์ฒด์ธ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜์—ฌ ๋ธ”๋ก์ฒด์ธ ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ์˜ ๋™์ž‘์„ ํ™•์ธ ํ•ด๋ณด๋„๋กํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์˜ ๊ฒฝ๋กœ์—์„œ ์ฒด์ธ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

  • MacOS
$ cd $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
$ go build
  • Windows
> cd %GOPATH%\src\github.com\hyperledger\fabric\examples\chaincode\go\chaincode_example02
> go build

์œ„์˜ ๊ณผ์ •์„ ๋ฌธ์ œ์—†์ด ์™„๋ฃŒํ•˜์˜€์œผ๋ฉด chaincode_example02 ๋””๋ ‰ํ† ๋ฆฌ ํ•˜์œ„์— chaincode_example02 ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์‹คํ–‰ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์—ˆ์„ ๊ฒ๋‹ˆ๋‹ค.(Windows๋Š” chaincode_example02.exe )
๊ฐœ๋ฐœ๋ชจ๋“œ์—์„œ๋Š” ์ด ์‹คํ–‰ํŒŒ์ผ์„ ๋ช‡ ๊ฐœ์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ ์‹คํ–‰ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ธ”๋ก์ฒด์ธ ๋Ÿฐํƒ€์ž„์—์„œ ํŠธ๋žœ์žญ์…˜ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ž ๊น!!
๊ฐœ๋ฐœ๋ชจ๋“œ์™€ ์šด์˜๋ชจ๋“œ์˜ ์ฐจ์ด์ ์„ ์„ค๋ช…ํ•˜๋ฉด ์•„๋ž˜ ๋‘ ๊ทธ๋ฆผ์„ ๋น„๊ตํ•ด ๋ณด๋ฉด์„œ ์ดํ•ดํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.
๋จผ์ €, ํฐ ์ฐจ์ด์ ์€ ๊ฐœ๋ฐœ๋ชจ๋“œ์—์„œ๋Š” ์ฒด์ธ์ฝ”๋“œ๊ฐ€ ๋ธ”๋ก์ฒด์ธ ๋Ÿฐํƒ€์ž„๊ณผ ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์šด์˜๋ชจ๋“œ์—์„œ๋Š” ์ฒด์ธ์ฝ”๋“œ๋ฅผ ๋””ํ”Œ๋กœ์ดํ•˜๋ฉด ๋ธ”๋ก์ฒด์ธ ๋„คํŠธ์›Œํฌ์— ์žˆ๋Š” ๋ชจ๋“  ํ”ผ์–ด๋“ค์—๊ฒŒ ๋ณต์ œ๊ฐ€ ๋˜๊ณ  ๋ชจ๋“  ํ”ผ์–ด๋“ค์ด ๋™์ผํ•œ ์ฒด์ธ์ฝ”๋“œ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋˜์ง€๋งŒ, ๊ฐœ๋ฐœ๋ชจ๋“œ์—์„œ๋Š” ๋‹จ์ผ ํ”ผ์–ด์— ์ฒด์ธ์ฝ”๋“œ๊ฐ€ ๋ถ™์–ด์„œ ๋™์ž‘ํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ ์ฒด์ธ์ฝ”๋“œ ๊ฐœ๋ฐœ์€ ์ฒด์ธ์ฝ”๋“œ ์‹คํ–‰ –> ํ…Œ์ŠคํŠธ –> ๋””๋ฒ„๊น… –> ์ฒด์ธ์ฝ”๋“œ ๋นŒ๋“œ –> ์ฒด์ธ์ฝ”๋“œ ์‹คํ–‰์˜ ์ˆœํ™˜์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ๋ชจ๋“œ vs. ์šด์˜๋ชจ๋“œ
  • ๊ฐœ๋ฐœ๋ชจ๋“œ

  • ์šด์˜๋ชจ๋“œ

๊ทธ๋Ÿฌ๋ฉด ์‹ค์ œ๋กœ ๋ธ”๋ก์ฒด์ธ ๋Ÿฐํƒ€์ž„์— ์ฒด์ธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์„œ REST๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
๋จผ์ €, ์ง€๋‚œ ํฌ์ŠคํŒ… Hyperledger Fabric ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์—ฌ ๋ธ”๋Ÿญ์ฒด์ธ ๋Ÿฐํƒ€์ž„์„ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค.

docker-compose up

์ฒด์ธ์ฝ”๋“œ ์‹คํ–‰ ์ „ Docker VM์˜ IP๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

docker-machine ls 

๊ทธ๋ฆฌ๊ณ  ์œ„์—์„œ ํ™•์ธํ•œ IP๋ฅผ ์•„๋ž˜ ๋ช…๋ น์–ด ์ค‘ CORE_PEER_ADDRESS์˜ ๊ฐ’์œผ๋กœ ์ž…๋ ฅํ•˜์—ฌ ์ฒด์ธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์ฒด์ธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ํ–ˆ์„ ๋•Œ ์—๋Ÿฌ์—†์ด ์‹คํ–‰๋˜๋ฉฐ, ๋งˆ์ง€๋ง‰์— “Received REGISTERED” ๋ผ๋Š” ๋ฉ”์„ธ์ง€๊ฐ€ ๋ณด์ด๋ฉด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • MacOS
$ cd $GOPATH/src/github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02
$ CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=192.168.99.100:7051 ./chaincode_example02

  • Windows
> cd %GOPATH%\src\github.com\hyperledger\fabric\examples\chaincode\go\chaincode_example02
> set CORE_CHAINCODE_ID_NAME=mycc
> set CORE_PEER_ADDRESS=192.168.99.100:7051
> chaincode_example01.exe

4. ํ…Œ์ŠคํŠธ

์ง€๊ธˆ๊นŒ์ง€ ๋ธ”๋ก์ฒด์ธ ๋Ÿฐํƒ€์ž„, ์ฒด์ธ์ฝ”๋“œ ์‹คํ–‰์„ ๋ชจ๋‘ ์™„๋ฃŒํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด์ œ๋ถ€ํ„ด REST Client๋ฅผ ํ†ตํ•ด ๋””ํ”Œ๋กœ์ด, ํŠธ๋žœ์žญ์…˜์„ ์‹คํ–‰ํ•ด ์ •์ƒ์ ์œผ๋กœ ์ฒด์ธ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
ํ…Œ์ŠคํŠธ๋Š” ์ผ๋ฐ˜์ ์ธ REST Client๋กœ๋„ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ €๋Š” POSTMAN์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

REST Endpoints

REST API๋“ค์˜ ์ƒ์„ธ ์„ค๋ช…์€ ๋‹ค์Œ์— ๋”ฐ๋กœ ์‹œ๊ฐ„์„ ๋‚ด์–ด์„œ ์„ค๋ช…ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด์„œ Registrar, Chaincode API๋งŒ ์‚ฌ์šฉ์„ ํ•ฉ๋‹ˆ๋‹ค.

  • Block
    • GET /chain/blocks/{block-id}
  • Blockchain
    • GET /chain
  • Chaincode
    • POST /chaincode
  • Network
    • GET /network/peers
  • Registrar
    • POST /registrar
    • GET /registrar/{enrollmentID}
    • DELETE /registrar/{enrollmentID}
    • GET /registrar/{enrollmentID}/ecert
    • GET /registrar/{enrollmentID}/tcert
  • Transactions
    • GET /transactions/{UUID}

Hyperledger Fabric ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ตฌ์„ฑ ์—์„œ ๋งŒ๋“ค์—ˆ๋˜ docker-compose.yml ํŒŒ์ผ์˜ ๋‚ด์šฉ ์ค‘ CORE_SECURITY_ENABLED์˜ ํ•ญ๋ชฉ true์ผ ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉ์ž ๋“ฑ๋ก ๋ฐ ๋กœ๊ทธ์ธ ์ด ์„ ํ–‰๋˜์–ด์•ผ์ง€๋งŒ ํŠธ๋žœ์žญ์…˜์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  API call์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ž…๋ ฅํ•ด์•ผ์ง€๋งŒ ์ •์ƒ์ ์ธ API call์ด ๋ฉ๋‹ˆ๋‹ค.

๋ธ”๋ก์ฒด์ธ์˜ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณผ์ •์€ ๋ณด์•ˆ์„ค์ •์ด ๋˜์–ด ์žˆ์Œ์„ ๊ฐ€์ •ํ•˜๊ณ 
์ตœ์ดˆ, ์‚ฌ์šฉ์ž ๋“ฑ๋ก ๋ฐ ๋กœ๊ทธ์ธ
์ด์–ด์„œ ์ฒด์ธ์ฝ”๋“œ ๋””ํ”Œ๋กœ์ด๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.
์ฒด์ธ์ฝ”๋“œ ๋””ํ”Œ๋กœ์ด๊นŒ์ง€๊ฐ€ ๋ธ”๋ก์ฒด์ธ ๋Ÿฐํƒ€์Œ์„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ์œผ๋กœ ์ค€๋น„ํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.
๋‹ค์Œ์œผ๋กœ ๋ธ”๋ก์ฒด์ธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์กฐํ™”ํ•˜๋Š” ๋™์ž‘์ธ “Invoke”, “Query” ๋™์ž‘์„ ํ•„์š”์— ๋”ฐ๋ผ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ๋“ฑ๋ก ๋ฐ ๋กœ๊ทธ์ธ

๋จผ์ €, ์‚ฌ์šฉ์ž ๋“ฑ๋ก ๋ฐ ๋กœ๊ทธ์ธ์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜ ๋‚ด์šฉ์— ์žˆ๋Š” ID, PW๋Š” ์‚ฌ์ „์— ์ •์˜๋˜์–ด ์žˆ๋Š” ์œ ์ €์ด๋ฏ€๋กœ ๋™์ผํ•œ ์œ ์ €๋กœ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.(์œ ์ € ์ถ”๊ฐ€๋Š” ์ฐจํ›„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.)

POST /registrar

{
  "enrollId": "admin",
  "enrollSecret": "Xurw3yU9zI0l"
}

์ฒด์ธ์ฝ”๋“œ ๋””ํ”Œ๋กœ์ด

๋ธ”๋ก์ฒด์ธ์˜ ๋Ÿฐํƒ€์ž„์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ ์œ„ํ•œ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋กœ ์ฒด์ธ์ฝ”๋“œ ๋””ํ”Œ๋กœ์ด API๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
์•„๋ž˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ค‘ “secureContext”๋Š” ์•ž์„œ ์„ค๋ช…ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์ด ๋ณด์•ˆ์„ค์ •(CORE_SECURITY_ENABLED ํ•ญ๋ชฉ์„ true๋กœ ํ”ผ์–ด๊ฐ€ ๊ตฌ๋™๋˜์—ˆ์„ ๊ฒฝ์šฐ) ์ด ์ผœ์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ฒ„์ „์˜ Fabric์—์„œ๋Š” ๋ธ”๋ก์„ ๊ด€๋ฆฌํ•˜๊ธฐ์œ„ํ•ด์„œ Key-value ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ, ๋ธ”๋ก์— ๋ฐ์ดํ„ฐ ์ž…๋ ฅ์„ ์œ„ํ•ด์„œ๋Š” Java์˜ HashMap๋“ฑ๊ณผ ๊ฐ™์ด Key – Value ์Œ์œผ๋กœ ์ž…๋ ฅ์„ ํ•˜๋ฉฐ,
๊ฐ’์„ ๋ธ”๋ก์—์„œ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Key ๋ฅผ ์•„์šฉํ•˜์—ฌ ๊ฐ’์„ ๋ฆฌํ„ด ๋ฐ›์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ ์ƒ˜ํ”Œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ฒด์ธ์ฝ”๋“œ๋Š” ์ตœ์ดˆ ๋””ํ”Œ๋กœ์ด๋ฅผ ํ• ๋•Œ ์ด 4๊ฐœ์˜ argument๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด “a”, “100”, “b”, “200” ์ž…๋‹ˆ๋‹ค.
์ฒด์ธ์ฝ”๋“œ์˜ ๋กœ์ง์œผ๋กœ Key a ๋กœ 100์˜ ๊ฐ’์„ ๋ธ”๋ก์— ์ž…๋ ฅํ•˜๊ณ , ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Key b ๋กœ 200์˜ ๊ฐ’์„ ๋„ฃ์Šต๋‹ˆ๋‹ค.

POST /chaincode

{
  "jsonrpc": "2.0",
  "method": "deploy",
  "params": {
    "type": 1,
    "chaincodeID":{
        "name": "mycc"
    },
    "ctorMsg": {
        "args":["init", "a", "100", "b", "200"]
    },
    "secureContext": "admin"
  },
  "id": 1
}

๊ฐœ๋ฐœ ๋ชจ๋“œ์—์„œ ์ฒด์ธ์ฝ”๋“œ ๋””ํ”Œ๋กœ์ด๋Š” โ€œchaincodeIDโ€ ์˜ โ€œnameโ€ ์— ์•ž์„œ ์ฒด์ธ์ฝ”๋“œ ์‹คํ–‰์‹œ ์ž…๋ ฅํ•œ โ€œCORE_CHAINCODE_ID_NAMEโ€์˜ ๊ฐ’์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ, ๊ฐœ๋ฐœ๋ชจ๋“œ์—์„œ ์ฒด์ธ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์˜€์„ ๊ฒฝ์šฐ 3๋ฒˆ ํ•ญ๋ชฉ์—์„œ ์„ค๋ช…ํ•œ ์ฒด์ธ์ฝ”๋“œ ๋นŒ๋“œ๋ถ€ํ„ฐ –> ์ฒด์ธ์ฝ”๋“œ ์‹คํ–‰ –> ๋กœ๊ทธ์ธ API ํ˜ธ์ถœ –> ์ฒด์ธ์ฝ”๋“œ ๋””ํ”Œ๋กœ์ด๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ์•ผ์ง€๋งŒ ๊ธฐ๋ณธ ํ™˜๊ฒฝ์ด ์ค€๋น„๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
์ฒด์ธ์ฝ”๋“œ์˜ ๊ฐœ๋ฐœ๊ณผ์ •์€ ์ด ๋ผ์ดํ”„์‚ฌ์ดํด์˜ ์—ฐ์†์ด๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Invoke

์ง€๊ธˆ๋ถ€ํ„ฐ๋Š” ๋ธ”๋ก์ฒด์ธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ณ ,์กฐํšŒํ•˜๋Š” API๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋ธ”๋ก์ฒด์ธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ธฐ์œ„ํ•ด์„œ๋Š” Invoke, ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Query ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
Invoke์—์„œ๋Š” ์ฒด์ธ์ฝ”๋“œ์˜ ๋กœ์ง์ด 3๊ฐœ์˜ argument๋ฅผ ๋ฐ›์•„์„œ a ์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’์— ๋งˆ์ง€๋ง‰ argument (์—ฌ๊ธฐ์—์„  10) ์„ ๋นผ๊ณ  ๋ธ”๋ก์— ์ž…๋ ฅ, b ์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’์— ๋งˆ์ง€๋ง‰ argument๋ฅผ ๋”ํ•ด์„œ ๋ธ”๋ก์— ์ž…๋ ฅํ•˜๋ผ์ž…๋‹ˆ๋‹ค.

POST /chaincode

{
  "jsonrpc": "2.0",
  "method": "invoke",
  "params": {
      "type": 1,
      "chaincodeID":{
          "name":"mycc"
      },
      "ctorMsg": {
         "args":["invoke", "a", "b", "10"]
      },
      "secureContext": "admin"
  },
  "id": 3
}

Query

์œ„์—์„œ Invoke๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ˜ธ์ถœ์ด ๋˜์—ˆ๋‹ค๋ฉด Qeury๋ฅผ ํ†ตํ•ด์„œ ์ž…๋ ฅ๋œ ๊ฐ’์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์ž…๋ ฅ๋œ A ํ‚ค์˜ ๊ฐ’์— ๋Œ€ํ•ด์„œ Queryํ•ฉ๋‹ˆ๋‹ค.
Invoke๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋˜์—ˆ๋‹ค๋ฉด ์•„๋ž˜ ๊ทธ๋ฆผ์—์„œ์™€ ๊ฐ™์ด 90์˜ ๊ฐ’์ด ๋ฆฌํ„ด๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.(Invoke ์˜ ๋กœ์ง ์„ค๋ช… ์ฐธ์กฐ๋ฐ”๋ž๋‹ˆ๋‹ค.)
Invoke์˜ ๋กœ์ง ์ƒ Invoke๊ฐ€ ํ˜ธ์ถœ ๋  ์ˆ˜๋ก a ์˜ ๊ฐ’์€ 10 ๋งŒํผ ์ž‘์•„์ง€๋ฉฐ, b์˜ ๊ฐ’์€ 10 ๋งŒํผ ์ปค์ง‘๋‹ˆ๋‹ค.(Invoke์™€ Query๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœํ•˜๋ฉด์„œ ํ™•์ธ ํ•ด ๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.)

POST /chaincode

{
  "jsonrpc": "2.0",
  "method": "query",
  "params": {
      "type": 1,
      "chaincodeID":{
          "name":"mycc"
      },
      "ctorMsg": {
         "args":["query", "a"]
      },
      "secureContext": "admin"
  },
  "id": 5
}

5. ์ •๋ฆฌํ•˜๋ฉฐ

์—ฌ๊ธฐ๊นŒ์ง€ ๋ชจ๋‘ ๋ง‰ํž˜์—†์ด ์ž˜ ์ง„ํ–‰์ด ๋˜์…จ๋‚˜์š”?
์•„์ง ์ฒด์ธ์ฝ”๋“œ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์ŠคํŽ™์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ, REST API ์ƒ์„ธ ์„ค๋ช…์€ ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ, ์ „๋ฐ˜์ ์ธ ์ฒด์ธ์ฝ”๋“œ ๊ฐœ๋ฐœ ์‚ฌ์ดํด์€ ์ดํ•ด๊ฐ€ ๋˜์—ˆ์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์„ ์œ„ํ•œ ๋ธ”๋ก์ฒด์ธ ๋Ÿฐํƒ€์ž„ ๊ตฌ๋™์€ ๋‹จ์ˆœํžˆ ๋ฉค๋ฒ„์‰ฝ ์„œ๋น„์Šค์™€ VP๊ฐ€ ํ•˜๋‚˜์”ฉ ์ด๋ฃจ์–ด์ง„ ํ™˜๊ฒฝ( ์‚ฌ์‹ค์€ ์ฒด์ธ์ฝ”๋“œ ๊ฐœ๋ฐœ๋งŒ์„ ์œ„ํ•ด์„œ๋Š” VP ํ•˜๋‚˜๋งŒ ์žˆ์–ด๋„ ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค.) ์œผ๋กœ ์ถฉ๋ถ„ํ•œ ํ™˜๊ฒฝ์ด ๋˜๋ฏ€๋กœ ๊ฐ€๋ณ๊ฒŒ ์‹œ์ž‘ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์œผ๋กœ ์ด์–ด์งˆ ๋‚ด์šฉ์€ ์šด์˜๋ชจ๋“œ์—์„œ์˜ ์ฒด์ธ์ฝ”๋“œ ๋””ํ”Œ๋กœ์ด์™€ ํ…Œ์ŠคํŠธ, ์ฒด์ธ์ฝ”๋“œ ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์„ธ, REST API ์ŠคํŽ™ ์ƒ์„ธ ๋“ฑ์ž…๋‹ˆ๋‹ค.