Почему запросы цепного кода записываются в книгу? (Только цепной код частного образца Marbles)

#hyperledger-fabric #hyperledger-chaincode

#hyperledger-ткань #hyperledger-цепной код

Вопрос:

Я тестирую частные коллекции данных, используя образец частного цепного кода Fabric Marble, и столкнулся с озадачивающей проблемой: в одноранговых журналах отображается, что новые блоки добавляются в реестр при выполнении запроса.

Когда я вызываю функцию цепного кода «ReadMarble«:

 peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile /home/user/fabric-samples/test-network/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n marblesp -c '{"Args":["ReadMarble","marble1"]}'
 

в одноранговых журналах Org1 и Org2 отображаются следующие сообщения:

 2020-11-26 17:20:23.034 UTC [gossip.privdata] StoreBlock -> INFO 080 Received block [7] from buffer channel=mychannel
2020-11-26 17:20:23.036 UTC [committer.txvalidator] Validate -> INFO 081 [mychannel] Validated block [7] in 1ms
2020-11-26 17:20:23.056 UTC [kvledger] commit -> INFO 082 [mychannel] Committed block [7] with 1 transaction(s) in 19ms (state_validation=0ms block_and_pvtdata_commit=5ms state_commit=12ms) commitHash=[93f46d1c133896b222d3dfa4dd7571704aec625332c503a296e918bf7765e2c1]
 

То, что новые блоки фиксируются в бухгалтерской книге, подтверждается тем фактом, что данные о ценах marble private исчезают после 3 транзакций из частной коллекции Org1 на основе конфигурации коллекции по умолчанию.
Кроме того, такое поведение происходит только после вызова initMarble. Если ReadMarble вызывается до добавления шариков в регистр, новые блоки не записываются.
Такое же поведение (появляются новые блоки, которые записываются) также наблюдается при вызове функций «
GetMarblesByRange» и «ReadMarblePrivateDetails«. (Однако вызов «GetMarblesByRange» приведет к записи дополнительных блоков независимо от того, был ли уже вызван initMarble.)

Я использую последние образцы структуры (версия 2.3) и ссылаюсь на руководство на этой странице.

Я попытался использовать учебное пособие по закрытым данным 2.3, в котором вместо частного образца Marbles используется образец цепного кода asset-transfer-private, и не смог воспроизвести эту проблему; При использовании цепного кода Asset-transfer-Private новые блоки при вызывающих запросах не создаются. Я не заметил никаких очевидных различий между этими примерами цепных кодов, которые могли бы объяснить эту разницу в поведении, но у меня также нет опыта программирования.

Ответ №1:

Я думаю, что проблема связана с командой CLI, которую вы используете для выполнения вызова. Ты бежишь peer chaincode invoke . В справке для этой команды указано:

Вызовите указанный цепной код. Он попытается зафиксировать подтвержденную транзакцию в сети.

Обратите внимание, что комментарии в верхней части связанного вами цепного кода предлагают эту команду для запроса мрамора:

 peer chaincode query -C mychannel -n marblesp -c '{"Args":["ReadMarble","marble1"]}'
 

И справка для peer chaincode query команды гласит:

Получите подтвержденный результат вызова функции цепного кода и распечатайте его. Он не будет генерировать транзакцию.

peer chaincode query Команда просто отправляет предложение одноранговым узлам, чтобы получить результат транзакции. peer chaincode invoke Команда отправляет предложение одноранговым узлам для сбора одобренных ответов, а затем отправляет предложение и эти подтверждения заказчику (заказчикам) для фиксации в качестве транзакции в регистр. Более подробно об этом потоке здесь:

https://hyperledger-fabric.readthedocs.io/en/release-2.2/peers/peers.html#phase-1-proposal

Комментарии:

1. Привет, bestbeforetoday, вы абсолютно правы! Я вызывал «invoke» вместо «query» в моей команде. Я рад, что это была всего лишь простая ошибка с моей стороны, и надеюсь, что ваш ответ также поможет всем другим, кто столкнется с той же проблемой.