تست رافت هایپرلجر فابریک (Hyperledger Fabric)

ژوئیه 17, 2024 52 mins read

در این مقاله مطالبی در زمینه تست رافت هایپرلجر فابریک را مطرح خواهیم کرد. Fabric 1.4.1 ، به جای کافکا و سولو، از اجماع جدیدی به نام Raft پشتیبانی می کند. این مقاله کوتاه برای “تست” Raft in Fabric’s Build-Your-First-Network است.

تنظیم محیط

ما از Fabric’s Build-Your-First-Network استفاده می کنیم که شامل:

  • 2 سازمان
  • 5 سفارش دهنده
  • 2 همتا در هر سازمان، با CouchDB
  • یک رابط خط فرمان برای کنترل همتایان و سفارش دهندگان
  • یک کانال (mychannel)
  • یک کد زنجیره ای ساده توسط Fabric

اول از همه، پیش نیازها را با دستورالعمل زیر آماده کنید :

https://hyperledger-fabric.readthedocs.io/en/release-1.4/prereqs.html

پس از برآورده شدن پیش نیازها، ترمینال خود را باز کنید، مکانی را که دوست دارید پیدا کنید، به عنوان مثال دسکتاپ.

سپس دستور زیر را تایپ کنید:

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

این دستور برای دانلود تصاویر فابریک داکر و کشیدن یک دایرکتوری فابریک-نمونه هایی است که حاوی فایل های آموزشی است.

حالا دستورات زیر را یکی یکی دنبال کنید :

cd fabric-samples/first-network../bin/cryptogen generate --config=./crypto-config.yamlexport FABRIC_CFG_PATH=$PWD../bin/configtxgen -profile SampleMultiNodeEtcdRaft -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.blockexport CHANNEL_NAME=mychannel../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSPdocker-compose -f docker-compose-cli.yaml -f docker-compose-couch.yaml -f docker-compose-etcdraft2.yaml up -ddocker exec -it cli bashCORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp CORE_PEER_ADDRESS=peer0.org1.example.com:7051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crtexport CHANNEL_NAME=mychannelpeer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pempeer channel join -b mychannel.blockCORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp CORE_PEER_ADDRESS=peer0.org2.example.com:9051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt peer channel join -b mychannel.blockCORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp CORE_PEER_ADDRESS=peer0.org1.example.com:7051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crtpeer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pemCORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp CORE_PEER_ADDRESS=peer0.org2.example.com:9051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/Org2MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pempeer chaincode install -n mycc -v 1.0 -l java -p /opt/gopath/src/github.com/chaincode/chaincode_example02/java/peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc -l java -v 1.0 -c '{"Args":["init","a", "100", "b","200"]}' -P "AND ('Org1MSP.peer','Org2MSP.peer')"CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp CORE_PEER_ADDRESS=peer0.org1.example.com:7051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crtpeer chaincode install -n mycc -v 1.0 -l java -p /opt/gopath/src/github.com/chaincode/chaincode_example02/java/peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp CORE_PEER_ADDRESS=peer1.org2.example.com:10051 CORE_PEER_LOCALMSPID="Org2MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls/ca.crtpeer chaincode install -n mycc -v 1.0 -l java -p /opt/gopath/src/github.com/chaincode/chaincode_example02/java/peer channel join -b mychannel.blockCORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp CORE_PEER_ADDRESS=peer1.org1.example.com:8051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls/ca.crtpeer chaincode install -n mycc -v 1.0 -l java -p /opt/gopath/src/github.com/chaincode/chaincode_example02/java/peer channel join -b mychannel.blockCORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp CORE_PEER_ADDRESS=peer0.org1.example.com:7051 CORE_PEER_LOCALMSPID="Org1MSP" CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt

در واقع، اگر فکر می کنید دستورات زیادی برای تایپ در بالا وجود دارد، می توانید فقط یک دستور را تایپ کنید:

./byfn.sh up -o etcdraft -l java -s couchdb

توجه: اگر لیست طولانی دستورات را قبلاً تمام کرده اید، لطفاً دستور واحد را در اینجا تایپ نکنید.

پیشنهاد مطالعه: آموزش ساخت اولین شبکه Hyperledger Fabric

لیست گره های موجود

هنگامی که محیط راه اندازی شد، نگاهی می اندازیم که چه گره هایی در شبکه اجرا می شوند.

exitdocker ps -a

777777.webp

لیست کانتینرهای در حال اجرا

می بینیم که orderer.example.com، orderer2.example.com،… داریم ( ستون NAMES را بخوانید ، ببخشید که کمی کوچک است)

در مجموع، ما 5 سفارش دهنده داریم، بنابراین 5 گره در Raft داریم.

در صورت تمایل به آموزش برنامه نویسی بلاکچین پکیج آموزش برنامه نویسی بلاکچین را ملاحظه نمایید.

متوقف کردن یک لیدر

بعد یه لیدر Raft رو متوقف میکنم ببینم تو شبکه رافت چی میشه!

قبل از متوقف کردن، بیایید بفهمیم که لیدر فعلی Raft کدام دستور دهنده است.

docker logs orderer3.example.com

ممکن است مورد شما متفاوت باشد! اما روند بررسی یکسان است، گزارش های زیر را مشاهده شد:

[orderer.consensus.etcdraft] start -> INFO 03b Starting raft node as part of a new channel channel=mychannel node=3[...][orderer.consensus.etcdraft] serveRequest -> INFO 05d Raft leader changed: 0 -> 3 channel=mychannel node=3

اگر نمی‌توانید گزارش‌های مشابهی را مانند بالا ببینید، نگران نباشید، دستور «docker logs orderer3.example.com» را چند بار دیگر امتحان کنید یا فقط بعداً آن را امتحان کنید (مثلاً 10 تا 20 ثانیه بعد).

بنابراین، orderer3 گره Raft 3 است، و لیدر فعلی گره 3 است. یعنی orderer3، لیدر فعلی Raft در مورد من است !

حالا متوقفش کنیم:

docker stop orderer3.example.com

سپس، گزارش های مربوط به سفارش دهنده دیگر را مشاهده کنید:

docker logs orderer2.example.com

من مشاهده کردم:

[orderer.consensus.etcdraft] serveRequest -> INFO 05a Raft leader changed: 0 -> 1 channel=mychannel node=2

اکنون گره 1 (باید orderer.example.com باشد) رهبر جدید Raft است که به طور خودکار مجدداً انتخاب می شود.

اما برای اثبات اینکه شبکه همچنان به درستی کار می کند، اجازه دهید برخی از تراکنش ها را انجام دهیم:

docker exec -it cli bashexport CHANNEL_NAME=mychannelpeer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'// then you should get 90, or whatever number peer chaincode invoke -o orderer.example.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C $CHANNEL_NAME -n mycc --peerAddresses peer0.org1.example.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"Args":["invoke","a","b","10"]}'peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'// then you should get 80, // or a number different from the query // result above, thus the network is working!

متوقف کردن دوباره لیدر!

یک لیدر را دوباره متوقف کنید تا ببینید چه خواهد شد. به یاد داشته باشید که رهبر فعلی ما گره 1 است، یعنی orderer.example.com.

exitdocker stop orderer.example.com// now observe logs from another ordererdocker logs orderer4.example.com[orderer.consensus.etcdraft] serveRequest -> INFO 087 Raft leader changed: 0 -> 4 channel=mychannel node=4

در مورد من در حال حاضر، لیدر جدید انتخاب شده نود 4 (باید orderer4.example.com) است.

پیشنهاد مطالعه: به‌روزرسانی تنظیمات کانال در Hyperledger Fabric

متوقف کردن بارها و بارهای یک لیدر!

docker stop orderer4.example.com// now observe logs from another ordererdocker logs orderer2.example.com

به نظر می رسد که این بار، هیچ لیدر جدیدی انتخاب نشده است (هیچ گزارش جدید انتخابات ظاهر می شود)، چرا؟

مشکل چیست؟ در رافت برای اینکه شبکه به درستی کار کند نیاز است اکثریت سفارش دهندگان نگه داشته شوند. در مورد ما 5 تا سفارش دهنده داریم و من 3 نفر از آنها را متوقف کرده ام، قانون اکثریت شکسته شده است!

رافت را تعمیر کنید

اجازه دهید یک سفارش دهنده متوقف شده روشن شود، بنابراین قانون اکثریت را اصلاح کنید:

docker start orderer4.example.comdocker logs orderer4.example.com// you will observe log like this:[orderer.consensus.etcdraft] serveRequest -> INFO 0ab Raft leader changed: 0 -> 2 channel=mychannel node=4

پس از اجرای قانون اکثریت، روند انتخاب مجدد دوباره عادی می شود.

حذف داده های سفارش دهنده

اکنون سعی می کنیم اطلاعات سفارش دهنده را حذف کنیم، سپس ببینیم آیا می توان داده ها را از سفارش دهنده موجود بازیابی کرد یا خیر

docker start orderer4.example.comdocker logs orderer4.example.com// you will observe log like this:[orderer.consensus.etcdraft] serveRequest -> INFO 0ab Raft leader changed: 0 -> 2 channel=mychannel node=4

نتیجه

در این مقاله کوتاه در Fabric’s Raft می بینیم که سفارش دهندگان می توانند:

با توجه به اینکه اکثریت سفارش‌دهنده‌ها این کار را انجام می‌دهند، مجدداً رهبر را تحت خرابی گره رهبر انتخاب کنند.

Image NewsLetter
Icon primary
Newsletter

در خبرنامه آرتا رسانه عضو شوید

با آخرین اخبار و تخفیف های ما آگاه شوید