PR #992proposed changes toZIP 325

Support multi-paragraph notes and warnings in Markdown

Draftby daira · updated 2025-06-10zips/zip-0325.md @ 34ceb8f532 · upstream 4699a8d518view on GitHub ↗

Unofficial preview — the proposed text below is rendered from the pull request head and is not part of the canonical ZIP set.

Terminology

The key words "MUST NOT", "SHOULD", and "MAY" in this document are to be interpreted as described in BCP 14 1 when, and only when, they appear in all capitals.

Abstract

This ZIP specifies the key tree for Account Metadata Keys. These are derived from the same seed as a ZIP 32 2 account, and can be used by wallets to derive encryption keys for local / off-chain metadata.

Motivation

A wallet's main data source is the Zcash chain: from this it can detect notes received by an account, determine whether those notes are spent, build witnesses for spending, recover on-chain memo data, and so on. However, wallets also generate significant quantities of off-chain metadata as they are used, such as:

  • Local annotations about transactions in the wallet.
  • Mappings between Zcash addresses and user-meaningful recipient names.
  • The exchange rate from ZEC to another currency that was used to determine how much ZEC to send in a payment.

This metadata is valuable to users, and highly desirable to ensure to be backed up. If the user's device is wiped or lost and the user recovers their wallet from a backed-up mnemonic phrase, they will lose all of this metadata if it is not stored somewhere.

For other kinds of mobile device data, it is expected by users that their device's normal backup storage will have saved (most of) their data, such that access to e.g. the associated Apple or Google account will be sufficient for data recovery. However, metadata such as mappings between Zcash addresses and recipient names can be particularly sensitive, meaning that users may not want these to be backed up unencrypted in their device's normal backup storage. Similarly, the inability to alter on-chain data means that permanently storing metadata in transaction memo fields may also not be an option.

Additionally, it is currently the case that users only need to back up a single secret (a mnemonic seed phrase), once, in order to recover all information for accounts derived from that secret. If metadata were encrypted using independent key material, these keys would also need to be backed up, leading to fragility of wallet restoration.

Requirements

  • The user should not need to update their existing backups of secret material.
  • It should be possible to store metadata about accounts for which we don't control spend authority (i.e. imported UFVKs).
  • The key tree must be future-extensible.

Specification

Metadata key tree

This ZIP registers the following ZIP 32 Registered Key Derivation 3 tree:

  • 𝖢𝗈𝗇𝗍𝖾𝗑𝗍𝖲𝗍𝗋𝗂𝗇𝗀=“𝙼𝚎𝚝𝚊𝚍𝚊𝚝𝚊𝙺𝚎𝚢𝚜”
  • 𝖹𝗂𝗉𝖭𝗎𝗆𝖻𝖾𝗋=325

The tree has the following general structure, specified in more detail below:

  • m𝗆𝖾𝗍𝖺𝖽𝖺𝗍𝖺: Metadata Key tree
    • m𝗆𝖾𝗍𝖺𝖽𝖺𝗍𝖺/325′/𝖼𝗈𝗂𝗇𝖳𝗒𝗉𝖾′/𝖺𝖼𝖼𝗈𝗎𝗇𝗍′ - Account Metadata Key
      • …/0′ - Account-level Inherent Metadata Key
        • …/… - (Reserved for future updates to this ZIP)
        • …/(𝟶𝚡𝟽𝙵𝙵𝙵𝙵𝙵𝙵𝙵′,𝖯𝗋𝗂𝗏𝖺𝗍𝖾𝖴𝗌𝖾𝖲𝗎𝖻𝗃𝖾𝖼𝗍) - Private-use Inherent Metadata Key
      • …/1′ - Account-level External Metadata Key
        • …/(0′,𝖥𝖵𝖪𝖳𝗒𝗉𝖾𝖽𝖨𝗍𝖾𝗆) - Imported UFVK Metadata Key
          • …/… - (Reserved for future updates to this ZIP)
          • …/(𝟶𝚡𝟽𝙵𝙵𝙵𝙵𝙵𝙵𝙵′,𝖯𝗋𝗂𝗏𝖺𝗍𝖾𝖴𝗌𝖾𝖲𝗎𝖻𝗃𝖾𝖼𝗍) - Private-use External Metadata Key
        • …/… - (Reserved for future updates to this ZIP)
      • …/… - (Reserved for future updates to this ZIP)

Non-leaf keys in the key tree MUST NOT be used directly to encrypt metadata. Encryption keys are leaves in this key tree. The sole exception to this is private-use keys (for which part of their key derivation is outside the scope of this specification): encryption keys MAY be derived from the private-use key leaves.

Account Metadata Key

The Account Metadata Key is the root of a subtree that corresponds to a ZIP 32 account represented elsewhere in the overall tree. It is derived from the seed 𝖲 as:

𝖠𝖼𝖼𝗈𝗎𝗇𝗍𝖬𝖾𝗍𝖺𝖽𝖺𝗍𝖺𝖪𝖾𝗒=𝖢𝖪𝖣𝗋𝖾𝗀(𝖢𝖪𝖣𝗋𝖾𝗀(𝖱𝖾𝗀𝖪𝖣(“𝙼𝚎𝚝𝚊𝚍𝚊𝚝𝚊𝙺𝚎𝚢𝚜”,𝖲,325),𝖼𝗈𝗂𝗇𝖳𝗒𝗉𝖾,[]),𝖺𝖼𝖼𝗈𝗎𝗇𝗍,[])

or, in path notation:

m_metadata / 325' / coin_type' / account'

Inherent metadata keys

The Account-level Inherent Metadata Key's subtree contains keys used for metadata associated with the Account Metadata Key's corresponding account. The key is derived as:

𝖢𝖪𝖣𝗋𝖾𝗀(𝖠𝖼𝖼𝗈𝗎𝗇𝗍𝖬𝖾𝗍𝖺𝖽𝖺𝗍𝖺𝖪𝖾𝗒,0,[])

External metadata keys

The Account-level External Metadata Key's subtree contains keys used for metadata associated with imported UFVKs. Unlike the inherent metadata keys which can leverage the inherent domain separation provided by the account index, here domain separation between metadata keys is provided by the UFVKs themselves.

As UFVKs may in general change over time (due to the inclusion of new higher-preference FVK items, or removal of older deprecated FVK items), there is no guarantee that the exact same set of FVK items will be present at both backup creation time and recovery time. Instead, the most preferred FVK item within a UFVK is used as the domain in which keys can be generated, and the Imported UFVK Metadata Key is derived as:

𝖢𝖪𝖣𝗋𝖾𝗀(𝖢𝖪𝖣𝗋𝖾𝗀(𝖠𝖼𝖼𝗈𝗎𝗇𝗍𝖬𝖾𝗍𝖺𝖽𝖺𝗍𝖺𝖪𝖾𝗒,1,[]),0,𝖥𝖵𝖪𝖳𝗒𝗉𝖾𝖽𝖨𝗍𝖾𝗆)

where 𝖥𝖵𝖪𝖳𝗒𝗉𝖾𝖽𝖨𝗍𝖾𝗆 is the encoding of the most preferred FVK item within the ZIP 316 raw encoding of a UFVK. 4

Usage of the Imported UFVK Metadata Key trees SHOULD follow ZIP 316 preference order: 4

  • For encryption-like usage, the key tree corresponding to the most preferred FVK item within a UFVK SHOULD be used.
  • For decryption-like usage, each key tree SHOULD be tried in preference order until metadata can be recovered. If metadata is recovered via an FVK item that is not the most preferred, wallets SHOULD update their metadata backups by re-encrypting the metadata using the key tree corresponding to the most preferred FVK item.

Standardised metadata protocols

The following metadata protocols have been standardised:

  • None at time of writing.

The remaining range of child indices from 0 to 𝟶𝚡𝟽𝙵𝙵𝙵𝙵𝙵𝙵𝙴 inclusive are reserved for future updates to this ZIP. Wallet developers can propose new standardised metadata protocols by writing a 2000-series ZIP that specifies the protocol as an update to this ZIP.

Private-use metadata keys

In some contexts there is a need for deriving ad-hoc key trees for private use by wallets, without ecosystem coordination and without any kind of compatibility guarantees. This ZIP reserves child index 𝟶𝚡𝟽𝙵𝙵𝙵𝙵𝙵𝙵𝙵 (the maximum valid hardened child index) within its key tree for this purpose.

  • Let K be either the Account-level Inherent Metadata Key, or an Imported UFVK Metadata Key.
  • Let 𝖯𝗋𝗂𝗏𝖺𝗍𝖾𝖴𝗌𝖾𝖲𝗎𝖻𝗃𝖾𝖼𝗍 be a globally unique non-empty sequence of at most 252 bytes that identifies the desired private-use context.
  • Return 𝖢𝖪𝖣𝗋𝖾𝗀(K,𝟶𝚡𝟽𝙵𝙵𝙵𝙵𝙵𝙵𝙵,𝖯𝗋𝗂𝗏𝖺𝗍𝖾𝖴𝗌𝖾𝖲𝗎𝖻𝗃𝖾𝖼𝗍)

It is the responsibility of wallet developers to ensure that they do not use colliding 𝖯𝗋𝗂𝗏𝖺𝗍𝖾𝖴𝗌𝖾𝖲𝗎𝖻𝗃𝖾𝖼𝗍 values, and to analyse their private use for any security risks related to potential cross-protocol attacks (in the event that two wallet developers happen to select a colliding 𝖯𝗋𝗂𝗏𝖺𝗍𝖾𝖴𝗌𝖾𝖲𝗎𝖻𝗃𝖾𝖼𝗍).

Wallet developers that are unwilling to accept these risks SHOULD propose new standardised metadata protocols instead, to benefit from ecosystem coordination and review.

Zashi uses the string “𝚖𝚎𝚝𝚊𝚍𝚊𝚝𝚊” for one of its 𝖯𝗋𝗂𝗏𝖺𝗍𝖾𝖴𝗌𝖾𝖲𝗎𝖻𝗃𝖾𝖼𝗍 use cases. This is an example of a bad choice of private-use name, since it does not include a wallet-specific prefix such as “𝚉𝚊𝚜𝚑𝚒”, or a version number.

Reference implementation

References

Footnotes

  1. Information on BCP 14 — "RFC 2119: Key words for use in RFCs to Indicate Requirement Levels" and "RFC 8174: Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words" ↩

  2. ZIP 32: Shielded Hierarchical Deterministic Wallets ↩

  3. ZIP 32: Shielded Hierarchical Deterministic Wallets, Section: Registered key derivation ↩

  4. ZIP 316: Unified Addresses and Unified Viewing Keys ↩ ↩2

Changes

rendered/css/style.css +35 −12
@@ -122,6 +122,10 @@ background-color: #6060e0; color: #ffffff; } + div.note-cont + p { + background-color: #6060e0; + color: #ffffff; + } aside.note::before { background-color: #3030e0; } @@ -138,6 +142,11 @@ color: #ffffff; font-weight: 700; } + div.warning-cont + p { + background-color: #e08060; + color: #ffffff; + font-weight: 700; + } aside.warning::before { background-color: #e05030; font-weight: 800; @@ -152,9 +161,15 @@ div.note + p > a, a:visited { color: #50e7f4; } + div.note-cont + p > a, a:visited { + color: #50e7f4; + } div.warning + p > a, a:visited { color: #50e7f4; } + div.warning-cont + p > a, a:visited { + color: #50e7f4; + } aside > p > a:hover { color: #90ffff; } @@ -181,16 +196,32 @@ aside { } div.note + p { padding-top: 4.4rem; - padding-left: 0.15rem; - padding-right: 0.15rem; + padding-left: 1rem; + padding-right: 1rem; + padding-bottom: 1.4rem; + margin-top: -2.25rem; + margin-bottom: 1.5rem; +} +div.note-cont + p { + padding-top: 1rem; + padding-left: 1rem; + padding-right: 1rem; padding-bottom: 1.4rem; margin-top: -2.25rem; margin-bottom: 1.5rem; } div.warning + p { padding-top: 4.4rem; - padding-left: 0.15rem; - padding-right: 0.15rem; + padding-left: 1rem; + padding-right: 1rem; + padding-bottom: 1.4rem; + margin-top: -2.25rem; + margin-bottom: 1.5rem; +} +div.warning-cont + p { + padding-top: 1rem; + padding-left: 1rem; + padding-right: 1rem; padding-bottom: 1.4rem; margin-top: -2.25rem; margin-bottom: 1.5rem; @@ -245,14 +276,6 @@ aside > p { padding-left: 1rem; padding-right: 1rem; } -div.note + p { - padding-left: 1rem; - padding-right: 1rem; -} -div.warning + p { - padding-left: 1rem; - padding-right: 1rem; -} @font-face { font-family: robotolight;
rendered/zip-0325.html +6 −3
@@ -202,13 +202,16 @@ <h2 id="private-usemetadatakeys"><span class="section-heading">Private-use metad <li>Return <span class="math">\(\mathsf{CKDreg}(K, \mathtt{0x7FFFFFFF}, \mathsf{PrivateUseSubject})\)</span></li> </ul> -<div class=warning></div> +<div class="warning"></div> <p>It is the responsibility of wallet developers to ensure that they do not use colliding <span class="math">\(\mathsf{PrivateUseSubject}\)</span> values, and to analyse their private use for any security risks related to potential cross-protocol attacks (in the event that -two wallet developers happen to select a colliding <span class="math">\(\mathsf{PrivateUseSubject}\)</span>). -Wallet developers that are unwilling to accept these risks SHOULD propose new +two wallet developers happen to select a colliding <span class="math">\(\mathsf{PrivateUseSubject}\)</span>).</p> + +<div class="warning-cont"></div> + +<p>Wallet developers that are unwilling to accept these risks SHOULD propose new standardised metadata protocols instead, to benefit from ecosystem coordination and review.</p>
rendered/zip-guide-markdown.html +17 −9
@@ -168,21 +168,29 @@ <h2 id="notesandwarnings"><span class="section-heading">Notes and warnings</span <div class="note"></div> -<p>&#8220;<code>.. note::</code>&#8221; in reStructuredText or &#8220;<code>&lt;div class=&quot;note&quot;&gt;&lt;/div&gt;</code>&#8221; in Markdown -(followed by a blank line in either case), can be used for an aside from the main -text. The rendering of notes is colourful and may be distracting, so they should +<p>&#8220;<code>.. note::</code>&#8221; in reStructuredText, or &#8220;<code>&lt;div class=&quot;note&quot;&gt;&lt;/div&gt;</code>&#8221; followed by a +blank line in Markdown, can be used for an aside from the main text.</p> + +<div class="note-cont"></div> + +<p>The rendering of notes is colourful and may be distracting, so they should only be used for important points.</p> <div class="warning"></div> -<p>&#8220;<code>.. warning::</code>&#8221; in reStructuredText or &#8220;<code>&lt;div class=&quot;warning&quot;&gt;&lt;/div&gt;</code>&#8221; in -Markdown (followed by a blank line in either case), can be used for warnings. -Warnings should be used very sparingly — for example to signal that a +<p>&#8220;<code>.. warning::</code>&#8221; in reStructuredText, or &#8220;<code>&lt;div class=&quot;warning&quot;&gt;&lt;/div&gt;</code>&#8221; followed +by a blank line in Markdown, can be used for warnings.</p> + +<div class="warning-cont"></div> + +<p>Warnings should be used very sparingly — for example to signal that a entire specification, or part of it, may be inapplicable or could cause significant interoperability or security problems. In most cases, a &#8220;MUST&#8221; or &#8220;SHOULD&#8221; conformance requirement is more appropriate.</p> -<p>In Markdown, notes and warnings can currently only be a single paragraph.</p> +<p>In Markdown, notes and warnings can be extended across multiple paragraphs by +using &#8220;<code>&lt;div class=&quot;note-cont&quot;&gt;&lt;/div&gt;</code>&#8221; or &#8220;<code>&lt;div class=&quot;warning-cont&quot;&gt;&lt;/div&gt;</code>&#8221; +(preceded and followed by a blank line) between paragraphs.</p> <h2 id="validmarkup"><span class="section-heading">Valid markup</span><span class="section-anchor"> <a rel="bookmark" href="#validmarkup"><img width="24" height="24" class="section-anchor" src="assets/images/section-anchor.png" alt=""></a></span></h2> @@ -219,9 +227,9 @@ <h2 id="citationsandreferences"><span class="section-heading">Citations and refe <pre><code class="rst">.. [#snark] `The Hunting of the Snark &lt;<a href="https://www.gutenberg.org/files/29888/29888-h/29888-h.htm">https://www.gutenberg.org/files/29888/29888-h/29888-h.htm</a>&gt;_. Lewis Carroll, with illustrations by Henry Holiday. MacMillan and Co. London. March 29, 1876. </code></pre> -<p>or like this in Markdown::</p> +<p>or like this in Markdown:</p> -<pre><code class="markdown">[^snark] [The Hunting of the Snark](https://www.gutenberg.org/files/29888/29888-h/29888-h.htm). Lewis Carroll, with illustrations by Henry Holiday. MacMillan and Co. London. March 29, 1876. +<pre><code class="markdown">[^snark]: [The Hunting of the Snark](https://www.gutenberg.org/files/29888/29888-h/29888-h.htm). Lewis Carroll, with illustrations by Henry Holiday. MacMillan and Co. London. March 29, 1876. </code></pre> <p>Note that each entry must be on a single line regardless of how long that makes the
rendered/zip-guide.html +4 −4
@@ -91,14 +91,14 @@ </section> <section id="notes-and-warnings"><h3><span class="section-heading">Notes and warnings</span><span class="section-anchor"> <a rel="bookmark" href="#notes-and-warnings"><img width="24" height="24" class="section-anchor" src="assets/images/section-anchor.png" alt=""></a></span></h3> <aside class="note"> - <p>"<code>.. note::</code>" in reStructuredText or "<code>&lt;div class="note"&gt;&lt;/div&gt;</code>" in Markdown (followed by a blank line in either case), can be used for an aside from the main text.</p> + <p>"<code>.. note::</code>" in reStructuredText, or "<code>&lt;div class="note"&gt;&lt;/div&gt;</code>" followed by a blank line in Markdown, can be used for an aside from the main text.</p> <p>The rendering of notes is colourful and may be distracting, so they should only be used for important points.</p> </aside> <aside class="warning"> - <p>"<code>.. warning::</code>" in reStructuredText, or "<code>&lt;div class="warning"&gt;&lt;/div&gt;</code>" in Markdown (followed by a blank line in either case), can be used for warnings.</p> + <p>"<code>.. warning::</code>" in reStructuredText, or "<code>&lt;div class="warning"&gt;&lt;/div&gt;</code>" followed by a blank line in Markdown, can be used for warnings.</p> <p>Warnings should be used very sparingly — for example to signal that a entire specification, or part of it, may be inapplicable or could cause significant interoperability or security problems. In most cases, a "MUST" or "SHOULD" conformance requirement is more appropriate.</p> </aside> - <p>In Markdown, notes and warnings can currently only be a single paragraph.</p> + <p>In Markdown, notes and warnings can be extended across multiple paragraphs by using "<code>&lt;div class="note-cont"&gt;&lt;/div&gt;</code>" or "<code>&lt;div class="warning-cont"&gt;&lt;/div&gt;</code>" (preceded and followed by a blank line) between paragraphs.</p> </section> <section id="valid-markup"><h3><span class="section-heading">Valid markup</span><span class="section-anchor"> <a rel="bookmark" href="#valid-markup"><img width="24" height="24" class="section-anchor" src="assets/images/section-anchor.png" alt=""></a></span></h3> <p>This is optional before publishing a PR, but to check whether a document is valid reStructuredText or Markdown, first install <code>docutils</code> and <code>rst2html5</code>, and build <code>MultiMarkdown-6</code>. E.g. on Debian-based distros:</p> @@ -119,7 +119,7 @@ <p>The corresponding entry in the <a href="#references">References</a> section should look like this in reStructuredText:</p> <pre>.. [#snark] `The Hunting of the Snark &lt;<a href="https://www.gutenberg.org/files/29888/29888-h/29888-h.htm">https://www.gutenberg.org/files/29888/29888-h/29888-h.htm</a>&gt;`_. Lewis Carroll, with illustrations by Henry Holiday. MacMillan and Co. London. March 29, 1876.</pre> <p>or like this in Markdown:</p> - <pre>[^snark] [The Hunting of the Snark](https://www.gutenberg.org/files/29888/29888-h/29888-h.htm). Lewis Carroll, with illustrations by Henry Holiday. MacMillan and Co. London. March 29, 1876.</pre> + <pre>[^snark]: [The Hunting of the Snark](https://www.gutenberg.org/files/29888/29888-h/29888-h.htm). Lewis Carroll, with illustrations by Henry Holiday. MacMillan and Co. London. March 29, 1876.</pre> <p>Note that each entry must be on a single line regardless of how long that makes the line. In Markdown there must be a blank line between entries.</p> <p>The current rendering of a Markdown ZIP reorders the references according to their first use; the rendering of a reStructuredText ZIP keeps them in the same order as in the References section.</p> <p>To link to another section of the same ZIP, use "<code>`Section title`_</code>" in reStructuredText, or "<code>[Section title]</code>" in Markdown.</p>
zips/zip-0325.md +4 −1
@@ -171,12 +171,15 @@ valid hardened child index) within its key tree for this purpose. most 252 bytes that identifies the desired private-use context. - Return $\mathsf{CKDreg}(K, \mathtt{0x7FFFFFFF}, \mathsf{PrivateUseSubject})$ -<div class=warning></div> +<div class="warning"></div> It is the responsibility of wallet developers to ensure that they do not use colliding $\mathsf{PrivateUseSubject}$ values, and to analyse their private use for any security risks related to potential cross-protocol attacks (in the event that two wallet developers happen to select a colliding $\mathsf{PrivateUseSubject}$). + +<div class="warning-cont"></div> + Wallet developers that are unwilling to accept these risks SHOULD propose new standardised metadata protocols instead, to benefit from ecosystem coordination and review.
zips/zip-guide-markdown.md +16 −8
@@ -158,21 +158,29 @@ ZIP editors will catch any inconsistencies in review. <div class="note"></div> -"`.. note::`" in reStructuredText or "`<div class="note"></div>`" in Markdown -(followed by a blank line in either case), can be used for an aside from the main -text. The rendering of notes is colourful and may be distracting, so they should +"`.. note::`" in reStructuredText, or "`<div class="note"></div>`" followed by a +blank line in Markdown, can be used for an aside from the main text. + +<div class="note-cont"></div> + +The rendering of notes is colourful and may be distracting, so they should only be used for important points. <div class="warning"></div> -"`.. warning::`" in reStructuredText or "`<div class="warning"></div>`" in -Markdown (followed by a blank line in either case), can be used for warnings. +"`.. warning::`" in reStructuredText, or "`<div class="warning"></div>`" followed +by a blank line in Markdown, can be used for warnings. + +<div class="warning-cont"></div> + Warnings should be used very sparingly — for example to signal that a entire specification, or part of it, may be inapplicable or could cause significant interoperability or security problems. In most cases, a "MUST" or "SHOULD" conformance requirement is more appropriate. -In Markdown, notes and warnings can currently only be a single paragraph. +In Markdown, notes and warnings can be extended across multiple paragraphs by +using "`<div class="note-cont"></div>`" or "`<div class="warning-cont"></div>`" +(preceded and followed by a blank line) between paragraphs. ## Valid markup @@ -207,9 +215,9 @@ reStructuredText: .. [#snark] `The Hunting of the Snark <https://www.gutenberg.org/files/29888/29888-h/29888-h.htm>_. Lewis Carroll, with illustrations by Henry Holiday. MacMillan and Co. London. March 29, 1876. ``` -or like this in Markdown:: +or like this in Markdown: ```markdown -[^snark] [The Hunting of the Snark](https://www.gutenberg.org/files/29888/29888-h/29888-h.htm). Lewis Carroll, with illustrations by Henry Holiday. MacMillan and Co. London. March 29, 1876. +[^snark]: [The Hunting of the Snark](https://www.gutenberg.org/files/29888/29888-h/29888-h.htm). Lewis Carroll, with illustrations by Henry Holiday. MacMillan and Co. London. March 29, 1876. ``` Note that each entry must be on a single line regardless of how long that makes the
zips/zip-guide.rst +7 −6
@@ -167,23 +167,24 @@ Notes and warnings ------------------ .. note:: - "``.. note::``" in reStructuredText or "``<div class="note"></div>``" in - Markdown (followed by a blank line in either case), can be used for an aside - from the main text. + "``.. note::``" in reStructuredText, or "``<div class="note"></div>``" followed + by a blank line in Markdown, can be used for an aside from the main text. The rendering of notes is colourful and may be distracting, so they should only be used for important points. .. warning:: "``.. warning::``" in reStructuredText, or "``<div class="warning"></div>``" - in Markdown (followed by a blank line in either case), can be used for warnings. + followed by a blank line in Markdown, can be used for warnings. Warnings should be used very sparingly — for example to signal that a entire specification, or part of it, may be inapplicable or could cause significant interoperability or security problems. In most cases, a "MUST" or "SHOULD" conformance requirement is more appropriate. -In Markdown, notes and warnings can currently only be a single paragraph. +In Markdown, notes and warnings can be extended across multiple paragraphs by +using "``<div class="note-cont"></div>``" or "``<div class="warning-cont"></div>``" +(preceded and followed by a blank line) between paragraphs. Valid markup ------------ @@ -221,7 +222,7 @@ reStructuredText:: or like this in Markdown:: - [^snark] [The Hunting of the Snark](https://www.gutenberg.org/files/29888/29888-h/29888-h.htm). Lewis Carroll, with illustrations by Henry Holiday. MacMillan and Co. London. March 29, 1876. + [^snark]: [The Hunting of the Snark](https://www.gutenberg.org/files/29888/29888-h/29888-h.htm). Lewis Carroll, with illustrations by Henry Holiday. MacMillan and Co. London. March 29, 1876. Note that each entry must be on a single line regardless of how long that makes the line. In Markdown there must be a blank line between entries.