* 본 포스팅은 하이퍼레저 패브릭 docs를 번역한 내용으로, 번역 과정에서 잘못된 부분이 있을 수 있습니다.

상세 내용은 하단 링크를 참조 부탁드리며, 잘못된 내용에 대한 피드백은 언제든 환영합니다 : ) 

https://hyperledger.github.io/composer/latest/tutorials/deploy-to-fabric-multi-org

 

Deploying to a multi-organization Hyperledger Fabric | Hyperledger Composer

Deploying a Hyperledger Composer blockchain business network to Hyperledger Fabric (multiple organizations) This tutorial provides an insight into the process for configuring a blockchain network, spanning multiple organizations. It outlines the steps you

hyperledger.github.io

이 튜토리얼은 여러 조직에 블록체인 네트워크를 구성하는 절차를 제공합니다.

 

이 튜토리얼은 하이퍼레저 패브릭 기반의 여러 조직 블록체인 네트워크를 구성하는데 필요한 단계에 대해 설명합니다. 두 개의 조직으로 구성된 블록체인 네트워크는 하이퍼레저 패브릭에서 제공하는 샘플 네트워크를 기반으로 합니다. 또한, 필요한 보안 artifact를 생성하고 두 조직 간 네트워크를 보호하는 단계에 대해 설명합니다.

 

블록체인 네트워크가 구성되면, 우리는 비즈니스 네트워크가 어떻게 배포되는지 확인할 수 있습니다. (예: 샘플 네트워크의 Commodity 거래 비즈니스 네트워크) 이 비즈니스 네트워크는 체인코드 컨테이너를 운영하고 양 쪽 기관의 분산 원장에서 인스턴스화 됩니다. 그리고나서 우리는 각 조직의 신원 제공자로 생성된 서로 다른 참가자 및 신원 간 분산원장에서의 상호작용을 확인합니다.

 

먼저 첨부된 단일 기관 튜토리얼을 먼저 해보는 것이 좋습니다. 이 튜토리얼에서는 블록체인 네트워크를 단일 조직용 하이퍼레저 패브릭 객체에 배포하는 것을 먼저 보여주고 몇 가지 개념을 자세히 설명합니다.

 

이 튜토리얼의 하이퍼레저 패브릭 블록체인 네트워크 ( 두 개의 조직용) 는 docker 컨테이너를 사용해서 구성되며, 두 조직의 패브릭 네트워크는 동일한 머신에 있습니다. 현실 세계에서는 두 조직은 분리된 IP 네트워크나 도메인 혹은 secure 클라우드 환경에 있을 것입니다.

 

이 튜토리얼은 편의를 위해 색깔로 단계를 구분했습니다. '어느 조직'이 특정 단계를 따라야하는지, 혹은 두 조직 모두 필요한 단계일 수도 있습니다.

 

첫 번째 종류는 양 쪽 조직 모두 따라하는 단계입니다.

Org1은 Alice라 불리며 초록색 블록입니다.

Org2는 Bob이라 불리며 보라색 블록입니다.

 

이 단계는 스스로 따라할 수도 있고 친구 혹은 동료와 함께 따라할 수도 있습니다. 

 

Prerequisites

이전에 컴포저 개발 환경을 설치했다면, 먼저 개발 환경에서 제공하는 하이퍼레저 패브릭 컨테이너를 해제해야 합니다.

cd ~/fabric-dev-servers
export FABRIC_VERSION=hlfv12
./stopFabric.sh
./teardownFabric.sh

다음으로는 아래 명령어를 사용해 GitHub Fabric Samples repository를 복사합니다. (중요: Fabric site에 있는 샘플을 사용하지 마세요, 이 튜토리얼에서 필요한 몇몇이 누락되어 있습니다.)

git clone https://github.com/mahoney1/fabric-samples.git

우리는 여러 조직용 튜토리얼을 하기 위해 Building Your First Network 패브릭 샘플을 사용합니다. 우리는 이 하이퍼레저 패브릭 네트워크를 'BYFN' (Building Your First Network) 네트워크라고 부를 것입니다. 조직을 별도의 물리적 컴퓨터 또는 다른 IP 네트워크에서 실행되는 별도의 가상 컴퓨터로 분할하려는 경우 이 튜토리얼의 범위를 벗어납니다.

 

 

 

Step One: Starting a Hyperledger Fabric network

이 튜토리얼을 따라하기 위해서는 새로운 하이퍼레저 패브릭 네트워크를 시작해야 합니다. 이 튜토리얼은 하이퍼레저 패브릭의 Building Your First Network tutorial에서 제공된 하이퍼레저 패브릭 네트워크를 사용할 것입니다.

 

1. fabric-samples 디렉토리로 이동하세요.

cd fabric-samples

2. 아래 커맨드를 사용해 cryptogen을 포함한 플랫폼 바이너리파일을 다운받으세요. (bash command를 위해 3 개의 파라미터가 필요합니다.)

curl -sSL http://bit.ly/2ysbOFE | bash -s 1.2.1 1.2.1 0.4.10

다운로드받은 docket image 리스트에 이슈가 없는지 확인하세요.

("error: pathspec v1.x.x did not match" 메시지는 무시해도 좋습니다.)

 

3. 우리는 앞서 복사해둔 Git repo의 multi-org 브랜치를 사용해야 합니다. 

git checkout multi-org

4. first-network 디렉토리로 이동하세요.

cd first-network

5. 다음으로 BYFN 네트워크를 시작합니다. 우리는 world state 데이터베이스로 CouchDB를 사용하고 있기 때문에 (byfn.sh 스크립트에) 부가적인 플래그가 필요합니다. (패브릭 BYFN 페이지에 나온 것과 약간 다름) 또, 우리는 각 조직 별 CA를 시작해야 합니다.

 

6. first-network 폴더에서 아래 커맨드를 순서대로 실행하세요.

./byfn.sh -m generate

./byfn.sh -m up -s couchdb -a

명령어가 성공적으로 동작하면 첫 번째 커맨드는 패브릭 네트워크 / security artifacts를 생성합니다. 두 번째 커맨드를 통해 BYFN 네트워크가 시작되고, 아래와 같이 출력되는지 확인하세요.

========= All GOOD, BYFN execution completed ===========


_____   _   _   ____
| ____| | \ | | |  _ \
|  _|   |  \| | | | | |
| |___  | |\  | | |_| |
|_____| |_| \_| |____/

다음으로 이전 패브릭 환경에서 생성되어 지갑에 있을 수도 있는 비즈니스 네트워크 카드를 삭제합니다. 비즈니스 네트워크 카드를 찾을 수 없다는 에러는 무시해도 좋습니다.

composer card delete -c PeerAdmin@byfn-network-org1
composer card delete -c PeerAdmin@byfn-network-org2
composer card delete -c alice@trade-network
composer card delete -c bob@trade-network
composer card delete -c admin@trade-network
composer card delete -c PeerAdmin@fabric-network

하지만, 다른 유형의 에러는 더 이전 버전의 하이퍼레저 컴포저에 카드가 저장되어 있을수도 있습니다. 그러므로 HOME 디렉토리에서 아래와 같은 명령어를 실행해 파일 시스템 내 카드 저장소를 삭제해야 합니다.

rm -fr $HOME/.composer

 

 

Step Two: Exploring the Hyperledger Fabric network

이 단계에서는 BFYN 네트워크 구성 및 요소들을 살펴볼 것입니다. 구성의 세부 요소들은 아래 단계를 완료해야 합니다.

 

Organizations

BYFN 네트워크는 Org1과 Org2, 두 개의 조직으로 구성되어 있습니다. Org1은 org1.example.com이라는 도메인 이름을 사용합니다. Org1의 MSP는 Org1MSP라고 불립니다. Org2는 org2.example.com이라는 도메인 이름을 사용하고 Org2MSP라는 MSP를 갖고 있습니다. 이 튜토리얼에서는 Org1과 Org2가 상호작용할 수 있는 블록체인 비즈니스 네트워크를 배포합니다.

 

Network components

하이퍼레저 패브릭 네트워크는 몇몇 구성요소로 이뤄져 있습니다.

- Org1의 두 개의 피어 노드: peer0.org1.example.com, peer1.org1.example.com

   > request port (peer0) : 7051

   > event hub port (peer0) : 7053

   > request port (peer1) : 8051

   > event hub port (peer1) : 8053

 

- Org1의 단일 CA: ca.org1.example.com

   > CA port : 7054

 

- Org2의 두 개의 피어 노드: peer0.org2.example.com, peer1.org1.example.com

   > request port (peer0) : 9051

   > event hub port (peer0) : 9053

   > request port (peer1) : 10051

   > event hub port (peer1) : 10053

 

- Org2의 단일 CA: ca.org2.example.com

   > CA port : 8054

 

- 단일 orderer 노드: orderer.example.com

   > orderer port : 7050

 

위 구성요소들은 Docker 컨테이너 내에서 동작합니다. 하이퍼레저 컴포저가 Docker 컨테이너에서 동작할 때 위의 이름 (예: peer0.org1.example.com)은 하이퍼레저 패브릭 네트워크와 상호작용하는데 사용될 수 있습니다.

 

이 튜토리얼에서는 하이퍼레저 컴포저 커맨드를 Docker network 내에서 실행하기 보다는 host machine에서 실행합니다. 이는 하이퍼레저 컴포터 커맨드가 localhost를 호스트 이름으로 사용하고 공개된 컨테이너 포트를 사용해 하이퍼레저 패브릭 네트워크와 상호작용한다는 것을 의미합니다.

 

모든 네트워크 구성요소들은 통신 암호화에 TLS를 사용하여 보호됩니다. 해당 네트워크 구성요소에 연결하려면 모든 네트워크 구성요소에 대한 CA 인증서가 필요합니다. CA 인증서는 byfn.sh 스크립트가 들어있는 폴더에서 찾을 수 있습니다.

 

orderer 노드의 CA 인증서:

crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt

Org1의 CA 인증서:

crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt

Org2의 CA 인증서:

crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt

이 파일들은 이후 하이퍼레저 패브릭 네트워크와 상호작용하는 데 사용될 것입니다.

 

Users

Org1은 Admin@org1.example.com이라는 사용자로 구성되며, 이 사용자는 관리자입니다.

 

Admin@org1.example.com 사용자는 아래 폴더에 인증서와 개인 키 파일을 저장하고 있습니다.

crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp

Org2는 Admin@org2.example.com이라는 사용자로 구성되며, 이 사용자는 관리자입니다.

 

Admin@org2.example.com 사용자는 아래 폴더에 인증서와 개인 키 파일을 저장하고 있습니다.

crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp

이 파일 중 일부는 이후 하이퍼레저 패브릭 네트워크와 상호작용하는 데 사용될 것입니다.

 

관리자 외에도 Org1 및 Org2의 CA는 기본 사용자로 구성되어 있습니다. 이 기본 사용자는 등록 ID가 admin이고 비밀번호가 adminpw입니다. 하지만, 이 사용자에게는 블록체인 비즈니스 네트워크를 배포할 수 있는 권한이 없습니다.

 

이 튜토리얼에서 나중에 작업할 컴포터 connector profile과 키/인증서 파일을 관리하기 위해 임시 작업용 디렉토리 (및 하위 디렉토리) 를 생성하는 것이 좋습니다.

mkdir -p /tmp/composer/org1

mkdir -p /tmp/composer/org2

 

Channel

mychannel 이라는 채널이 생성되었다. 모든 4개의 피어 노드 - peer0.org1.example.com, peer1.org1.example.com, peer0.org2.example.com, peer1.org2.example.com은 이 채널에 조인된다.

 

Connection Profiles

우리는 패브릭 네트워크를 설명하는 기본 connection profile가 필요합니다. 이 connection profile은 alice와 bob에게 전달되어 해당 조직에 맞게 커스터마이징 될 수 있습니다.

{
    "name": "byfn-network",
    "x-type": "hlfv1",
    "version": "1.0.0",
    "channels": {
        "mychannel": {
            "orderers": [
                "orderer.example.com"
            ],
            "peers": {
                "peer0.org1.example.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "eventSource": true
                },
                "peer1.org1.example.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "eventSource": true
                },
                "peer0.org2.example.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "eventSource": true
                },
                "peer1.org2.example.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "eventSource": true
                }
            }
        }
    },
    "organizations": {
        "Org1": {
            "mspid": "Org1MSP",
            "peers": [
                "peer0.org1.example.com",
                "peer1.org1.example.com"
            ],
            "certificateAuthorities": [
                "ca.org1.example.com"
            ]
        },
        "Org2": {
            "mspid": "Org2MSP",
            "peers": [
                "peer0.org2.example.com",
                "peer1.org2.example.com"
            ],
            "certificateAuthorities": [
                "ca.org2.example.com"
            ]
        }
    },
    "orderers": {
        "orderer.example.com": {
            "url": "grpcs://localhost:7050",
            "grpcOptions": {
                "ssl-target-name-override": "orderer.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_ORDERER_CA_CERT"
            }
        }
    },
    "peers": {
        "peer0.org1.example.com": {
            "url": "grpcs://localhost:7051",
            "grpcOptions": {
                "ssl-target-name-override": "peer0.org1.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_ORG1_CA_CERT"
            }
        },
        "peer1.org1.example.com": {
            "url": "grpcs://localhost:8051",
            "grpcOptions": {
                "ssl-target-name-override": "peer1.org1.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_ORG1_CA_CERT"
            }
        },
        "peer0.org2.example.com": {
            "url": "grpcs://localhost:9051",
            "grpcOptions": {
                "ssl-target-name-override": "peer0.org2.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_ORG2_CA_CERT"
            }
        },
        "peer1.org2.example.com": {
            "url": "grpcs://localhost:10051",
            "grpcOptions": {
                "ssl-target-name-override": "peer1.org2.example.com"
            },
            "tlsCACerts": {
                "pem": "INSERT_ORG2_CA_CERT"
            }
        }
    },
    "certificateAuthorities": {
        "ca.org1.example.com": {
            "url": "https://localhost:7054",
            "caName": "ca-org1",
            "httpOptions": {
                "verify": false
            }
        },
        "ca.org2.example.com": {
            "url": "https://localhost:8054",
            "caName": "ca-org2",
            "httpOptions": {
                "verify": false
            }
        }
    }
}

위 기본 파일을 복사해서 /tmp/composer 라는 새 디렉토리 아래 byfn-network.json파일을 생성하고 붙여넣으세요.

 

byfn-network.json파일을 열고 INSERT_ORG1_CA_CERT를 Org1 피어노드의 CA인증서로 교체하세요:

아래 커맨드를 사용해 .pem파일에서 인증서를 가져와 위 connection profile에 포함되도록 하세요.

awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt > /tmp/composer/org1/ca-org1.txt

/tmp/composer/org1/ca-org1.txt 파일 내용을 복사하고 .json 파일의 INSERT_ORG1_CA_CERT 자리에 넣으세요. 아래와 같은 형태가 될 것입니다. (profile 파일에서는 한 줄이어야 합니다.)

"pem": "-----BEGIN CERTIFICATE-----\nMIICNTCCAdygAwIBAgIRAMNvmQpnXi7uM19BLdha3MwwCgYIKoZIzj0EAwIwbDEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xFDASBgNVBAoTC2V4YW1wbGUuY29tMRowGAYDVQQDExF0bHNjYS5l\neGFtcGxlLmNvbTAeFw0xNzA2MjYxMjQ5MjZaFw0yNzA2MjQxMjQ5MjZaMGwxCzAJ\nBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4gRnJh\nbmNpc2NvMRQwEgYDVQQKEwtleGFtcGxlLmNvbTEaMBgGA1UEAxMRdGxzY2EuZXhh\nbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASJn3QUVcKCp+s6lSPE\nP5KlWmE9rEG0kpECsAfW28vZQSIg2Ez+Tp1alA9SYN/5BtL1N6lUUoVhG3lz8uvi\n8zhro18wXTAOBgNVHQ8BAf8EBAMCAaYwDwYDVR0lBAgwBgYEVR0lADAPBgNVHRMB\nAf8EBTADAQH/MCkGA1UdDgQiBCB7ULYTq3+BQqnzwae1RsnwQgJv/HQ5+je2xcDr\nka4MHTAKBggqhkjOPQQDAgNHADBEAiB2hLiS8B1g4J5Qbxu15dVWAZTAXX9xPAvm\n4l25e1oS+gIgBiU/aBwSxY0uambwMB6xtQz0ZE/D4lyTZZcW9SODlOE=\n-----END CERTIFICATE-----\n"

동일한 .json 파일에서 INSERT_ORG2_CA_CERT도 Org2 피어 노드의 CA 인증서로 교체해야 합니다. 아래 커맨드를 사용해 .pem 파일에서 인증서를 가져오고 connection profile에 포함되도록 하세요.

awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt > /tmp/composer/org2/ca-org2.txt

/tmp/composer/org2/ca-org2.txt파일 내용을 복사하고 INSERT_ORG2_CA_CERT 자리에 넣으세요. 다시 한 번 언급하지만 모두 한 줄에 있어야 합니다.

 

INSERT_ORDERER_CA_CERT를 orderer 노드의 CA 인증서로 교체하세요. 아래 커맨드를 사용해 .pem 파일 내용이 connetion profile json 파일로 포함되도록 하세요.

awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt > /tmp/composer/ca-orderer.txt

/tmp/composer/ca-orderer.txt파일 내용을 복사하고 INSERT_ORDERER_CA_CERT 자리에 넣으세요. 다시 한 번 언급하지만 모두 동일한 라인에 있어야 합니다.

 

완료되면 이 파일을 /tmp/composer/byfn-network.json 파일에 저장하세요.

 

이 connectino profile은 이제 네트워크의 일부분인 모든 피어, orderer, 인증서를 포함한 패브릭 네트워크 구성을 나타냅니다. 이 파일은 네트워크에 참여하는 모든 조직을 나타내고 이 네트워크에 있는 모든 채널을 정의합니다. 하이퍼레저 컴포저는 단일 채널과 상호작용할 수 있기 때문에 하나의 채널만이 정의되어 있습니다.

 

 

Step Three: Customizing the connection profile for Org1

이 단계는 alice가 속한 조직을 지정하는 것입니다. 타임아웃이 있는 클라이언트 섹션에서는 다음 블록을 위에서 작성한 /tmp/composer/byfn-network.json 이라는 connection profile 파일에 추가합니다. 이는 version 속성과 channel 속성 사이에 있습니다. 완료되면 /tmp/composer/org1/byfn-network-org1.json이라는 새로운 파일로 저장하세요.

    "client": {
        "organization": "Org1",
        "connection": {
            "timeout": {
                "peer": {
                    "endorser": "300",
                    "eventHub": "300",
                    "eventReg": "300"
                },
                "orderer": "300"
            }
        }
    },

그러면 profile 섹션은 아래와 같아집니다.

    ...
    "version": "1.0.0",
    "client": {
        "organization": "Org1",
        "connection": {
            "timeout": {
                "peer": {
                    "endorser": "300",
                    "eventHub": "300",
                    "eventReg": "300"
                },
                "orderer": "300"
            }
        }
    },
    "channel": {
    ...

 

 

 

Step Four: Building a connection profile for Org2

bob에 동일한 절차를 반복합니다. 하지만 이번에는 조직을 Org2로 지정하고 파일명 또한 /tmp/composer/byfn-network-org2.json이라고 지정합니다. 그러면 profile 섹션은 아래와 같아집니다.

    ...
    "version": "1.0.0",
    "client": {
        "organization": "Org2",
        "connection": {
            "timeout": {
                "peer": {
                    "endorser": "300",
                    "eventHub": "300",
                    "eventReg": "300"
                },
                "orderer": "300"
            }
        }
    },
    "channel": {
    ...

 

 

 

Step Five: Locating the certificate and private key for the Hyperledger Fabric administrator for Org1

하이퍼레저 패브릭 Org1 네트워크의 관리자는 Admin@org1.example.com라 불리는 사용자입니다. 이 인증서와 개인키 파일은 아래 디렉토리에 저장되어 있습니다.

crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp

먼저 사용자의 인증서 파일을 위치시켜야 합니다. 인증서는 신원확인의 공개된 부분입니다. 인증서 파일은 signcerts 하위 디렉토리에서 찾을 수 있으며 Admin@org1.example.com-cert.pem이라는 파일입니다.

 

다음으로 사용자의 개인키 파일을 위치시켜야 합니다. 개인키는 이 신원을 통해 트랜잭션을 인증할 때 사용됩니다. 개인 키 파일은 keystore 하위 디렉토리에서 찾을 수 있습니다. 개인 키 파일은 16진수 문자열로 접미어는 _sk입니다. 예를 들면 78f2139bfcfc0edc7ada0801650ed785a11cfcdef3f9c36f3c8ca2ebfa00a59c_sk와 같이 생겼습니다. 이 이름은 구성이 생성될 때마다 매번 바뀌므로 아래의 와일드 카드를 사용하세요.

 

이 두 파일 경로를 모두 기억하세요, 혹은 step 3에서 생성한 connection profile 파일인 /tmp/composer/orgl/byfn-network-org1.json 파일과 동일한 폴더에 복사해두세요. 이 파일은 다음 단계에서 필요합니다.

 

이 작업을 하기 위해 아래 커맨드를 사용하세요.

export ORG1=crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp

cp -p $ORG1/signcerts/A*.pem /tmp/composer/org1

cp -p $ORG1/keystore/*_sk /tmp/composer/org1

 

 

Step Six: Locating the certificate and private key for the Hyperledger Fabric administrator for Org2

하이퍼레저 패브릭 네트워크의 관리자는 Admin@org2.example.com이라는 사용자입니다. 이 사용자의 인증서와 개인 키는 아래 디렉토리에 있습니다.

crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp

먼저 사용자의 인증서 파일을 위치시켜야 합니다. 인증서는 신원확인의 공개된 부분입니다. 인증서 파일은 signcerts 하위 디렉토리에서 찾을 수 있으며 Admin@org2.example.com-cert.pem이라는 파일입니다.

 

다음으로 사용자의 개인키 파일을 위치시켜야 합니다. 개인키는 이 신원을 통해 트랜잭션을 인증할 때 사용됩니다. 개인 키 파일은 keystore 하위 디렉토리에서 찾을 수 있습니다. 개인 키 파일은 16진수 문자열로 접미어는 _sk입니다. 예를 들면 d4889cb2a32e167bf7aeced872a214673ee5976b63a94a6a4e61c135ca2f2dbb_sk와 같이 생겼습니다. 이 이름은 구성이 생성될 때마다 매번 바뀌므로 아래의 와일드 카드를 사용하세요.

 

이 두 파일 경로를 모두 기억하세요, 혹은 step 3에서 생성한 connection profile 파일인 /tmp/composer/orgl/byfn-network-org2.json 파일과 동일한 폴더에 복사해두세요. 이 파일은 다음 단계에서 필요합니다.

 

이 작업을 하기 위해 아래 커맨드를 사용하세요.

export ORG2=crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp

cp -p $ORG2/signcerts/A*.pem /tmp/composer/org2

cp -p $ORG2/keystore/*_sk /tmp/composer/org2

 

 

Step Seven: Creating business network cards for the Hyperledger Fabric administrator for Org1

이 단계는 관리자가 하이퍼레저 패브릭 네트워크에 블록체인 비즈니스 네트워크를 배포하는데 사용되는 비즈니스 네트워크 카드를 생성합니다.

 

composer card create 커맨드를 실행해서 Org1의 connection profile을 사용하는 비즈니스 네트워크 카드를 생성하세요. 이전 단계에서 생성 혹은 위치시킨 3가지 파일 경로를 모두 지정해야 합니다. (주의: sk파일은 다를 것입니다.)

composer card create -p /tmp/composer/org1/byfn-network-org1.json -u PeerAdmin -c /tmp/composer/org1/Admin@org1.example.com-cert.pem -k /tmp/composer/org1/*_sk -r PeerAdmin -r ChannelAdmin -f PeerAdmin@byfn-network-org1.card

커맨드가 성공적으로 수행되면, PeerAdmin@byfn-network-org1.card라는 비즈니스 네트워크 카드 파일이 현재 폴더에 생성됩니다.

 

 

Step Eight: Creating business network cards for the Hyperledger Fabric administrator for Org2

이 단계는 관리자가 하이퍼레저 패브릭 네트워크에 블록체인 비즈니스 네트워크를 배포하는데 사용되는 비즈니스 네트워크 카드를 생성합니다.

 

composer card create 커맨드를 실행해서 Org2의 connection profile을 사용하는 비즈니스 네트워크 카드를 생성하세요. 이전 단계에서 생성 혹은 위치시킨 3가지 파일 경로를 모두 지정해야 합니다. 

composer card create -p /tmp/composer/org2/byfn-network-org2.json -u PeerAdmin -c /tmp/composer/org2/Admin@org2.example.com-cert.pem -k /tmp/composer/org2/*_sk -r PeerAdmin -r ChannelAdmin -f PeerAdmin@byfn-network-org2.card

커맨드가 성공적으로 수행되면, PeerAdmin@byfn-network-org2.card라는 비즈니스 네트워크 카드 파일이 현재 폴더에 생성됩니다.

 

 

Step Nine: Importing the business network cards for the Hyperledger Fabric administrator for Org1

composer card import 커맨드를 사용해 Org1의 비즈니스 네트워크 카드를 지갑으로 import하세요.

composer card import -f PeerAdmin@byfn-network-org1.card --card PeerAdmin@byfn-network-org1

명령어가 올바르게 실행되면 PeerAdmin@byfn-network-org1이라는 비즈니스 네트워크 카드가 지갑으로 import됩니다.

 

 

Step Ten: Importing the business network cards for the Hyperledger Fabric administrator for Org2

composer card import 커맨드를 사용해 Org2의 비즈니스 네트워크 카드를 지갑으로 import하세요.

composer card import -f PeerAdmin@byfn-network-org2.card --card PeerAdmin@byfn-network-org2

명령어가 올바르게 실행되면 PeerAdmin@byfn-network-org2이라는 비즈니스 네트워크 카드가 지갑으로 import됩니다.

 

 

 

Step Eleven: Installing the business network onto the Hyperledger Fabric peer nodes for Org1

composer network install 명령어를 사용해 Step 3에서 connection profile 파일에 정의한 Org1의 하이퍼레저 패브릭 피어 노드에 비즈니스 네트워크를 설치하세요.

composer network install --card PeerAdmin@byfn-network-org1 --archiveFile trade-network.bna

위에서 볼 수 있듯이, 여러 조직 환경을 테스트하기 위해 trade-network라 불리는 하이퍼레저 컴포저 비스니스 네트워크를 사용합니다. 테스트를 하려면 trade-network.bna (샘플 네트워크에서 만들어진 비즈니스 네트워크 아카이브) 파일이 필요합니다. 이 파일을 가지고 있지 않다면 https://composer-playground.mybluemix.net/ 옆의 링크로 이동해 온라인 플레이그라운드에서 trade-network 샘플을 배포한 다음 admin으로 비즈니스 네트워크에 connect 하세요. 왼쪽 하단 버전을 0.1.14로 변경하고 현재 폴더에 trade-network.bna파일을 export하세요. 비즈니스 네트워크는 package.json 파일에 version 속성을 가지고 있습니다. 이 버전은 비즈니스 네트워크가 step 17에서 composer start 커맨드를 사용해 시작될 때 지정되어야 합니다. trade-network 샘플 네트워크를 사용하고 있다면 버전은 0.1.14입니다. (주의: 컴포저 튜토리얼 네트워크 tutorial-network같은 다른 네트워크를 비즈니스 네트워크로 사용하려 한다면 위의 network install 커맨드에 해당 파일을 이 튜토리얼의 비즈니스 네트워크 아카이브로 지정하고 버전 또한 알맞게 지정해야 합니다.)

 

network install 커맨드의 유용한 기능은 설치된 비즈니스 네트워크 이름과 버전 번호를 출력한다는 것입니다. 이는 아래 step 17에서 사용할 수 있습니다.

 

 

Step Twelve: Installing the business network onto the Hyperledger Fabric peer nodes for Org2

composer network install 명령어를 사용해 Step 4에서 connection profile 파일에 정의한 Org2의 하이퍼레저 패브릭 피어 노드에 비즈니스 네트워크를 설치하세요.

composer network install --card PeerAdmin@byfn-network-org2 --archiveFile trade-network.bna

 

 

 

Step Thirteen: Defining the endorsement policy for the business network

운영중인 비즈니스 네트워크는 인증 정책을 가지고 있습니다. 이 정책은 트랜잭션이 블록체인에 커밋되기 전에 어느 조직이 트랜잭션을 검증할지를 결정하는 규칙을 정의합니다. 기본적으로 비즈니스 네트워크는 블록체인에 트랜잭션이 커밋되기 전 하나의 기관이 트랜잭션을 검증하도록 배포됩니다.

 

실제 블록체인 비즈니스 네트워크에서는 여러 기관들이 블록체인에 트랜잭션이 커밋되기 전 검증하기를 원합니다. 그리고 기본 검증 정책은 여기에 적합하지 못합니다. 그래서 비즈니스 네트워크를 시작할 때 검증 정책을 커스텀할 수 있습니다.

 

검증 정책과 관련해서는 하이퍼레저 패브릭 docs 내 아래 링크를 참고하면 더 상세한 정보를 알 수 있습니다.

https://hyperledger-fabric.readthedocs.io/en/release/endorsement-policies.html

불러오는 중입니다...
비즈니스 네트워크에서 사용되는 검증 정책은 하이퍼레저 패브릭 Node.js SDK에서 사용하는 JSON 형식이어야 합니다. 하이퍼레저 패브릭 CLI에서 사용되는 간단한 검증 정책 형식과 다른 형식으로 하이퍼레저 패브릭 문서에서 확인할 수 있습니다.

 

/tmp/composer/endorsement-policy.json 이라는 검증 정책 파일을 생성하고 아래 내용을 복사해 붙여넣은 후 저장하세요. 이후 단계에서 이 파일을 사용할 것이므로 어디 저장했는지 기억하세요.

{
    "identities": [
        {
            "role": {
                "name": "member",
                "mspId": "Org1MSP"
            }
        },
        {
            "role": {
                "name": "member",
                "mspId": "Org2MSP"
            }
        }
    ],
    "policy": {
        "2-of": [
            {
                "signed-by": 0
            },
            {
                "signed-by": 1
            }
        ]
    }
}

방금 생성한 검증정책은 Org1과 Org2 모두 블록체인에 트랜잭션을 커밋하기 전 비즈니스 네트워크 내 트랜잭션을 검증해야만 합니다. Org1 혹은 Org2가 트랜잭션을 검증하지 않거나, 트랜잭션 결과에 동의하지 않으면 해당 트랜잭션은 비즈니스 네트워크에 의해 거절당합니다.

 

 

Step Fourteen: Understanding and selecting the business network administrators

비즈니스 네트워크가 시작되면, 초기 참가자 집단으로 구성됩니다. 이 참가자들은 비즈니스 네트워크를 시작하고 다른 참가자들을 비즈니스 네트워크에 초대하는 역할을 합니다. 하이퍼레저 컴포저에서 우리는 이 초기 참가자들을 비즈니스 네트워크 관리자라고 부릅니다.

 

여기서 Org1과 Org2는 동일한 권한을 갖고 있습니다. 각 조직은 비즈니스 네트워크에 관리자를 제공하고 , 해당 관리자들은 각 조직에 다른 참가자들을 초대합니다. Org1의 비즈니스 네트워크 관리자는 Alice이고 Org2의 관리자는 Bob입니다.

 

비즈니스 네트워크가 시작되면 모든 비즈니스 네트워크 관리자의 인증서 (신원확인의 공개파트) 는 비즈니스 네트워크를 시작하는 조직에 제출되어야 합니다. 비즈니스 네트워크가 시작되면, 모든 관리자들은 비즈니스 네트워크와 상호작용하는데 그들의 신원을 사용할 수 있습니다.

 

비즈니스 네트워크 관리자에 대해 더 자세한 내용은 아래 링크를 참고하세요.

https://hyperledger.github.io/composer/latest/business-network/bnd-deploy.html

 

Deploying Business Networks | Hyperledger Composer

Deploying Business Networks Before a business network definition can be deployed it must be packaged into a Business Network Archive (.bna) file. The composer archive create command is used to create a business network archive file from a business network

hyperledger.github.io

 

 

 

Step Fifteen: Retrieving business network administrator certificates for Org1

composer identity request 커맨드를 사용해 Org1의 비즈니스 네트워크 관리자로 사용할 Alice의 인증서를 검색하세요.

composer identity request -c PeerAdmin@byfn-network-org1 -u admin -s adminpw -d alice

이 커맨드의 -u admin 과 -s adminpw 옵션은 하이퍼레저 패브릭 CA에 등록된 기본 사용자입니다.

 

인증서는 현재 작업 디렉토리의 alice폴더에 위치할 것입니다. 3개의 인증서가 생성되지만 2가지가 중요합니다. 이 두 가지는 admin-pub.pem이라는 공개키를 포함한 인증서와 admin-priv.pem이라는 개인키 파일입니다. admin-pub.pem파일만이 다른 조직과 공유되어야 합니다. admin-priv.pem파일은 비밀로 유지되어야 하며 조직을 대표해 트랜잭션을 인증하는데 사용됩니다.

 

 

 

Step Sixteen: Retrieving business network administrator certificates for Org2

composer identity request 커맨드를 사용해 Org2의 비즈니스 네트워크 관리자로 사용할 Alice의 인증서를 검색하세요.

composer identity request -c PeerAdmin@byfn-network-org2 -u admin -s adminpw -d bob

이 커맨드의 -u admin 과 -s adminpw 옵션은 하이퍼레저 패브릭 CA에 등록된 기본 사용자입니다.

 

인증서는 현재 작업 디렉토리의 bob폴더에 위치할 것입니다. 3개의 인증서가 생성되지만 2가지가 중요합니다. 이 두 가지는 admin-pub.pem이라는 공개키를 포함한 인증서와 admin-priv.pem이라는 개인키 파일입니다. admin-pub.pem파일만이 다른 조직과 공유되어야 합니다. admin-priv.pem파일은 비밀로 유지되어야 하며 조직을 대표해 트랜잭션을 인증하는데 사용됩니다.

 

 

 

Step Seventeen: Starting the business networ

composer network start 커맨드를 사용해 비즈니스 네트워크를 시작하세요. 이 동작은 Org1에서만 수행합니다. 이 명령어는 step 13에서 생성한 /tmp/composer/endorsement-policy.json 파일을 사용합니다. 그리고 step 15, 16에서 Alice와 Bob에 의해 생성된 admin-pub.pem 파일을 사용합니다. 그러므로 위 모든 파일에 아래 명령어로 접근할 수 있어야 합니다.

composer network start -c PeerAdmin@byfn-network-org1 -n trade-network -V 0.1.14 -o endorsementPolicyFile=/tmp/composer/endorsement-policy.json -A alice -C alice/admin-pub.pem -A bob -C bob/admin-pub.pem

위 명령어가 수행되면, 비즈니스 네트워크는 시작됩니다. Alice와 Bob모두 비즈니스 네트워크에 접근해 시작할 수 있고 각 조직에 다른 참가자들을 초대할 수 있습니다. 하지만, Alice와 Bob은 이전 단계에서 생성한 인증서로 비즈니스 네트워크 카드를 생성해야 비즈니스 네트워크에 접근할 수 있습니다.

 

 

 

Step Eighteen: Creating a business network card to access the business network as Org1

composer card create 커맨드를 사용해 Org1의 비즈니스 네트워크 관리자인 Alice의 비즈니스 네트워크 카드를 생성하세요. 그러면 비즈니스 네트워크에 접근할 수 있습니다.

composer card create -p /tmp/composer/org1/byfn-network-org1.json -u alice -n trade-network -c alice/admin-pub.pem -k alice/admin-priv.pem

composer card import 커맨드를 사용해 방금 생성한 비즈니스 네트워크 카드를 import 하세요.

composer card import -f alice@trade-network.card

composer network ping 커맨드를 사용해 블록체인 비즈니스 네트워크 접속을 테스트하세요.

composer network ping -c alice@trade-network

위 커맨드가 성공적으로 동작하면, org.hyperledger.composer.system.NetworkAdmin#alice와 같은 참가자 신분을 확인할 수 있을 것입니다. 이제 블록체인 비즈니스 네트워크와 상호작용하고 다른 참가자들을 초대하는데 이 비즈니스 네트워크 카드를 사용할 수 있습니다.

 

참가자를 생성하고 해당 참가자에 매핑된 ID를 발급하고 해당 ID로 블록체인 네트워크에서 자산을 생성할 수 있습니다.

 

아래의 composer participant add 명령어를 실행하세요.

composer participant add -c alice@trade-network -d '{"$class":"org.example.trading.Trader","tradeId":"trader1-org1", "firstName":"Jo","lastName":"Doe"}'

다음으로 trader1-org1의 id를 생성하기 위해 composer issue identity 커맨드를 사용하세요.

composer identity issue -c alice@trade-network -f jo.card -u jdoe -a "resource:org.example.trading.Trader#trader1-org1"

카드를 import하고 테스트해보세요.

composer card import -f jo.card

composer network ping -c jdoe@trade-network

다음으로 자산을 생성할 것입니다. 커맨드 라인에서 jdoe 참가자로 Commodity 자산을 생성하는 트랜잭션을 제출합니다. (혹은 컴포저 플레이그라운드를 설치했다면 jdoe@trade-network로 trade-network에 접속해 'EMA'라는 아래 JSON형태의 자산을 생성하세요.)

 

CLI를 사용해 자산을 생성하기 위해 아래 transaction submit 시퀀스를 복사합니다. 이 내용은 Commodity 자산을 생성합니다.

composer transaction submit --card jdoe@trade-network -d '{"$class": "org.hyperledger.composer.system.AddAsset", "targetRegistry" : "resource:org.hyperledger.composer.system.AssetRegistry#org.example.trading.Commodity", "resources": [{"$class": "org.example.trading.Commodity","tradingSymbol":"EMA", "description":"Corn commodity","mainExchange":"EURONEXT", "quantity":"10","owner":"resource:org.example.trading.Trader#trader1-org1"}]}'

혹은 플레이그라운드에서 생성하려면 아래 내용을 복사하세요.

{
  "$class": "org.example.trading.Commodity",
  "tradingSymbol": "EMA",
  "description": "Corn commodity",
  "mainExchange": "EURONEXT",
  "quantity": 10,
  "owner": "resource:org.example.trading.Trader#trader1-org1"
}

마지막으로 composer network list 커맨드를 사용해서 비즈니스 네트워크에 생성된 산출물을 확인하세요.

composer network list -c jdoe@trade-network

 

 

 

Step Nineteen: Creating a business network card to access the business network as Org2

composer card create 커맨드를 사용해 Org2의 비즈니스 네트워크 관리자인 Bob의 비즈니스 네트워크 카드를 생성하세요. 그러면 비즈니스 네트워크에 접근할 수 있습니다.

composer card create -p /tmp/composer/org2/byfn-network-org2.json -u bob -n trade-network -c bob/admin-pub.pem -k bob/admin-priv.pem

composer card import 커맨드를 사용해 방금 생성한 비즈니스 네트워크 카드를 import 하세요.

composer card import -f bob@trade-network.card

composer network ping 커맨드를 사용해 블록체인 비즈니스 네트워크 접속을 테스트하세요.

composer network ping -c bob@trade-network

위 커맨드가 성공적으로 동작하면, org.hyperledger.composer.system.NetworkAdmin#bob와 같은 참가자 신분을 확인할 수 있을 것입니다. 이제 다른 Trader를 초대해봅시다.

 

다시 한 번 참가자를 생성하고 해당 참가자에 매핑된 ID를 발급합니다. 이미 블록체인 네트워크에 자산을 갖고 있기 때문에, 우리는 소유자를 변경하는 트랜잭션을 사용할 것입니다. (Org1에서 Org2 trader로)

 

아래의 composer participant add 명령어를 실행하세요.

composer participant add -c bob@trade-network -d '{"$class":"org.example.trading.Trader","tradeId":"trader2-org2", "firstName":"Dave","lastName":"Lowe"}'

다음으로 trader2-org2의 id를 생성하기 위해 composer issue identity 커맨드를 사용하세요.

composer identity issue -c bob@trade-network -f dave.card -u dlowe -a "resource:org.example.trading.Trader#trader2-org2"

카드를 import하고 테스트해보세요.

composer card import -f dave.card

composer network ping -c dlowe@trade-network

마지막으로 이전에 생성한 Commodity 자산의 소유자를 변경하는 트랜잭션을 제출합니다. 우리는 자산 소유자인 Jon Doe로 트랜잭션을 제출하고 Dave Lowe에게 전달할 것입니다. 그리고나서 dlowe라고 매핑된 Org2의 trader 참가자로 소유자가 변경되었는지 확인할 것입니다. 아래 단계를 따라 수행하세요.

composer transaction submit --card jdoe@trade-network -d '{"$class":"org.example.trading.Trade","commodity":"resource:org.example.trading.Commodity#EMA","newOwner":"resource:org.example.trading.Trader#trader2-org2"}'

마지막으로 Org2 trader 참가자로  composer network list 커맨드를 사용해서 자산의 소유자가 변경되었는지 확인하세요.

 

 

* 본 포스팅은 하이퍼레저 패브릭 docs를 번역한 내용으로, 번역 과정에서 잘못된 부분이 있을 수 있습니다.

상세 내용은 하단 링크를 참조 부탁드리며, 잘못된 내용에 대한 피드백은 언제든 환영합니다 : ) 

https://hyperledger.github.io/composer/latest/tutorials/deploy-to-fabric-single-org

 

Deploying to a single organization Hyperledger Fabric | Hyperledger Composer

Deploying a Hyperledger Composer blockchain business network to Hyperledger Fabric for a single organization In the development environment, a simple development only Hyperledger Fabric single organization, single peer network is created for you (fabric-de

hyperledger.github.io

개발 환경에서는 블록체인 비즈니스 네트워크를 배포하는데 필요한 하이퍼레저 컴포저 구성과 함께 하이퍼레터 패브릭 단일 조직, 단일 피어 네트워크 (fabric-dev-servers)만 생성됩니다.

 

이 튜토리얼에서는 필요한 조직을 생성하는 방법을 포함해 관리자가 단일 조직에 대해 하이퍼레저 패브릭 객체에 블록체인 비즈니스 네트워크를 배포하기 위해 수행해야 하는 단계를 보여줍니다. 이후 튜토리얼에서는 블록체인 비즈니스 네트워크를 여러 조직의 하이퍼레저 패브릭 객체에 배포하는 방법을 보여줍니다.

 

이 튜토리얼을 수행하는 동안 아래 하이퍼레저 패브릭 문서를 참고할 수 있습니다.

http://hyperledger-fabric.readthedocs.io/

 

A Blockchain Platform for the Enterprise — hyperledger-fabricdocs master documentation

Docs » A Blockchain Platform for the Enterprise Edit on GitHub Built with Sphinx using a theme provided by Read the Docs.

hyperledger-fabric.readthedocs.io

 

Prerequisites

1. 시작하기 전 개발환경 설치가 완료되었는지 확인하세요.

https://ralee-world.tistory.com/entry/Hyperledger-Composer-Installing?category=719808

 

Composer Installing

* 본 포스팅은 하이퍼레저 패브릭 docs를 번역한 내용으로, 번역 과정에서 잘못된 부분이 있을 수 있습니다. 상세 내용은 하단 링크를 참조 부탁드리며, 잘못된 내용에 대한 피드백은 언제든 환영합니다 : ) http..

ralee-world.tistory.com

 

 

Step One: Starting a Hyperledger Fabric network

이 튜토리얼을 따라하려면 하이퍼레저 패브릭 네트워크를 시작해야 합니다. 개발 환경에서 주어진 간단한 하이퍼레저 패브릭 네트워크를 사용할 수도 있고, 하이퍼레즈 패브릭 docs를 따라 생성한 네트워크를 사용해도 좋습니다.

 

이 튜토리얼은 개발 환경에 제공된 간단한 하이퍼레저 패브릭 네트워크를 사용한다고 가정합니다. 개인이 생성한 하이퍼레저 패브릭 네트워크를 사용한다면 아래 설명된 구성과 일치하도록 매핑해야 하며 단일 조직 네트워크여야 합니다.

 

1. 아래 커맨드를 통해 clean Hyperledger Fabric을 시작하세요.

cd ~/fabric-dev-servers
export FABRIC_VERSION=hlfv12
./stopFabric.sh
./teardownFabric.sh
./downloadFabric.sh
./startFabric.sh

2. 지갑에 있는 모든 비즈니스 네트워크 카드를 삭제하세요. 비즈니스 네트워크 카드를 찾을 수 없다는 오류는 무시해도 괜찮습니다.

composer card delete -c PeerAdmin@fabric-network
composer card delete -c admin@tutorial-network

위 명령어들이 실패하면 이전 버전의 네트워크 카드가 있다는 것이며, 파일 시스템 카드 저장소를 삭제해야 합니다.

    rm -fr ~/.composer

 

 

Step Rwo: Exploring the Hyperledger Fabric network

이 단계는 방금 시작한 하이퍼레저 패브릭 네트워크를 탐색하고 구성 방법 및 요소를 이해하는 단계입니다. 이 섹션의 모든 정보를 사용해 이후 단계에서 하이퍼레저 컴포저를 구성할 수 있습니다.

 

Configuration files

개발 환경에서 주어진 간단한 하이퍼레저 패브릭 네트워크는 하이퍼레저 패브릭 구성 툴인 cryptogen이나 configtxgen을 사용해 환경설정을 할 수 있습니다.

 

cryptogen은 아래 파일에 저장되어 있습니다.

~/fabric-dev-servers/fabric-scripts/hlfv12/composer/crypto-config.yaml

configtxgen은 아래 파일에 저장되어 있습니다.

~/fabric-dev-servers/fabric-scripts/hlfv12/composer/configtx.yaml

하이퍼레저 패브릭 docs를 읽으면 이러한 구성 툴에 대한 추가 정보, 수행 방법 및 사용법에 대해 알 수 있습니다.

 

Organizations

간단한 하이퍼레저 패브릭 네트워크는 Org1이라는 단일 조직으로 구성됩니다. 조직은 org1.example.com이라는 도메인 이름을 사용합니다. 또한, 이 조직의 Membership Services Provider (MSP)는 Org1MSP라고 합니다. 이 튜토리얼에서는 Org1만 상호작용할 수 있는 블록체인 비즈니스 네트워크를 배포합니다.

 

Network components

하이퍼레저 패브릭은 몇몇 요소로 구성되어 있습니다.

 

- peer0.org1.example.com: Org1의 단일 피어 노드

   > request port : 7051

   > event hub port : 7053

 

- ca.org1.example.com: 단일 인증 권한

   > CA port : 7054

 

- orderer.example.com

   > orderer port : 7050

 

하이퍼레저 패브릭 네트워크 구성요소는 Docker 컨테이너에서 실행됩니다. Docker 컨테이너에서 하이퍼레저 컴포저를 실행하는 경우 위의 이름 (예: peer0.org1.example.com)을 사용하여 하이퍼레저 패브릭 네트워크와 상호작용할 수 있습니다.

 

이 튜토리얼에서는 Docker 네트워크 내부가 아닌 Docker 호스트 컴퓨터에서 하이퍼레저 컴포저 명령을 실행합니다. 즉, 하이퍼레저 컴포터 명령은 localhost를 호스트 이름으로 사용하고 노출된 컨테이터 포트를 사용해 하이퍼레저 패브릭 네트워크와 상호작용해야 합니다.

 

Users

조직 Org1은 Admin@org1.example.com이라는 사용자로 구성됩니다. 이 사용자는 관리자입니다. 조직의 관리자는 조직의 피어들에게 블록체인 비즈니스 네트워크의 코드를 설치할 수 있는 권한이 있으며, 구성에 따라 블록체인 비즈니스 네트워크를 시작할 수 있는 권한을 가질 수도 있습니다. 이 튜토리얼에서는 Admin@org1.example.com 사용자로 블록체인 비즈니스 네트워크를 배포합니다.

 

Admin@org1.example.com 사용자는 아래 디렉토리에 저장된 일력의 인증서와 개인 키 파일을 가지고 있습니다.

~/fabric-dev-servers/fabric-scripts/hlfv12/composer/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp

이후 하이퍼레저 패브릭 네트워크와 상호작용할 때 이 파일들을 사용할 것입니다.

 

관리자 외에도 Org1의 CA(Certificate Authority)가 기본 사용자로 등록되어 있습니다. 이 기본 사용자는 등록 ID가 admin이고 패스워드는 adminpw입니다. 하지만, 이 사용자에게는 블록체인 비즈니스 네트워크를 배포할 수 있는 권한이 없습니다.

 

Channel

마지막으로, composerchannel이라는 채널이 생성되었습니다. 피어 노드인 peer0.org1.example.com은 이 채널에 조인되었습니다. 하이퍼레저 컴포저 블록체인 비즈니스 네트워크는 기존 채널에만 배포할 수 있지만, 하이퍼레저 패브릭 docs를 따라 추가 채널을 만들 수도 있습니다.

 

 

Step Three: Building a connection profile

Connection profile은 하이퍼레저 패브릭 네트워크를 찾고 연결하는데 필요한 모든 정보 (예: 모든 하이퍼레저 패브릭 네트워크 구성 요소의 호스트 이름 및 포트)를 지정합니다. 이 단계에서는 하이퍼레저 컴포저가 하이퍼레저 패브릭 네트워크에 연결하는데 사용할 connection profile을 생성합니다.

 

1. connection.json이라는 connection profile 파일을 생성하세요.

2. connection profile의 name, version, x-type속성을 connection.json파일 가장 위에 아래 세 줄을 추가하여 지정하세요.

{
    "name": "fabric-network",
    "x-type": "hlfv1",
    "version": "1.0.0",

name 속성은 하이퍼레저 패브릭 네트워크에 이름을 제공하므로 나중에 참조할 수 잇습니다. 방금 작성한 connection profile에서 이름은 fabric-network입니다. 하이퍼레저 패브릭 네트워크에 대해 원하는 이름을 사용할 수 있습니다.

 

하이퍼레저 컴포저는 다양한 유형의 블록체인 네트워크와 호환되도록 설계되었습니다. 현재는 하이퍼레저 패브릭 v.1.x만 지원되지만 사용할 블록체인 네트워크의 유형을 지정해야 합니다. 하이퍼레저 패브릭 v1.2의 x-type은 hlfv1입니다.

 

버전 번호는 이 connection profile 형식의 버전입니다. 현재 버전은 1.0.0입니다.

 

또한 x-commitTimeout이라는 속성을 부가적으로 지정할 수도 있습니다. 이는 하이퍼레저 컴포저가 제출된 트랜잭션이 대기를 포기하기 전에 조직의 피어에 commit되는 동안 얼마나 오래 기다릴지를 지정하는 속성입니다. default 값은 300초입니다.

 

3. 하이퍼레저 패브릭 네트워크에서는 모든 피어노드의 호스트 이름과 포트를 지정해야 합니다. 여기서는 단 하나의 피어가 있고 peer0.org1.example.com이라는 레이블을 붙입니다.

    "peers": {
        "peer0.org1.example.com": {
            "url": "grpc://localhost:7051"
        }
    },

여기서, 우리는 단일 피어 노드인 peer0.org1.example.com (localhost를 호스트 이름으로 사용하는) 를 지정했으며 request 포트 번호는 7051, event hub port 번호는 7053 입니다.

 

peers 배열은 여러 피어 노드를 포함할 수 있습니다. 여러 피어 노드를 가지고 있다면 해당 노드들을 peers 객체에 추가해야 합니다.

 

4. 기존 사용자를 등록하고 새 사용자를 등록하려면 하이퍼레저 패브릭 네트워크 내 Certificate Authority (CA)의 호스트 이름과 포트 번호를 지정해야 합니다.

    "certificateAuthorities": {
        "ca.org1.example.com": {
            "url": "http://localhost:7054",
            "caName": "ca.org1.example.com"
        }
    },

여기서 우리는 단일 CA인 ca.org1.example.com (localhost를 호스트 이름으로 사용하는) 를 지정했으며 CA 포트 번호는 7054입니다. 또, 우리는 이 엔트리를 ca-org1.example.com이라고 레이블을 붙였습니다.

 

5. 우리는 연결하고자하는 하이퍼레저 패브릭에 있는 모든 ordering노드의 호스트 이름과 포트 번호를 지정해야 합니다.

    "orderers": {
        "orderer.example.com": {
            "url": "grpc://localhost:7050"
        }
    },

여기서 우리는 단일 orderer 노드인 orderer.example.com (localhost를 호스트 이름으로 사용하는) 를 지정했으며, orderer 포트 번호는 7050입니다. 또한 이를 orderer.example.com이라고 레이블을 붙입니다.

 

orderer 객체는 여러 orderer 노드들을 포함할 수 있습니다. 여러 orderer 노드를 가지고 있다면 이를 orderers 객체에 추가해야 합니다.

 

6. 이제 우리는 네트워크 내 모든 조직을 지정해야 합니다. 이 튜토리얼에서는 1개의 조직 Org1만 존재합니다.

    "organizations": {
        "Org1": {
            "mspid": "Org1MSP",
            "peers": [
                "peer0.org1.example.com"
            ],
            "certificateAuthorities": [
                "ca.org1.example.com"
            ]
        }
    },

여기서 우리는 피어 소유자와 그들의 인증기관이 누구인지에 대해 설명하고 있으며, 이 조직에 대해 정의된 MSP ID도 선언합니다. 이 튜토리얼에서는 Org1MSP로 정의되어 있습니다.

 

7. 우리는 존재하는 채널의 이름을 지정해야 합니다. 우리는 블록체인 비즈니스 네트워크를 composerchannel이라는 채널에 배포할 것입니다. 이는 channels 객체에 정의되어 있습니다.

    "channels": {
        "composerchannel": {
            "orderers": [
                "orderer.example.com"
            ],
            "peers": {
                "peer0.org1.example.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "eventSource": true
                }
            }
        }
    },

여기서 우리는 composerchannel 채널과 해당 채널의 일부인 orderers, peers를 정의합니다. 또한 피어가 이 채널에서 수행할 역할도 지정합니다. 이 튜토리얼에서 우리는 이전에 정의된 레이블을 사용해 단일 orderer과 peer를 추가했습니다. 피어는 비즈니스 네트워크를 설치하므로 체인코드 쿼리를 처리하고 이벤트를 생성할 수 있는 트랜잭션 인증자가 됩니다. 블록체인 비즈니스 네트워크는 모든 지정된 피어 노드에 배포될 것입니다. 블록체인 비즈니스 네트워크가 배포되면, 지정된 피어 노드들은 블록체인 비즈니스 네트워크에 쿼리하고, 트랜잭션을 보증하고, 이벤트를 구독하는 데 사용됩니다.

 

8. 마지막 섹션은 클라이언트 섹션입니다. 이것은 클라이언트 애플리케이션 (하이퍼레저 컴포저 같은)에서 상호작용할 때 어떤 조직을 나타내는지와 몇 가지 추가 선택적인 타임아웃 등을 알기 위해 사용됩니다.

    "client": {
        "organization": "Org1",
        "connection": {
            "timeout": {
                "peer": {
                    "endorser": "300",
                    "eventHub": "300",
                    "eventReg": "300"
                },
                "orderer": "300"
            }
        }
    }
}

여기서 우리는 Org1에 정의하고 있습니다. 타임아웃은 피어나 orderer와 상호작용할 때 응답을 얼마나 기다릴지 판별하는 데 사용되며 단위는 초 단위로 지정됩니다. 아무것도 지정하지 않으면 기본값은 45chdlqslek.

 

1. connection.json 파일의 변경 내용을 저장하세요. 완성된 connection profile은 아래와 같을 것입니다.

{
    "name": "fabric-network",
    "x-type": "hlfv1",
    "version": "1.0.0",
    "peers": {
        "peer0.org1.example.com": {
            "url": "grpc://localhost:7051"
        }
    },
    "certificateAuthorities": {
        "ca.org1.example.com": {
            "url": "http://localhost:7054",
            "caName": "ca.org1.example.com"
        }
    },
    "orderers": {
        "orderer.example.com": {
            "url": "grpc://localhost:7050"
        }
    },
    "organizations": {
        "Org1": {
            "mspid": "Org1MSP",
            "peers": [
                "peer0.org1.example.com"
            ],
            "certificateAuthorities": [
                "ca.org1.example.com"
            ]
        }
    },
    "channels": {
        "composerchannel": {
            "orderers": [
                "orderer.example.com"
            ],
            "peers": {
                "peer0.org1.example.com": {
                    "endorsingPeer": true,
                    "chaincodeQuery": true,
                    "eventSource": true
                }
            }
        }
    },
    "client": {
        "organization": "Org1",
        "connection": {
            "timeout": {
                "peer": {
                    "endorser": "300",
                    "eventHub": "300",
                    "eventReg": "300"
                },
                "orderer": "300"
            }
        }
    }
}

 

 

 

Step Four: Locating the certificate and private key for the Hyperledger Fabric administrator

블록체인 비즈니스 네트워크를 하이퍼레저 패브릭 네트워크에 배포하기 위해, 우리는 스스로를 이러한 동작을 수행할 수 있는 권한을 가진 관리자로 정의해야 합니다. 이 단계에서는 스스로를 관리자로 지정하는데 필요한 파일을 배정합니다.

 

하이퍼레저 패브릭 네트워크의 관리자는 Admin@org1.example.com이라 불리는 사용자입니다. 이 사용자의 인증서와 개인 키는 아래 폴더에 있습니다.

~/fabric-dev-servers/fabric-scripts/hlfv12/composer/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp

먼저 이 사용자를 위한 인증서 파일을 위치시켜야 합니다. 인증서는 신원확인의 공개파트입니다. 인증서 파일은 signcerts의 하위 폴더에서 찾을 수 있으며 Admin@org1.example.com-cert.pem이라는 파일입니다. 이 파일의 내용을 보면 아래와 같이 PEM 인코딩 된 인증서를 확인할 수 있습니다.

-----BEGIN CERTIFICATE-----
MIICGjCCAcCgAwIBAgIRANuOnVN+yd/BGyoX7ioEklQwCgYIKoZIzj0EAwIwczEL
MAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG
cmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh
Lm9yZzEuZXhhbXBsZS5jb20wHhcNMTcwNjI2MTI0OTI2WhcNMjcwNjI0MTI0OTI2
WjBbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
U2FuIEZyYW5jaXNjbzEfMB0GA1UEAwwWQWRtaW5Ab3JnMS5leGFtcGxlLmNvbTBZ
MBMGByqGSM49AgEGCCqGSM49AwEHA0IABGu8KxBQ1GkxSTMVoLv7NXiYKWj5t6Dh
WRTJBHnLkWV7lRUfYaKAKFadSii5M7Z7ZpwD8NS7IsMdPR6Z4EyGgwKjTTBLMA4G
A1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1UdIwQkMCKAIBmrZau7BIB9
rRLkwKmqpmSecIaOOr0CF6Mi2J5H4aauMAoGCCqGSM49BAMCA0gAMEUCIQC4sKQ6
CEgqbTYe48az95W9/hnZ+7DI5eSnWUwV9vCd/gIgS5K6omNJydoFoEpaEIwM97uS
XVMHPa0iyC497vdNURA=
-----END CERTIFICATE-----

다음으로는 이 사용자의 개인 키 파일을 위치시켜야 합니다. 개인 키는 이 신원으로 트랜잭션을 인증할 때 사용됩니다. 개인 키 파일은 keystore 하위 디렉토리에서 찾을 수 있습니다. 개인 키 파일의 이름은 긴 16진수 문자열로, 접미어는 _sk입니다. (예: 114aab0e76bf0c78308f89efc4b8c9423e31568da0c340ca187a9b17aa9a4457_sk) 이름은 구성이 생성될 때마다 변경됩니다. 이 파일의 내용을 보면 다음과 유사한 PEM으로 인코딩 된 개인 키를 확인할 수 있습니다.

-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg00IwLLBKoi/9ikb6
ZOAV0S1XeNGWllvlFDeczRKQn2uhRANCAARrvCsQUNRpMUkzFaC7+zV4mClo+beg
4VkUyQR5y5Fle5UVH2GigChWnUoouTO2e2acA/DUuyLDHT0emeBMhoMC
-----END PRIVATE KEY-----

이 두 파일의 경로를 기억하거나 이전 단계에서 작성한 connection profile 파일인 connection.json과 동일한 디렉토리에 파일을 복사해두세요. 다음 단계에서 이 파일이 필요합니다.

 

 

Step Five: Creating a business network card for the Hyperledger Fabric administrator

비즈니스 네트워크 카드는 블록체인 비즈니스 네트워크 및 기본 하이퍼레저 패브릭 네트워크 접속에 필요한 모든 정보가 들어 있습니다. 이 정보에는 Step 3에서 생성한 connection profile과 Step 4에서 위치시킨 관리자의 인증서 및 개인 키가 포합됩니다.

 

이 단계에서는 관리자가 하이퍼레저 패브릭 네트워크에 블록체인 비즈니스 네트워크를 배포하는 데 사용할 비즈니스 네트워크 카드를 생성합니다.

 

composer card create 명령어를 실행시켜서 비즈니스 네트워크 카드를 생성하세요. 이전 단계에서 작성하거나 위치시킨 세 가지 파일 모두에 대한 경로를 지정해야 합니다:

composer card create -p connection.json -u PeerAdmin -c Admin@org1.example.com-cert.pem -k 114aab0e76bf0c78308f89efc4b8c9423e31568da0c340ca187a9b17aa9a4457_sk -r PeerAdmin -r ChannelAdmin

PeerAdmin@fabric-network.card라고 불리는 비즈니스 네트워크 카드 파일이 현재 디렉토리에 작성될 것입니다. composer card create 커맨드와 함께 사용한 옵션을 살펴봅시다.

-p connection.json

이 옵션은 step 3에서 생성한 connection profile 파일의 경로를 나타냅니다.

-u PeerAdmin

이 옵션은 관리자인 사용자를 가리키기 위해 사용하는 이름을 의미합니다. 모든 곳에 Admin@org1.example.com 을 사용하는 대신, 입력하는데 시간이 오래 걸리므로 우리는 이 사용자를 쉽게 참조할 수 있도록 PeerAdmin이라는 이름을 지정했습니다.

-c Admin@org1.example.com-cert.pem

이 옵션은 step 4에서 위치시킨 Admin@org1.example.com 사용자의 인증서 파일 경로를 나타냅니다.

-k 114aab0e76bf0c78308f89efc4b8c9423e31568da0c340ca187a9b17aa9a4457_sk

이 옵션은 step 4에서 위치시킨 Admin@org1.example.com 사용자의 개인 키 파일 경로를 나타냅니다.

-r PeerAdmin -r ChannelAdmin

여기서 우리는 사용자의 역할을 지정합니다. 이 정보는 하이퍼레저 컴포저의 플레이그라운드에서 어떤 사용자가 어떤 작업을 수행할 수 있는지 알기 위해 필요합니다. Admin@org1.example.com이라는 사용자는 하이퍼레저 패브릭 네트워크의 관리자로 PeerAdmin (체인코드 설치 가능) 과 ChannelAdmin (체인코드 객체 생성가능) 역할을 가집니다.

 

 

Step Six: Importing the business network card for the Hyperldeger Fabric administrator

하이퍼레저 컴포저는 지갑에 있는 비즈니스 네트워크 카드만 사용할 수 있습니다. 지갑은 비즈니스 네트워크 카드들을 포함하고 있는 파일 시스템 내 디렉토리 입니다. 이 단계에서는 step 5에서 생성한 비즈니스 네트워크 카드를 지갑으로 import해서 다음 단계에서 이 비즈니스 네트워크 카드를 사용할 수 있도록 합니다.

 

composer card import 명령어를 실행해 비즈니스 네트워크 카드를 지갑으로 import 하세요.

composer card import -f PeerAdmin@fabric-network.card

composer card import 명령어에 사용한 옵션을 살펴봅시다.

-f PeerAdmin@fabric-network.card

이 옵션은 step 5에서 생성한 비즈니스 네트워크 카드 파일의 경로를 의미합니다.

 

이제 PeerAdmin@fabric-network라는 이름을 지정해 비즈니스 네트워크 카드를 사용할 수 있습니다. 이제 블록체인 비즈니스 네트워크를 하이퍼레저 패브릭 네트워크에 배포할 모든 준비가 끝났습니다.

 

우리는 developer tutorial에서 생성한 tutorial-network라는 블록체인 비즈니스 네트워크를 배포할 것입니다. 아직 비즈니스 네트워크 아카이프 파일(.bna)을 만들지 않았다면 step 1, 2, 3 및 developer tutorial을 통해 생성하세요.

 

 

 

Step Seven: Installing the Hyperledger Composer business network onto the Hyperledger Fabric peer nodes

이 단계에서, 블록체인 비즈니스 네트워크를 하이퍼레저 패브릭 피어 노드의 모든 조직에 설치할 것입니다. 하이퍼레저 패브릭 용어에서 이것을 체인코드 설치라고 부릅니다.

 

composer network install 커맨드를 사용해 하이퍼레저 컴포저 런타임을 step 3에서 생성한 connection profile 파일에 정의한 하이퍼레저 패브릭 피어 노드에 설치하세요.

composer network install -c PeerAdmin@fabric-network -a tutorial-network@0.0.1.bna

composer network install 명령어에 사용한 옵션을 살펴봅시다.

-c PeerAdmin@fabric-network

이 옵션은 step 6에서 import한 비즈니스 네트워크 카드의 이름을 의미합니다.

-a tutorial-network@0.0.1.bna

여기서 비즈니스 네트워크의 사본을 설치해야 합니다. 이 옵션은 우리가 배포할 tutorial-network@0.0.1.bna 블록체인 비즈니스 네트워크 파일의 이름을 의미합니다.

 

 

Step Eight: Starting the blockchain business network

이 단계에서는 블록체인 비즈니스 네트워크를 시작합니다. 하이퍼레저 패브릭 용어로 이를 체인코드 생성이라고 합니다.

 

composer network start 명령어를 통해 블록체인 비즈니스 네트워크를 시작하세요.

composer network start --networkName tutorial-network --networkVersion 0.0.1 -A admin -S adminpw -c PeerAdmin@fabric-network

composer network start 명령어에서 사용한 옵션을 살펴봅시다.

-c PeerAdmin@fabric-network

이 옵션은 step 6에서 지갑으로 import한 비즈니스 네트워크 카드의 이름을 의미합니다.

--networkName tutorial-network

이 옵션은 tutorial-network의 블록체인 비즈니스 네트워크 이름을 의미합니다.

--networkVersion 0.0.1

이 옵션은 tutorial-network라고 불리는 블록체인 비즈니스 네트워크의 버전을 의미하며, 이는 비즈니스 네트워크의 package.json 내 version 속성에 정의되어 있습니다.

-A admin

블록체인 비즈니스 네트워크가 배포될 때, 블록체 비즈니스 네트워크 관리자가 될 참가자를 적어도 한 명 이상 생성해야 합니다. 이 참가자는 다른 참가자를 블록체인 비즈니스 네트워크에 onboarding할 책임이 있습니다. 여기서는 admin이라는 단일 블록체인 비즈니스 네트워크 관리자를 만들고자 합니다.

-S adminpw

이 옵션은 블록체인 비즈니스 네트워크 관리자 admin이 adminpw 비밀번호를 사용해 CA에서 인증서 및 개인 키를 요청하도록 지정하는 옵션입니다. 이 옵션을 지정하면 비즈니스 네트워크 관리자에게 지정된 이름이 CA에 이미 등록된 사용자의 기존 등록 ID여야 합니다.

 

이제 블록체인 비즈니스 네트워크가 시작되었으므로 생성된 비즈니스 네트워크 카드 파일 admin@tutorial-network.card를 사용하여 상호작용할 수 있습니다.

 

 

 

Step Nine: Importing the business network card for the business network administrator

composer card import 커맨드를 실행해 비즈니스 네트워크 카드를 지갑으로 import 하세요.

composer card import -f admin@tutorial-network.card

이제 admin@tutorial-network라는 이름으로 비즈니스 네트워크 카드를 사용할 수 있습니다. 이제 실행중인 블록체인 비즈니스 네트워크와 상호작용할 모든 준비가 끝났습니다.

 

 

Step Ten: Testing the connection to the blockchain business network

composer network ping 명령어를 사용해 블록체인 비즈니스 네트워크를 테스트해보세요.

composer network ping -c admin@tutorial-network

테스트 결과가 성공적인지 확인하세요. 비즈니스 네트워크에는 NetworkAdmin이라는 단일 참가자 리스트가 존재할 것입니다.

테비토퍼 도도한 두부모래(오리지날) 8L

 

오늘은 우리 귀탱뽀짝이의 화장실을 책임지는

두부모래를 바꿔보았습니다.

 

기존 사용하던 제품이 안좋아서라기보다는

품절.......왜죠?_? 무슨일이 생긴건가요.

왜 어느 사이트에서도 사용하던 모래를

구매할 수 없는거죠ㅠ_ㅠ??

 

 

저희집 귀탱뽀짝이는

씽씽두부모래 오리지널 + 라벤더

섞어서 사용하고 있었습니다.

 

원래 오리지널만 사용하다가

라벤더도 사볼까 싶어서 샀는데

개인적으로는 라벤더 재구매 의사는 없습니다.

오리지널보다 입자가 무른 느낌이 나서요.

제가 배송받은 제품만 그런지

원래 그런건지는 모르겠지만(?)

오리지널에 비해 너무 물러서

가루가 많이 발생합니다ㅠㅠ

 

 

여튼 새 두부모래로 바꾸게 되었네요.

이번에 구매한 모래는 바로

도도한 두부모래(오리지널) 8L

입니다.

 

사이트마다 가격은 조금씩 차이가 있지만

8L x 6개 20,900원

에 구입했습니다.

 

새 두부모래 개봉

막 개봉했을 때 느껴지는 향은

전혀 나쁘거나 독하지 않구요.

콩비지 100%라서

혹시나 아이들이 먹더라도(?)

덜 위험하지 않을까 하는 생각에

구매했습니다.

 

 

우선 아이들이 싫어할까봐

기존 쓰던 모래와 조금 섞어주었어요.

입자 크기 비교사진 (씽씽 vs 도도한)

 

기존 씽씽두부모래와 입자굵기 및 크기는

다행히 큰 차이가 없습니다.

도도한 두부모래가 조금 더 굵어요.

 

이제 귀탱뽀짝님을 위해

잘 섞어주기만 하면(?)

새로운 두부에 관심을 보이는 귀탱뽀짝

읭ㅇ_ㅇ???? 아직 안섞었는데!!!!!

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

바스락바스락 소리가 나니 귀탱뽀짝이가

관심을 보입니다.

 

 

뭉침이라거나 냄새를 잡아주는건

조금 더 오랜 기간 사용해봐야 알겠지만

씽씽보다는 입자가 굵고 단단한 편이라

가루날림은 적은 편이구요.

다만 대변에는 잘 붙지 않습니다.

 

그래도 저는 씽씽이랑 도도한 중에

하나를 선택한다고 하면

도도한 두부모래를 선택할 것 같아요.

 

저는 거의 재택근무를 하기 때문에

아이들이 화장실가면 바로 치워주는 편이라

덜붙는거야 개인적으로는 큰 이슈가 아닙니다.

가루날림!!!!이 덜하다는게 더 중요해서요.

 

집사님들의 상황에 맞게

냥이님들이 거부하지만 않으면

잘 골라 사용하시면 될 듯해요.

 

 

 

+ Recent posts