11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

nemAdvent Calendar 2021

Day 12

CatapultでSymbolのコピーチェーンを構築する

Posted at

Catapultを利用してSymbolのコピーチェーンを作る

SymbolのブロックチェーンはXYMを買わないと利用できないと思えてしまいますが,Symbolの土台であるCatapultはOSSであり,誰でも自由に利用が可能です.
チェーンの構築にはこの記事に記載するような操作や定期的な維持管理が必要になりますが,次のようなメリットがあります.

  • 手数料などのネットワーク設定が自由に操作できる
  • コンソーシアムチェーンが作成できる
  • PluginTransactionを実装できる

これらにより,柔軟で使いやすいブロックチェーンのネットワークの構築が可能になります.また,PluginTransactionの実装によってSymbolでは実現できなかったような操作を実現させることができます.

この記事ではCatapultをマニュアルビルドし,Symbolのコピーチェーンを作成する方法を紹介します.

作成までの流れ

大まかな流れは次のようになります.

  1. catapultのclientをビルドする
  2. ネットワークの設定を行う
  3. NemesisBlockを生成する
  4. 証明書を作成する
  5. 通信に必要な鍵関係などの設定をする
  6. 起動確認を行う
  7. Restを追加しDual化する
  8. ネットワークを拡張する

1. catapultのclientをビルドする

まず,catapultをマニュアルビルドします.PluginTransaactionを実装する場合はPluginTransacationを実装したソースをビルドする必要があります.マニュアルでのビルドは依存や設定の関係でうまくいかないことがよくあります.
レポジトリの変更等も起きる場合がありますので上手くいかない場合は公式Discord等で質問してみてください.

ビルド方法については先駆者様の記事が非常に詳しいため,以下の記事を参考に実施してみてください.

また,PluginTransactionを実装した場合はPluginTransactionを実装したCatapultをビルドしてください.

私の記事にはなりますが,マニュアルビルドが中々上手くいかない場合は以下に記載しているConanでのビルドも試してみてください.

この他にもDockerビルドがあるようなのですが,私では力不足でビルドすることができませんでした.もし可能な方がいれば試してみてほしいです.bootstrapではdockerが使用されているので何らかの設定の調整を行えば上手くいくとおもいます.

2. ネットワークの設定を行う

基本的にはこちらのマニュアルに従って設定を行います.
設定には秘密鍵を使用します.セキュアに行いたい場合はこれらの操作を安全な環境で行い,設定ファイルのみをサーバに転送するようにしてください.

前準備

まず,元となるテンプレート類をコピーします.

cd ~/symbol/client/catapult/_build
cp ../tools/nemgen/resources/testnet.properties resources/
cp ../resources/* resources/

アカウントを生成します.秘密鍵がサーバーに生成されますので取り扱いには十分に気をつけてください.

./bin/catapult.tools.addressgen --count 10 --network testnet --output nemesis.addresses.txt --suppressConsole

countの値を変更することで生成するアカウント数のカスタマイズが可能です

NemesisBlockのTxや設定を保存するフォルダを作成しておきます

mkdir -p seed/00000
mkdir txes
mkdir votingkeys

testnet.porpertiesの設定

先ほどコピーしたtestnet.propertiesを設定していきます.まず,GenarationHash,NemesisSignerを設定していきます
nemesisGenerationHashには適当なSHA3-256のハッシュを指定してください.

generationHashを他のネットワークと同じにした場合,設定によっては他のネットワークからのトランザクションを流用して他のチェーン上で実行したトランザクションをこのチェーンでアナウンスされる可能性があります.逆も然りです.
generationHashはトランザクションの署名の際に使用する重要な要素なので,必ず変更するようにしましょう.

NemesisSignerには先ほど生成したアカウントから一つ選んで設定します.

NemesisSignerはネットワーク生成後のトランザクションには参加することはできなります.ここで使用したアカウントは以降使用しないようにしましょう

resources/testnet.properties
[nemesis]

networkIdentifier = testnet
nemesisGenerationHashSeed = 57F7DA205008026C776CB6AED843393F04CD458E0AA2D9F1D5F31A402072B2D6
nemesisSignerPrivateKey = ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

[cpp],[output]は次のように生成します

testnet.properties
[cpp]

cppFileHeader =

[output]

cppFile =
binDirectory = ../seed

[mosaics],[distribution]の項目を編集します.ここではNemesisBlockで初期配布するモザイク(トークン)の設定します.
モザイクの供給量などを設定したら配布アドレスに先ほど生成したアドレスを入力していきましょう.

testnet.properties
[mosaics]

cat:currency = true
cat:harvest = true

[mosaic>cat:currency]

divisibility = 6
duration = 0
supply = 8'999'999'998'000'000
isTransferable = true
isSupplyMutable = false
isRestrictable = false

[distribution>cat:currency]

TAIBNNG7QJXY54Z334HOKA36NTH7FRRCKFRM4XY = 409'090'909'000'000
...

入力後,必ず1つはハーベスト権を持っているアドレスの秘密鍵があることを確認してください.ハーベストの権利を持たないままチェーンを立ち上げた場合,永遠にブロックが進行できなくなります.

[transaction]は次のように設定しておきます

testnet.properties
[transactions]
transactionsDirectory = ../txes

今回私は次のように設定しています.testnet.propertiesのデフォルト設定に倣い,cat.currencyとcat.harvestの2つに分離しています.
Symbolのネットワークではネットワーク通貨(トランザクション手数料通貨)とハーベスト通貨(ブロック生成権通貨)が一緒のモザイクになっていますが,どうやら分離できるようです.またハーベスト通貨に転送不可属性を付与したりすることもできそうです.チェーンのブロック生成権を奪われては困るようなチェーンの構築には良いかもしれません.

[nemesis]

networkIdentifier = testnet
nemesisGenerationHashSeed = 18EE24150DCB1D96752A4D6DD0F20DFD8BA8C38527E40AA8509B7ADECF78F9C6
nemesisSignerPrivateKey = ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

[cpp]

cppFileHeader =

[output]

cppFile =
binDirectory = ../seed

[namespaces]

cat = true
cat.currency = true
cat.harvest = true

[namespace>cat]

duration = 0

[mosaics]

cat:currency = true
cat:harvest = true

[mosaic>cat:currency]

divisibility = 6
duration = 0
supply = 8'999'999'998'000'000
isTransferable = true
isSupplyMutable = false
isRestrictable = false
[distribution>cat:currency]

TAHREWBLYOFBF726OKNHL2UISGJSS2GVS653QGA = 409'090'909'000'000
TBYVWMNRNBS2IDMFEKTQPSEECXADKRXBM4UXD5Y = 409'090'909'000'000
TAAA4RUOJ2RBEKWYOZHSMZWTDGHMCRDUCOMCD2Y = 409'090'909'000'000
TAAA6NI72BJ4FEE24JNVTSQRZHXGZCZCJ5LEYLQ = 409'090'909'000'000
TAAA7O53WQULXNOK2GTP7QURX7RKPRDNF4TP4NI = 409'090'909'000'000
TAAAC7XL2E6XC2NCSXI4C6MG7HWZGE47WFLXNPI = 409'090'909'000'000
TAAADPWJ27OZVPSPMWCX5QQWWC47IF6KUFMXQEI = 409'090'909'000'000
TAAAEBW5QTJAYLWOYUZDJO7BJIZCIFRP3FABGFQ = 409'090'909'000'000
TAAAFAXT2EHGLAOXOR6I3JXR27ED7Q3LEERIDOQ = 409'090'909'000'000
TAAAG6WJ6IHREIOJN4U5H6GV5HAQLWU7SOXKGHY = 409'090'909'000'000
TAAAHTKTAW4NLGLXU7U2ZWP5LWQ4Y7DGYU2YUHI = 409'090'909'000'000

TA4J7PBCWSFKX6XKUVHDU5PAGVYEQKPWUBO7G2Y = 409'090'909'000'000
TAHYX6QWV6BJTV2KUP7QLV2ZRMNMQRNFG44HKCQ = 409'090'909'000'000
TAJIXZWUCO6SL3V53M5L75GEEIMRTMC72NTBK3Q = 409'090'909'000'000
TAT3FUMUQEELVP6ZY3Q3XWS2QDOHCNCT2RCRMBI = 409'090'909'000'000
TAYCXWWIKKBDFNBXWJY6GEVQYJQFXIDCRHVGTDA = 409'090'909'000'000
TBBHJU5NIM2GVU6NT5RBRNO2THDSXFOFVSR4MZA = 409'090'909'000'000
TBGJOTW52KHPKEJ7UBQAD4VWUYIQ3UUBXTXDXYI = 409'090'909'000'000
TCBYBEWJ5DFTMJX6PA7IIR4IE3WNUZQHENCUTJA = 409'090'909'000'000
TDBOQFDD2Q42EKTYBQNJQRLOLM5SSNNDKN7H65A = 409'090'909'000'000
TDCKUFTTHEN4XUQ5ED6USM67IUABCGQJTKK5EBY = 409'090'909'000'000
TDDMRZAM2GOHUHAXMW5KQPAZX2KCHMPRL4TUV5Y = 409'090'909'000'000

[mosaic>cat:harvest]

divisibility = 3
duration = 0
supply = 17'000'000
isTransferable = true
isSupplyMutable = true
isRestrictable = false

[distribution>cat:harvest]

TAHREWBLYOFBF726OKNHL2UISGJSS2GVS653QGA = 1'000'000
TBYVWMNRNBS2IDMFEKTQPSEECXADKRXBM4UXD5Y = 1'000'000
TAAA4RUOJ2RBEKWYOZHSMZWTDGHMCRDUCOMCD2Y = 1'000'000
TAAA6NI72BJ4FEE24JNVTSQRZHXGZCZCJ5LEYLQ = 1'000'000
TAAA7O53WQULXNOK2GTP7QURX7RKPRDNF4TP4NI = 4'000'000
TAAAC7XL2E6XC2NCSXI4C6MG7HWZGE47WFLXNPI = 1'000'000
TAAADPWJ27OZVPSPMWCX5QQWWC47IF6KUFMXQEI = 1'000'000
TAAAEBW5QTJAYLWOYUZDJO7BJIZCIFRP3FABGFQ = 1'000'000
TAAAFAXT2EHGLAOXOR6I3JXR27ED7Q3LEERIDOQ = 1'000'000
TAAAG6WJ6IHREIOJN4U5H6GV5HAQLWU7SOXKGHY = 1'000'000
TAAAHTKTAW4NLGLXU7U2ZWP5LWQ4Y7DGYU2YUHI = 4'000'000

# additional transactions are appended after generated transactions
# transactions will be sorted based on file names

[transactions]

transactionsDirectory = ../txes

config-network.propertiesの設定

まず,以下の設定を無効にしてください

enableVerifiableState = false
enableVerifiableReceipts = false

その後,先ほどのtestnet.propertiesを元にnetowrk.propertiesの設定を行います.供給量などの数値が各項目が一致するように調整してください.このネットワークの設定などのconfigは設定を間違えたり,おかしな値があるとcatapultを起動した際にエラーが発生したり,brokerが立ち上がらなかったりします.最初はテストネットやbootstarpのプライベートネットワークのconfigを参考にしながら設定すると良いと思います.私は1からやろうとして苦戦しました,,,

元のドキュメントでは次の項目が重要とかかれているので特にチェックするようにしましょう

  • initialCurrencyAtomicUnits: cat.currencyの初期供給量
  • totalChainImportance:
    • ネットワークの総インポータンス量
    • 10で割れる数量にする
    • 500モザイクを初期に配布する場合は500,50,5のようになる
  • identifier: ネットワーク識別子,mainnet,testnet,もしくはbyteが利用できる
  • nemesisSignerPublicKey: testnet.propertiesで設定したnemesisSignerの公開鍵
  • generationHashSeed: testnet.propertiesで設定したものと同じもの
  • harvestNetworkFeeSinkAddress: ネットワーク手数料を入れたいアドレス
  • mosaicRentalFeeSinkAddress: モザイクレンタル手数料を入れたいアドレス
  • namespaceRentalFeeSinkAddress: ネームスペース手数料を入れたいアドレス

また,別途ワーク通貨の供給量はconfig-inflation.propertiesのインフレ量と初期供給量を合算して合うことを確認してください.誤っていると起動しません.
私は次のように設定しました.bootstrapのプライベートネットワークとtestnetを混ぜ合わせたものになっています.

config-network.properties
[network]

identifier = testnet
nemesisSignerPublicKey = 2A13DB18EAA636396B299068EB8669F11EEED01C95D4B99027E3F32FF5699897
nodeEqualityStrategy = host
generationHashSeed = 18EE24150DCB1D96752A4D6DD0F20DFD8BA8C38527E40AA8509B7ADECF78F9C6
epochAdjustment = 1637848847s

[chain]

enableVerifiableState = false
enableVerifiableReceipts = false

currencyMosaicId = 0x38E1C1C590120CB6
harvestingMosaicId = 0x1027226F95170CD8

blockGenerationTargetTime = 30s
blockTimeSmoothingFactor = 3000

importanceGrouping = 39
importanceActivityPercentage = 5
maxRollbackBlocks = 0
maxDifficultyBlocks = 60
defaultDynamicFeeMultiplier = 100

maxTransactionLifetime = 6h
maxBlockFutureTime = 300ms

initialCurrencyAtomicUnits = 8'999'999'998'000'000
maxMosaicAtomicUnits = 9'000'000'000'000'000

totalChainImportance = 17'000'000
minHarvesterBalance = 500
maxHarvesterBalance = 4'000'000
minVoterBalance = 50'000

# assuming finalization ~20 minutes
votingSetGrouping = 78
maxVotingKeysPerAccount = 3
minVotingKeyLifetime = 72
maxVotingKeyLifetime = 26280

harvestBeneficiaryPercentage = 25
harvestNetworkPercentage = 5

harvestNetworkFeeSinkAddressV1 = TBR3XLCYWLI4AC5CRMBMHOLFROA3WC2IXQGKGTI
harvestNetworkFeeSinkAddress = TBR3XLCYWLI4AC5CRMBMHOLFROA3WC2IXQGKGTI

maxTransactionsPerBlock = 6'000

[plugin:catapult.plugins.accountlink]

dummy = to trigger plugin load

[plugin:catapult.plugins.aggregate]

maxTransactionsPerAggregate = 100
maxCosignaturesPerAggregate = 25

# multisig plugin is expected to do more advanced cosignature checks
enableStrictCosignatureCheck = false
enableBondedAggregateSupport = true

maxBondedTransactionLifetime = 48h

[plugin:catapult.plugins.lockhash]

lockedFundsPerAggregate = 10'000'000
maxHashLockDuration = 2d

[plugin:catapult.plugins.locksecret]

maxSecretLockDuration = 365d
minProofSize = 0
maxProofSize = 1024

[plugin:catapult.plugins.metadata]

maxValueSize = 1024

[plugin:catapult.plugins.mosaic]

maxMosaicsPerAccount = 1'000
maxMosaicDuration = 3650d
maxMosaicDivisibility = 6

mosaicRentalFeeSinkAddressV1 = TDFYDFR4V6U3NOU7RELXNVXE2UJDKWNEYSU2ODQ
mosaicRentalFeeSinkAddress = TDFYDFR4V6U3NOU7RELXNVXE2UJDKWNEYSU2ODQ
mosaicRentalFee = 500000

[plugin:catapult.plugins.multisig]

maxMultisigDepth = 3
maxCosignatoriesPerAccount = 25
maxCosignedAccountsPerAccount = 25

[plugin:catapult.plugins.namespace]

maxNameSize = 64
maxChildNamespaces = 100
maxNamespaceDepth = 3

# *approximate* days based on blockGenerationTargetTime
minNamespaceDuration = 30d
maxNamespaceDuration = 1825d
namespaceGracePeriodDuration = 1d
reservedRootNamespaceNames = symbol, symbl, xym, xem, nem, user, account, org, com, biz, net, edu, mil, gov, info

namespaceRentalFeeSinkAddressV1 = TANQYMTLDSIQYXDV37IXJBK5HNDCRTIMJDKCKJQ
namespaceRentalFeeSinkAddress = TANQYMTLDSIQYXDV37IXJBK5HNDCRTIMJDKCKJQ
rootNamespaceRentalFeePerBlock = 2
childNamespaceRentalFee = 100000

[plugin:catapult.plugins.restrictionaccount]

maxAccountRestrictionValues = 100

[plugin:catapult.plugins.restrictionmosaic]

maxMosaicRestrictionValues = 20

[plugin:catapult.plugins.transfer]

maxMessageSize = 1024

[fork_heights]

totalVotingBalanceCalculationFix = 0
treasuryReissuance = 0

[treasury_reissuance_transaction_signatures]

インフレ設定は次のようにしています

config-inflation.properties
[inflation]

starting-at-height-1 = 100
starting-at-height-10000 = 0

3. NemesisBlockを生成する

VRFの設定

testnet.propertiesでハーベストモザイクを配布したアドレスの中からハーベスト資格を満たしているアドレスを一つ選んでください.以降このアカウントをメインアカウントと呼称します.また,モザイクを配布しないアカウントを一つ選んでください.VRFキーリンクのために使用します.
その後binディレクトリでVRFキーをnemesisBlockに追加します

cd bin
./catapult.tools.linker --resources ../ --type vrf --secret <HARVESTER_PRIVATE_KEY> --linkedPublicKey <VRF_PUBLIC_KEY> --output ../txes/vrf_tx0.bin

<HARVESTER_PRIVATE_KEY> :メインアカウントの秘密鍵
<VRF_PUBLIC_KEY> :VRFアカウントの公開鍵

Votingの設定

次のコマンドを実行し,Votingキーを生成します.

./catapult.tools.votingkey --output ../votingkeys/private_key_tree1.dat

生成後,Votingキーの公開鍵が表示されます.これをリンクするTXを作成します.

./catapult.tools.linker --resources ../ --type voting --secret <VOTER_PRIVATE_KEY> --linkedPublicKey <VOTING_PUBLIC_KEY> --output ../txes/voting_tx0.bin

<VOTER_PRIVATE_KEY> : メインアカウントの秘密鍵
<VOTING_PUBLIC_KEY> : 表示されたVotingキーの公開鍵

モザイクidの生成

nemesis block generatorを実行します

./catapult.tools.nemgen --nemesisProperties ../resources/testnet.properties

するとエラーが発生すると思います.(しないこともあります)出力された結果から次の項目に着目します

Mosaic Summary
 - cat:currency (621EC5B403856FC2)
...
 - cat:harvest (4291ED23000A037A)

これらのモザイクidをconfig-network.propertiesに書き込みます

[chain]

currencyMosaicId = 0x621EC5B403856FC2
harvestingMosaicId = 0x4291ED23000A037A

設定後,もう一度nemesis block generatorを実行します.今度はうまくいくはずです

./catapult.tools.nemgen --nemesisProperties ../resources/testnet.properties

Nemesis blockの生成が完了しました.

nemesis block generatorがfile not foundで動かない場合

ビルドの際に設定するパス内にファイルがないのが原因の場合があります.この場合,パスにファイルを追加することで稼働します.例えば_build内のlibにファイルが存在する場合はlibのファイル類をパスのディレクトリにコピーすると動くようになります

cp lib/* deps

4. 証明書を作成する

ノードの証明書を作成します.この証明書の作成にはメインアカウントの秘密鍵を使用する仕組みになっており,ノードの証明書自体がメインアカウントを所有している署名にもなるようです.

configuratorをインストールする

証明書作製のため,configuratorのレポジトリをクローンします.その後,必要なものをインストールします.

git clone https://github.com/symbol/bazinga.git
cd bazinga
apt-get install python3 python3-pip openssl
python3 -m pip install -r requirements.txt

ca.key.pemを作成します.次のコマンドを入力し,案内に従ってメインアカウントの秘密鍵を入力してください

python3 pemtool.py --output ca.key.pem

証明書を生成します.実行後,certディレクトリが生成されるので_buildにコピーします

python3 certtool.py
cp -r cert ../

証明書の作成が完了しました.

5. 通信に必要な鍵関係などの設定をする

ノードの証明書やVRFなどの設定を行ってきましたが,これらのカギに関する設定を行う必要があります.

一応変更した部分は全部書いたつもりなのですが記載漏れがあるかもしれません,動かない場合はエラーやログから推察して設定を適宜変更してください.

config-harvesting.properties

resourcesに移動しconfig-harvesting.propertiesを開いてください.

config-harvesting.properties
[harvesting]
harvesterSigningPrivateKey = <HARVESTER_SIGNING_PRIVATE_KEY>
harvesterVrfPrivateKey = <HARVESTER_VRF_PRIVATE_KEY>
enableAutoHarvesting = true
...

<HARVESTER_SIGNING_PRIVATE_KEY>:メインアカウントの秘密鍵
<HARVESTER_VRF_PRIVATE_KEY> : VRFアカウントの秘密鍵

config-node.properties

IPやVersion,rolesを設定します.

config-node.properties
[localnode]

host = 154.12.242.37
friendlyName = build
version = 1.0.3.3
roles = Peer,Api,Voting

config-user.properties

ディレクトリを設定します

config-user.properties
[storage]

seedDirectory = ../seed
certificateDirectory = ../cert
dataDirectory = ../data
pluginsDirectory = ../lib
votingKeysDirectory = ../votingkeys

config-database.properties

mongodbをrest構築の際に立ち上げるので設定しておきます

config-database.properties
[database]

databaseUri = mongodb://127.0.0.1:27017
databaseName = catapult
maxWriterThreads = 8
maxDropBatchSize = 10
writeTimeout = 10m

peers-p2p.json

ノードの通信先の設定を行います.テンプレートからコピーした状態の場合,あらかじめ127.0.0.1向けの設定が書かれていると思います.この公開鍵の部分を先ほど設定したノードのメインアカウントの公開鍵に変更してください.

peers-p2p.json
{
  "_info": "this file contains a list of all trusted peers and can be shared",
  "knownPeers": [
    {
      "publicKey": "9600533E5AAD89EAB0091356F051E64467D75DC889DB11E05CCBA8D32B3FC947",
      "endpoint": {
        "host": "127.0.0.1",
        "port": 7900
      },
      "metadata": {
        "name": "peernode",
        "roles": "Peer,Api,Voting"
      }
    }
  ]
}

6. 起動確認を行う

binディレクトリで次のコマンドを実行し,catapultを起動します.起動すれば成功です.エラーが出た場合はエラー内容に従って修正を行ってください.

./catapult.server

ctrl+cで停止です.通常はnohup ./catapult.server &のようにしてログアウトしても起動し続けるようにすれば良いと思います.

7. Restを追加しDual化する

mongodbをインストールします.

curl -fsSL https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
sudo apt update
sudo apt install mongodb-org
sudo systemctl enable mongod
sudo systemctl start mongod

mongodbのフォルダを作成し,起動します

mkdir dbfiles
mkdir log
mongod --dbpath=dbfiles --wiredTigerCacheSizeGB 2 --bind_ip 127.0.0.1 --logpath=log/mongo.log --fork
mongo 127.0.0.1/catapult < ../scripts/mongo/mongoDbPrepare.js

binでbrokerを起動します

./catapult.broker ..

Restゲートウェイを立ち上げます.symbol/client/restに移動してください.その後,パッケージをインストールします

npm i

また,resourcesに移動し,ノードの設定を行います

rest.json
...
  "port": 3000,
  "protocol": "HTTP",
...
  "apiNode": {
    "host": "127.0.0.1",
    "port": 7900,
    "timeout": 1000,
    "tlsClientCertificatePath": "/home/user/symbol/client/catapult/_build/cert/node.crt.pem",
    "tlsClientKeyPath": "/home/user/symbol/client/catapult/_build/cert/node.key.pem",
    "tlsCaCertificatePath": "/home/user/symbol/client/catapult/_build/cert/ca.crt.pem",
    "networkPropertyFilePath": "/home/user/symbol/client/catapult/_build/resources/config-network.properties",
    "nodePropertyFilePath": "/home/user/symbol/client/catapult/_build/resource/config-node.properties"
  },
...

restを起動しましょう.デーモン化する場合はforeverやpm2を使うと良いと思います

node src/index.js resources/rest.json

8. ネットワークを拡張する

ビルド,証明書の作成まで実施しネットワークを拡張します.seed,resourcesを元のノードからコピーしてきてください.
また,ネットワークの設定をしても勝手に同期はしてくれないのでpeers-p2p.jsonにノードを追記し通信できる状態にしてあげます.

peers-p2p.json
{
  "_info": "this file contains a list of all trusted peers and can be shared",
  "knownPeers": [
    {
      "publicKey": "9600533E5AAD89EAB0091356F051E64467D75DC889DB11E05CCBA8D32B3FC947",
      "endpoint": {
        "host": "127.0.0.1",
        "port": 7900
      },
      "metadata": {
        "name": "peernode",
        "roles": "Peer,Api,Voting"
      }
    },
    {
      "publicKey": "F7C3A5EFCC7B519D1C74A05ACAB48C7A2B9AE4F7185E39F53773902EF9BC443E",
      "endpoint": {
        "host": "hogehoge.com",
        "port": 7900
      },
      "metadata": {
        "name": "peernode",
        "roles": "Peer"
      }
    }
  ]
}

はまったところ

nemesisBlock関連

nemesisBlockがライブラリのエラーで生成できない

ビルドの際に実行したexport=にエラー内容のファイルが含まれているか確認してください.ない場合はファイルを探し(私の場合は/libにありました)コピーするなどしてディレクトリに追加してください.

catapult関連

NemesisBlockが生成できない

エラー原因が多岐にわたるので何とも言えないのですが,基本的にconfigが原因なので出力されるログとの戦いになります.
Votingの期間の設定やインフレと供給量の設定値など,出力されるログを見ながら修正してみてください

ブロック高が進行しない

ネットワークに有効なハーベスタが存在しない場合,ブロック高は進行しません.catapult.serverのログを確認し,ノードのメインアカウントがリジェクトされていないか確認してみてください.されている場合はconfig-harvesting.propertiesの鍵をハーベスト資格を持つ鍵と一度もトランザクションが発生していないVRF鍵に修正してください.

他のノードと通信できない

peers-p2p.jsonにて適切なIP,公開鍵が両方に設定されているか確認してみてください.また,ノードの証明書をメインアカウントから生成していることを確認してください.ファイヤーウォールも確認してみましょう.
少し特殊な事情になりますが,私はcontaboのサーバーを2基同じリージョンでレンタルしたところ,ルーティングの問題で通信できない問題が発生しました(リージョンが違う場合はOKでした)調べたところ,静的ルートを追加することで通信できるようになるようなのですが,面倒な場合はリージョンを変えたり,別の会社からサーバを借りたりするのが良いと思います.

broker,mongodb関連

brokerが落ちてしまう

brokerが動かない原因は私の場合次のようなものがありました.

  • data内にbroker.lockファイルが残っている
    =>削除する
  • mongodbが正常に稼働していない
    =>mongodbがエラーで立ち上がらないを参照
  • resoucesのconfigの設定が不適切なためcatapultから情報を取得できない
    =>設定の見直し,data,seed,votingkeys,dbfilesを削除してやり直す
  • mongodbのインデックスを貼り忘れてパフォーマンスが悪くなっている
    => インデックスをはる

設定を誤っているとbrokerは落ちてしまうので気をつけてください

mongodbがエラーで立ち上がらない

私は次のような記事を参考にし,解決しました.参考にしてみてください.

Rest関連

Restが立ち上がらない

エラーを確認し,resources/rest.jsonが読み込まれているか確認してください.読み込まれていない場合はrest起動の際に第二引数にrest.jsonの配置場所を指定します.restが読み込まれているのに起動しない場合はconfigの読み込むファイルが適切に指定できているか確認してみてください.

ノードが正常に稼働しているのに/node/healthでdbがdownを返す

こちらは色々試してみたのですがよくわかりませんでした(discordではバグとの回答をいただきました)./node/healthあくまでもRestがdownと判定しているだけなのでcatapultが実際に落ちているとは限らないようです./chain/infoでチェーン高が正常に増加していることや,catapult.serverのログを確認し,正常に増加していれば問題はありません.binのcatapult.tools.healthcheckも実施してみてください

その他

bootstrapでプライベートチェーンを立てる方法の記事も先駆者様の記事がありますのでこちらもご覧になってください.

感想

こんなに面倒な環境構築をコマンド数行でできるSymbol-bootstrapやDockerは凄いというのが,作業を終えての感想です.将来的にはbootstrapでこれらの設定も行えたらなと思います.
PluiginTransactionを追加したノードの記事についてはまた後日かきます

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?