Catapultを利用してSymbolのコピーチェーンを作る
SymbolのブロックチェーンはXYMを買わないと利用できないと思えてしまいますが,Symbolの土台であるCatapultはOSSであり,誰でも自由に利用が可能です.
チェーンの構築にはこの記事に記載するような操作や定期的な維持管理が必要になりますが,次のようなメリットがあります.
- 手数料などのネットワーク設定が自由に操作できる
- コンソーシアムチェーンが作成できる
- PluginTransactionを実装できる
これらにより,柔軟で使いやすいブロックチェーンのネットワークの構築が可能になります.また,PluginTransactionの実装によってSymbolでは実現できなかったような操作を実現させることができます.
この記事ではCatapultをマニュアルビルドし,Symbolのコピーチェーンを作成する方法を紹介します.
作成までの流れ
大まかな流れは次のようになります.
- catapultのclientをビルドする
- ネットワークの設定を行う
- NemesisBlockを生成する
- 証明書を作成する
- 通信に必要な鍵関係などの設定をする
- 起動確認を行う
- Restを追加しDual化する
- ネットワークを拡張する
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はネットワーク生成後のトランザクションには参加することはできなります.ここで使用したアカウントは以降使用しないようにしましょう
[nemesis]
networkIdentifier = testnet
nemesisGenerationHashSeed = 57F7DA205008026C776CB6AED843393F04CD458E0AA2D9F1D5F31A402072B2D6
nemesisSignerPrivateKey = ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
[cpp],[output]は次のように生成します
[cpp]
cppFileHeader =
[output]
cppFile =
binDirectory = ../seed
[mosaics],[distribution]の項目を編集します.ここではNemesisBlockで初期配布するモザイク(トークン)の設定します.
モザイクの供給量などを設定したら配布アドレスに先ほど生成したアドレスを入力していきましょう.
[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]は次のように設定しておきます
[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を混ぜ合わせたものになっています.
[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]
インフレ設定は次のようにしています
[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
を開いてください.
[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を設定します.
[localnode]
host = 154.12.242.37
friendlyName = build
version = 1.0.3.3
roles = Peer,Api,Voting
config-user.properties
ディレクトリを設定します
[storage]
seedDirectory = ../seed
certificateDirectory = ../cert
dataDirectory = ../data
pluginsDirectory = ../lib
votingKeysDirectory = ../votingkeys
config-database.properties
mongodbをrest構築の際に立ち上げるので設定しておきます
[database]
databaseUri = mongodb://127.0.0.1:27017
databaseName = catapult
maxWriterThreads = 8
maxDropBatchSize = 10
writeTimeout = 10m
peers-p2p.json
ノードの通信先の設定を行います.テンプレートからコピーした状態の場合,あらかじめ127.0.0.1向けの設定が書かれていると思います.この公開鍵の部分を先ほど設定したノードのメインアカウントの公開鍵に変更してください.
{
"_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
に移動し,ノードの設定を行います
...
"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
にノードを追記し通信できる状態にしてあげます.
{
"_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を追加したノードの記事についてはまた後日かきます