SNIP-05: Miner & Pool Identity

Status

Draft

Abstract

This specification defines identity events for participants in the Sharenote mining ecosystem. Two distinct event kinds allow miners and pool operators to publish their profiles, chain addresses, and operational parameters over Nostr.

1. Miner Identity (Kind 10520)

A miner publishes a single replaceable event declaring which chain addresses they control. This allows pools, dashboards, and settlement systems to discover where to send payouts.

Content: Empty string.

Tag Structure:

TagFormatRequiredDescription
a["a", "<chain_id>", "<address>"]YesChain address binding. Hex-encoded chain ID and the miner’s receiving address. One or more a tags allowed.
payout["payout", "<scheme>"]NoMiner’s preferred payout scheme (e.g., "pplns", "pps").

Multi-Chain Support

A miner operating on multiple chains publishes a single event containing multiple a tags, one for each chain.

Example (Multi-chain miner):

{
  "kind": 10520,
  "content": "",
  "tags": [
    ["a", "15", "fc1q0vw9cmzqqc3vxfhd7m4zcqf8n82s9gsmagr02a"],
    ["a", "01", "bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq"],
    ["payout", "pplns"]
  ]
}

2. Pool Identity (Kind 10521)

A pool operator publishes a single replaceable event declaring their pool profile, accepted chains with fee schedules, supported payout schemes, and operational parameters.

Content: Optional JSON object following the NIP-01 set_metadata convention (name, about, picture, website).

Tag Structure:

TagFormatRequiredDescription
a["a", "<chain_id>", "<address>", "<fee_bps>"]YesChain address with pool fee in basis points (1 bps = 0.01%). One or more a tags allowed.
payout["payout", "<scheme>", "<key:value>", ...]YesSupported payout scheme (e.g., pps, pplns, prop, solo).
sharenote["sharenote", "<min_label>"]NoMinimum accepted sharenote denomination floor (e.g., "30z00").
threshold["threshold", "<chain_id>", "<amount>"]NoMinimum payout threshold in satoshis.

Supported Payout Schemes

SchemeIDDescriptionParameters
Pay Per ShareppsFixed payment per valid share.
PPLNSpplnsProportional to shares in a sliding window.n:<window_size>
ProportionalpropSimple proportional split of block reward.
SolosoloMiner receives full block reward (infrastructure only).

Example (Multi-chain PPLNS pool):

{
  "kind": 10521,
  "content": "{\"name\":\"AlphaPool\",\"website\":\"https://alphapool.io\"}",
  "tags": [
    ["a", "15", "fc1qpoolalpha...", "150"],
    ["a", "01", "bc1qpoolalpha...", "200"],
    ["payout", "pplns", "n:10000"],
    ["sharenote", "30z00"],
    ["threshold", "15", "100000"]
  ]
}

3. Validation Rules

  1. Miner Identity (10520): At least one a tag MUST be present. Each MUST contain exactly 3 elements.
  2. Pool Identity (10521): At least one a tag and one payout tag MUST be present. a tags MUST contain exactly 4 elements.
  3. Chain IDs: MUST be valid hex strings (e.g., "15" for chain 21).
  4. Uniqueness: Duplicate chain IDs within a single event are NOT allowed.

Rationale

Using replaceable events (10000–19999) ensures that users only ever need to discover the latest identity for a given pubkey. Moving the accounting and identity logic to Nostr eliminates the need for miners to trust centralized pool dashboards.

Vibe Coding Integration

Builders do not need to manually parse or construct identity arrays. By invoking npx skills add soprinter/skills, your AI assistant natively understands the identity schemas outlined in this specification.

Read the official Vibe Coding Integration Guide