diff --git a/Makefile b/Makefile index b47e9bfb..71d90984 100644 --- a/Makefile +++ b/Makefile @@ -49,6 +49,10 @@ index.html: README.rst edithtml.sh README.rst: .zipfilelist.current makeindex.sh README.template $(sort $(wildcard zip-*.rst) $(wildcard zip-*.md)) ./makeindex.sh | cat README.template - >README.rst +.PHONY: linkcheck +linkcheck: protocol/protocol.pdf protocol/canopy.pdf protocol/heartwood.pdf protocol/blossom.pdf protocol/sapling.pdf + ./links_and_dests.py --check $(filter-out $(wildcard draft-*.html),$(wildcard *.html)) protocol/protocol.pdf protocol/canopy.pdf protocol/heartwood.pdf protocol/blossom.pdf protocol/sapling.pdf + .PHONY: clean clean: rm -f .zipfilelist.* README.rst index.html $(addsuffix .html,$(basename $(sort $(wildcard *.rst) $(wildcard *.md)))) diff --git a/links_and_dests.py b/links_and_dests.py new file mode 100755 index 00000000..fa113a74 --- /dev/null +++ b/links_and_dests.py @@ -0,0 +1,220 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from urllib.request import build_opener, HTTPCookieProcessor, HTTPSHandler, Request +from urllib.error import URLError, HTTPError +from os.path import relpath +from collections import deque +import sys +from time import sleep +import ssl +from io import BytesIO + +try: + from bs4 import BeautifulSoup + import html5lib + import certifi +except ImportError: + print("Please install the BeautifulSoup, html5lib, and certifi libraries using `pip install bs4 html5lib certifi`.\n") + raise + +if [int(v) for v in certifi.__version__.split('.')] < [2021, 5, 30]: + print("Please upgrade certifi using `pip install --upgrade certifi`.\n") + sys.exit(1) + +def get_links_and_destinations_from_pdf(f): + try: + from PyPDF2 import PdfFileReader + except ImportError: + print("Please install the PyPDF2 library using `pip install PyPDF2`.\n") + raise + + # Based on + pdf = PdfFileReader(f) + + links = set() + for pg in range(pdf.getNumPages()): + obj = pdf.getPage(pg).getObject() + + for annotation in obj.get('/Annots', []): + uri = annotation.getObject().get('/A', {}).get('/URI', None) + if uri is not None and uri not in links: + links.add(uri) + + dests = pdf.getNamedDestinations().keys() + + return (links, dests) + + +def get_links_and_destinations_from_html(f): + links = set() + internal = set() + dests = set() + + soup = BeautifulSoup(f.read(), "html5lib") + for link in soup.find_all('a'): + if link.has_attr('href'): + url = link['href'] + (internal if url.startswith('#') else links).add(url) + + if link.has_attr('name'): + dests.add(link['name']) + + for link in soup.find_all(id=True): + dests.add(link['id']) + + internal.difference_update(['#' + d for d in dests]) # ignore internal links satisfied by a dest + links.update(internal) + return (links, dests) + + +def main(args): + if len(args) < 2: + print("Usage: ./links_and_dests.py [--check] [--print-dests] ") + return 1 + + check = '--check' in args[1:] + print_dests = '--print-dests' in args[1:] + paths = [arg for arg in args[1:] if not arg.startswith('--')] + + all_links = {} # url -> pdf_paths + all_dests = {} # url -> dests + + errors = deque() + + print("Reading files...") + for path in paths: + print(path, end=" ") + sys.stdout.flush() + + with open(path, 'rb') as f: + if path.endswith(".html") or path.endswith(".xhtml"): + (links, dests) = get_links_and_destinations_from_html(f) + elif path.endswith(".pdf"): + (links, dests) = get_links_and_destinations_from_pdf(f) + else: + errors.append("Unrecognized file type: " + path) + continue + + path = relpath(path) + for l in links: + refs = all_links.get(l, None) + if refs is None: + all_links[l] = refs = deque() + refs.append(path) + + all_dests["https://zips.z.cash/" + path] = dests + if path.endswith(".html"): + all_dests["https://zips.z.cash/" + path[:-5]] = dests + + print("\n") + print("Links:") + + last_url = None + content = None + content_type = None + dests = None + + for (l, p) in sorted(all_links.items()): + print(l, end=" ") + sys.stdout.flush() + what = "%s (occurs in %s)" % (l, " and ".join(p)) if len(paths) > 1 else l + status = "" + + if ":" not in l: + l = "https://zips.z.cash/" + l + + if l.startswith("mailto:"): + status = "(not checked)" + elif l.startswith("https:") or l.startswith("HTTP:"): # use uppercase HTTP: for links with no https: equivalent + (url, _, fragment) = l.partition("#") + + if url in all_dests: + if fragment and fragment not in all_dests[url]: + errors.append("Missing link target: " + what) + status = "❌" + else: + status = "✓" + elif check: + # If url == last_url, there is no need to refetch content. This is an optimization when + # checking URLs with the same site but different fragments (which will be sorted together). + if url != last_url: + headers = {"User-Agent": "Mozilla/5.0"} + https_handler = HTTPSHandler(context=ssl.create_default_context(cafile=certifi.where())) + + # Some DOI links (i.e. to https://doi.org/) redirect to link.springer.com + # in a way that requires cookies (booo!). We allow this for DOI links, + # but for all other links we simulate a client that never sets cookies. + if l.startswith("https://doi.org/"): + opener = build_opener(HTTPCookieProcessor(), https_handler) + else: + opener = build_opener(https_handler) + + for retry in range(2): + try: + response = opener.open(Request(url=l, headers=headers)) + content_type = response.info().get_content_type() + content = response.read() + last_url = url + except URLError as e: + if retry == 0 and isinstance(e, HTTPError) and e.code == 429: + try: + delay = int(e.headers['Retry-After'], 10) + 1 + except Exception: + delay = 60 + + print("(waiting %ds due to rate limiting)" % (delay,), end=" ") + sys.stdout.flush() + sleep(delay) + continue + + errors.append("Could not open link: %s due to %r" % (what, e)) + status = "❌" + content_type = None + content = None + last_url = None + + dests = None + break + + if content is not None: + if fragment: + if dests is None: + if content_type == 'text/html': + (_, dests) = get_links_and_destinations_from_html(BytesIO(content)) + elif content_type == 'application/pdf': + (_, dests) = get_links_and_destinations_from_pdf(BytesIO(content)) + + if dests is None: + print("(link target not checked)", end=" ") + status = "✓" + elif fragment not in dests: + errors.append("Missing link target: " + what) + status = "❌" + else: + status = "✓" + else: + status = "✓" + else: + errors.append("Insecure or unrecognized protocol in link: " + what) + status = "❌" + + print(status) + + if print_dests: + for (path, dests) in all_dests.items(): + if path + ".html" not in all_dests: # avoid duplication + print("\nDestinations for %s:" % (path,)) + for d in dests: + print(d) + + if errors: + print("\nErrors:") + for e in errors: + print(e) + + return 0 + + +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/protocol/Makefile b/protocol/Makefile index ce1def10..51c6b54a 100644 --- a/protocol/Makefile +++ b/protocol/Makefile @@ -39,10 +39,6 @@ endif discard: git checkout -- '*.pdf' -.PHONY: linkcheck -linkcheck: protocol.pdf canopy.pdf heartwood.pdf blossom.pdf sapling.pdf - ./links_and_dests.py --check protocol.pdf canopy.pdf heartwood.pdf blossom.pdf sapling.pdf - .Makefile.uptodate: Makefile $(MAKE) clean touch .Makefile.uptodate diff --git a/protocol/links_and_dests.py b/protocol/links_and_dests.py deleted file mode 100755 index a6242929..00000000 --- a/protocol/links_and_dests.py +++ /dev/null @@ -1,111 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -try: - from PyPDF2 import PdfFileReader -except ImportError: - print("Please install the PyPDF2 library using `pip3 install PyPDF2`.\n") - raise - -from urllib.request import build_opener, HTTPCookieProcessor, Request -from urllib.error import URLError -from os.path import basename -from collections import deque -import sys - -def get_links_and_destinations(f): - # Based on - pdf = PdfFileReader(f) - - links = set() - for pg in range(pdf.getNumPages()): - obj = pdf.getPage(pg).getObject() - - for annotation in obj.get('/Annots', []): - uri = annotation.getObject().get('/A', {}).get('/URI', None) - if uri is not None and uri not in links: - links.add(uri) - - dests = pdf.getNamedDestinations() - - return (links, dests) - - -def main(args): - if len(args) < 2: - print("Usage: ./links_and_dests.py [--check] [--print-dests] ") - return 1 - - check = '--check' in args[1:] - print_dests = '--print-dests' in args[1:] - paths = [arg for arg in args[1:] if not arg.startswith('--')] - - all_links = {} # url -> pdf_paths - all_dests = {} # url -> dests - - for pdf_path in paths: - with open(pdf_path, 'rb') as f: - (links, dests) = get_links_and_destinations(f) - - for l in links: - refs = all_links.get(l, None) - if refs is None: - all_links[l] = refs = deque() - refs.append(pdf_path) - - all_dests["https://zips.z.cash/protocol/" + basename(pdf_path)] = dests - - errors = deque() - - print("Links:") - for (l, p) in sorted(all_links.items()): - print(l, end=" ") - sys.stdout.flush() - what = "%s (occurs in %s)" % (l, " and ".join(p)) if len(paths) > 1 else l - status = "" - - if not l.startswith("https:"): - errors.append("Insecure or unrecognized protocol in link: " + what) - status = "❌" - else: - (url, _, fragment) = l.partition("#") - if url in all_dests: - if fragment and fragment not in all_dests[url]: - errors.append("Missing link target: " + what) - status = "❌" - else: - status = "✓" - elif check: - try: - headers = {"User-Agent": "Mozilla/5.0"} - # Some DOI links (i.e. to https://doi.org/) redirect to link.springer.com - # in a way that requires cookies (booo!). We allow this for DOI links, - # but for all other links we simulate a client that never sets cookies. - if l.startswith("https://doi.org/"): - opener = build_opener(HTTPCookieProcessor()) - else: - opener = build_opener() - response = opener.open(Request(url=l, headers=headers)) - response.read() - status = "✓" - except URLError as e: - errors.append("Could not open link: %s due to %r" % (what, e)) - status = "❌" - - print(status) - - if print_dests: - for dests in all_dests: - print("\nDestinations for %s:" % (dests,)) - for d in dests: - print(d) - - if errors: - print("\nErrors:") - for e in errors: - print(e) - - return 0 - -if __name__ == '__main__': - sys.exit(main(sys.argv)) diff --git a/zip-0000.html b/zip-0000.html index 4ccf0b9e..356652e9 100644 --- a/zip-0000.html +++ b/zip-0000.html @@ -215,20 +215,20 @@ Updates:
  • BSD-2-Clause: OSI-approved BSD 2-clause license
  • BSD-3-Clause: OSI-approved BSD 3-clause license
  • CC0-1.0: Creative Commons CC0 1.0 Universal
  • -
  • GNU-All-Permissive: GNU All-Permissive License
  • -
  • Apache-2.0: Apache License, version 2.0
  • +
  • GNU-All-Permissive: GNU All-Permissive License
  • +
  • Apache-2.0: Apache License, version 2.0
  • In addition, it is RECOMMENDED that literal code included in the ZIP be dual-licensed under the same license terms as the project it modifies. For example, literal code intended for zcashd would ideally be dual-licensed under the MIT license terms as well as one of the above with the rest of the ZIP text.

    Not acceptable licenses

    @@ -291,7 +291,7 @@ Updates: 5 - reStructuredText documentation + reStructuredText documentation diff --git a/zip-0000.rst b/zip-0000.rst index 09e78a71..45d73db4 100644 --- a/zip-0000.rst +++ b/zip-0000.rst @@ -560,9 +560,9 @@ Recommended licenses * CC0-1.0: `Creative Commons CC0 1.0 Universal `__ * GNU-All-Permissive: `GNU All-Permissive - License `__ + License `__ * Apache-2.0: `Apache License, version - 2.0 `__ + 2.0 `__ In addition, it is RECOMMENDED that literal code included in the ZIP be dual-licensed under the same license terms as the project it modifies. @@ -574,19 +574,19 @@ Not recommended, but acceptable licenses ---------------------------------------- * BSL-1.0: `Boost Software License, version - 1.0 `__ + 1.0 `__ * CC-BY-4.0: `Creative Commons Attribution 4.0 International `__ * CC-BY-SA-4.0: `Creative Commons Attribution-ShareAlike 4.0 International `__ * AGPL-3.0+: `GNU Affero General Public License (AGPL), version 3 or - newer `__ + newer `__ * FDL-1.3: `GNU Free Documentation License, version - 1.3 `__ + 1.3 `__ * GPL-2.0+: `GNU General Public License (GPL), version 2 or - newer `__ + newer `__ * LGPL-2.1+: `GNU Lesser General Public License (LGPL), version 2.1 or - newer `__ + newer `__ Not acceptable licenses ----------------------- @@ -632,6 +632,6 @@ References .. [#RFC3552] `RFC 3552: Guidelines for Writing RFC Text on Security Considerations `_ .. [#zip-0200] `ZIP 200: Network Upgrade Mechanism `_ .. [#conduct] `Zcash Code of Conduct `_ -.. [#rst] `reStructuredText documentation `_ +.. [#rst] `reStructuredText documentation `_ .. [#markdown] `The Markdown Guide `_ .. [#latex] `LaTeX — a document preparation system `_ diff --git a/zip-0143.html b/zip-0143.html index 47120f5d..549144ca 100644 --- a/zip-0143.html +++ b/zip-0143.html @@ -378,9 +378,9 @@ sighash: 23652e76cb13b85a0e3363bb5fca061fa791c40c533eccee899364e6e60bb4f7 4 diff --git a/zip-0143.rst b/zip-0143.rst index acb13eb5..2623dd28 100644 --- a/zip-0143.rst +++ b/zip-0143.rst @@ -458,9 +458,9 @@ References .. [#protocol-sproutsend] `Zcash Protocol Specification, Version 2020.1.15. Section 4.6: Sending Notes (Sprout) `_ .. [#wiki-checksig] `OP\_CHECKSIG. Bitcoin Wiki `_ .. [#quadratic] - * `CVE-2013-2292 `_ + * `CVE-2013-2292 `_ * `New Bitcoin vulnerability: A transaction that takes at least 3 minutes to verify `_ - * `The Megatransaction: Why Does It Take 25 Seconds? `_ + * `The Megatransaction: Why Does It Take 25 Seconds? `_ .. [#offline-wallets] `SIGHASH_WITHINPUTVALUE: Super-lightweight HW wallets and offline data `_ .. [#bip-0143] `BIP 143: Transaction Signature Verification for Version 0 Witness Program `_ .. [#buip-HF] `BUIP-HF Digest for replay protected signature verification across hard forks, version 1.2 `_ diff --git a/zip-0155.html b/zip-0155.html index 72b7a998..09d6f0f7 100644 --- a/zip-0155.html +++ b/zip-0155.html @@ -276,7 +276,7 @@ CHECKSUM = H(".onion checksum" || PUBKEY || VERSION)[:2] // first 2 bytes 12 - Cjdns whitepaper: Pulling It All Together + Cjdns whitepaper: Pulling It All Together diff --git a/zip-0155.rst b/zip-0155.rst index 71c8a8c3..910730ac 100644 --- a/zip-0155.rst +++ b/zip-0155.rst @@ -246,4 +246,4 @@ References .. [#Tor-rendezvous-v3] `Tor Rendezvous Specification - Version 3 `_ .. [#NIST-SHA3] `NIST FIPS 202 - SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions `_ .. [#I2P-naming] `I2P: Naming and address book `_ -.. [#Cjdns-whitepaper] `Cjdns whitepaper: Pulling It All Together `_ +.. [#Cjdns-whitepaper] `Cjdns whitepaper: Pulling It All Together `_ diff --git a/zip-0173.html b/zip-0173.html index 3865414a..ca9b887b 100644 --- a/zip-0173.html +++ b/zip-0173.html @@ -140,7 +140,7 @@ def bech32_verify_checksum(hrp, data):

    The lowercase form is used when determining a character's value for checksum purposes.

    Encoders MUST always output an all-lowercase Bech32 string. If an uppercase version of the encoding result is desired (e.g. for presentation purposes, or QR code use), then an uppercasing procedure can be performed external to the encoding process.

    Decoders MUST NOT accept strings where some characters are uppercase and some are lowercase (such strings are referred to as mixed-case strings).

    -

    For presentation, lowercase is usually preferable, but inside QR codes uppercase SHOULD be used, as those permit the use of alphanumeric mode, which is 45% more compact than the byte mode that would otherwise be used.

    +

    For presentation, lowercase is usually preferable, but inside QR codes uppercase SHOULD be used, as those permit the use of alphanumeric mode, which is 45% more compact than the byte mode that would otherwise be used.

    Encoding

    diff --git a/zip-0173.rst b/zip-0173.rst index 5e93472b..25d85e08 100644 --- a/zip-0173.rst +++ b/zip-0173.rst @@ -181,9 +181,9 @@ are lowercase (such strings are referred to as mixed-case strings). For presentation, lowercase is usually preferable, but inside QR codes uppercase SHOULD be used, as those permit the use of `alphanumeric mode -`_, +`_, which is 45% more compact than the `byte mode -`_ that would +`_ that would otherwise be used. Encoding @@ -313,7 +313,7 @@ Reference implementations * Fancy decoder written for Bitcoin that localizes errors: * `Fancy decoder for Javascript `_ - (`demo website `_) + (`demo website `_) Note that the encoders written for Bitcoin may make assumptions specific to Segregated Witness address formats that do not apply to Zcash. Only the Python diff --git a/zip-0202.html b/zip-0202.html index 13343ed4..1ff7c618 100644 --- a/zip-0202.html +++ b/zip-0202.html @@ -213,12 +213,16 @@ License: MIT

    Header Field

    The first four bytes of pre-Overwinter and Overwinter transactions are little-endian encoded.

    -

    Version 1 transaction (txid 5c6ba844e1ca1c8083cd53e29971bd82f1f9eea1f86c1763a22dd4ca183ae061 https://zcash.blockexplorer.com/tx/5c6ba844e1ca1c8083cd53e29971bd82f1f9eea1f86c1763a22dd4ca183ae061)

    +

    Version 1 transaction (txid 5c6ba844e1ca1c8083cd53e29971bd82f1f9eea1f86c1763a22dd4ca183ae061)

    • begins with little-endian byte sequence [0x01, 0x00, 0x00, 0x00];
    • deserialized as 32-bit signed integer with decimal value of 1.
    -

    Version 2 transaction (txid 4435bf8064e74f01262cb1725fd9b53e600fa285950163fd961bed3a64260d8b https://zcash.blockexplorer.com/tx/4435bf8064e74f01262cb1725fd9b53e600fa285950163fd961bed3a64260d8b)

    +

    Version 2 transaction (txid `4435bf8064e74f01262cb1725fd9b53e600fa285950163fd961bed3a64260d8b <https://blockchair.com/zcash/transaction/4435bf8064e74f01262cb1725fd9b53e600fa285950163fd961bed3a64260d8b>)

    +
    +

    System Message: WARNING/2 (zip-0202.rst line 110) id9

    +

    Inline interpreted text or phrase reference start-string without end-string.

    +
    • begins with little-endian byte sequence [0x02, 0x00, 0x00, 0x00];
    • deserialized as 32-bit signed integer with decimal value of 2.
    • @@ -268,13 +272,13 @@ License: MIT

      However, if a new transaction version can be correctly parsed according to the format of a preceding version (that is, it only restricts the format, or defines fields that were previously reserved and which old parsers can safely ignore), then the same version group ID MAY be re-used.

    Expiry Height

    -

    The expiry height field, as defined in the Transaction Expiry ZIP 5, stores the block height after which a transaction can no longer be mined.

    +

    The expiry height field, as defined in the Transaction Expiry ZIP 5, stores the block height after which a transaction can no longer be mined.

    Transaction Validation

    A valid Overwinter transaction intended for Zcash MUST have:

    • version number 3; and
    • -
    • version group ID 0x03C48270 6; and
    • +
    • version group ID 0x03C48270; and
    • fOverwintered flag set.

    Overwinter validators MUST reject transactions for violating consensus rules if:

    @@ -283,7 +287,7 @@ License: MIT
  • the version group ID is unknown; or
  • the version number is unknown.
  • -

    Validation of version 3 transactions MUST use the signature validation process detailed in the Transaction Signature Validation for Overwinter ZIP 2.

    +

    Validation of version 3 transactions MUST use the signature validation process detailed in the Transaction Signature Validation for Overwinter ZIP 2.

    Implementation

    @@ -317,14 +321,14 @@ License: MIT }

    It is expected that this test involving nVersionGroupId is only required when a transaction is being constructed or deserialized e.g. when an external transaction enters the system.

    However, it's possible that a clone of Zcash is using the same version group ID and passes the conditional.

    -

    Ultimately, a client can determine if a transaction is truly intended for the client's chain or not by following the signature validation process detailed in the Transaction Signature Validation for Overwinter ZIP 2.

    +

    Ultimately, a client can determine if a transaction is truly intended for the client's chain or not by following the signature validation process detailed in the Transaction Signature Validation for Overwinter ZIP 2.

    Deployment

    -

    This proposal will be deployed with the Overwinter network upgrade. The activation block height proposal is in 4.

    +

    This proposal will be deployed with the Overwinter network upgrade. The activation block height proposal is in 4.

    Backwards compatibility

    -

    This proposal intentionally creates what is known as a "bilateral consensus rule change" 3 between pre-Overwinter software and Overwinter-compatible software. Use of this new transaction format requires that all network participants upgrade their software to a compatible version within the upgrade window. Pre-Overwinter software will treat Overwinter transactions as invalid.

    +

    This proposal intentionally creates what is known as a "bilateral consensus rule change" 3 between pre-Overwinter software and Overwinter-compatible software. Use of this new transaction format requires that all network participants upgrade their software to a compatible version within the upgrade window. Pre-Overwinter software will treat Overwinter transactions as invalid.

    Once Overwinter has activated, Overwinter-compatible software will reject version 1 and version 2 transactions, and will only accept transactions based upon supported transaction version numbers and recognized version group IDs.

    Reference Implementation

    @@ -371,14 +375,6 @@ License: MIT - - - - - - - -
    6OVERWINTER_VERSION_GROUP_ID
    diff --git a/zip-0202.rst b/zip-0202.rst index 36da1679..93186108 100644 --- a/zip-0202.rst +++ b/zip-0202.rst @@ -102,12 +102,12 @@ Header Field The first four bytes of pre-Overwinter and Overwinter transactions are little-endian encoded. -Version 1 transaction (txid 5c6ba844e1ca1c8083cd53e29971bd82f1f9eea1f86c1763a22dd4ca183ae061 https://zcash.blockexplorer.com/tx/5c6ba844e1ca1c8083cd53e29971bd82f1f9eea1f86c1763a22dd4ca183ae061) +Version 1 transaction (txid `5c6ba844e1ca1c8083cd53e29971bd82f1f9eea1f86c1763a22dd4ca183ae061 `_) * begins with little-endian byte sequence [0x01, 0x00, 0x00, 0x00]; * deserialized as 32-bit signed integer with decimal value of 1. -Version 2 transaction (txid 4435bf8064e74f01262cb1725fd9b53e600fa285950163fd961bed3a64260d8b https://zcash.blockexplorer.com/tx/4435bf8064e74f01262cb1725fd9b53e600fa285950163fd961bed3a64260d8b) +Version 2 transaction (txid `4435bf8064e74f01262cb1725fd9b53e600fa285950163fd961bed3a64260d8b ) * begins with little-endian byte sequence [0x02, 0x00, 0x00, 0x00]; * deserialized as 32-bit signed integer with decimal value of 2. @@ -183,7 +183,7 @@ Transaction Validation A valid Overwinter transaction intended for Zcash MUST have: - version number 3; and -- version group ID 0x03C48270 [#versiongroupid]_; and +- version group ID 0x03C48270; and - ``fOverwintered`` flag set. Overwinter validators MUST reject transactions for violating consensus rules if: @@ -286,4 +286,3 @@ References .. [#zip-0200] `ZIP 200: Network Upgrade Mechanism `_ .. [#zip-0201] `ZIP 201: Network Handshaking for Overwinter `_ .. [#zip-0203] `ZIP 203: Transaction Expiry `_ -.. [#versiongroupid] `OVERWINTER_VERSION_GROUP_ID `_ diff --git a/zip-0211.html b/zip-0211.html index b6cb0cd8..a5e05e8b 100644 --- a/zip-0211.html +++ b/zip-0211.html @@ -122,7 +122,7 @@ License: MIT 8 - Zerocash: Decentralized Anonymous Payments from Bitcoin (extended version) + Zerocash: Decentralized Anonymous Payments from Bitcoin (extended version) diff --git a/zip-0211.rst b/zip-0211.rst index 1476e131..f68f7c48 100644 --- a/zip-0211.rst +++ b/zip-0211.rst @@ -150,5 +150,5 @@ References .. [#zip-0209] `ZIP 209: Prohibit Negative Shielded Value Pool `_ .. [#zip-0251] `ZIP 251: Deployment of the Canopy Network Upgrade `_ .. [#zip-0308] `ZIP 308: Sprout to Sapling Migration `_ -.. [#zerocash] `Zerocash: Decentralized Anonymous Payments from Bitcoin (extended version) `_ +.. [#zerocash] `Zerocash: Decentralized Anonymous Payments from Bitcoin (extended version) `_ .. [#counterfeiting] `Zcash Counterfeiting Vulnerability Successfully Remediated `_ diff --git a/zip-0216.html b/zip-0216.html index d3ef0b9a..2911b24e 100644 --- a/zip-0216.html +++ b/zip-0216.html @@ -322,7 +322,7 @@ Discussions-To: <https://g 15 - jubjub Rust crate + jubjub Rust crate diff --git a/zip-0216.rst b/zip-0216.rst index da7d5787..33bef5a5 100644 --- a/zip-0216.rst +++ b/zip-0216.rst @@ -228,4 +228,4 @@ References .. [#zip-0200] `ZIP 200: Network Upgrade Mechanism `_ .. [#zip-0215] `ZIP 215: Explicitly Defining and Modifying Ed25519 Validation Rules `_ .. [#zip-0251] `ZIP 251: Deployment of the Canopy Network Upgrade `_ -.. [#jubjub-crate] `jubjub Rust crate `_ +.. [#jubjub-crate] `jubjub Rust crate `_ diff --git a/zip-0221.html b/zip-0221.html index 3a98e8be..96c8634b 100644 --- a/zip-0221.html +++ b/zip-0221.html @@ -650,13 +650,13 @@ License: MIT

    Additional Reading

    diff --git a/zip-0221.rst b/zip-0221.rst index 7a7e7ad7..e9255bcd 100644 --- a/zip-0221.rst +++ b/zip-0221.rst @@ -813,13 +813,13 @@ Additional Reading ================== - `Flyclient enabled geth fork by FlyClient authors `_ -- `ECIP-1055: Succinct PoW Using Merkle Mountain Ranges `_ -- `Grin project MMR implementation in Rust `_ -- `Tari Project MMR implementation in Rust `_ +- `Draft ECIP-1055: Succinct PoW Using Merkle Mountain Ranges `_ +- `Grin project MMR implementation in Rust `_ +- `Tari Project MMR implementation in Rust `_ - `Beam Project MMR implementation in C++ `_ - `Mimblewimble MMR docs `_ - `MMR Python implementation `_ -- `Tari MMR documentation `_ +- `Tari MMR documentation `_ - `Zcash Protocol Specification, Version 2020.1.1 [Overwinter+Sapling+Blossom] or later `_ - `opentimestamps-server Merkle Mountain Range documentation `_ diff --git a/zip-0301.html b/zip-0301.html index ef12f081..d60b8ffc 100644 --- a/zip-0301.html +++ b/zip-0301.html @@ -418,7 +418,7 @@ License: MIT 10 - JSON-RPC 2.0 Specification. The JSON-RPC Working Group. + JSON-RPC 2.0 Specification. The JSON-RPC Working Group. diff --git a/zip-0301.rst b/zip-0301.rst index 07c10a32..b22247ed 100644 --- a/zip-0301.rst +++ b/zip-0301.rst @@ -497,4 +497,4 @@ References .. [#Bitcoin-Block] `Block Headers - Bitcoin Developer Reference. `_ .. [#Bitcoin-CompactSize] `Variable length integer. Bitcoin Wiki `_ .. [#JSON-RPC-1.0] `JSON-RPC 1.0 Specification (2005). `_ -.. [#JSON-RPC-2.0] `JSON-RPC 2.0 Specification. The JSON-RPC Working Group. `_ +.. [#JSON-RPC-2.0] `JSON-RPC 2.0 Specification. The JSON-RPC Working Group. `_ diff --git a/zip-0302.html b/zip-0302.html index 894f9119..9d20ee0e 100644 --- a/zip-0302.html +++ b/zip-0302.html @@ -77,7 +77,7 @@ Pull-Request: <https://githu 2 - UTF-8, a transformation format of ISO 10646 + UTF-8, a transformation format of ISO 10646 diff --git a/zip-0302.rst b/zip-0302.rst index 8c9e0585..18e67df2 100644 --- a/zip-0302.rst +++ b/zip-0302.rst @@ -96,5 +96,5 @@ References ========== .. [#protocol] `Zcash Protocol Specification, Version 2021.1.19 `_ -.. [#UTF-8] `UTF-8, a transformation format of ISO 10646 `_ +.. [#UTF-8] `UTF-8, a transformation format of ISO 10646 `_ .. [#Bitcoin-CompactSize] `Variable length integer. Bitcoin Wiki `_ diff --git a/zip-0309.html b/zip-0309.html index ae6f73f8..a35caf6a 100644 --- a/zip-0309.html +++ b/zip-0309.html @@ -15,7 +15,7 @@ Credits: Ian Miers Status: Reserved Category: Standards / Ecosystem Created: 2019-07-15 -Discussions-To: <https://github.com/zcash/zips/issues/2353> +Discussions-To: <https://github.com/zcash/zcash/issues/2353> Pull-Request: <https://github.com/zcash/zips/pull/216>
    diff --git a/zip-0309.rst b/zip-0309.rst index bf5ca0d3..cd85c9c3 100644 --- a/zip-0309.rst +++ b/zip-0309.rst @@ -9,5 +9,5 @@ Status: Reserved Category: Standards / Ecosystem Created: 2019-07-15 - Discussions-To: + Discussions-To: Pull-Request: diff --git a/zip-1010.html b/zip-1010.html index 99b3f3d7..fe815ad7 100644 --- a/zip-1010.html +++ b/zip-1010.html @@ -19,7 +19,7 @@ Status: Obsolete Category: Consensus Process Created: 2019-08-31 License: MIT -Discussions-To: <https://forum.zcashcommunity.com/t/a-grand-compromise-synthesis-zip-proposal/34812/> +Discussions-To: <https://forum.zcashcommunity.com/t/a-grand-compromise-synthesis-zip-proposal/34812>

    Terminology

    The key words "MUST", "MUST NOT", "SHOULD", and "SHOULD NOT" in this document are to be interpreted as described in RFC 2119. 1

    The term "network upgrade" in this document is to be interpreted as described in ZIP 200. 2

    diff --git a/zip-1010.rst b/zip-1010.rst index ee2f652f..6bf3c410 100644 --- a/zip-1010.rst +++ b/zip-1010.rst @@ -13,7 +13,7 @@ Category: Consensus Process Created: 2019-08-31 License: MIT - Discussions-To: + Discussions-To: Terminology diff --git a/zip-1014.html b/zip-1014.html index fc50f84a..40bf2342 100644 --- a/zip-1014.html +++ b/zip-1014.html @@ -234,7 +234,7 @@ Pull-Request: <https://githu 12 - U.S. Code, Title 26, Section 501(c)(3) + U.S. Code, Title 26, Section 501(c)(3) diff --git a/zip-1014.rst b/zip-1014.rst index e4f52864..6e9d8ae2 100644 --- a/zip-1014.rst +++ b/zip-1014.rst @@ -409,4 +409,4 @@ References .. [#zip-1011] `ZIP 1011: Decentralize the Dev Fee `_ .. [#zip-1012] `ZIP 1012: Dev Fund to ECC + ZF + Major Grants `_ .. [#zf-community] `ZF Community Advisory Panel `_ -.. [#section501c3] `U.S. Code, Title 26, Section 501(c)(3) `_ +.. [#section501c3] `U.S. Code, Title 26, Section 501(c)(3) `_ diff --git a/zip-guide.html b/zip-guide.html index 545932f4..8f85e7aa 100644 --- a/zip-guide.html +++ b/zip-guide.html @@ -98,11 +98,11 @@ sudo pip3 install rst2html5 - +
    - +
    4ZIP xxxx: TitleZIP 0: ZIP Process
    diff --git a/zip-guide.rst b/zip-guide.rst index 20769163..6acd0890 100644 --- a/zip-guide.rst +++ b/zip-guide.rst @@ -141,4 +141,4 @@ References .. [#RFC2119] `RFC 2119: Key words for use in RFCs to Indicate Requirement Levels `_ .. [#protocol] `Zcash Protocol Specification, Version 2020.1.24 or later `_ .. [#protocol-introduction] `Zcash Protocol Specification, Version 2020.1.24. Section 1: Introduction `_ -.. [#zip-xxxx] `ZIP xxxx: Title `_ +.. [#zip-0000] `ZIP 0: ZIP Process `_