Corda Enterprise Network Manager(CENM) 1.2を動かす

# Cordaを久しぶりに動かす
- V3の頃は結構一生懸命やっていましたが、EthereumやSubstrate、Plasmに目が行くようになってからは触らない期間が長かったです。
- Corda Certified Developerは取得済みです。
- LayerXさんのCordageの勉強会等に参加して、久しぶりにやろうと思い、やったことのないものをやろうと思いました。

# Corda Enterprise Network Managerを動かす
- これがどんなものかというと、簡単に言うとCorda Netowrkを自分で構築するための道具ひとセットがまとまっているものだと自分は認識しています。

# 何をやったか
- [LayerXさんの記事](https://scrapbox.io/layerx/Corda_Network%E6%A7%8B%E7%AF%89%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3)通りにやりましたが、記事はCENM1.1、私がやったのはCENM1.2でした。
- ほんの少しの違いがありました。あと、記事に書いてない部分だけをここでは補足させて下さい。
- 全体的にはLayerXさんの記事は非常に分かり易かったです。a lot of 感謝！

# 環境
- java 1.8 OracleJDK　★Oracle JDKっていうのは結構大事
- corda4.4
- CENM1.2

# 直面した問題　＆　解説補足
## identityManagerが立ち上がらない
- 記事通りにやっても立ち上がらない事態が発生。
- 結論は1.2になったことで、DBのマイグレーション方法が変わったようです。
- identity-manager.confに「runMigration = true」を追加しました。

```
address = "localhost:10000"

database {
    driverClassName = org.h2.Driver
    url = "jdbc:h2:file:./identity-manager-persistence;DB_CLOSE_ON_EXIT=FALSE;LOCK_TIMEOUT=10000;WRITE_DELAY=0;AUTO_SERVER_PORT=0"
    user = "example-db-user"
    password = "example-db-password"
    runMigration = true //★★★ここです。★★★
}

shell {
    sshdPort = 10002
    user = "testuser"
    password = "password"
}

localSigner {
    keyStore {
        file = corda-identity-manager-keys.jks
        password = "password"
    }
    keyAlias = "cordaidentitymanagerca"
    signInterval = 1000
    # This CRL parameter is not strictly needed. However if it is omitted then
    # revocation cannot be used in the future so it makes sense to leave it in.
    crlDistributionUrl = "http://"${address}"/certificate-revocation-list/doorman"
}

workflows {
    "issuance" {
        type = ISSUANCE
        updateInterval = 1000
        plugin {
            pluginClass = "com.r3.enmplugins.approveall.ApproveAll"
        }
    }
}
```

## NotaryをIdentity Managerに登録するに何度も挑戦
- LayerXさんの記事にも書いてありましたが、登録には結構時間がかかります。
- 動いていないのかと思い、中途半端な状態で止めてしまったのが原因で、リトライできなくなりました。
- そこで私がやったことは以下です。
  - 記事通りに、「additional-node-infos`、`certificates`、`network-parameters`ディレクトリ内にファイルがある場合は削除する」
  - NortaryとIdentity Managerの下に作成された .dbファイルを削除する。
- 正しい方法か自身はありませんが、私は上記でリトライ可能になりました。

## networkMapManagerを動かす時の追加ファイル
- 「pki-tool-1.2.0\trust-stores\network-root-truststore.jks」　と　「pki-tool-1.2.0\key-stores\corda-network-map-keys.jks」　を「networkmap-1.2.0」にコピーして下さい。

## 他のNodeの設定は
- 記事に従ってPartyAまではほぼコピぺでいけますが、Cordaに不慣れな方はひょっとして困るかもしれないのでメモします。
- 「samples\cordapp-example\workflows-java\build\nodes」の下に各ノードのnode.infoがあるので、それを参考にして、PartyB、PartyCを設定して下さい。
- 変更するのは、「myLegalName」、sshdの「port」、「p2pAddress」、rpcSettingsの「address」「adminAddress」で良いはずです。
- 参考にして書き換えるのは「myLegalName」であとは、重複しないようにカウントアップするなどして設定して下さい。

## 各ノードを起動してもflow listにあるはずのflowが表示されない
- 実行するとエラーは出ないのですが、コンソールに以下のように表示されてしまいます。

```
Loaded 0 CorDapp(s)
```
- Cordappがゼロ・・・
- flow listを打つと・・・

```
Wed Jun 03 21:27:47 JST 2020>>> flow list
net.corda.core.flows.ContractUpgradeFlow$Authorise
net.corda.core.flows.ContractUpgradeFlow$Deauthorise
net.corda.core.flows.ContractUpgradeFlow$Initiate
```
- 出てきて欲しいflowが出てきません・・・Why?
- コピーするものが足りませんでした。
- 各ノードのディレクトリを作成して、「corda.jar」「network-root-truststore.jks」「node.conf」を配置するところまでは、記事に書いてあります。
- あともう一つ。Cordappをコピーして下さい。
- 「samples\cordapp-example\workflows-java\build\nodes\PartyA\cordapps」の下にあるflowのjarを「parthA\cordapps」にコピーします。

## 関係あるかわかりませんが、以下の設定も入れています。
- 記事通りに何も考えずコピペしていくと「devMode=false」に設定してしまいます。
- flowが期待通りに出力されない原因を探している仮定で「devMode=true」に設定しましたが、必須かは調べていません。
- 参考までに私のnode.infoを貼っておきます。

```
devMode = true
devModeOptions.allowCompatibilityZone = true
myLegalName="O=PartyB,L=New York,C=US"
     
     networkServices {
       doormanURL="http://localhost:10000"
       networkMapURL="http://localhost:20000"
     }
     
     cordappSignerKeyFingerprintBlacklist = []
     
     sshd {
       port = 2224
     }
     
     p2pAddress="localhost:10006"
     
     rpcSettings {
         address="localhost:10007"
         adminAddress="localhost:10008"
     }
     
     security {
         authService {
             dataSource {
                 type=INMEMORY
                 users=[
                     {
                         password=test
                         permissions=[
                             ALL
                         ]
                         user=user1
                     }
                 ]
             }
         }
     }
```

## 無事動きました
```
Wed Jun 03 21:36:30 JST 2020>>> flow list
com.example.flow.ExampleFlow$Initiator
net.corda.core.flows.ContractUpgradeFlow$Authorise
net.corda.core.flows.ContractUpgradeFlow$Deauthorise
net.corda.core.flows.ContractUpgradeFlow$Initiate

Wed Jun 03 21:36:30 JST 2020>>> flow start ExampleFlow$Initiator iouValue: 30, otherParty: "O=PartyA,L=London,C=GB"
Starting
Generating transaction based on new IOU.
Verifying contract constraints.
Signing transaction with our private key.
Gathering the counterparty's signature.
Collecting signatures from counterparties.
Verifying collected signatures.
Obtaining notary signature and recording transaction.
Broadcasting transaction to participants
Done
Flow completed with result: SignedTransaction(id=2AF86F203C038A1117C2290B2F3BC6279DE9ABB0A8669DAF72B5D30205748071)

Wed Jun 03 21:37:15 JST 2020>>> run vaultQuery contractStateType: com.example.state.IOUState
states:
- state:
    data: !<com.example.state.IOUState>
      value: 30
      lender: "O=PartyB, L=New York, C=US"
      borrower: "O=PartyA, L=London, C=GB"
      linearId:
        externalId: null
        id: "72bef44c-7c89-4abc-85ef-121fda32113d"
    contract: "com.example.contract.IOUContract"
    notary: "O=Notary, L=London, C=GB"
    encumbrance: null
    constraint: !<net.corda.core.contracts.HashAttachmentConstraint>
      attachmentId: "602D711517904FB3628BB1D58FBBC6463A813C0AADB7D7DC8A1030135F0D1A35"
  ref:
    txhash: "2AF86F203C038A1117C2290B2F3BC6279DE9ABB0A8669DAF72B5D30205748071"
    index: 0
statesMetadata:
- ref:
    txhash: "2AF86F203C038A1117C2290B2F3BC6279DE9ABB0A8669DAF72B5D30205748071"
    index: 0
  contractStateClassName: "com.example.state.IOUState"
  recordedTime: "2020-06-03T12:37:14.293Z"
  consumedTime: null
  status: "UNCONSUMED"
  notary: "O=Notary, L=London, C=GB"
  lockId: null
  lockUpdateTime: null
  relevancyStatus: "RELEVANT"
  constraintInfo:
    constraint:
      attachmentId: "602D711517904FB3628BB1D58FBBC6463A813C0AADB7D7DC8A1030135F0D1A35"
totalStatesAvailable: -1
stateTypes: "UNCONSUMED"
otherResults: []
```

# 明日はPlasmをやって明後日は・・・
- これからもパブリックチェーンを中心にブロックチェーン技術を触っていこうと思います。