У меня были некоторые проблемы с обновлением моего цепного кода Hyperledger, и даже если я закомментировал функцию, все еще можно запустить эту функцию.Я использую образец сети «Создай свою первую сеть» из этого учебного пособия вместе с мраморным цепным кодом, также упомянутым в учебном пособии.У меня нет проблем с использованием исходного цепного кода, но когда я начинаю вносить изменения, не всегда эти изменения показываются, когда я повторно развертываю свою сеть.
Мой вопрос похож на этот вопрос , но даже следование ответу на этот вопрос мне не помогает.
Когда я запускаю свою сеть, я использую следующие команды:
cd .../fabric-samples/first-network
Измените каталог на first-network в папке fabric-samples.
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
docker rmi $(docker images -a -q)
Это делается для того, чтобы сначала остановить все контейнеры, удалить все контейнеры и удалить все изображения.Это не удаляет образы Hyperledger Fabric, а только все цепные коды.Это так, чтобы убедиться, что старый цепной код по-прежнему активен.Даже если я проверяю с помощью docker images
, это только изображения Hyperledger.
./byfn.sh down
./byfn.sh up -c mychannel -s couchdb
docker exec -it cli bash
Здесь я закрываю существующую программу «Создай свою первую сеть» (byfn).После того, как я снова разверну сеть с каналом mychannel и couchdb в качестве couchdb в качестве базы данных состояний.Наконец, вход в контейнер док-станции CLI.
peer chaincode install -n marblestest -v 3.1 -p github.com/chaincode/marblestest/go
export CHANNEL_NAME=mychannel
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 marblestest -v 3.1 -c '{"Args":["init"]}' -P "OR ('Org0MSP.peer','Org1MSP.peer')"
Как вы видите, я пробовал использовать разные версии и не работает с версией 3.1.Цепной код установлен, имя канала установлено на mychannel, и цепной код создается без каких-либо проблем.
peer chaincode invoke -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 marblestest -c '{"Args":["initMarble","marble1","blue","35","tom"]}'
Мрамор создается с помощью initMarble.
peer chaincode query -C $CHANNEL_NAME -n marblestest -c '{"Args":["queryMarbles", "{\"selector\":{\"docType\":\"marble\",\"owner\":\"tom\"}, \"use_index\":[\"_design/indexOwnerDoc\", \"indexOwner\"]}"]}'
Здесь используется модифицированная функция запроса, которая работает так же, как исходная функция, и печатает созданную мраморную запись.
exit
Наконец, выход из программы перед повторным ее запуском.
Внесенные мной в функцию запроса изменения заключаются в том, что я закомментировал две строки печати и добавил счетчик для подсчета количества записей из цикла for:
func getQueryResultForQueryString(stub shim.ChaincodeStubInterface, queryString string) ([]byte, error) {
//fmt.Printf("- getQueryResultForQueryString queryString:\n%s\n", queryString)
resultsIterator, err := stub.GetQueryResult(queryString)
if err != nil {
return nil, err
}
defer resultsIterator.Close()
buffer, counter, err := constructQueryResponseFromIterator(resultsIterator)
if err != nil {
return nil, err
}
//fmt.Printf("- getQueryResultForQueryString queryResult:\n%s\n", buffer.String())
fmt.Printf("counter =", counter)
return buffer.Bytes(), nil
}
Я быожидал печать с counter = 1
, но я получил оригинальную печать {"color":"blue","docType":"marble","name":"marble1","owner":"tom","size":35}
Кто-нибудь знает, почему мой цепной код не обновляется при повторном развертывании?