{"record":{"id":"e2b27212ac16061a","repo":"hyperledger/fabric","slug":"failed-sending-proposal-due-to-s","errorCode":null,"errorMessage":"failed sending proposal, due to %s","messagePattern":"failed sending proposal, due to (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/peer/channel/joinbysnapshotstatus.go","lineNumber":89,"sourceCode":"\t\t},\n\t}\n\n\tvar prop *pb.Proposal\n\tc, _ := cc.cf.Signer.Serialize()\n\tprop, _, err = protoutil.CreateProposalFromCIS(common2.HeaderType_ENDORSER_TRANSACTION, \"\", invocation, c)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"cannot create proposal, due to %s\", err)\n\t}\n\n\tvar signedProp *pb.SignedProposal\n\tsignedProp, err = protoutil.GetSignedProposal(prop, cc.cf.Signer)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"cannot create signed proposal, due to %s\", err)\n\t}\n\n\tproposalResp, err := cc.cf.EndorserClient.ProcessProposal(context.Background(), signedProp)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed sending proposal, due to %s\", err)\n\t}\n\n\tif proposalResp.Response == nil || proposalResp.Response.Status != http.StatusOK {\n\t\treturn nil, fmt.Errorf(\"received bad response, status %d: %s\", proposalResp.Response.Status, proposalResp.Response.Message)\n\t}\n\n\tjoinbysnapshotStatus := &pb.JoinBySnapshotStatus{}\n\terr = proto.Unmarshal(proposalResp.Response.Payload, joinbysnapshotStatus)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"cannot query joinbysnapshot status, due to %s\", err)\n\t}\n\treturn joinbysnapshotStatus, nil\n}\n","sourceCodeStart":71,"sourceCodeEnd":103,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/internal/peer/channel/joinbysnapshotstatus.go#L71-L103","documentation":"Returned by joinBySnapshotStatus when the signed proposal cannot be delivered to the peer's endorser service. cc.cf.EndorserClient.ProcessProposal over gRPC failed at the transport/rpc level, and the underlying error is embedded via %s.","triggerScenarios":"EndorserClient.ProcessProposal(context.Background(), signedProp) returns a non-nil error — TLS handshake failure, connection refused, peer unreachable, gRPC timeout, or server rejecting the client identity.","commonSituations":"Peer not running or wrong address in --peerAddress; TLS enabled on peer but no --tlsRootCertFile supplied; DNS/firewall blocking the port; client certificate not trusted by the peer (mutual TLS).","solutions":["Verify the peer address and port are correct and the peer container/process is up","Supply the peer's TLS CA certificate with --tlsRootCertFile when TLS is enabled","Check network reachability (ping/openssl s_client) and firewall rules for the endorser port","Confirm mutual-TLS client certs match what the peer's TLS CA issued"],"exampleFix":"// before: TLS peer without CA cert -> gRPC failure\npeer channel joinbysnapshot -c mychannel --peerAddress peer0:7051\n// after\npeer channel joinbysnapshot -c mychannel --peerAddress peer0:7051 --tlsRootCertFile /path/peerOrg-ca.crt","handlingStrategy":"retry","validationCode":"// pre-flight: reachability check\nconn, err := net.DialTimeout(\"tcp\", strings.TrimPrefix(peerAddr, \"https://\"), 3*time.Second)\nif err != nil { return fmt.Errorf(\"peer endorser unreachable: %w\", err) }\nconn.Close()","typeGuard":null,"tryCatchPattern":"proposalResp, err := endorserClient.ProcessProposal(ctx, signedProp)\nif err != nil {\n    // retry with backoff for transient gRPC failures; surface TLS/addr config errors immediately\n    return nil, fmt.Errorf(\"failed sending proposal, due to %s\", err)\n}","preventionTips":["Always pass --tlsRootCertFile when the peer has TLS enabled","Verify --peerAddress hostname matches the peer's TLS SAN","Confirm the peer container is healthy before scripting CLI calls","Use short connectivity probes before batch operations"],"tags":["fabric","grpc","network","endorser"],"backgroundTag":"connection-refused","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}