Identity
This page documents the normative V2AddressNative identity model from protocol/SPECIFICATION.md.
Canonical identity
owner_address is the sole canonical account identifier in Makechain V2.
- It is a raw 20-byte EVM-style address.
- Any valid 20-byte address is a valid Makechain principal, even if it has never submitted a message.
- Missing account state means default-zero bookkeeping, not invalid identity.
V2 has no registry-backed account creation, protocol-level ownership transfer, or protocol-level recovery flow.
Delegated protocol keys
Protocol signing keys are Ed25519-only in V2.
Each delegated key is attached to an owner_address and has one of these scopes:
| Scope | Meaning |
|---|---|
OWNER | Highest privilege |
SIGNING | Ordinary account and project administration |
AGENT | Project-scoped automated actions |
AGENT keys may be constrained by allowed_projects. OWNER and SIGNING keys ignore allowed_projects.
Signer management
SIGNER_ADD and SIGNER_REMOVE are the only signer-management paths in V2.
- Both are user-submitted messages with valid Ed25519 envelopes.
- The envelope signer provides transport integrity only.
- Authorization comes from a custody signature that verifies directly against
MessageData.owner_address.
Supported wallet-level custody signature families are:
custody_key_type | Family |
|---|---|
0 | secp256k1 ECDSA |
1 | P256 ECDSA |
2 | WebAuthn P256 |
3 | ERC-1271 |
For ERC-1271, the corresponding custody_block_hash must be present and is bound into the typed data.
App attribution
Every SIGNER_ADD includes app attribution.
request_owner_addressis a 20-byte external wallet address.- It is not a Makechain account lookup key.
request_signatureverifies directly againstrequest_owner_address.- Self-request is represented by
request_owner_address == owner_address.
The typed data is SignerRequest(address requestOwner, bytes32 key, uint64 validAfter, uint64 validBefore, uint32 network).
Typed data
The custody and attribution payloads are address-native in V2:
SignerAdd(address owner, bytes32 key, uint32 scope,
uint64 validAfter, uint64 validBefore,
uint64 nonce, bytes32[] allowedProjects,
uint32 network)
SignerRemove(address owner, bytes32 key,
uint64 validAfter, uint64 validBefore,
uint64 nonce, uint32 network)
SignerRequest(address requestOwner, bytes32 key,
uint64 validAfter, uint64 validBefore,
uint32 network)ERC-1271 variants add bytes32 validationBlockHash and bind the historical Tempo block hash into the signed payload.
External address verification
VERIFICATION_ADD and VERIFICATION_REMOVE link external addresses to an owner_address.
For ETH verification, the proof metadata includes:
claim_key_typeclaim_block_hashwhenclaim_key_type == 3
For SOL verification, the signed challenge string is:
makechain:verify:<network>:<owner_address_hex>owner_address_hex is lowercase hex, exactly 40 characters, with no 0x prefix.
Removed concepts
These do not exist in V2 semantics:
- registry-based account allocation
- onchain registry-based account creation
- protocol-level ownership transfer
- protocol-level recovery
- host-chain-driven identity ingress
- relay-derived signer authorization