hyperledger/fabric · error

reading config block: %s

Error message

reading config block: %s

What it means

osnadmin wraps any failure to read the file given via --configBlock with this error. os.ReadFile errors (missing file, bad permissions, is-a-directory) are surfaced with their underlying message appended via %s, so the CLI fails fast before validating the block.

Source

Thrown at cmd/osnadmin/main.go:111

			return "", 1, fmt.Errorf("reading orderer CA certificate: %s", err)
		}
		if !caCertPool.AppendCertsFromPEM(caFilePEM) {
			return "", 1, errors.New("failed to add ca-file PEM to cert pool")
		}

		tlsClientCert, err = tls.LoadX509KeyPair(*clientCert, *clientKey)
		if err != nil {
			return "", 1, fmt.Errorf("loading client cert/key pair: %s", err)
		}
	} else { // TLS disabled
		osnURL = fmt.Sprintf("http://%s", *orderer)
	}

	var marshaledConfigBlock []byte
	if *configBlockPath != "" {
		marshaledConfigBlock, err = os.ReadFile(*configBlockPath)
		if err != nil {
			return "", 1, fmt.Errorf("reading config block: %s", err)
		}

		err = validateBlockChannelID(marshaledConfigBlock, *joinChannelID)
		if err != nil {
			return "", 1, err
		}
	}

	var marshaledConfigEnvelope []byte
	if *configUpdateEnvelopePath != "" {
		marshaledConfigEnvelope, err = os.ReadFile(*configUpdateEnvelopePath)
		if err != nil {
			return "", 1, fmt.Errorf("reading config updte envelope: %s", err)
		}

		err = validateEnvelopeChannelID(marshaledConfigEnvelope, *updateChannelID)
		if err != nil {
			return "", 1, err

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Verify the path passed to --configBlock exists and is readable (ls -l / cat the file).
  2. Use an absolute path instead of a relative one.
  3. Check file permissions or run as a user with access.
  4. Regenerate the config block if it was deleted or moved.

Example fix

// before
osnadmin channel join --channelID mychannel --configBlock ./block.pb
// after
osnadmin channel join --channelID mychannel --configBlock /absolute/path/to/config.block
Defensive patterns

Strategy: validation

Validate before calling

path := "./mychannel.block"
if _, err := os.Stat(path); err != nil {
    return fmt.Errorf("config block %s not accessible: %w", path, err)
}
if _, err := os.ReadFile(path); err != nil {
    return fmt.Errorf("config block %s unreadable: %w", path, err)
}

Type guard

func fileReadable(path string) bool {
    f, err := os.Open(path)
    if err != nil { return false }
    f.Close()
    return true
}

Try / catch

if err := runOsnadmin(); err != nil {
    if strings.Contains(err.Error(), "reading config block:") {
        log.Fatalf("check --configBlock path: %v", err)
    }
}

Prevention

When it happens

Trigger: Running `osnadmin channel join` with a --configBlock path that does not exist, is unreadable due to file permissions, or points to a directory rather than a file.

Common situations: Wrong working directory, typo in the block file path, config block generated in another container/host not mounted, or insufficient read permissions.

Understand the failure class

Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.

Related errors


AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04). Data as JSON: /api/errors/25d0d12204b82c0e. Report an issue: GitHub.