Skip to main content

Synopsis

cowboy tee submits the CIP-23 §3.8 TEE-verifier system actor (0x05) instructions to a validator. update-collateral and register-key are governance operations and must be signed by a key listed in genesis.system_deployers; verify-cae is how a runner registers by submitting its Composite Attestation Envelope. Each subcommand accepts --private-key and --rpc-url, resolved with key auto-discovery. Every write signs with resource limits from the node’s estimate.

Subcommands

cowboy tee update-collateral

Governance: publish a CollateralSnapshot whose cpu_roots carry the vendor root (for example the AWS Nitro root). Behavior:
  1. Read the DER-encoded root certificate from --root.
  2. Build a minimal snapshot: cpu_roots = [root], effective_at as given, empty tcb_info, qe_identity, crls, nras_root, and allowed_tcb_statuses, and a one-byte placeholder snark_verifying_key.
  3. Sign and submit UpdateCollateral; print the node response and the transaction hash.
Flags: Example:

cowboy tee register-key

Governance: endorse a measurement (the operator root) by registering a trusted key for (tee_type, keccak256(pcr0)). Behavior:
  1. Decode --pcr0 and compute keccak256 of it; that hash is the on-chain measurement index.
  2. Decode --public-key.
  3. Sign and submit RegisterTeeTrustedKey.
Flags: Example:

cowboy tee verify-cae

Runner: register by submitting a Composite Attestation Envelope. Behavior:
  1. Read the D-CBOR CAE bytes from --cae.
  2. Decode --proof; a non-empty proof selects the full (registration) path. The Nitro path ignores its contents.
  3. Parse the three 32-byte hashes, sign, and submit VerifyCae.
Flags: Example:

Edge Cases

  • update-collateral and register-key are rejected on chain unless signed by a genesis.system_deployers key.
  • --job-id, --req-hash, and --result-hash must each decode to exactly 32 bytes.
  • The default --proof ab is a non-empty placeholder, so the full registration path is selected unless you pass an empty proof explicitly.
  • update-collateral publishes a snapshot with only cpu_roots populated; SGX/TDX collateral fields (tcb_info, qe_identity, CRLs) are left empty.