- Feature Name: CoAP Gateway for Hyperledger Fabric
- Start Date: 18/08/2025
- RFC PR: (leave this empty)
- Fabric Component: Ecosystem Architecture, Peer , Gateway.
- Fabric Issue: (leave this empty)
Summary
This RFC proposes the addition of a Constrained Application Protocol (CoAP) gateway to Hyperledger Fabric. The goal is to enable IoT and resource-constrained devices to interact with Fabric networks using a lightweight, UDP-based protocol. The CoAP gateway will provide a simplified interface for submitting transactions, evaluating chaincode, and receiving events, maintaining security through DTLS encryption and certificate-based authentication.
Motivation
The current Hyperledger Fabric gRPC gateway has limitations for IoT and resource-constrained devices due to:
-
IoT devices often have limited memory, processing power, and network bandwidth, making gRPC/HTTP2 impractical.
-
Many IoT deployments use UDP-based networks or have unreliable connectivity.
-
gRPC requires TCP and HTTP/2 connections, which may not be suitable for constrained environments.
-
IoT devices require lightweight yet secure communication protocols.
The CoAP gateway addresses these limitations by providing:
-
Lightweight, UDP-based communication.
-
DTLS security for encrypted and authenticated connections.
-
Support for resource-constrained devices.
-
Event streaming capabilities.
Guide-level explanation
This section explains the proposed Hyperledger Fabric CoAP Gateway. It’s designed to teach a Fabric developer how to understand, use, and think about integrating IoT devices with Fabric using this new capability.
For developers and users, the CoAP gateway will be perceived as a new option for integrating IoT devices into Hyperledger Fabric.
The main difference is the use of CoAP (UDP/DTLS) instead of gRPC (TCP/HTTP2), resulting in lower protocol overhead and better suitability for constrained environments. APIs will be similar to the current gRPC gateway, but using CoAP instead, with specific endpoints for transaction endorsement, submission, and evaluation, as well as event subscription.
Comprehensive documentation, configuration guides, security, performance, and troubleshooting guides will be provided to ensure users understand the capabilities and use of the CoAP gateway.
The CoAP gateway introduces a dual-certificate security model that separates connection authentication from transaction authorization:
-
DTLS Certificate: Validates the device can connect to the gateway (checked during connection establishment)
-
Signing Certificate: Proves the device is authorized to execute specific transactions (checked by Fabric ACLs and endorsement policies)
Both certificates are issued by Fabric CAs and validated against the channel’s MSP configuration.
Connecting the Physical World to Fabric
Imagine you’re building a supply chain network to track refrigerated goods. You have thousands of IoT sensors that monitor temperature and location. How do you get that data onto the blockchain in a secure, efficient, and standardized way? Historically, this required a complex middle layer: an IoT platform or custom application server that would receive data from devices (perhaps over MQTT or CoAP), validate it, and then use a Fabric SDK to submit a transaction. This adds latency, a central point of failure, development overhead, and requires implicit trust on that middle layer.
The Fabric CoAP Gateway solves this problem by creating a direct, lightweight, and secure bridge between CoAP-enabled IoT devices and the Fabric network. Using automatically generated client libraries, resource-constrained devices can interact with chaincode using the same APIs as traditional gRPC clients, but over the lightweight CoAP protocol. This extends the reach of Fabric to the very edge of your network without sacrificing developer experience or security.
New Concepts
To understand the gateway, let’s introduce a few new concepts:
-
This is a new, optional peer service that exposes a CoAP endpoint. It listens for incoming CoAP requests from registered IoT devices, translates them into calls to the existing gRPC Gateway implementation, and returns the result to the device. Think of it as a thin protocol adapter that makes the Fabric Gateway accessible to CoAP clients without duplicating any business logic.
-
The gateway acts as a lightweight protocol converter, translating CoAP requests into in-process gRPC Gateway calls. This API is an exact reflection of the existing Hyperledger Fabric gRPC gateway’s interface, providing a consistent experience for developers across protocols.
-
The gateway exposes RPC-style endpoints that mirror the Gateway service methods. The client is responsible for packaging all necessary information, such as the channel, chaincode name, and function arguments, within the Protobuf payload, just as they would when using the gRPC gateway directly.
Specifically, it exposes:
-
/rpc/gateway.Gateway/Evaluatefor evaluation requests -
/rpc/gateway.Gateway/Endorsefor managing endorsements -
/rpc/gateway.Gateway/Submitfor processing transaction submissions -
/rpc/gateway.Gateway/ChaincodeEventsfor listening to events -
/rpc/gateway.Gateway/CommitStatusfor checking transaction commit status
This design maximizes code reuse by delegating all business logic to the existing GatewayServer implementation. The CoAP adapter is purely a protocol translation layer, ensuring consistency and minimal maintenance overhead.
A key difference from typical REST endpoints is that these endpoints don’t receive JSON strings. Instead, they accept a binary stream encoded with Protobuf, just like the gRPC gateway. This simplifies the resource-to-chaincode mapping by allowing the CoAP gateway to act as a new entry point to existing functionalities without needing format transformations.
Security is paramount. An IoT device cannot simply send data to the network. Each device must have a verifiable identity. The CoAP Gateway integrates directly with the Member Service Provider (MSP). Devices are enrolled through a Fabric CA and issued two X.509 certificates: one for DTLS transport security and one for signing transactions. These certificates establish a secure DTLS (Datagram TLS) session with the gateway and authenticate the device’s transactions through Fabric’s standard validation mechanisms.
Client Generation and Usage
The CoAP gateway provides the same developer experience as gRPC through automated client generation. When fabric-protos is built, a protoc plugin (protoc-gen-go-coap) generates type-safe Go clients that mirror the gRPC gateway interface.
Developers simply import the generated client:
import "github.com/hyperledger/fabric-protos-go-apiv2/gateway"
// Create CoAP connection with DTLS certificate
conn, err := coap.NewDTLSConnection("fabric-gateway.mycorp.com:5684",
coap.WithDTLSCert(transportCert, transportKey),
coap.WithRootCA(caCert))
// Use generated client
client := gateway.NewGatewayCoapClient(conn)
// Type-safe method calls with IDE autocomplete
resp, err := client.Endorse(ctx, &gateway.EndorseRequest{
TransactionId: "tx123",
ChannelId: "mychannel",
ProposedTransaction: signedProposal, // Signed with identity certificate
})
This approach ensures that:
- Client code is automatically in sync with protocol changes
- Developers get full IDE support (autocomplete, type checking)
- The experience matches gRPC client patterns exactly
- When Gateway API changes, regeneration is automatic
An Example: The Smart Cold Chain
Let’s start with the cold chain example. A temperature sensor on a truck needs to report its reading. The device has been enrolled and provisioned with:
- DTLS certificate: For secure connection (
device-345-dtls.pem) -
Signing certificate: For transaction signing (
device-345-identity.pem) - The sensor wakes up, reads the temperature (e.g., -18°C). It must then create a transaction proposal, endorse it and finally submit it:
- Establishes DTLS connection using its transport certificate
- Creates and signs the proposal using its signing certificate
- Target: coaps://fabric-gateway.mycorp.com:5684/rpc/gateway.Gateway/Endorse
- Method: POST
- Payload: protobuf-encoded
SignedProposalwith embedded signing certificate
- The gateway receives this request over the DTLS-secured connection:
- Stage 1: Validates the DTLS certificate - confirms device is allowed to connect
- Stage 2: Extracts the signing certificate from
SignedProposaland validates:- Signature is valid
- Signing certificate belongs to
transporter-orgMSP - Device has permission per channel ACLs
- Forwards the validated proposal to existing gRPC gateway implementation
- Returns CoAP response with endorsement
- Once endorsed, the gateway sends a CoAP response:
- Success:
2.05 Contentwith marshaledEndorseResponse - Failure:
4.03 Forbiddenif ACL check failed,5.00 Internal Server Errorfor system issues
- Success:
After the endorsement is completed, the device starts once again with the submission phase, where the process is similar to the endorsement.
Teaching This to Different Developers
-
For Established Fabric Developers: The CoAP Gateway is simply a new protocol adapter that plugs into the existing Gateway implementation with zero changes to business logic. The main new concepts are: (1) the dual-certificate model for separating connection and transaction security and (2) using the generated CoAP client from
fabric-protos-go-apiv2, which works exactly like the gRPC client you’re already familiar with. -
For IoT Developers New to Fabric: The CoAP Gateway enables direct integration of resource-constrained devices with blockchain networks. The dual-certificate approach is straightforward: one certificate connects you to the gateway, and another signs your transactions. Start with an example like our cold chain to see how device data flows securely onto the ledger.
Reference-level explanation
This section provides the technical details of the CoAP gateway implementation. The gateway exposes a CoAP interface that mirrors the functionality of the existing gRPC gateway, allowing clients in constrained environments to interact with a Hyperledger Fabric network. The core design principle is to reuse the existing Fabric gateway logic and protocol message structures, with the CoAP server acting as a thin network wrapper.
Protocol and Security
The gateway utilizes the Constrained Application Protocol (CoAP) over Datagram Transport Layer Security (DTLS) to ensure secure, low-overhead communication. Security is implemented through a dual-certificate model that separates transport-level authentication from transaction-level authorization.
Dual-Certificate Architecture
Devices are provisioned with two distinct X.509 certificate/key pairs, both issued by a Fabric Certificate Authority (CA):
- Transport Layer: DTLS 1.2/1.3 with mutual X.509 authentication (connection security)
- Application Layer: Signed transaction proposals with identity certificates (transaction authorization)
This is identical to the gRPC gateway’s security model - the CoAP adapter validates DTLS certificates during connection establishment, then delegates all transaction-level security (ACL checks, endorsement policies) to the existing GatewayServer implementation.
Devices require two certificates from Fabric CA:
- DTLS certificate: For UDP transport authentication
- Identity certificate: For signing
SignedProposalpayloads (embedded in request body)
Both certificates are validated against channel MSP configuration. Compromised transport certificates cannot sign transactions; compromised identity certificates cannot intercept network traffic.
API Endpoints
The CoAP gateway exposes five main endpoints corresponding to the Fabric Gateway service. All paths follow the pattern /rpc/gateway.Gateway/{Method} and are automatically generated as constants in fabric-protos-go-apiv2.
Generated Path Constants (in gateway_coap.pb.go):
const (
Gateway_Endorse_CoAPPath = "/rpc/gateway.Gateway/Endorse"
Gateway_Submit_CoAPPath = "/rpc/gateway.Gateway/Submit"
Gateway_CommitStatus_CoAPPath = "/rpc/gateway.Gateway/CommitStatus"
Gateway_Evaluate_CoAPPath = "/rpc/gateway.Gateway/Evaluate"
Gateway_ChaincodeEvents_CoAPPath = "/rpc/gateway.Gateway/ChaincodeEvents"
)
Requests and responses use the same protobuf message types as the gRPC service, marshaled into binary payloads.
1. Evaluate Transaction
Used to invoke a transaction function on a peer to query the ledger state without submitting a transaction for ordering.
- Endpoint:
POST /rpc/gateway.Gateway/Evaluate - Request Payload: The body of the CoAP request must contain a marshaled
gateway.EvaluateRequestprotobuf message. - Success Response:
- Code:
2.05 Content - Payload: The response body contains a marshaled
gateway.EvaluateResponseprotobuf message.
- Code:
2. Endorse Transaction
Used to collect endorsements for a transaction from peers sufficient to satisfy the chaincode’s endorsement policy.
- Endpoint:
POST /rpc/gateway.Gateway/Endorse - Request Payload: The body of the CoAP request must contain a marshaled
gateway.EndorseRequestprotobuf message. - Success Response:
- Code:
2.05 Content - Payload: The response body contains a marshaled
gateway.EndorseResponseprotobuf message, which includes the prepared transaction envelope ready for signing by the client.
- Code:
3. Submit Transaction
Used to submit a previously endorsed and client-signed transaction to the ordering service.
- Endpoint:
POST /rpc/gateway.Gateway/Submit - Request Payload: The body of the CoAP request must contain a marshaled
gateway.SubmitRequestprotobuf message. - Success Response:
- Code:
2.04 Changed - Payload: The response body contains a marshaled
gateway.SubmitResponseprotobuf message.
- Code:
Note: The /rpc/gateway.Gateway/Submit endpoint waits for the transaction to be submitted to the ordering service before returning. To check whether the transaction has been committed to the ledger, clients must use the /rpc/gateway.Gateway/CommitStatus endpoint.
4. Receive Ledger Events
Used to subscribe to a stream of chaincode events from the ledger. This endpoint uses the CoAP Observe option (RFC 7641) to deliver a stream of notifications to the client.
- Endpoint:
GET /rpc/gateway.Gateway/ChaincodeEvents(with theObserveoption set to0) - Request Payload: The body of the initial CoAP GET request must contain a marshaled
gateway.ChaincodeEventsRequestprotobuf message. - Response Stream:
- The server will register the client as an observer and send a success response (
2.05 Content). - Subsequently, as new blocks containing relevant chaincode events are committed to the ledger, the server will push notifications to the client. Each notification will have a
2.05 Contentresponse code and a payload containing a marshaledgateway.ChaincodeEventsResponsemessage.
- The server will register the client as an observer and send a success response (
5. Commit Status
Used to check the status of a previously submitted transaction.
- Endpoint:
POST /rpc/gateway.Gateway/CommitStatus - Request Payload: The body of the CoAP request must contain a marshaled
gateway.SignedCommitStatusRequestprotobuf message. - Success Response:
- Code:
2.05 Content - Payload: The response body contains a marshaled
gateway.CommitStatusResponseprotobuf message.
- Code:
Developer Experience
Client-Side Development
External developers working with the CoAP gateway get the same ergonomic experience as gRPC:
Step 1: Import generated client
import "github.com/hyperledger/fabric-protos-go-apiv2/gateway"
Step 2: Create connection and client
conn, err := coap.NewDTLSConnection("fabric-gateway.example.com:5684",
coap.WithDTLSCert(transportCert, transportKey), // DTLS certificate
coap.WithRootCA(caCert))
if err != nil {
log.Fatal(err)
}
client := gateway.NewGatewayCoapClient(conn)
Step 3: Use type-safe methods
// Full IDE autocomplete and type safety
endorseResp, err := client.Endorse(ctx, &gateway.EndorseRequest{
TransactionId: txID,
ChannelId: "mychannel",
ProposedTransaction: signedProposal, // Signed with identity certificate
})
Server-Side Development
For Fabric core developers, the CoAP gateway requires minimal implementation:
- No changes to existing
GatewayServerimplementation - Thin adapter layer in
fabric/internal/peer/gateway/coap/ - Standard patterns for all handlers (unmarshal → call gRPC → marshal)
- Reuse existing tests and validation logic
When the Gateway service adds new methods:
- Protocol buffer definition updated
- Run
make genprotosin fabric-protos gateway_coap.pb.goautomatically regenerates- Add simple handler in adapter following existing pattern
- External clients automatically get new methods
Error Handling
When a request fails, the CoAP gateway maps the underlying Fabric error to an appropriate CoAP response code from the 4.xx (Client Error) or 5.xx (Server Error) class. The payload of the error response contains a plain-text UTF-8 string describing the error.
The following table details the mapping from common Fabric errors to CoAP response codes:
| Fabric Error Condition | CoAP Code | Description |
|---|---|---|
| Malformed request payload | 4.00 Bad Request | The protobuf message in the request body could not be unmarshalled. |
| Endorsement policy failure | 4.03 Forbidden | The transaction failed to meet the chaincode’s endorsement policy. |
| MVCC read conflict | 4.12 Precondition Failed | A read-write conflict (MVCC) was detected when validating the transaction. |
| No peers available | 5.03 Service Unavailable | The gateway could not connect to any endorsing peers for the request. |
| Unspecified internal error | 5.00 Internal Server Error | A generic or unexpected error occurred within Fabric or the gateway. |
Detailed Design
Architecture Overview
The CoAP gateway is implemented as a lightweight adapter within the Fabric peer that proxies requests to the existing gRPC Gateway implementation.
Key Design Principles:
- All transaction processing, endorsement, and validation logic remains in the existing
GatewayServer - CoAP adapter only handles protocol translation (CoAP ↔ gRPC)
- No network overhead between CoAP adapter and gRPC Gateway
- DTLS identity flows seamlessly to Fabric ACL checks
Component Structure:
fabric/
├── internal/peer/gateway/
│ ├── gateway.go # Existing GatewayServer (UNCHANGED)
│ ├── endorser.go # Existing endorsement logic (UNCHANGED)
│ ├── evaluator.go # Existing query logic (UNCHANGED)
│ └── coap/ # NEW: CoAP adapter
│ ├── adapter.go # CoAP-to-gRPC translation
│ ├── server.go # DTLS server and routing
│ └── auth.go # DTLS certificate validation
└── core/peer/
└── peer.go # Peer startup: initialize CoAP listener
fabric-protos/
└── bindings/go-apiv2/gateway/
├── gateway.pb.go # Existing protobuf definitions
├── gateway_grpc.pb.go # Existing gRPC client
└── gateway_coap.pb.go # NEW: Generated CoAP client
Request Flow:
IoT Device (CoAP client)
↓ DTLS connection (transport cert validation)
CoAP Adapter (fabric/internal/peer/gateway/coap/)
↓ Extract SignedProposal
↓ In-process call
Existing GatewayServer (fabric/internal/peer/gateway/)
↓ Validate signing cert, check ACLs
↓ Process transaction
Endorsing Peers / Orderer
Server Configuration:
- UDP port 5683 (CoAP) or 5684 (CoAPs/DTLS)
- DTLS 1.2/1.3 support
- X.509 certificate validation via MSP
- Configurable via peer’s
core.yaml
Peer Lifecycle Integration
Startup Sequence (in core/peer/peer.go):
1. Initialize MSP
2. Start event hub
3. Initialize gRPC Gateway
4. If peer.gateway.coap.enabled:
- Validate CoAP configuration
- Initialize DTLS certificates
- Create CoAP adapter with reference to GatewayServer
- Start CoAP listener on configured port
Graceful Shutdown:
- Stop accepting new CoAP connections
- Wait for in-flight requests (with timeout from config)
- Close DTLS connections
- Shutdown event observers
Dependencies: Requires MSP and GatewayServer to be initialized first
Integration with fabric-protos Build Pipeline
The CoAP gateway leverages the existing fabric-protos infrastructure to automatically generate client libraries.
buf.gen.yaml Configuration:
plugins:
- local: protoc-gen-go-grpc
out: bindings/go-apiv2
opt:
- paths=source_relative
- require_unimplemented_servers=false
- local: protoc-gen-go-coap # New plugin
out: bindings/go-apiv2
opt:
- paths=source_relative
Build Process:
make genprotosin fabric-protos repository- Plugin generates
gateway_coap.pb.goinbindings/go-apiv2/gateway/ - Generated files are published to
fabric-protos-go-apiv2via existing release process - External clients import the package and get fully typed CoAP clients
Benefits:
- Zero manual maintenance of client code
- Automatic sync with protocol changes
- Consistent experience across gRPC, Java, and Node.js clients
- Full IDE support for external developers
Configuration
Configured via the peer’s core.yaml file:
peer:
gateway:
coap:
enabled: true
address: 0.0.0.0
port: 5684
dtls:
# Transport-level certificates (connection authentication)
certFile: /etc/hyperledger/fabric/tls/server.crt
keyFile: /etc/hyperledger/fabric/tls/server.key
clientCACerts: /etc/hyperledger/fabric/tls/ca.crt
requireClientCert: true
# Performance tuning
maxConcurrentRequests: 1000
requestTimeout: 30s
observeTimeout: 300s
Security Model
The security model implements a dual-certificate architecture with two-stage validation:
-
Transport Authentication: Based on X.509 DTLS certificates for connection establishment. Validated during DTLS handshake against channel MSP configuration. Determines if device can connect to the gateway.
-
Transaction Authorization: Based on X.509 signing certificates embedded in
SignedProposalpayloads. Validated by Fabric’s standard mechanisms, checking ACLs and endorsement policies. Determines if device can execute specific chaincode operations. -
Encryption: DTLS 1.2/1.3 for end-to-end encryption, support for Perfect Forward Secrecy, and mutual certificate authentication.
-
Separation of Concerns: Transport and signing certificates are provisioned separately, allowing independent lifecycle management and minimizing security impact of certificate compromise.
Implementation Details
protoc-gen-go-coap Plugin:
- Integrated into fabric-protos
buf.gen.yamlconfiguration - Generates
gateway_coap.pb.goalongsidegateway_grpc.pb.go - Creates type-safe client interfaces and path constants
- Published to
fabric-protos-go-apiv2automatically
Generated Output Structure:
// Path constants for CoAP URIs
const (
Gateway_Endorse_CoAPPath = "/rpc/gateway.Gateway/Endorse"
Gateway_Submit_CoAPPath = "/rpc/gateway.Gateway/Submit"
Gateway_CommitStatus_CoAPPath = "/rpc/gateway.Gateway/CommitStatus"
Gateway_Evaluate_CoAPPath = "/rpc/gateway.Gateway/Evaluate"
)
// GatewayCoapClient interface
type GatewayCoapClient interface {
Endorse(ctx context.Context, in *EndorseRequest, opts ...CoapOption) (*EndorseResponse, error)
Submit(ctx context.Context, in *SubmitRequest, opts ...CoapOption) (*SubmitResponse, error)
CommitStatus(ctx context.Context, in *SignedCommitStatusRequest, opts ...CoapOption) (*CommitStatusResponse, error)
Evaluate(ctx context.Context, in *EvaluateRequest, opts ...CoapOption) (*EvaluateResponse, error)
}
protoc Plugin Implementation
The protoc-gen-go-coap plugin uses google.golang.org/protobuf/compiler/protogen:
Input: Service definitions from gateway.proto
Output: gateway_coap.pb.go with:
- Path constants (pattern:
/rpc/{package}.{service}/{method}) - Client interface with method signatures matching gRPC
- Client implementation with CoAP POST requests (unary) and GET+Observe (streaming)
Code Generation Logic:
for each service method:
- Generate path constant
- If unary: POST request with protobuf body
- If streaming: GET request with Observe option
- Marshal request to protobuf bytes
- Unmarshal response from protobuf bytes
File Naming: {basename}_coap.pb.go (matches gRPC pattern)
Core Server Components (within Fabric peer)
- CoAP Adapter (
fabric/internal/peer/gateway/coap/adapter.go): Lightweight proxy that translates CoAP requests to gRPC Gateway calls - CoAP Server (
fabric/internal/peer/gateway/coap/server.go): DTLS server initialization and request routing - DTLS Authenticator (
fabric/internal/peer/gateway/coap/auth.go): Validates transport certificates during DTLS handshake - Existing Gateway (
fabric/internal/peer/gateway/gateway.go): UNCHANGED - all business logic remains here
Each handler follows a simple pattern:
func (a *CoAPAdapter) handleEndorse(w coap.ResponseWriter, req *coap.Request) {
// 1. Unmarshal CoAP request
request := &gateway.EndorseRequest{}
proto.Unmarshal(req.Body(), request)
// 2. Call existing gRPC implementation (all business logic here)
response, err := a.grpcGateway.Endorse(req.Context(), request)
// 3. Marshal CoAP response
payload, _ := proto.Marshal(response)
w.Write(payload)
}
Integration Points:
- Gateway Service: All handlers delegate to existing
GatewayServerimplementation - zero business logic duplication - MSP Integration: Leverages Fabric MSP for both DTLS certificate validation and signing certificate validation
- Event System: Integrates with Fabric event delivery system using CoAP Observe for real-time notifications
- Configuration: Extends core.yaml with CoAP gateway settings (ports, DTLS, MSP)
- Context Flow: DTLS peer certificate is extracted and added to context during handshake. This context flows to GatewayServer where the signing certificate from
SignedProposalis validated. Both identities are logged for audit trails. - Timeout Handling: CoAP request timeout is enforced first. If request times out before gRPC call completes, context is cancelled and client receives
5.03 Service Unavailable. - Trace Propagation: Request ID generated per CoAP request, passed to gRPC context for distributed tracing.
Error Handling:
Error mapping from gRPC to CoAP response codes:
| gRPC Status Code | CoAP Response Code | Scenario |
|---|---|---|
| OK | 2.05 Content | Success |
| INVALID_ARGUMENT | 4.00 Bad Request | Malformed protobuf |
| UNAUTHENTICATED | 4.01 Unauthorized | Invalid signature |
| PERMISSION_DENIED | 4.03 Forbidden | ACL failure |
| NOT_FOUND | 4.04 Not Found | Channel/chaincode not found |
| ABORTED | 4.12 Precondition Failed | MVCC conflict |
| UNAVAILABLE | 5.03 Service Unavailable | No peers available |
| Other | 5.00 Internal Server Error | Unexpected errors |
Error details from gRPC status message are included in CoAP response payload as UTF-8 text.
Performance Considerations:
- DTLS connection pooling to reuse secure connections across requests
- In-process communication eliminates network overhead between adapter and GatewayServer
- Configurable limits for concurrent connections (default: 1000) and request timeouts (default: 30s)
- Separate goroutine pools for CoAP and gRPC to prevent resource contention
Impact Analysis
Breaking Changes
None. This RFC does not introduce breaking changes to existing Fabric functionality.
Backward Compatibility
The CoAP gateway is an optional feature and disabled by default, which does not affect existing Fabric deployments. gRPC gateway functionalities remain unchanged, and both can operate simultaneously.
Performance Impact
Minimal. The CoAP gateway runs independently, with separate resource allocation to avoid interference with core peer operations. Configurable limits can be set for resource usage.
Security Impact
Improved security by implementing a dual-certificate model that separates transport authentication from transaction authorization. DTLS provides network-layer security for IoT communications, while Fabric’s standard SignedProposal validation ensures transaction-level security. This separation follows the principle of least privilege and minimizes the impact of certificate compromise. Certificate management for CoAP clients leverages existing Fabric CA infrastructure.
Resource Requirements
-
Memory Requirements: ~30-50MB additional per peer for the CoAP adapter, with ~10-20MB per 100 concurrent DTLS connections for connection state and certificate caching.
-
CPU Requirements: Additional overhead for DTLS handshakes and encryption (primary cost), minimal overhead for protocol translation due to in-process communication with GatewayServer, moderate usage for CoAP Observe event streaming.
-
Network Requirements: UDP port 5684 for DTLS (5683 for plain CoAP if needed), minimal additional bandwidth as CoAP messages are smaller than gRPC/HTTP2, configurable limits for concurrent connections (default: 1000).
-
Storage Requirements: Space for server DTLS certificates (separate from gRPC TLS certs), MSP configuration for validating client signing certificates (shared with gRPC gateway), minimal additional configuration in core.yaml, CoAP gateway operation logs integrated with peer logging.
Drawbacks
-
DTLS handshakes and encryption add CPU overhead, particularly for constrained devices with limited crypto acceleration.
-
Requires maintaining
protoc-gen-go-coapplugin and coordinating releases with fabric-protos updates. -
CoAP/UDP has inherent limitations compared to gRPC/TCP (no connection state, message size limits, potential packet loss on unreliable networks).
Rationale and alternatives
Why CoAP?
It is an established IETF standard (RFC 7252), designed specifically for resource-constrained devices, has native DTLS support, offers the Observe pattern for event streaming, and a familiar REST-like API design.
Alternatives Considered
- MQTT: More complex, requires a message broker.
- Custom UDP Protocol: Would require custom security implementation.
- HTTP/1.1: Higher overhead, no native event streaming.
- gRPC over HTTP/1.1: Would defeat the purpose of a lightweight protocol.
Prior art
The concept of a CoAP gateway and its implementations are well-established:
Eclipse Californium: CoAP implementation in Java.
go-coap: Go CoAP library used in this implementation.
IoT Edge: Microsoft’s IoT edge computing platform.
AWS IoT: Amazon’s IoT platform with CoAP support.
Testing
The testing strategy for the CoAP gateway will include:
- Code Generation Tests: Verify
protoc-gen-go-coapplugin generates correct client interfaces, path constants, and marshaling code. Test with various protobuf service definitions. - Unit Tests: Test individual adapter components (DTLS authentication, request unmarshaling, error mapping, response marshaling).
- Integration Tests: End-to-end workflow tests using generated CoAP client, covering all Gateway service methods (endorse, submit, evaluate, commit-status, events).
- Security Tests: Verify dual-certificate validation (DTLS handshake with transport cert, SignedProposal validation with signing cert). Test certificate revocation, expiration, and invalid scenarios.
- Performance Tests: Load and stress tests comparing CoAP adapter overhead vs. direct gRPC. Test concurrent connection handling and DTLS handshake performance.
- IoT Device Testing: Tests with real constrained devices to validate memory usage and protocol compatibility.
Unresolved Questions
Performance Benchmarks: What are the performance characteristics of the CoAP adapter compared to direct gRPC? What is the overhead of the in-process protocol translation?
Monitoring: How should CoAP connections be monitored and debugged? Should metrics be integrated into existing peer metrics endpoints?
Implementation Plan
The implementation plan is divided into phases:
Phase 1: Code Generation and Core Infrastructure
- Develop
protoc-gen-go-coapplugin for fabric-protos - Integrate plugin into
buf.gen.yamlconfiguration - Generate initial
gateway_coap.pb.gowith client interfaces and path constants - Implement basic CoAP adapter structure in
fabric/internal/peer/gateway/coap/ - Implement dual-certificate DTLS authentication
- Documentation for client generation and certificate provisioning
Phase 2: Transaction Operations
- Implement CoAP-to-gRPC adapter handlers (endorse, submit, evaluate, commit-status)
- Integrate two-stage validation (DTLS cert + signing cert)
- Add error mapping from gRPC to CoAP response codes
- End-to-end testing with generated client
- Performance benchmarking
Phase 3: Event Streaming and Advanced Features
- Implement CoAP Observe for chaincode events
- Event streaming optimization
- Monitoring and metrics integration
- Load testing and optimization
- Security audit
- Production deployment guides
References
CoAP Protocol Specifications:
- RFC 7252 - The Constrained Application Protocol (CoAP)
- RFC 7641 - Observing Resources in the Constrained Application Protocol (CoAP)
- RFC 6347 - Datagram Transport Layer Security Version 1.2
Hyperledger Fabric:
- Hyperledger Fabric Gateway Documentation
- Hyperledger Fabric Certificate Authority Documentation
- fabric-protos Repository and Build Pipeline
Protocol Buffers and Code Generation:
- Protocol Buffers Documentation
- protoc Plugin Development Guide
- protogen Package (google.golang.org/protobuf/compiler/protogen)
CoAP Implementations:
- go-coap Library (github.com/plgd-dev/go-coap)
- Eclipse Californium (Java CoAP Framework)
- libcoap (C CoAP Library)
Security Models:
- X.509 Certificate Best Practices for IoT
- DTLS 1.2/1.3 Implementation Guidelines
- Principle of Least Privilege in Certificate Management