@@ -1,32 +1,469 @@
1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # Fossil As Blockchain
2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil is a version control system built around blockchain.
4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Wikipedia defines "blockchain" as
6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- >
8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "a growing list of records, called blocks, which are linked using
9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cryptography. Each block contains a cryptographic hash of the previous
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- block, a timestamp, and transaction data..." [(1)][]
11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- By that definition, Fossil is clearly an implementation of blockchain.
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- The blocks are ["manifests" artifacts](./fileformat.wiki#manifest).
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Each manifest has a SHA1 or SHA3 hash of its parent or parents,
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- a timestamp, and other transactional data. The repository grows by
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- adding new manifests onto the list.
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Some people have come to associate blockchain with cryptocurrency, however,
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- and since Fossil has nothing to do with cryptocurrency, the claim that
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fossil is built around blockchain is met with skepticism. The key thing
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- to note here is that cryptocurrency implementations like BitCoin are
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- built around blockchain, but they are not synonymous with blockchain.
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blockchain is a much broader concept. Blockchain is a mechanism for
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- constructing a distributed ledger of transactions.
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Yes, you can use a distributed
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ledger to implement a cryptocurrency, but you can also use a distributed
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ledger to implement a version control system, and probably many other kinds
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- of applications as well. Blockchain is a much broader idea than
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cryptocurrency.
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- [(1)]: https://en.wikipedia.org/wiki/Blockchain
1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Is Fossil A Blockchain?
2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The Fossil version control system shares a lot of similarities with
4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ other blockchain based technologies, but it also differs from the more common
5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sorts of blockchains. This document will discuss the term’s
6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ applicability, so you can decide whether applying the term to Fossil
7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ makes sense to you.
8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
9 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
10 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## The Dictionary Argument
11 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
12 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The [Wikipedia definition of "blockchain"][bcwp] begins:
13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ >
15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "A blockchain…is a growing list of records, called blocks, which are linked using
16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cryptography. Each block contains a cryptographic hash of the previous
17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ block, a timestamp, and transaction data (generally represented as a Merkle tree)."
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ By that partial definition, Fossil is indeed a blockchain. The blocks
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ are Fossil’s ["manifest" artifacts](./fileformat.wiki#manifest). Each
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ manifest has a cryptographically-strong [SHA-1] or [SHA-3] hash linking it to
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ one or more “parent” blocks. The manifest also contains a timestamp and
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the transactional data needed to express a commit to the repository. If
25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ you traverse the Fossil repository from the tips of its [DAG] to the
26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ root by following the parent hashes in each manifest, you will then have
27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a Merkle tree. Point-for-point, Fossil follows that definition.
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Every change in Fossil starts by adding one or more manifests to
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the repository, extending this tree.
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [bcwp]: https://en.wikipedia.org/wiki/Blockchain
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [DAG]: https://en.wikipedia.org/wiki/Directed_acyclic_graph
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [SHA-1]: https://en.wikipedia.org/wiki/SHA-1
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [SHA-3]: https://en.wikipedia.org/wiki/SHA-3
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="currency"></a>
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Cryptocurrency
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Because blockchain technology was first popularized as Bitcoin, many
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ people associate the term with cryptocurrency. Fossil has nothing to do
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ with cryptocurrency, so a claim that “Fossil is a blockchain” may fail
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to communicate the speaker’s concepts clearly due to conflation with
46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cryptocurrency.
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Cryptocurrency has several features and requirements that Fossil doesn’t
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ provide, either because it doesn’t need them or because we haven’t
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ gotten around to creating the feature. Whether these are essential to
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the definition of “blockchain” and thus disqualify Fossil as a blockchain
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ is for you to decide.
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Cryptocurrencies must prevent three separate types of fraud to be useful:
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * **Type 1** is modification of existing currency. To draw an analogy
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to paper money, we wish to prevent someone from using green and
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ black markers to draw extra zeroes on a US $10 bill so that it
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ claims to be a $100 bill. Cryptocurrencies apply digital signatures
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to each block so that a given block of currency’s face value cannot
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ be changed after it is created. The [proof-of-work][pow] aspect
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ prevents the creator from setting its initial value fraudulently.
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * **Type 2** is making new counterfeit $10 bills that look
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sufficiently like the original to pass in commerce. Cryptocurrencies
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ chain blocks together and establish a sufficiently hard work problem
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to create new currency that Type 2 frauds are impractical short of
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ doing the actual mining needed to produce legitimate cryptocurrency.
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * **Type 3** is double-spending existing legitimate cryptocurrency.
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ There is no analogy in paper money due to its physical form; it is a
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ problem unique to digital currency due to its infinitely-copyable
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nature. Cryptocurrencies prevent Type 3 frauds by making the
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *prior* owner of a block sign it over to the new owner. To avoid an
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ O(n²) auditing problem as a result, cryptocurrencies also use a
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ chain of hashes to make checking for double-spending quick and easy.
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ How does all of this compare to Fossil?
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 1. <a id="signatures"></a>**Signatures.** Cryptocurrencies use a chain
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ of [digital signatures][dsig] to prevent Type 1 and Type 3 frauds. This
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ chain forms an additional link between the blocks, separate from the
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ hash chain that applies an ordering and lookup scheme to the blocks.
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [_Blockchain: Simple Explanation_][bse] explains this “hash chain”
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ vs. “block chain” distinction in more detail.
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil has [a disabled-by-default feature][cs] to call out to an
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ external copy of [PGP] or [GPG] to sign commit manifests before
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ inserting them into the repository. You may wish to couple that with
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a server-side [after-receive hook][arh] to reject unsigned commits.
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Although there are several distinctions you can draw between the way
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil’s commit signing scheme works and the way block signing works
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ in cryptocurrencies, only one is of material interest for our
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ purposes here: Fossil commit signatures apply only to a single
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ commit. Fossil does not sign one commit over to the next “owner” of
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ that commit in the way that a blockchain-based cryptocurrency must
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ when transferring currency from one user to another, beacuse there
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ is no useful analog to the double-spending problem in Fossil. The
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ closest you can come to this is double-insert of commits into the
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blockchain, which we’ll address shortly.
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ What Fossil commit signatures actually do is provide in-tree forgery
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ prevention, both Type 1 and Type 2. You cannot modify existing
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ commits (Type 1 forgery) because you do not have the original
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ committer’s private signing key, and you cannot forge new commits
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ attesting to come from some other trusted committer (Type 2) because
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ you don’t have any of their private signing keys, either.
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Cyrptocurrencies also use the work problem to prevent Type 2
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ forgeries, but the application of that to Fossil is a matter we get
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to [later](#work).
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If Fossil signatures prevent Type 1 and Type 2 frauds, why then are
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ they not enabled by default? Because they are defense-in-depth
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ measures, not the minimum sufficient measures needed to prevent
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ repository fraud in Fossil. Fossil provides its primary protections
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ through other means.
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Although you have complete control over the contents of your local
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil repository clone, you cannot perform Type 1 forgery on its
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ contents short of executing a [preimage attack][prei] on the hash
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ algorthm. ([SHA3-256][SHA-3] by default in the current version of
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil.) Even if you could, Fossil’s sync protocol will prevent the
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ modification from being pushed into another repository: the remote
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil instance says, “I’ve already got that one, thanks,” and
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ignores the push. Thus, short of breaking into the remote server
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and modifying the repository in place, you couldn’t even make use of
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a preimage attack if you had that power. This is an attack on the
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ server itself, not on Fossil’s data structures, so while it is
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ useful to think through this problem, it is not helpful to answering
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ our questions here.
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The Fossil sync protocol also prevents the closest analog to Type 3
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ frauds in Fossil: copying a commit manifest in your local repo clone
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ won’t result in a double-commit on sync.
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ In the absence of digital signatures, Fossil’s [RBAC system][caps]
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ restricts Type 2 forgery to trusted committers. Thus once again
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ we’re reduced to an infosec problem, not a data structure design
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ question. (Inversely, enabling commit clearsigning is a good idea
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if you have committers on your repo whom you don’t trust not to
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ commit Type 2 frauds. But let us be clear: your choice of setting
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ does not answer the question of whether Fossil is a blockchain.)
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If you’re wondering why Fossil’s current commit signing feature is
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ not enabled by default and why it doesn’t verify signatures on
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ commits, it is because Fossil is not itself a [PKI], and there is no
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ way for regular users of Fossil to link it to a PKI, since doing so
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ would likely result in an unwanted [PII] disclosure. There is no
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ email address in a Fossil commit manifest that you could use to
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ query one of the public PGP keyservers, for example. It therefore
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ becomes a local policy matter as to whether you even *want* to have
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ signatures, because they’re not without their downsides.
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 2. <a id="work"></a>**Work Contests.** Cryptocurrencies prevent forgery
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ by setting up some sort of contest that ensures that new coins can come
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ into existence only by doing some difficult work task. This “mining”
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ activity results in a coin that took considerable work to create,
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ which thus has economic value by being a) difficult to re-create,
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and b) resistant to [debasement][dboc].
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil repositories are most often used to store the work product of
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ individuals, rather than cryptocoin mining machines. There is
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ generally no contest in trying to produce the most commits. There
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ may be an implicit contest to produce the “best” commits, but that
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ is a matter of project management, not something that can be
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ automatically mediated through objective measures.
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Incentives to commit to the repository come from outside of Fossil;
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ they are not inherent to its nature, as with cryptocurrencies.
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Moreover, there is no useful sense in which we could say that one
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ commit “re-creates” another. Commits are generally products of
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ individual human intellect, thus necessarily unique in all but
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ trivial cases. This is foundational to copyright law.
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 3. <a id="lcr"></a>**Longest Chain Rule.** Cryptocurrencies generally
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ need some way to distinguish which blocks are legitimate and which
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ not. They do this in part by identifying the linear chain with the
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ greatest cumulative [work time](#work) as the legitimate chain. All
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blocks not on that linear chain are considered “orphans” and are
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ignored by the cryptocurrency software.
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ It inverse is sometimes called the “51% attack” because a single
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ actor would have to do slightly more work than the entire rest of
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the community using a given cryptocurrency in order for their fork
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ of the currency to be considered the legitimate fork. This argument
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ soothes concerns that a single bad actor could take over the
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ network.
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The closest we can come to that notion in Fossil is the default
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ “trunk” branch, but there’s nothing in Fossil that delegitimizes
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ other branches just because they’re shorter, nor is there any way in
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil to score the amount of work that went into a commit. Indeed,
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [forks and branches][fb] are *valuable and desirable* things in
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil.
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This much is certain: Fossil is definitely not a cryptocurrency. Whether
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this makes it “not a blockchain” is a subjective matter.
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [arh]: ./hooks.md
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [bse]: https://www.researchgate.net/publication/311572122_What_is_Blockchain_a_Gentle_Introduction
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [caps]: ./caps/
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [cs]: /help?cmd=clearsign
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [dboc]: https://en.wikipedia.org/wiki/Debasement
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [dsig]: https://en.wikipedia.org/wiki/Digital_signature
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [fb]: ./branching.wiki
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [GPG]: https://gnupg.org/
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [PGP]: https://www.openpgp.org/
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [PII]: https://en.wikipedia.org/wiki/Personal_data
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [PKI]: https://en.wikipedia.org/wiki/Public_key_infrastructure
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [pow]: https://en.wikipedia.org/wiki/Proof_of_work
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [prei]: https://en.wikipedia.org/wiki/Preimage_attack
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="dlt"></a>
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Distributed Ledgers
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Cryptocurrencies are an instance of [distributed ledger technology][dlt]. If
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ we can convince ourselves that Fossil is also a distributed
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ledger, then we might think of Fossil as a peer technology,
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ having at least some qualifications toward being considered a blockchain.
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ A key tenet of DLT is that records be unmodifiable after they’re
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ committed to the ledger, which matches quite well with Fossil’s design
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and everyday use cases. Fossil puts up multiple barriers to prevent
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ modification of existing records and injection of incorrect records.
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Yet, Fossil also has [purge] and [shunning][shun]. Doesn’t that mean
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil cannot be a distributed ledger?
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ These features only remove existing commits from the repository. If you want a
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ currency analogy, they are ways to burn a paper bill or to melt a [fiat
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ coin][fc] down to slag. In a cryptocurrency, you can erase your “wallet”
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ file, effectively destroying money in a similar way. These features
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ do not permit forgery of either type described above: you can’t use them
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to change the value of existing commits (Type 1) or add new commits to
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the repository (Type 2).
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ What if we removed those features from Fossil, creating an append-only
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil variant? Is it a DLT then? Arguably still not, because [today’s Fossil
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ is an AP-mode system][ctap] in the [CAP theorem][cap] sense, which means
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ there can be no guaranteed consensus on the content of the ledger at any
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ given time. If you had an AP-mode accounts receivable system, it could
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ have different bottom-line totals at different sites, because you’ve
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cast away “C” to get AP-mode operation.
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Because of this, you could still not guarantee that the command
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ “`fossil info tip`” gives the same result everywhere. A CA or CP-mode Fossil
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ variant would guarantee that everyone got the same result. (Everyone not
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ partitioned away from the majority of the network at any rate, in the CP
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case.)
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ What are the prospects for CA-mode or CP-mode Fossil? [We don’t want
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CA-mode Fossil][ctca], but [CP-mode could be useful][ctcp]. Until the latter
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ exists, this author believes Fossil is not a distributed ledger in a
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ technologically defensible sense.
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ The most common technologies answering to the label “blockchain” are all
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DLTs, so if Fossil is not a DLT, then it is not a blockchain in that
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sense.
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [ctap]: ./cap-theorem.md#ap
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [ctca]: ./cap-theorem.md#ca
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [ctcp]: ./cap-theorem.md#cp
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [cap]: https://en.wikipedia.org/wiki/CAP_theorem
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [dlt]: https://en.wikipedia.org/wiki/Distributed_ledger
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [DVCS]: https://en.wikipedia.org/wiki/Distributed_version_control
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [fc]: https://en.wikipedia.org/wiki/Fiat_money
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [purge]: /help?cmd=purge
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [shun]: ./shunning.wiki
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="dpc"></a>
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Distributed Partial Consensus
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If we can’t get DLT, can we at least get some kind of distributed
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ consensus at the level of individual Fossil’s commits?
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Many blockchain based technologies have this property: given some
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ element of the blockchain, you can make certain proofs that it either is
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a legitimate part of the whole blockchain, or it is not.
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Unfortunately, this author doesn’t see a way to do that with Fossil.
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Given only one “block” in Fossil’s putative “blockchain” — a commit, in
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil terminology — all you can prove is whether it is internally
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ consistent, that it is not corrupt. That then points you at the parent(s) of that
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ commit, which you can repeat the exercise on, back to the root of the
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DAG. This is what the enabled-by-default [`repo-cksum` setting][rcks]
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ does.
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If cryptocurrencies worked this way, you wouldn’t be able to prove that
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a given cryptocoin was legitimate without repeating the proof-of-work
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ calculations for the entire cryptocurrency scheme! Instead, you only
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ need to check a certain number of signatures and proofs-of-work in order
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to be reasonably certain that you are looking at a legitimate section of
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the whole blockchain.
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ What would it even mean to prove that a given Fossil commit “*belongs*”
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ to the repository you’ve extracted it from? For a software project,
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isn’t that tantamount to automatic code review, where the server would
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ be able to reliably accept or reject a commit based solely on its
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ content? That sounds nice, but this author believes we’ll need to invent
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [AGI] first.
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ A better method to provide distributed consensus for Fossil would be to
307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rely on the *natural* intelligence of its users: that is, distributed
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ commit signing, so that a commit is accepted into the blockchain only
309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ once some number of users countersign it. This amounts to a code review
310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ feature, which Fossil doesn’t currently have.
311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Solving that problem basically requires solving the [PKI] problem first,
313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ since you can’t verify the proofs of these signatures if you can’t first
314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ prove that the provided signatures belong to people you trust. This is a
315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ notoriously hard problem in its own right.
316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ A future version of Fossil could instead provide [consensus in the CAP
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sense][ctcp]. For instance, you could say that if a quorum of servers
319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ all have a given commit, it “belongs.” Fossil’s strong hashing tech
320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ would mean that querying whether a given commit is part of the
321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ “blockchain” would be as simple as going down the list of servers and
322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sending each an HTTP GET `/info` query for the artifact ID, concluding
323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ that the commit is legitimate once you get enough HTTP 200 status codes back. All of this is
324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ hypothetical, because Fossil doesn’t do this today.
325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [AGI]: https://en.wikipedia.org/wiki/Artificial_general_intelligence
327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [rcks]: /help?cmd=repo-cksum
328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ <a id="anon"></a>
332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Anonymity
333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Many blockchain based technologies go to extraordinary lengths to
335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ allow anonymous use of their service.
336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ As typically configured, Fossil does not: commits synced between servers
338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ always at least have a user name associated with them, which the remote
339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ system must accept through its [RBAC system][caps]. That system can run
340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ without having the user’s email address, but it’s needed if [email
341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ alerts][alert] are enabled on the server. The remote server logs the IP
342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ address of the commit for security reasons. That coupled with the
343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ timestamp on the commit could sufficiently deanonymize users in many
344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ common situations.
345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ It is possible to configure Fossil so it doesn’t do this:
347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * You can give [Write capability][capi] to user category “nobody,” so
349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ that anyone that can reach your server can push commits into its
350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ repository.
351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * You could give that capability to user category “anonymous” instead,
353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ which requires that the user log in with a CAPTCHA, but which doesn’t
354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ require that the user otherwise identify themselves.
355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * You could enable [the `self-register` setting][sreg] and choose not to
357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ enable [commit clear-signing][cs] so that anonymous users could push
358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ commits into your repository under any name they want.
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ On the server side, you can also [scrub] the logging that remembers
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ where each commit came from.
362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ That info isn’t transmitted from the remote server on clone or pull.
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Instead, the size of the `rcvfrom` table after initial clone is 1: it
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ contains the remote server’s IP address. On each pull containing new
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ artifacts, your local `fossil` instance adds another entry to this
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ table, likely with the same IP address unless the server has moved or
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ you’re using [multiple remotes][mrep]. This table is far more
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ interesting on the server side, containing the IP addresses of all
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ contentful pushes; thus [the `scrub` command][scrub].
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Because Fossil doesn’t
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ remember IP addresses in commit manifests or require commit signing, it
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ allows at least *pseudonymous* commits. When someone clones a remote
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ repository, they don’t learn the email address, IP address, or any other
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sort of [PII] of prior committers, on purpose.
377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Some people say that private, permissioned blockchains (as you may
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ imagine Fossil to be) are inherently problematic by the very reason that
380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ they don’t bake anonymous contribution into their core. The very
381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ existence of an RBAC is a moving piece that can break. Isn’t it better,
382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the argument goes, to have a system that works even in the face of
383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ anonymous contribution, so that you don’t need an RBAC? Cryptocurrencies
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ do this, for example: anyone can “mine” a new coin and push it into the
385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blockchain, and there is no central authority restricting the transfer
386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ of cryptocurrency from one user to another.
387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ We can draw an analogy to encryption, where an algorithm is
389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ considered inherently insecure if it depends on keeping any information
390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ from an attacker other than the key. Encryption schemes that do
391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ otherwise are derided as “security through obscurity.”
392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ You may be wondering what any of this has to do with whether Fossil is a
394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blockchain, but that is exactly the point: all of this is outside
395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil’s core hash-chained repository data structure. If you take the
396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ position that you don’t have a “blockchain” unless it allows anonymous
397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ contribution, with any needed restrictions provided only by the very
398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ structure of the managed data, then Fossil does not qualify.
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Why do some people care about this distinction? Consider Bitcoin,
401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ wherein an anonymous user cannot spam the blockchain with bogus coins
402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ because its [proof-of-work][pow] protocol allows such coins to be
403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rejected immediately. There is no equivalent in Fossil: it has no
404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ technology that allows the receiving server to look at the content of a
405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ commit and automatically judge it to be “good.” Fossil relies on its
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ RBAC system to provide such distinctions: if you have a commit bit, your
407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ commits are *ipso facto* judged “good,” insofar as any human work
408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ product can be so judged by a blob of compiled C code. This takes us
409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ back to the [digital ledger question](#dlt), where we can talk about
410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ what it means to later correct a bad commit that got through the RBAC
411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ check.
412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ We may be willing to accept pseudonymity, rather than full anonymity.
414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ If we configure Fossil as above, either bypassing the RBAC or abandoning
415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ human control over it, scrubbing IP addresses, etc., is it then a public
416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ permissionless blockchain in that sense?
417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ We think not, because there is no [longest chain rule](#lcr) or anything
419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ like it in Fossil.
420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ For a fair model of how a Fossil repository might behave under such
422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ conditions, consider GitHub: here one user can fork another’s repository
423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ and make an arbitrary number of commits to their public fork. Imagine
424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this happens 10 times. How does someone come along later and
425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *automatically* evaluate which of the 11 forks of the code (counting the
426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ original repository among their number) is the “best” one? For a
427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ computer software project, the best we could do to approximate this
428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ devolves to a [software project cost estimation problem][scost]. These
429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ methods are rather questionable in their own right, being mathematical
430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ judgement values on human work products, but even if we accept their
431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ usefulness, then we still cannot say which fork is better based solely
432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ on their scores under these metrics. We may well prefer to use the fork
433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ of a software program that took *less* effort, being smaller, more
434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ self-contained, and with a smaller attack surface.
435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [alert]: ./alerts.md
438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [capi]: ./caps/ref.html#i
439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [mrep]: /help?cmd=remote
440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [scost]: https://en.wikipedia.org/wiki/Software_development_effort_estimation
441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [scrub]: /help?cmd=scrub
442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [sreg]: /help?cmd=self-register
443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Conclusion
446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ This author believes it is technologically indefensible to call Fossil a
448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ “blockchain” in any sense likely to be understood by a majority of those
449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ you’re communicating with.
450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Within a certain narrow scope, you can defend this usage, but if you do
452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ that, you’ve failed any goal that requires clear communication: it
453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ doesn’t work to use a term in a nonstandard way just because you can
454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ defend it. The people you’re communicating your ideas to must have the
455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ same concept of the terms you use.
456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ What term should you use instead? Fossil stores a DAG of hash-chained
459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ commits, so an indisputably correct term is a [Merkle tree][mt], named
460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ after [its inventor][drrm]. You could also use the more generic term
461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ “hash tree.”
462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fossil is a technological peer to many common sorts of blockchain
464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ technology. There is a lot of overlap in concepts and implementation
465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ details, but when speaking of what most people understand as
466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ “blockchain,” Fossil is not that.
467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [drrm]: https://en.wikipedia.org/wiki/Ralph_Merkle
469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [mt]: https://en.wikipedia.org/wiki/Merkle_tree
33 470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!