|
| 1 | +--- |
| 2 | +taip: 1 |
| 3 | +title: TAP and TAIP Purpose and Guidelines |
| 4 | +status: Review |
| 5 | +type: Meta |
| 6 | +author: Pelle Braendgaard <pelle@notabene.id> |
| 7 | +created: 2024-01-09 |
| 8 | +updated: 2024-01-09 |
| 9 | +--- |
| 10 | + |
| 11 | +## Transaction Authorization Protocol (TAP) Rationale |
| 12 | + |
| 13 | +Currently there is not a good abstract and chain agnostic method for multiple |
| 14 | +parties to reason about and collaborate around blockchain transactions. As an |
| 15 | +example, in a typical blockchain transaction the only party able to authorize a |
| 16 | +transaction is the holder of a blockchain account. Smart contract based |
| 17 | +applications can implement authorization functionality within their code, but |
| 18 | +they do not work universally across different kinds of blockchains. As more and |
| 19 | +more businesses and individuals work to utilize blockchains for real world |
| 20 | +applications, it becomes increasingly important to be able to manage this. See |
| 21 | +the [TAP Whitepaper] for more. |
| 22 | + |
| 23 | +## What is an TAIP? |
| 24 | + |
| 25 | +TAIP stands for Transaction Authorization Improvement Proposal and is designed |
| 26 | +as a basic building block for specifying and implementing the Transaction |
| 27 | +Authorization Protocol. A TAIP is a design document providing information to the |
| 28 | +community or describing a standard to be used for transaction authorization |
| 29 | +between multiple off-chain parties across multiple chains. |
| 30 | + |
| 31 | +The TAIP should provide a concise technical specification of the feature and a |
| 32 | +rationale for it. The TAIP author is responsible for building consensus within |
| 33 | +the community and documenting dissenting opinions. |
| 34 | + |
| 35 | +## TAIP Rationale |
| 36 | + |
| 37 | +Blockchain development is still under very rapid pace. Adding authorization |
| 38 | +support to new technologies requires a decentralized approach to authoring this. |
| 39 | + |
| 40 | +TAIPs allows authors to focus on specific aspects of authorization and |
| 41 | +interactions with new protocols, technologies, and workflows. |
| 42 | + |
| 43 | +## TAIP Formats and Templates |
| 44 | + |
| 45 | +TAIPs should be written in [markdown][markdown] format. Image files should be |
| 46 | +included in a subdirectory of the `assets` folder for that TAIP as follows: |
| 47 | +`assets/taip-N` (where **N** is to be replaced with the TAIP number). When |
| 48 | +linking to an image in the TAIP, use relative links such as |
| 49 | +`../assets/taip-1/image.png`. |
| 50 | + |
| 51 | +## TAIP Header Preamble |
| 52 | + |
| 53 | +Each TAIP must begin with an [RFC 822] style header preamble, preceded and |
| 54 | +followed by three hyphens (`---`). This header is also termed |
| 55 | +["front matter" by Jekyll]. The headers must appear in the following order. |
| 56 | +Headers marked with "*" are optional and are described below. All other headers |
| 57 | +are required. |
| 58 | + |
| 59 | +- `taip:` TAIP number (this is determined by the TAIP editor) |
| 60 | +- `title:` TAIP title |
| 61 | +- `author:` a list of the author's or authors' name(s) and/or username(s), or |
| 62 | + name(s) and email(s). Details are below. |
| 63 | +- `discussions-to: *` URL pointing to the official discussion thread |
| 64 | +- `status:` `Draft`, `Rejected`, `Review`, `Last Call`, `Withdrawn`, `Final`, |
| 65 | + `Superseded` |
| 66 | +- `review-period-end: *` date review period ends |
| 67 | +- `type:` `Standard`, `Informational`, `Meta` |
| 68 | +- `created:` date created on |
| 69 | +- `updated: *` comma separated list of dates |
| 70 | +- `requires: *` TAIP number(s); if multiple, use `1, 2` format to create a YAML |
| 71 | + array |
| 72 | +- `replaces: *` TAIP number(s); if multiple, use `1, 2` format to create a YAML |
| 73 | + array |
| 74 | +- `superseded-by: *` TAIP number(s) or URL of non-TAIP standard |
| 75 | + |
| 76 | +Headers that permit lists must separate elements with commas. |
| 77 | + |
| 78 | +Headers requiring dates will always do so in the format of ISO 8601 |
| 79 | +(yyyy-mm-dd). |
| 80 | + |
| 81 | +#### `author` header |
| 82 | + |
| 83 | +The `author` header optionally lists the names, email addresses or usernames of |
| 84 | +the authors/owners of the TAIP. Those who prefer anonymity may use a username |
| 85 | +only, or a first name and a username. The format of the author header value must |
| 86 | +be: |
| 87 | + |
| 88 | +> Random J. User <address@dom.ain> |
| 89 | +
|
| 90 | +or |
| 91 | + |
| 92 | +> Random J. User (@username) |
| 93 | +
|
| 94 | +if the email address or GitHub username is included, and |
| 95 | + |
| 96 | +> Random J. User |
| 97 | +
|
| 98 | +if the email address is not given. |
| 99 | + |
| 100 | +#### `resolution` header |
| 101 | + |
| 102 | +#### `discussions-to` header |
| 103 | + |
| 104 | +While a TAIP is a draft, a `discussions-to` header will indicate the mailing |
| 105 | +list or URL where the TAIP is being discussed. |
| 106 | + |
| 107 | +As a single exception, `discussions-to` cannot point to GitHub pull requests. |
| 108 | + |
| 109 | +#### `type` header |
| 110 | + |
| 111 | +The `type` header specifies the type of TAIP: Standard, Meta, or Informational. |
| 112 | + |
| 113 | +#### `created` header |
| 114 | + |
| 115 | +The `created` header records the date that the TAIP was assigned a number. Both |
| 116 | +headers should be in yyyy-mm-dd format, e.g. 2001-08-14. |
| 117 | + |
| 118 | +#### `updated` header |
| 119 | + |
| 120 | +The `updated` header records the date(s) when the TAIP was updated with |
| 121 | +"substantial" changes. This header is only valid for TAIPs of Draft and Active |
| 122 | +status. |
| 123 | + |
| 124 | +#### `requires` header |
| 125 | + |
| 126 | +TAIPs may have a `requires` header, indicating the TAIP(s) on which this TAIP |
| 127 | +depends. Note that if the TAIP requires multiple others, the value should be an |
| 128 | +array of integers (no `"` needed) and/or URLs (wrapped in `"`s) within square |
| 129 | +brackets (`[]`). |
| 130 | + |
| 131 | +#### `superseded-by` and `replaces` headers |
| 132 | + |
| 133 | +TAIPs may also have a `superseded-by` header indicating that a TAIP has been |
| 134 | +rendered obsolete by a later document; the value is the number of the TAIP that |
| 135 | +replaces the current document. The newer TAIP must have a `replaces` header |
| 136 | +containing the number of the TAIP that it rendered obsolete. |
| 137 | + |
| 138 | +## Auxiliary Files |
| 139 | + |
| 140 | +TAIPs may include auxiliary files such as diagrams. Such files must be named |
| 141 | +TAIP-XXXX-Y.ext, where “XXXX” is the TAIP number, “Y” is a serial number |
| 142 | +(starting at 1), and “ext” is replaced by the actual file extension (e.g. |
| 143 | +“png”). |
| 144 | + |
| 145 | +## Design Principles of for TAIPs |
| 146 | + |
| 147 | +- Follow the |
| 148 | + ~~[Robustness Principle](https://en.wikipedia.org/wiki/Robustness_principle)~~ |
| 149 | + - _“be conservative in what you do, be liberal in what you accept from |
| 150 | + others”_ |
| 151 | +- It should be message based and support peer 2 peer messaging |
| 152 | +- It should support self-hosted wallets under the direct control of an ultimate |
| 153 | + party |
| 154 | +- Avoid reliance on centralized gateways or associations to impose trust by |
| 155 | + utilizing Decentralized Identifiers (DIDs) for all parties and agents |
| 156 | + involved. |
| 157 | +- Certain workflows such as the Travel Rule flow, should be able to be |
| 158 | + implemented even if one services to participates actively in the flow, but |
| 159 | + should encourage and help push more services to be active participants |
| 160 | +- Any agent to the transaction should be able to initiate a transaction |
| 161 | +- There is no strict message flow defined, but strict flows can be added through |
| 162 | + TAIPs |
| 163 | +- To be able to support a transition for companies adopting it, it should be |
| 164 | + possible to create messages after the fact outlining the meta-data for an |
| 165 | + exiting crypto transaction |
| 166 | +- Modern blockchain transactions often include multiple individual real world |
| 167 | + transactions, such as Bitcoin UTXO transactions or airdrop transactions. |
| 168 | + Several kinds of real world transactions are also implemented through multiple |
| 169 | + blockchain transactions such as multi-sigs and many kinds of transactions |
| 170 | + requiring pre-authorization. Thus transactions in TAP could have a many to |
| 171 | + many relationship with blockchain transactions. |
| 172 | +- Separate out the exchange of sensitive PII information between agents to be |
| 173 | + fully end-to-end encrypted and handled through the messaging flow on a need to |
| 174 | + know policy based basis |
| 175 | +- Allow each agent to be able to authorize or reject a transfer, while |
| 176 | + understanding that for blockchain transactions only the agent holding the keys |
| 177 | + ultimately authorizes a transaction |
| 178 | +- Support discovery of relevant agents to the flow, by allowing each agent to be |
| 179 | + able to inject an intermediary agent |
| 180 | +- Allow each agent to be able to replace themselves from the transaction with |
| 181 | + another DID, e.g. redirect the transaction to another legal entity or a |
| 182 | + custodial service provider |
| 183 | +- Built primarily on existing open standards |
| 184 | + - Flexible message encoding default, but default to |
| 185 | + [JSON-LD](https://json-ld.org) |
| 186 | + - Use [Chain Agnostic standards](https://chainagnostic.org) whenever possible |
| 187 | + for blockchain relevant standards, such as: |
| 188 | + - References to blockchain assets should rely on |
| 189 | + [CAIP-19](https://chainagnostic.org/CAIPs/caip-19) |
| 190 | + - References to blockchain accounts should rely on |
| 191 | + [CAIP-10](https://chainagnostic.org/CAIPs/caip-10) |
| 192 | + - Identifiers for parties should use |
| 193 | + [RFC-3987 IRIs](https://datatracker.ietf.org/doc/html/rfc3987), but more |
| 194 | + specifically |
| 195 | + [W3C Decentralized Identifiers](https://www.w3.org/TR/did-core/) (DIDs) are |
| 196 | + recommended |
| 197 | + - Identifiers for agents should use |
| 198 | + [W3C Decentralized Identifiers](https://www.w3.org/TR/did-core/) (DIDs) |
| 199 | + |
| 200 | +- References to agents or other services should also use DID’s, but prefer DID |
| 201 | + methods that can immediately be used to identify it. Eg. |
| 202 | + [PKH-DID](https://github.com/w3c-ccg/did-pkh/blob/main/did-pkh-method-draft.md) |
| 203 | + methods for blockchain wallets or smart contracts and |
| 204 | + [Web DIDs](https://w3c-ccg.github.io/did-method-web/) for centralized services |
| 205 | +- Messaging and Encryption should be based on proven digital signature and |
| 206 | + encryption standards: |
| 207 | + - [IETF RFC-7515 JWS](https://www.rfc-editor.org/rfc/rfc7515) for signed data |
| 208 | + between agents |
| 209 | + - [IETF RFC-7516 JWE](https://www.rfc-editor.org/rfc/rfc7516.html) for |
| 210 | + encrypted data between agents |
| 211 | + - [DID-Comm V2](https://identity.foundation/didcomm-messaging/spec/v2.0/) |
| 212 | + semantics for decentralized messaging between services |
| 213 | +- Allow anyone to build their own agent implementing the protocol |
| 214 | + |
| 215 | +## Transferring TAIP Ownership |
| 216 | + |
| 217 | +It occasionally becomes necessary to transfer ownership of TAIPs to a new |
| 218 | +champion. In general, we'd like to retain the original author as a co-author of |
| 219 | +the transferred TAIP, but that's really up to the original author. A good reason |
| 220 | +to transfer ownership is because the original author no longer has the time or |
| 221 | +interest in updating it or following through with the TAIP process, or has |
| 222 | +fallen off the face of the 'net (i.e. is unreachable or isn't responding to |
| 223 | +email). A bad reason to transfer ownership is because you don't agree with the |
| 224 | +direction of the TAIP. We try to build consensus around a TAIP, but if that's |
| 225 | +not possible, you can always submit a competing TAIP. |
| 226 | + |
| 227 | +If you are interested in assuming ownership of a TAIP, send a message asking to |
| 228 | +take over, addressed to both the original author and the TAIP editor. If the |
| 229 | +original author doesn't respond to email in a timely manner, the TAIP editor |
| 230 | +will make a unilateral decision (it's not like such decisions can't be reversed |
| 231 | +:)). |
| 232 | + |
| 233 | +## TAIP Editors |
| 234 | + |
| 235 | +Temporarily [Notabene](https://notabene.id) will act as editors. Notabene |
| 236 | +pledges to implement a simple informal governance structure during H1 2024 to |
| 237 | +include more parties and lessent the reliance on a single company. |
| 238 | + |
| 239 | +## TAIP Editorial Process |
| 240 | + |
| 241 | +For each new TAIP that comes in, an editor does the following: |
| 242 | + |
| 243 | +- Read the TAIP to check if it is ready: sound and complete. The ideas must make |
| 244 | + technical sense, even if they don't seem likely to get to final status. |
| 245 | +- The title should accurately describe the content. |
| 246 | +- Check the TAIP for language (spelling, grammar, sentence structure, etc.), |
| 247 | + markup (Github flavored Markdown), code style. |
| 248 | + |
| 249 | +If the TAIP isn't ready, the editor will send it back to the author for |
| 250 | +revision, with specific instructions. |
| 251 | + |
| 252 | +Once the TAIP is ready for the repository, the TAIP editor will: |
| 253 | + |
| 254 | +- Assign a TAIP number (generally the PR number or, if preferred by the author, |
| 255 | + the Issue # if there was discussion in the Issues section of this repository |
| 256 | + about this TAIP) |
| 257 | + |
| 258 | +- Merge the corresponding pull request |
| 259 | + |
| 260 | +- Send a message back to the TAIP author with the next step. |
| 261 | + |
| 262 | +The editors don't pass judgment on TAIPs. We merely do the administrative & |
| 263 | +editorial part. |
| 264 | + |
| 265 | +## History |
| 266 | + |
| 267 | +This document was derived heavily from [CAIP-1] written by Ligi, which was |
| 268 | +derived by [Bitcoin's BIP-0001] written by Amir Taaki, which in turn was derived |
| 269 | +from [Python's PEP-0001]. In many places text was simply copied and modified. |
| 270 | +Although the PEP-0001 text was written by Barry Warsaw, Jeremy Hylton, and David |
| 271 | +Goodger, they are not responsible for its use in Transaction Authorization |
| 272 | +Improvement Proposals, and should not be bothered with technical questions |
| 273 | +specific to TAIPs. Please direct all comments to the TAIP editors. |
| 274 | + |
| 275 | +### References |
| 276 | + |
| 277 | +[TAP Whitepaper]: https://docs.google.com/document/d/1z16nPRjiCFGsnMqr7GiBRMCMMPBG6laaS337s4oJrEw/edit#heading=h.ujq0dkl3njwc |
| 278 | +[CAIP-1]: https://chainagnostic.org/CAIPs/caip-1 |
| 279 | +[markdown]: https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet |
| 280 | +[Bitcoin's BIP-0001]: https://github.com/bitcoin/bips |
| 281 | +[Python's PEP-0001]: https://www.python.org/dev/peps/ |
| 282 | +[RFC 822]: https://www.ietf.org/rfc/rfc822.txt |
| 283 | +["front matter" by Jekyll]: https://jekyllrb.com/docs/front-matter/ |
| 284 | + |
| 285 | +## Copyright |
| 286 | + |
| 287 | +Copyright and related rights waived via [CC0](../LICENSE). |
0 commit comments