docs: private void handleInit(ChaincodeMessage message) {
          new Thread(() -> {
              try {
  
                  // Get the function and args from Payload
                  final ChaincodeInput input = ChaincodeInput.parseFrom(message.getPayload());
  
                  // Mark as a transaction (allow put/del state)
                  markIsTransaction(message.getChannelId(), message.getTxid(), true);
  
                  // Create the ChaincodeStub which the chaincode can use to
                  // callback
                  final ChaincodeStub stub = new ChaincodeStubImpl(message.getChannelId(), message.getTxid(), this, input.getArgsList(), message.getProposal());
  
                  // Call chaincode's init
                  final Chaincode.Response result = chaincode.init(stub);
  
                  if (result.getStatus().getCode() >= Chaincode.Response.Status.INTERNAL_SERVER_ERROR.getCode()) {
                      // Send ERROR with entire result.Message as payload
                      logger.severe(format("[%-8.8s] Init failed. Sending %s", message.getTxid(), ERROR));
                      queueOutboundChaincodeMessage(newErrorEventMessage(message.getChannelId(), message.getTxid(), result.getMessage(), stub.getEvent()));
                  } else {
                      // Send COMPLETED with entire result as payload
                      if (logger.isLoggable(Level.FINE)) {
                          logger.fine(format(format("[%-8.8s] Init succeeded. Sending %s", message.getTxid(), COMPLETED)));
                      }
                      queueOutboundChaincodeMessage(newCompletedEventMessage(message.getChannelId(), message.getTxid(), result, stub.getEvent()));
                  }
              } catch (InvalidProtocolBufferException | RuntimeException e) {
                  logger.severe(format("[%-8.8s] Init failed. Sending %s: %s", message.getTxid(), ERROR, e));
                  queueOutboundChaincodeMessage(newErrorEventMessage(message.getChannelId(), message.getTxid(), e));
              } finally {
                  // delete isTransaction entry
                  deleteIsTransaction(message.getChannelId(), message.getTxid());
              }
          }).start();
      }