Search code examples
node.jshyperledger-fabrichyperledgeribm-blockchain

Problem communicating Nodejs (Docker) with hydperledger


I am new to the development of blockchain technologies, to make the development and implementation process easier I am using the ibm extension, it brings a tutorial to do all the infrastructure assembly. I was able to finish the entire tutorial with no problem and at this point I have:

  • Smart contract developed in typescript
  • Api in nodejs that insert some assets

In this local environment everything works great and I can make requests from postman, from nodejs I open port 8089 and the petitions (GET, POST, PUT,DELETE) for all cases were correct.

The problem comes when I create a Dockerfile for my nodejs project, which has the following structure FROM node:10-alpine

RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app

WORKDIR /home/node/app

COPY package*.json ./

USER node

RUN npm install

COPY --chown=node:node . .

EXPOSE 8089

CMD [ "node", "server.js" ]

Inside the docker the image launches successfully,but when trying to make a request to my container that has the nodejs api it shows me the following error, which I can see in the logs of my image

error: [ServiceEndpoint]: Error: Failed to connect before the deadline on Endorser- name: org1peer-api.127-0-0-1.nip.io:8080, url:grpc://org1peer-api.127-0-0-1.nip.io:8080, connected:false, connectAttempted:true}

error: [ServiceEndpoint]: waitForReady - Failed to connect to remote gRPC server org1peer-api.127-0-0-1.nip.io:8080 url:grpc://org1peer-api.127-0-0-1.nip.io:8080 timeout:3000

I am not sure if it is because it is not possible to connect the container with my hydperledger fabric that is deployed using the ibm extension or because I am not configuring the ports correctly.

Finally I have the connection.json file generated by my hydperledger fabric ibm extension and which I am using to connect from the api to the chaincode

{
    "certificateAuthorities": {
        "org1ca-api.127-0-0-1.nip.io:8080": {
            "url": "http://org1ca-api.127-0-0-1.nip.io:8080"
        }
    },
    "client": {
        "connection": {
            "timeout": {
                "orderer": "300",
                "peer": {
                    "endorser": "300"
                }
            }
        },
        "organization": "Org1"
    },
    "display_name": "Org1 Gateway",
    "id": "org1gateway",
    "name": "Org1 Gateway",
    "organizations": {
        "Org1": {
            "certificateAuthorities": [
                "org1ca-api.127-0-0-1.nip.io:8080"
            ],
            "mspid": "Org1MSP",
            "peers": [
                "org1peer-api.127-0-0-1.nip.io:8080"
            ]
        }
    },
    "peers": {
        "org1peer-api.127-0-0-1.nip.io:8080": {
            "grpcOptions": {
                "grpc.default_authority": "org1peer-api.127-0-0-1.nip.io:8080",
                "grpc.ssl_target_name_override": "org1peer-api.127-0-0-1.nip.io:8080"
            },
            "url": "grpc://org1peer-api.127-0-0-1.nip.io:8080"
        }
    },
    "type": "gateway",
    "version": "1.0"
}

Solution

  • Was the blockchain network still running when you created the Docker image. The registered user in the 'wallet' will become stale if not, and will no longer be valid for connecting to the network. It's been a while since I last used the IBM extension, so I don't know if it has the ability to stop the network as well as drop it entirely. But do check to make sure that the client credentials are up to date as a potential reason for not being able to connect to the network.