【備忘録】HyperLedger Fabric の環境構築(途中まで)

https://hyperledger-fabric-ca.readthedocs.io/en/latest/operations_guide.html

備忘録として作成した為不完全です。
途中エラーが出てしまっているので、もし間違いやなにか気付いたことがございましたらコメントしていただけると幸いです。


このガイドでは、Fabric CA を使用して Fabric ネットワークを設定する方法について説明します。Hyperledger Fabric ブロックチェーン ネットワークに参加するすべての ID は承認される必要があります。この承認は、信頼できる機関によって検証される暗号化マテリアルの形式で提供されます。


最初に初期化(既にコンテナが経っている場合)
```bash
docker compose down
```

バイナリーデータをダウンロード
https://github.com/hyperledger/fabric-ca/releases
↓のファイルをダウンロードする(バージョンは適宜最新のものを使用)
`hyperledger-fabric-ca-linux-amd64-1.5.13.tar.gz`

ダウンロードしたバイナリーデータを解凍する
```bash 
tar -xvzf hyperledger-fabric-ca-linux-amd64-1.5.13.tar.gz
```

解凍すると bin/ディレクトリ配下に
`bin/fabric-ca-client`
`bin/fabric-ca-server`
のようなディレクトリが生成される

バイナリのパスを通す

```bash
export PATH=$PATH:<解凍したバイナリがあるbinへの絶対パス>
#例: `export PATH=$PATH:/home/my/go/src/github.com/my/fabric/bin`
```

パスが通ったか確認
```bash
which fabric-ca-client

#指定したパスがリターンされたら成功
#出力例: /home/my/go/src/github.com/my/fabric/bin/fabric-ca-client
```



ローンチ
```bash
docker compose up ca-tls

#logに以下のレスポンスがあればローンチ成功
#[INFO] Listening on https://0.0.0.0:7052
```





TLS CAの管理者を登録する
 * 署名証明書を取得する
```bash
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/tls-ca/crypto/tls-cert.pem
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/tls-ca/admin
fabric-ca-client enroll -d -u https://tls-ca-admin:tls-ca-adminpw@0.0.0.0:7052
fabric-ca-client register -d --id.name peer1-org1 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name orderer1-org0 --id.secret ordererPW --id.type orderer -u https://0.0.0.0:7052
```
org0をローンチ
新規ターミナルタブで実行(プロジェクトディレクトリに移動することを忘れずに)
```bash
docker-compose up rca-org0
```

```bash
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/ca/crypto/ca-cert.pem
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org0/ca/admin
fabric-ca-client enroll -d -u https://rca-org0-admin:rca-org0-adminpw@0.0.0.0:7053
fabric-ca-client register -d --id.name orderer1-org0 --id.secret ordererpw --id.type orderer -u https://0.0.0.0:7053
fabric-ca-client register -d --id.name admin-org0 --id.secret org0adminpw --id.type admin --id.attrs "hf.Registrar.Roles=client,hf.Registrar.Attributes=*,hf.Revoker=true,hf.GenCRL=true,admin=true:ecert,abac.init=true:ecert" -u https://0.0.0.0:7053
```

権限エラーが出る場合は所有者を変更する
```bash
sudo chown -R $(whoami):$(whoami) /tmp/hyperledger/
```

org1をローンチ
新規ターミナルタブで実行(プロジェクトディレクトリに移動することを忘れずに)
```bash
docker-compose up rca-org1
```
```bash
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/ca/crypto/ca-cert.pem
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org1/ca/admin
fabric-ca-client enroll -d -u https://rca-org1-admin:rca-org1-adminpw@0.0.0.0:7054
fabric-ca-client register -d --id.name peer1-org1 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7054
fabric-ca-client register -d --id.name admin-org1 --id.secret org1AdminPW --id.type admin -u https://0.0.0.0:7054
fabric-ca-client register -d --id.name user-org1 --id.secret org1UserPW --id.type user -u https://0.0.0.0:7054
```

権限エラーが出る場合は所有者を変更する
```bash
sudo chown -R $(whoami):$(whoami) /tmp/hyperledger/
```


```bash
mkdir -p /tmp/hyperledger/org1/peer1/assets/ca/
```

※パーミッションエラーが出る場合はsudo を使用して実行
```bash
cp /tmp/hyperledger/org1/ca/crypto/ca-cert.pem /tmp/hyperledger/org1/peer1/assets/ca/
```


```bash
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org1/peer1
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer1/assets/ca/ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp
fabric-ca-client enroll -d -u https://peer1-org1:peer1PW@0.0.0.0:7054
```


```bash
mkdir -p /tmp/hyperledger/org1/peer1/assets/tls-ca/
cp /tmp/hyperledger/tls-ca/crypto/tls-cert.pem /tmp/hyperledger/org1/peer1/assets/tls-ca/
```


```bash
export FABRIC_CA_CLIENT_MSPDIR=tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer1/assets/tls-ca/tls-cert.pem
fabric-ca-client enroll -d -u https://peer1-org1:peer1PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer1-org1
```

```bash
cd /tmp/hyperledger/org1/peer1/tls-msp/keystore/
```

生成された認証書ファイルの名前をkey.pem二変更
```bash
mv <生成された認証書のファイル名> key.pem

#例 : mv adffe58434945e0f62dc0019e5e8f82f42bd5edbfbe4cfdf46a160c634e3b6e4_sk key.pem
```

```bash
cd -
```

```bash
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org1/admin
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer1/assets/ca/ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp
fabric-ca-client enroll -d -u https://admin-org1:org1AdminPW@0.0.0.0:7054
```
```bash
mkdir /tmp/hyperledger/org1/peer1/msp/admincerts
cp /tmp/hyperledger/org1/admin/msp/signcerts/cert.pem /tmp/hyperledger/org1/peer1/msp/admincerts/org1-admin-cert.pem
```

peer1-org1をローンチ
新規ターミナルタブで実行(プロジェクトディレクトリに移動することを忘れずに)
```bash
docker-compose up peer1-org1
```

```bash
mkdir -p /tmp/hyperledger/org0/orderer/assets/ca/
cp /tmp/hyperledger/org0/ca/crypto/ca-cert.pem /tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem
```

```bash
 export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org0/orderer
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem
fabric-ca-client enroll -d -u https://orderer1-org0:ordererpw@0.0.0.0:7053
```

```bash
mkdir -p /tmp/hyperledger/org0/orderer/assets/tls-ca/
cp /tmp/hyperledger/tls-ca/crypto/tls-cert.pem /tmp/hyperledger/org0/orderer/assets/tls-ca/tls-ca-cert.pem
```


```bash
export FABRIC_CA_CLIENT_MSPDIR=tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/orderer/assets/tls-ca/tls-ca-cert.pem
fabric-ca-client enroll -d -u https://orderer1-org0:ordererPW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts orderer1-org0
```


```bash
cd /tmp/hyperledger/org0/orderer/tls-msp/keystore
```

```bash
mv adffe58434945e0f62dc0019e5e8f82f42bd5edbfbe4cfdf46a160c634e3b6e4_sk key.pem
```

```bash
cd -
```

```bash
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org1/admin
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer1/assets/ca/ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp
fabric-ca-client enroll -d -u https://admin-org1:org1AdminPW@0.0.0.0:7054
```


```bash
mkdir /tmp/hyperledger/org1/peer1/msp/admincerts
cp /tmp/hyperledger/org1/admin/msp/signcerts/cert.pem /tmp/hyperledger/org1/peer1/msp/admincerts/org1-admin-cert.pem
```

```bash
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org0/admin
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp
fabric-ca-client enroll -d -u https://admin-org0:org0adminpw@0.0.0.0:7053
```

```bash
mkdir /tmp/hyperledger/org0/orderer/msp/admincerts
cp /tmp/hyperledger/org0/admin/msp/signcerts/cert.pem /tmp/hyperledger/org0/orderer/msp/admincerts/orderer-admin-cert.pem
```

```bash
export FABRIC_CFG_PATH=/home/masakazumaruta/dev/tmp/
configtxgen -profile OrgsOrdererGenesis -outputBlock /tmp/hyperledger/org0/orderer/genesis.block -channelID syschannel
```


```bash
configtxgen -profile OrgsChannel -outputCreateChannelTx /tmp/hyperledger/org0/orderer/channel.tx -channelID mychannel
```


新規ターミナルタブで実行(プロジェクトディレクトリに移動することを忘れずに)
```bash
docker-compose up orderer1-org0
```

新規ターミナルタブで実行(プロジェクトディレクトリに移動することを忘れずに)
```bash
docker-compose up cli-org1
```
新規ターミナルタブで実行(プロジェクトディレクトリに移動することを忘れずに)
```bash
docker exec -it cli-org1 sh
```

```bash
cp /tmp/hyperledger/org0/orderer/channel.tx /tmp/hyperledger/org1/peer1/assets
```

org1のコンテナ内で実行(cli-org1を起動したターミナルに移動し、実行)
```bash
cd /tmp/hyperledger/org1/admin/msp
mkdir admincerts
 cp ./signcerts/cert.pem ./admincerts/

export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/admin/msp
peer channel create -c mychannel -f /tmp/hyperledger/org1/peer1/assets/channel.tx -o orderer1-org0:7050 --outputBlock /tmp/hyperledger/org1/peer1/assets/mychannel.block --tls --cafile /tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
```