blockchain-lite 1.4.0 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 9fb07dad5bc09c884d56005cca1811efa4b97885
4
- data.tar.gz: 3ec43658943f4e9890d627effdbd1944abeea133
2
+ SHA256:
3
+ metadata.gz: c23e20fae718239734cf599d73beded949a12312de4fc2535769fadaa71ca77e
4
+ data.tar.gz: 82dd5188d90c78c80f767ddb0be664d1bce6800fdebf80cd4723dec8b6440e20
5
5
  SHA512:
6
- metadata.gz: 52a6008f77adf15d70f0f8a71b41c880fc1015eb5144cf849b829337f6ab4dc67afeacd2b0ecbdf3b4e47e4adacbb257c2af857c831052dbe13cf9e7b00e74cf
7
- data.tar.gz: 8ac88194f2f5791d83326f2c3fd4bdf8d71af6f9452fcffea13861cc954ef0db777c8f9cf902543facc6acbad56a28e3b537f99630fd521f8be30824abcb6e39
6
+ metadata.gz: 45e04027704febb2ee957b1547343a1b0829868a2256ea74d1656f7f79895d0b6d3862be2b546793372315ba4508d766c79993bf087a9a7b65acfd16102906d6
7
+ data.tar.gz: 073a34f50dbcb36da1d1a0e20268cfe3ca96e89f5e7f27cf195f3430e3dba5b4a631d662164d5db52b7c2f66ebf90104c5567474c8d8411bf06128a31c8036c1
@@ -1,3 +1,3 @@
1
- ### 0.0.1 / 2017-09-16
2
-
3
- * Everything is new. First release
1
+ ### 0.0.1 / 2017-09-16
2
+
3
+ * Everything is new. First release
@@ -1,5 +1,4 @@
1
- HISTORY.md
2
- LICENSE.md
1
+ CHANGELOG.md
3
2
  Manifest.txt
4
3
  README.md
5
4
  Rakefile
data/README.md CHANGED
@@ -1,303 +1,310 @@
1
- # Blockchain Lite (Ruby Edition)
2
-
3
- blockchain-lite library / gem - build your own blockchain with crypto hashes - revolutionize the world with blockchains, blockchains, blockchains one block at a time
4
-
5
- * home :: [github.com/openblockchains/blockchain.lite.rb](https://github.com/openblockchains/blockchain.lite.rb)
6
- * bugs :: [github.com/openblockchains/blockchain.lite.rb/issues](https://github.com/openblockchains/blockchain.lite.rb/issues)
7
- * gem :: [rubygems.org/gems/blockchain-lite](https://rubygems.org/gems/blockchain-lite)
8
- * rdoc :: [rubydoc.info/gems/blockchain-lite](http://rubydoc.info/gems/blockchain-lite)
9
-
10
-
11
- ## What's a Blockchain?
12
-
13
- > A blockchain is a distributed database with
14
- > a list (that is, chain) of records (that is, blocks)
15
- > linked and secured by digital fingerprints
16
- > (that is, crypto hashes).
17
-
18
- See the [Awesome Blockchains](https://github.com/openblockchains/awesome-blockchains) page for more.
19
-
20
-
21
- ## Usage
22
-
23
- Let's get started. Build your own blockchain one block at a time.
24
- Example:
25
-
26
- ``` ruby
27
- require 'blockchain-lite'
28
-
29
- b0 = Block.first( 'Genesis' )
30
- b1 = Block.next( b0, 'Transaction Data...' )
31
- b2 = Block.next( b1, 'Transaction Data...' )
32
- b3 = Block.next( b2, 'Transaction Data...' )
33
-
34
- blockchain = [b0, b1, b2, b3]
35
-
36
- pp blockchain
37
- ```
38
-
39
- will pretty print (pp) something like:
40
-
41
- ```
42
- [#<Block:0x1eed2a0
43
- @index = 0,
44
- @timestamp = 2017-09-15 20:52:38,
45
- @transactions_count = 1,
46
- @transactions = ["Genesis"],
47
- @previous_hash = "0",
48
- @hash = "edbd4e11e69bc399a9ccd8faaea44fb27410fe8e3023bb9462450a0a9c4caa1b">,
49
- #<Block:0x1eec9a0
50
- @index = 1,
51
- @timestamp = 2017-09-15 21:02:38,
52
- @transactions_count = 1,
53
- @transactions = ["Transaction Data..."],
54
- @hash = "eb8ecbf6d5870763ae246e37539d82e37052cb32f88bb8c59971f9978e437743",
55
- @previous_hash = "edbd4e11e69bc399a9ccd8faaea44fb27410fe8e3023bb9462450a0a9c4caa1b">,
56
- #<Block:0x1eec838
57
- @index = 2,
58
- @timestamp = 2017-09-15 21:12:38,
59
- @transactions_count = 1,
60
- @transactions = ["Transaction Data..."],
61
- @hash = "be50017ee4bbcb33844b3dc2b7c4e476d46569b5df5762d14ceba9355f0a85f4",
62
- @previous_hash = "eb8ecbf6d5870763ae246e37539d82e37052cb32f88bb8c59971f9978e437743">,
63
- #<Block:0x1eec6d0
64
- @index = 3,
65
- @timestamp = 2017-09-15 21:22:38
66
- @transactions_count = 1,
67
- @transactions = ["Transaction Data..."],
68
- @hash = "5ee2981606328abfe0c3b1171440f0df746c1e1f8b3b56c351727f7da7ae5d8d",
69
- @previous_hash = "be50017ee4bbcb33844b3dc2b7c4e476d46569b5df5762d14ceba9355f0a85f4">]
70
- ```
71
-
72
-
73
- ### Blocks
74
-
75
- [Basic](#basic) •
76
- [Proof-of-Work](#proof-of-work)
77
-
78
- Supported block types / classes for now include:
79
-
80
- #### Basic
81
-
82
- ``` ruby
83
- class Block
84
-
85
- attr_reader :index
86
- attr_reader :timestamp
87
- attr_reader :transactions_count
88
- attr_reader :transactions
89
- attr_reader :previous_hash
90
- attr_reader :hash
91
-
92
- def initialize(index, transactions, previous_hash)
93
- @index = index
94
- @timestamp = Time.now.utc ## note: use coordinated universal time (utc)
95
- @transactions = transactions
96
- @transactions_count = transactions.size
97
- @previous_hash = previous_hash
98
- @hash = calc_hash
99
- end
100
-
101
- def calc_hash
102
- sha = Digest::SHA256.new
103
- sha.update( @timestamp.to_s +
104
- @transactions.to_s +
105
- @previous_hash )
106
- sha.hexdigest
107
- end
108
- ...
109
- end
110
- ```
111
-
112
- (Source: [basic/block.rb](lib/blockchain-lite/basic/block.rb))
113
-
114
-
115
- #### Proof-of-Work
116
-
117
- ``` ruby
118
- class Block
119
-
120
- attr_reader :index
121
- attr_reader :timestamp
122
- attr_reader :transactions_count
123
- attr_reader :transactions
124
- attr_reader :transactions_hash ## merkle_root
125
- attr_reader :previous_hash
126
- attr_reader :nonce ## proof of work if hash starts with leading zeros (00)
127
- attr_reader :hash
128
-
129
- def initialize(index, transactions, previous_hash)
130
- @index = index
131
- @timestamp = Time.now.utc ## note: use coordinated universal time (utc)
132
- @transactions = transactions
133
- @transactions_count = transactions.size
134
- @transactions_hash = MerkleTree.compute_root_for( transactions )
135
- @previous_hash = previous_hash
136
- @nonce, @hash = compute_hash_with_proof_of_work
137
- end
138
-
139
- def calc_hash
140
- sha = Digest::SHA256.new
141
- sha.update( @nonce.to_s +
142
- @timestamp.to_s +
143
- @transactions_hash +
144
- @previous_hash )
145
- sha.hexdigest
146
- end
147
- ...
148
- end
149
- ```
150
-
151
- (Source: [proof_of_work/block.rb](lib/blockchain-lite/proof_of_work/block.rb))
152
-
153
-
154
-
155
- ### Blockchain Helper / Convenience Wrapper
156
-
157
- The `Blockchain` class offers some convenience helpers
158
- for building and checking blockchains. Example:
159
-
160
- ``` ruby
161
- b = Blockchain.new # note: will (auto-) add the first (genesis) block
162
-
163
- b << 'Transaction Data...'
164
- b << 'Transaction Data...'
165
- b << 'Transaction Data...'
166
-
167
- pp b
168
- ```
169
-
170
- Check for broken chain links. Example:
171
-
172
- ``` ruby
173
-
174
- b.broken?
175
- # => false ## blockchain OK
176
- ```
177
-
178
- or use the `Blockchain` class as a wrapper (pass in the blockchain array):
179
-
180
- ``` ruby
181
- b0 = Block.first( 'Genesis' )
182
- b1 = Block.next( b0, 'Transaction Data...' )
183
- b2 = Block.next( b1, 'Transaction Data...' )
184
- b3 = Block.next( b2, 'Transaction Data...' )
185
-
186
- blockchain = [b0, b1, b2, b3]
187
-
188
-
189
- b = Blockchain.new( blockchain )
190
-
191
- b.broken?
192
- # => false ## blockchain OK
193
- ```
194
-
195
- and so on.
196
-
197
-
198
- ### Transactions
199
-
200
- Let's put the transactions from the (hyper) ledger book from [Tulips on the Blockchain!](https://github.com/openblockchains/tulips)
201
- on the blockchain:
202
-
203
-
204
- | From | To | What | Qty |
205
- |---------------------|--------------|---------------------------|----:|
206
- | Dutchgrown (†) | Vincent | Tulip Bloemendaal Sunset | 10 |
207
- | Keukenhof (†) | Anne | Tulip Semper Augustus | 7 |
208
- | | | | |
209
- | Flowers (†) | Ruben | Tulip Admiral van Eijck | 5 |
210
- | Vicent | Anne | Tulip Bloemendaal Sunset | 3 |
211
- | Anne | Julia | Tulip Semper Augustus | 1 |
212
- | Julia | Luuk | Tulip Semper Augustus | 1 |
213
- | | | | |
214
- | Bloom & Blossom (†) | Daisy | Tulip Admiral of Admirals | 8 |
215
- | Vincent | Max | Tulip Bloemendaal Sunset | 2 |
216
- | Anne | Martijn | Tulip Semper Augustus | 2 |
217
- | Ruben | Julia | Tulip Admiral van Eijck | 2 |
218
- | | | | |
219
- | Teleflora (†) | Max | Tulip Red Impression | 11 |
220
- | Anne | Naomi | Tulip Bloemendaal Sunset | 1 |
221
- | Daisy | Vincent | Tulip Admiral of Admirals | 3 |
222
- | Julia | Mina | Tulip Admiral van Eijck | 1 |
223
-
224
- (†): Grower Transaction - New Tulips on the Market!
225
-
226
-
227
- ```ruby
228
- b0 = Block.first(
229
- { from: "Dutchgrown", to: "Vincent", what: "Tulip Bloemendaal Sunset", qty: 10 },
230
- { from: "Keukenhof", to: "Anne", what: "Tulip Semper Augustus", qty: 7 } )
231
-
232
- b1 = Block.next( b0,
233
- { from: "Flowers", to: "Ruben", what: "Tulip Admiral van Eijck", qty: 5 },
234
- { from: "Vicent", to: "Anne", what: "Tulip Bloemendaal Sunset", qty: 3 },
235
- { from: "Anne", to: "Julia", what: "Tulip Semper Augustus", qty: 1 },
236
- { from: "Julia", to: "Luuk", what: "Tulip Semper Augustus", qty: 1 } )
237
-
238
- b2 = Block.next( b1,
239
- { from: "Bloom & Blossom", to: "Daisy", what: "Tulip Admiral of Admirals", qty: 8 },
240
- { from: "Vincent", to: "Max", what: "Tulip Bloemendaal Sunset", qty: 2 },
241
- { from: "Anne", to: "Martijn", what: "Tulip Semper Augustus", qty: 2 },
242
- { from: "Ruben", to: "Julia", what: "Tulip Admiral van Eijck", qty: 2 } )
243
- ...
244
- ```
245
-
246
- resulting in:
247
-
248
- ```
249
- [#<Block:0x2da3da0
250
- @index = 0,
251
- @timestamp = 1637-09-24 11:40:15,
252
- @previous_hash = "0",
253
- @hash = "32bd169baebba0b70491b748329ab631c85175be15e1672f924ca174f628cb66",
254
- @transactions_count = 2,
255
- @transactions =
256
- [{:from=>"Dutchgrown", :to=>"Vincent", :what=>"Tulip Bloemendaal Sunset", :qty=>10},
257
- {:from=>"Keukenhof", :to=>"Anne", :what=>"Tulip Semper Augustus", :qty=>7}]>,
258
- #<Block:0x2da2ff0
259
- @index = 1,
260
- @timestamp = 1637-09-24 11:50:15,
261
- @previous_hash = "32bd169baebba0b70491b748329ab631c85175be15e1672f924ca174f628cb66",
262
- @hash = "57b519a8903e45348ac8a739c788815e2bd90423663957f87e276307f77f1028",
263
- @transactions_count = 4,
264
- @transactions =
265
- [{:from=>"Flowers", :to=>"Ruben", :what=>"Tulip Admiral van Eijck", :qty=>5},
266
- {:from=>"Vicent", :to=>"Anne", :what=>"Tulip Bloemendaal Sunset", :qty=>3},
267
- {:from=>"Anne", :to=>"Julia", :what=>"Tulip Semper Augustus", :qty=>1},
268
- {:from=>"Julia", :to=>"Luuk", :what=>"Tulip Semper Augustus", :qty=>1}]>,
269
- #<Block:0x2da2720
270
- @index = 2,
271
- @timestamp = 1637-09-24 12:00:15,
272
- @previous_hash = "57b519a8903e45348ac8a739c788815e2bd90423663957f87e276307f77f1028",
273
- @hash = "ec7dd5ea86ab966d4d4db182abb7aa93c7e5f63857476e6301e7e38cebf36568",
274
- @transactions_count = 4,
275
- @transactions =
276
- [{:from=>"Bloom & Blossom", :to=>"Daisy", :what=>"Tulip Admiral of Admirals", :qty=>8},
277
- {:from=>"Vincent", :to=>"Max", :what=>"Tulip Bloemendaal Sunset", :qty=>2},
278
- {:from=>"Anne", :to=>"Martijn", :what=>"Tulip Semper Augustus", :qty=>2},
279
- {:from=>"Ruben", :to=>"Julia", :what=>"Tulip Admiral van Eijck", :qty=>2}]>,
280
- ...
281
- ```
282
-
283
-
284
- ## Blockchain Lite in the Real World
285
-
286
- - [**centralbank**](https://github.com/openblockchains/centralbank) - command line tool (and core library) - print your own money / cryptocurrency; run your own federated central bank nodes on the blockchain peer-to-peer over HTTP; revolutionize the world one block at a time
287
- - [**tulipmania**](https://github.com/openblockchains/tulipmania) - command line tool (and core library) - tulips on the blockchain; learn by example from the real world (anno 1637) - buy! sell! hodl! enjoy the beauty of admiral of admirals, semper augustus, and more; run your own hyper ledger tulip exchange nodes on the blockchain peer-to-peer over HTTP; revolutionize the world one block at a time
288
- - [**shilling**](https://github.com/bitshilling/bitshilling.tools) - command line tool (and core library) - shilling (or schilling) on the blockchain! rock-solid alpine dollar from austria; print (mine) your own shillings; run your own federated shilling central bank nodes w/ public distributed (hyper) ledger book on the blockchain peer-to-peer over HTTP; revolutionize the world one block at a time
289
- - You? Add your tool / service
290
-
291
-
292
- ## References
293
-
294
- [**Programming Cryptocurrencies and Blockchains (in Ruby)**](http://yukimotopress.github.io/blockchains) by Gerald Bauer et al, 2018, Yuki & Moto Press
295
-
296
-
297
-
298
- ## License
299
-
300
- ![](https://publicdomainworks.github.io/buttons/zero88x31.png)
301
-
302
- The `blockchain.lite` scripts are dedicated to the public domain.
303
- Use it as you please with no restrictions whatsoever.
1
+ # Blockchain Lite
2
+
3
+ blockchain-lite library / gem - build your own blockchain with crypto hashes - revolutionize the world with blockchains, blockchains, blockchains one block at a time
4
+
5
+ * home :: [github.com/rubycoco/blockchain](https://github.com/rubycoco/blockchain)
6
+ * bugs :: [github.com/rubycoco/blockchain/issues](https://github.com/rubycoco/blockchain/issues)
7
+ * gem :: [rubygems.org/gems/blockchain-lite](https://rubygems.org/gems/blockchain-lite)
8
+ * rdoc :: [rubydoc.info/gems/blockchain-lite](http://rubydoc.info/gems/blockchain-lite)
9
+
10
+
11
+
12
+ ## What's a Blockchain?
13
+
14
+ > A blockchain is a
15
+ > a list (that is, chain) of records (that is, blocks)
16
+ > linked and secured by digital fingerprints
17
+ > (that is, crypto hashes).
18
+
19
+ See the [Awesome Blockchains](https://github.com/openblockchains/awesome-blockchains) page for more.
20
+
21
+
22
+ ## Usage
23
+
24
+ Let's get started. Build your own blockchain one block at a time.
25
+ Example:
26
+
27
+ ``` ruby
28
+ require 'blockchain-lite'
29
+
30
+ b0 = Block.first( 'Genesis' )
31
+ b1 = Block.next( b0, 'Transaction Data...' )
32
+ b2 = Block.next( b1, 'Transaction Data...' )
33
+ b3 = Block.next( b2, 'Transaction Data...' )
34
+
35
+ blockchain = [b0, b1, b2, b3]
36
+
37
+ pp blockchain
38
+ ```
39
+
40
+ will pretty print (pp) something like:
41
+
42
+ ```
43
+ [#<Block:0x1eed2a0
44
+ @index = 0,
45
+ @timestamp = 2021-09-15 20:52:38,
46
+ @transactions_count = 1,
47
+ @transactions = ["Genesis"],
48
+ @previous_hash = "0",
49
+ @hash = "edbd4e11e69bc399a9ccd8faaea44fb27410fe8e3023bb9462450a0a9c4caa1b">,
50
+ #<Block:0x1eec9a0
51
+ @index = 1,
52
+ @timestamp = 2021-09-15 21:02:38,
53
+ @transactions_count = 1,
54
+ @transactions = ["Transaction Data..."],
55
+ @hash = "eb8ecbf6d5870763ae246e37539d82e37052cb32f88bb8c59971f9978e437743",
56
+ @previous_hash = "edbd4e11e69bc399a9ccd8faaea44fb27410fe8e3023bb9462450a0a9c4caa1b">,
57
+ #<Block:0x1eec838
58
+ @index = 2,
59
+ @timestamp = 2021-09-15 21:12:38,
60
+ @transactions_count = 1,
61
+ @transactions = ["Transaction Data..."],
62
+ @hash = "be50017ee4bbcb33844b3dc2b7c4e476d46569b5df5762d14ceba9355f0a85f4",
63
+ @previous_hash = "eb8ecbf6d5870763ae246e37539d82e37052cb32f88bb8c59971f9978e437743">,
64
+ #<Block:0x1eec6d0
65
+ @index = 3,
66
+ @timestamp = 2021-09-15 21:22:38
67
+ @transactions_count = 1,
68
+ @transactions = ["Transaction Data..."],
69
+ @hash = "5ee2981606328abfe0c3b1171440f0df746c1e1f8b3b56c351727f7da7ae5d8d",
70
+ @previous_hash = "be50017ee4bbcb33844b3dc2b7c4e476d46569b5df5762d14ceba9355f0a85f4">]
71
+ ```
72
+
73
+
74
+ ### Blocks
75
+
76
+ [Basic](#basic)
77
+ [Proof-of-Work](#proof-of-work)
78
+
79
+ Supported block types / classes for now include:
80
+
81
+ #### Basic
82
+
83
+ ``` ruby
84
+ class Block
85
+
86
+ attr_reader :index
87
+ attr_reader :timestamp
88
+ attr_reader :transactions_count
89
+ attr_reader :transactions
90
+ attr_reader :previous_hash
91
+ attr_reader :hash
92
+
93
+ def initialize(index, transactions, previous_hash)
94
+ @index = index
95
+ @timestamp = Time.now.utc ## note: use coordinated universal time (utc)
96
+ @transactions = transactions
97
+ @transactions_count = transactions.size
98
+ @previous_hash = previous_hash
99
+ @hash = calc_hash
100
+ end
101
+
102
+ def calc_hash
103
+ sha = Digest::SHA256.new
104
+ sha.update( @timestamp.to_s +
105
+ @transactions.to_s +
106
+ @previous_hash )
107
+ sha.hexdigest
108
+ end
109
+ ...
110
+ end
111
+ ```
112
+
113
+ (Source: [basic/block.rb](lib/blockchain-lite/basic/block.rb))
114
+
115
+
116
+ #### Proof-of-Work
117
+
118
+ ``` ruby
119
+ class Block
120
+
121
+ attr_reader :index
122
+ attr_reader :timestamp
123
+ attr_reader :transactions_count
124
+ attr_reader :transactions
125
+ attr_reader :transactions_hash ## merkle_root
126
+ attr_reader :previous_hash
127
+ attr_reader :nonce ## proof of work if hash starts with leading zeros (00)
128
+ attr_reader :hash
129
+
130
+ def initialize(index, transactions, previous_hash)
131
+ @index = index
132
+ @timestamp = Time.now.utc ## note: use coordinated universal time (utc)
133
+ @transactions = transactions
134
+ @transactions_count = transactions.size
135
+ @transactions_hash = MerkleTree.compute_root_for( transactions )
136
+ @previous_hash = previous_hash
137
+ @nonce, @hash = compute_hash_with_proof_of_work
138
+ end
139
+
140
+ def calc_hash
141
+ sha = Digest::SHA256.new
142
+ sha.update( @nonce.to_s +
143
+ @timestamp.to_s +
144
+ @transactions_hash +
145
+ @previous_hash )
146
+ sha.hexdigest
147
+ end
148
+ ...
149
+ end
150
+ ```
151
+
152
+ (Source: [proof_of_work/block.rb](lib/blockchain-lite/proof_of_work/block.rb))
153
+
154
+
155
+
156
+ ### Blockchain Helper / Convenience Wrapper
157
+
158
+ The `Blockchain` class offers some convenience helpers
159
+ for building and checking blockchains. Example:
160
+
161
+ ``` ruby
162
+ b = Blockchain.new # note: will (auto-) add the first (genesis) block
163
+
164
+ b << 'Transaction Data...'
165
+ b << 'Transaction Data...'
166
+ b << 'Transaction Data...'
167
+
168
+ pp b
169
+ ```
170
+
171
+ Check for broken chain links. Example:
172
+
173
+ ``` ruby
174
+
175
+ b.broken?
176
+ # => false ## blockchain OK
177
+ ```
178
+
179
+ or use the `Blockchain` class as a wrapper (pass in the blockchain array):
180
+
181
+ ``` ruby
182
+ b0 = Block.first( 'Genesis' )
183
+ b1 = Block.next( b0, 'Transaction Data...' )
184
+ b2 = Block.next( b1, 'Transaction Data...' )
185
+ b3 = Block.next( b2, 'Transaction Data...' )
186
+
187
+ blockchain = [b0, b1, b2, b3]
188
+
189
+
190
+ b = Blockchain.new( blockchain )
191
+
192
+ b.broken?
193
+ # => false ## blockchain OK
194
+ ```
195
+
196
+ and so on.
197
+
198
+
199
+ ### Transactions
200
+
201
+ Let's put the transactions from the (hyper) ledger book from [Tulips on the Blockchain!](https://github.com/openblockchains/tulips)
202
+ on the blockchain:
203
+
204
+
205
+ | From | To | What | Qty |
206
+ |---------------------|--------------|---------------------------|----:|
207
+ | Dutchgrown (†) | Vincent | Tulip Bloemendaal Sunset | 10 |
208
+ | Keukenhof (†) | Anne | Tulip Semper Augustus | 7 |
209
+ | | | | |
210
+ | Flowers (†) | Ruben | Tulip Admiral van Eijck | 5 |
211
+ | Vicent | Anne | Tulip Bloemendaal Sunset | 3 |
212
+ | Anne | Julia | Tulip Semper Augustus | 1 |
213
+ | Julia | Luuk | Tulip Semper Augustus | 1 |
214
+ | | | | |
215
+ | Bloom & Blossom (†) | Daisy | Tulip Admiral of Admirals | 8 |
216
+ | Vincent | Max | Tulip Bloemendaal Sunset | 2 |
217
+ | Anne | Martijn | Tulip Semper Augustus | 2 |
218
+ | Ruben | Julia | Tulip Admiral van Eijck | 2 |
219
+ | | | | |
220
+ | Teleflora (†) | Max | Tulip Red Impression | 11 |
221
+ | Anne | Naomi | Tulip Bloemendaal Sunset | 1 |
222
+ | Daisy | Vincent | Tulip Admiral of Admirals | 3 |
223
+ | Julia | Mina | Tulip Admiral van Eijck | 1 |
224
+
225
+ (†): Grower Transaction - New Tulips on the Market!
226
+
227
+
228
+ ```ruby
229
+ b0 = Block.first(
230
+ { from: "Dutchgrown", to: "Vincent", what: "Tulip Bloemendaal Sunset", qty: 10 },
231
+ { from: "Keukenhof", to: "Anne", what: "Tulip Semper Augustus", qty: 7 } )
232
+
233
+ b1 = Block.next( b0,
234
+ { from: "Flowers", to: "Ruben", what: "Tulip Admiral van Eijck", qty: 5 },
235
+ { from: "Vicent", to: "Anne", what: "Tulip Bloemendaal Sunset", qty: 3 },
236
+ { from: "Anne", to: "Julia", what: "Tulip Semper Augustus", qty: 1 },
237
+ { from: "Julia", to: "Luuk", what: "Tulip Semper Augustus", qty: 1 } )
238
+
239
+ b2 = Block.next( b1,
240
+ { from: "Bloom & Blossom", to: "Daisy", what: "Tulip Admiral of Admirals", qty: 8 },
241
+ { from: "Vincent", to: "Max", what: "Tulip Bloemendaal Sunset", qty: 2 },
242
+ { from: "Anne", to: "Martijn", what: "Tulip Semper Augustus", qty: 2 },
243
+ { from: "Ruben", to: "Julia", what: "Tulip Admiral van Eijck", qty: 2 } )
244
+ ...
245
+ ```
246
+
247
+ resulting in:
248
+
249
+ ```
250
+ [#<Block:0x2da3da0
251
+ @index = 0,
252
+ @timestamp = 1637-09-24 11:40:15,
253
+ @previous_hash = "0",
254
+ @hash = "32bd169baebba0b70491b748329ab631c85175be15e1672f924ca174f628cb66",
255
+ @transactions_count = 2,
256
+ @transactions =
257
+ [{:from=>"Dutchgrown", :to=>"Vincent", :what=>"Tulip Bloemendaal Sunset", :qty=>10},
258
+ {:from=>"Keukenhof", :to=>"Anne", :what=>"Tulip Semper Augustus", :qty=>7}]>,
259
+ #<Block:0x2da2ff0
260
+ @index = 1,
261
+ @timestamp = 1637-09-24 11:50:15,
262
+ @previous_hash = "32bd169baebba0b70491b748329ab631c85175be15e1672f924ca174f628cb66",
263
+ @hash = "57b519a8903e45348ac8a739c788815e2bd90423663957f87e276307f77f1028",
264
+ @transactions_count = 4,
265
+ @transactions =
266
+ [{:from=>"Flowers", :to=>"Ruben", :what=>"Tulip Admiral van Eijck", :qty=>5},
267
+ {:from=>"Vicent", :to=>"Anne", :what=>"Tulip Bloemendaal Sunset", :qty=>3},
268
+ {:from=>"Anne", :to=>"Julia", :what=>"Tulip Semper Augustus", :qty=>1},
269
+ {:from=>"Julia", :to=>"Luuk", :what=>"Tulip Semper Augustus", :qty=>1}]>,
270
+ #<Block:0x2da2720
271
+ @index = 2,
272
+ @timestamp = 1637-09-24 12:00:15,
273
+ @previous_hash = "57b519a8903e45348ac8a739c788815e2bd90423663957f87e276307f77f1028",
274
+ @hash = "ec7dd5ea86ab966d4d4db182abb7aa93c7e5f63857476e6301e7e38cebf36568",
275
+ @transactions_count = 4,
276
+ @transactions =
277
+ [{:from=>"Bloom & Blossom", :to=>"Daisy", :what=>"Tulip Admiral of Admirals", :qty=>8},
278
+ {:from=>"Vincent", :to=>"Max", :what=>"Tulip Bloemendaal Sunset", :qty=>2},
279
+ {:from=>"Anne", :to=>"Martijn", :what=>"Tulip Semper Augustus", :qty=>2},
280
+ {:from=>"Ruben", :to=>"Julia", :what=>"Tulip Admiral van Eijck", :qty=>2}]>,
281
+ ...
282
+ ```
283
+
284
+
285
+ ## Blockchain Lite in the Real World
286
+
287
+ - [**centralbank**](../centralbank) - command line tool (and core library) - print your own money / cryptocurrency; run your own federated central bank nodes on the blockchain peer-to-peer over HTTP; revolutionize the world one block at a time
288
+ - [**tulipmania**](../tulipmania) - command line tool (and core library) - tulips on the blockchain; learn by example from the real world (anno 1637) - buy! sell! hodl! enjoy the beauty of admiral of admirals, semper augustus, and more; run your own hyper ledger tulip exchange nodes on the blockchain peer-to-peer over HTTP; revolutionize the world one block at a time
289
+
290
+ <!--
291
+ - [**shilling**](https://github.com/bitshilling/bitshilling) - command line tool (and core library) - shilling (or schilling) on the blockchain! rock-solid alpine dollar from austria; print (mine) your own shillings; run your own federated shilling central bank nodes w/ public distributed (hyper) ledger book on the blockchain peer-to-peer over HTTP; revolutionize the world one block at a time
292
+ -->
293
+
294
+ - You? Add your tool / service
295
+
296
+
297
+ ## References
298
+
299
+ [**Programming Cryptocurrencies and Blockchains (in Ruby)**](http://yukimotopress.github.io/blockchains) by Gerald Bauer et al, 2018, Yuki & Moto Press
300
+
301
+ And many more @ [**Best of Crypto Books**](https://openblockchains.github.io/crypto-books/) - a collection of books, white papers & more about crypto and blockchains
302
+
303
+
304
+
305
+ ## License
306
+
307
+ ![](https://publicdomainworks.github.io/buttons/zero88x31.png)
308
+
309
+ The `blockchain.lite` scripts are dedicated to the public domain.
310
+ Use it as you please with no restrictions whatsoever.
data/Rakefile CHANGED
@@ -1,30 +1,30 @@
1
- require 'hoe'
2
- require './lib/blockchain-lite/version.rb'
3
-
4
- Hoe.spec 'blockchain-lite' do
5
-
6
- self.version = BlockchainLite::VERSION
7
-
8
- self.summary = "blockchain-lite - build your own blockchain with crypto hashes - revolutionize the world with blockchains, blockchains, blockchains one block at a time"
9
- self.description = summary
10
-
11
- self.urls = ['https://github.com/openblockchains/blockchain.lite.rb']
12
-
13
- self.author = 'Gerald Bauer'
14
- self.email = 'wwwmake@googlegroups.com'
15
-
16
- # switch extension to .markdown for gihub formatting
17
- self.readme_file = 'README.md'
18
- self.history_file = 'HISTORY.md'
19
-
20
- self.extra_deps = [
21
- ['merkletree'],
22
- ]
23
-
24
- self.licenses = ['Public Domain']
25
-
26
- self.spec_extras = {
27
- required_ruby_version: '>= 2.3'
28
- }
29
-
30
- end
1
+ require 'hoe'
2
+ require './lib/blockchain-lite/version.rb'
3
+
4
+ Hoe.spec 'blockchain-lite' do
5
+
6
+ self.version = BlockchainLite::VERSION
7
+
8
+ self.summary = "blockchain-lite - build your own blockchain with crypto hashes - revolutionize the world with blockchains, blockchains, blockchains one block at a time"
9
+ self.description = summary
10
+
11
+ self.urls = { home: 'https://github.com/rubycoco/blockchain' }
12
+
13
+ self.author = 'Gerald Bauer'
14
+ self.email = 'wwwmake@googlegroups.com'
15
+
16
+ # switch extension to .markdown for gihub formatting
17
+ self.readme_file = 'README.md'
18
+ self.history_file = 'CHANGELOG.md'
19
+
20
+ self.extra_deps = [
21
+ ['merkletree'],
22
+ ]
23
+
24
+ self.licenses = ['Public Domain']
25
+
26
+ self.spec_extras = {
27
+ required_ruby_version: '>= 2.3'
28
+ }
29
+
30
+ end
@@ -25,4 +25,4 @@ require 'blockchain-lite/blockchain'
25
25
 
26
26
 
27
27
  # say hello
28
- puts BlockchainLite.banner if defined?($RUBYLIBS_DEBUG) && $RUBYLIBS_DEBUG
28
+ puts BlockchainLite.banner ## if defined?($RUBYLIBS_DEBUG) && $RUBYLIBS_DEBUG
@@ -1,23 +1,23 @@
1
- # encoding: utf-8
2
-
3
-
4
- module BlockchainLite
5
-
6
- MAJOR = 1
7
- MINOR = 4
8
- PATCH = 0
9
- VERSION = [MAJOR,MINOR,PATCH].join('.')
10
-
11
- def self.version
12
- VERSION
13
- end
14
-
15
- def self.banner
16
- "blockchain-lite/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
17
- end
18
-
19
- def self.root
20
- "#{File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )}"
21
- end
22
-
23
- end # module BlockchainLite
1
+ # encoding: utf-8
2
+
3
+
4
+ module BlockchainLite
5
+
6
+ MAJOR = 1
7
+ MINOR = 4
8
+ PATCH = 1
9
+ VERSION = [MAJOR,MINOR,PATCH].join('.')
10
+
11
+ def self.version
12
+ VERSION
13
+ end
14
+
15
+ def self.banner
16
+ "blockchain-lite/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}] in (#{root})"
17
+ end
18
+
19
+ def self.root
20
+ File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )
21
+ end
22
+
23
+ end # module BlockchainLite
@@ -1,28 +1,28 @@
1
- ## $:.unshift(File.dirname(__FILE__))
2
-
3
- ## minitest setup
4
-
5
- require 'minitest/autorun'
6
-
7
-
8
- ## our own code
9
-
10
- require 'blockchain-lite/base' ## note: use "modular" version without "top-level" Block constant
11
-
12
-
13
- module Basic
14
- Block = BlockchainLite::Basic::Block ## convenience shortcut
15
-
16
- class Blockchain < BlockchainLite::Blockchain
17
- def block_class() Block; end
18
- end
19
- end # module Basic
20
-
21
-
22
- module ProofOfWork
23
- Block = BlockchainLite::ProofOfWork::Block ## convenience shortcut
24
-
25
- class Blockchain < BlockchainLite::Blockchain
26
- def block_class() Block; end
27
- end
28
- end # module ProofOfWork
1
+ ## $:.unshift(File.dirname(__FILE__))
2
+
3
+ ## minitest setup
4
+
5
+ require 'minitest/autorun'
6
+
7
+
8
+ ## our own code
9
+
10
+ require 'blockchain-lite/base' ## note: use "modular" version without "top-level" Block constant
11
+
12
+
13
+ module Basic
14
+ Block = BlockchainLite::Basic::Block ## convenience shortcut
15
+
16
+ class Blockchain < BlockchainLite::Blockchain
17
+ def block_class() Block; end
18
+ end
19
+ end # module Basic
20
+
21
+
22
+ module ProofOfWork
23
+ Block = BlockchainLite::ProofOfWork::Block ## convenience shortcut
24
+
25
+ class Blockchain < BlockchainLite::Blockchain
26
+ def block_class() Block; end
27
+ end
28
+ end # module ProofOfWork
@@ -1,93 +1,93 @@
1
- # encoding: utf-8
2
-
3
- ###
4
- # to run use
5
- # ruby -I ./lib -I ./test test/test_block.rb
6
-
7
-
8
- require 'helper'
9
-
10
-
11
- class TestBlock < MiniTest::Test
12
-
13
- include ProofOfWork ## adds Block = BlockchainLite::ProofOfWork::Block etc.
14
-
15
-
16
- def test_example
17
-
18
- b0 = Block.first( 'Genesis' )
19
- b1 = Block.next( b0, 'Transaction Data...' )
20
- b2 = Block.next( b1, 'Transaction Data...', 'Transaction Data...' )
21
- b3 = Block.next( b2 ) ## no transaction data
22
- b4 = Block.next( b3, ['Transaction Data...', 'Transaction Data...'] )
23
-
24
- blockchain = [b0, b1, b2, b3, b4]
25
-
26
- pp blockchain
27
-
28
- assert true ## (for now) everything ok if we get here
29
- end
30
-
31
- def test_tulips_example
32
- b0 = Block.first(
33
- { from: "Dutchgrown", to: "Vincent", name: "Tulip Bloemendaal Sunset", qty: 10 },
34
- { from: "Keukenhof", to: "Anne", name: "Tulip Semper Augustus", qty: 7 } )
35
-
36
- b1 = Block.next( b0,
37
- { from: "Flowers", to: "Ruben", name: "Tulip Admiral van Eijck", qty: 5 },
38
- { from: "Vicent", to: "Anne", name: "Tulip Bloemendaal Sunset", qty: 3 },
39
- { from: "Anne", to: "Julia", name: "Tulip Semper Augustus", qty: 1 },
40
- { from: "Julia", to: "Luuk", name: "Tulip Semper Augustus", qty: 1 } )
41
-
42
- b2 = Block.next( b1,
43
- { from: "Bloom & Blossom", to: "Daisy", name: "Tulip Admiral of Admirals", qty: 8 },
44
- { from: "Vincent", to: "Max", name: "Tulip Bloemendaal Sunset", qty: 2 },
45
- { from: "Anne", to: "Martijn", name: "Tulip Semper Augustus", qty: 2 },
46
- { from: "Ruben", to: "Julia", name: "Tulip Admiral van Eijck", qty: 2 } )
47
-
48
- blockchain = [b0, b1, b2]
49
-
50
- pp blockchain
51
-
52
- assert true ## (for now) everything ok if we get here
53
- end
54
-
55
-
56
- def timestamp1637
57
- ## change year to 1637 :-)
58
- ## note: time (uses signed integer e.g. epoch/unix time starting in 1970 with 0)
59
- ## todo: add nano/mili-seconds - why? why not? possible?
60
- now = Time.now.utc.to_datetime
61
- past = DateTime.new( 1637, now.month, now.mday, now.hour, now.min, now.sec, now.zone )
62
- past
63
- end
64
-
65
- def test_tulips_1637_example
66
-
67
- b0 = Block.first(
68
- { from: "Dutchgrown", to: "Vincent", name: "Tulip Bloemendaal Sunset", qty: 10 },
69
- { from: "Keukenhof", to: "Anne", name: "Tulip Semper Augustus", qty: 7 },
70
- timestamp: timestamp1637 )
71
-
72
- b1 = Block.next( b0,
73
- { from: "Flowers", to: "Ruben", name: "Tulip Admiral van Eijck", qty: 5 },
74
- { from: "Vicent", to: "Anne", name: "Tulip Bloemendaal Sunset", qty: 3 },
75
- { from: "Anne", to: "Julia", name: "Tulip Semper Augustus", qty: 1 },
76
- { from: "Julia", to: "Luuk", name: "Tulip Semper Augustus", qty: 1 },
77
- timestamp: timestamp1637 )
78
-
79
- b2 = Block.next( b1,
80
- { from: "Bloom & Blossom", to: "Daisy", name: "Tulip Admiral of Admirals", qty: 8 },
81
- { from: "Vincent", to: "Max", name: "Tulip Bloemendaal Sunset", qty: 2 },
82
- { from: "Anne", to: "Martijn", name: "Tulip Semper Augustus", qty: 2 },
83
- { from: "Ruben", to: "Julia", name: "Tulip Admiral van Eijck", qty: 2 },
84
- timestamp: timestamp1637 )
85
-
86
- blockchain = [b0, b1, b2]
87
-
88
- pp blockchain
89
-
90
- assert true ## (for now) everything ok if we get here
91
- end
92
-
93
- end # class TestBlock
1
+ # encoding: utf-8
2
+
3
+ ###
4
+ # to run use
5
+ # ruby -I ./lib -I ./test test/test_block.rb
6
+
7
+
8
+ require 'helper'
9
+
10
+
11
+ class TestBlock < MiniTest::Test
12
+
13
+ include ProofOfWork ## adds Block = BlockchainLite::ProofOfWork::Block etc.
14
+
15
+
16
+ def test_example
17
+
18
+ b0 = Block.first( 'Genesis' )
19
+ b1 = Block.next( b0, 'Transaction Data...' )
20
+ b2 = Block.next( b1, 'Transaction Data...', 'Transaction Data...' )
21
+ b3 = Block.next( b2 ) ## no transaction data
22
+ b4 = Block.next( b3, ['Transaction Data...', 'Transaction Data...'] )
23
+
24
+ blockchain = [b0, b1, b2, b3, b4]
25
+
26
+ pp blockchain
27
+
28
+ assert true ## (for now) everything ok if we get here
29
+ end
30
+
31
+ def test_tulips_example
32
+ b0 = Block.first(
33
+ { from: "Dutchgrown", to: "Vincent", name: "Tulip Bloemendaal Sunset", qty: 10 },
34
+ { from: "Keukenhof", to: "Anne", name: "Tulip Semper Augustus", qty: 7 } )
35
+
36
+ b1 = Block.next( b0,
37
+ { from: "Flowers", to: "Ruben", name: "Tulip Admiral van Eijck", qty: 5 },
38
+ { from: "Vicent", to: "Anne", name: "Tulip Bloemendaal Sunset", qty: 3 },
39
+ { from: "Anne", to: "Julia", name: "Tulip Semper Augustus", qty: 1 },
40
+ { from: "Julia", to: "Luuk", name: "Tulip Semper Augustus", qty: 1 } )
41
+
42
+ b2 = Block.next( b1,
43
+ { from: "Bloom & Blossom", to: "Daisy", name: "Tulip Admiral of Admirals", qty: 8 },
44
+ { from: "Vincent", to: "Max", name: "Tulip Bloemendaal Sunset", qty: 2 },
45
+ { from: "Anne", to: "Martijn", name: "Tulip Semper Augustus", qty: 2 },
46
+ { from: "Ruben", to: "Julia", name: "Tulip Admiral van Eijck", qty: 2 } )
47
+
48
+ blockchain = [b0, b1, b2]
49
+
50
+ pp blockchain
51
+
52
+ assert true ## (for now) everything ok if we get here
53
+ end
54
+
55
+
56
+ def timestamp1637
57
+ ## change year to 1637 :-)
58
+ ## note: time (uses signed integer e.g. epoch/unix time starting in 1970 with 0)
59
+ ## todo: add nano/mili-seconds - why? why not? possible?
60
+ now = Time.now.utc.to_datetime
61
+ past = DateTime.new( 1637, now.month, now.mday, now.hour, now.min, now.sec, now.zone )
62
+ past
63
+ end
64
+
65
+ def test_tulips_1637_example
66
+
67
+ b0 = Block.first(
68
+ { from: "Dutchgrown", to: "Vincent", name: "Tulip Bloemendaal Sunset", qty: 10 },
69
+ { from: "Keukenhof", to: "Anne", name: "Tulip Semper Augustus", qty: 7 },
70
+ timestamp: timestamp1637 )
71
+
72
+ b1 = Block.next( b0,
73
+ { from: "Flowers", to: "Ruben", name: "Tulip Admiral van Eijck", qty: 5 },
74
+ { from: "Vicent", to: "Anne", name: "Tulip Bloemendaal Sunset", qty: 3 },
75
+ { from: "Anne", to: "Julia", name: "Tulip Semper Augustus", qty: 1 },
76
+ { from: "Julia", to: "Luuk", name: "Tulip Semper Augustus", qty: 1 },
77
+ timestamp: timestamp1637 )
78
+
79
+ b2 = Block.next( b1,
80
+ { from: "Bloom & Blossom", to: "Daisy", name: "Tulip Admiral of Admirals", qty: 8 },
81
+ { from: "Vincent", to: "Max", name: "Tulip Bloemendaal Sunset", qty: 2 },
82
+ { from: "Anne", to: "Martijn", name: "Tulip Semper Augustus", qty: 2 },
83
+ { from: "Ruben", to: "Julia", name: "Tulip Admiral van Eijck", qty: 2 },
84
+ timestamp: timestamp1637 )
85
+
86
+ blockchain = [b0, b1, b2]
87
+
88
+ pp blockchain
89
+
90
+ assert true ## (for now) everything ok if we get here
91
+ end
92
+
93
+ end # class TestBlock
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blockchain-lite
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-09 00:00:00.000000000 Z
11
+ date: 2021-01-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: merkletree
@@ -28,43 +28,47 @@ dependencies:
28
28
  name: rdoc
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '4.0'
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '7'
34
37
  type: :development
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
38
- - - "~>"
41
+ - - ">="
39
42
  - !ruby/object:Gem::Version
40
43
  version: '4.0'
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '7'
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: hoe
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
51
  - - "~>"
46
52
  - !ruby/object:Gem::Version
47
- version: '3.16'
53
+ version: '3.22'
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
58
  - - "~>"
53
59
  - !ruby/object:Gem::Version
54
- version: '3.16'
60
+ version: '3.22'
55
61
  description: blockchain-lite - build your own blockchain with crypto hashes - revolutionize
56
62
  the world with blockchains, blockchains, blockchains one block at a time
57
63
  email: wwwmake@googlegroups.com
58
64
  executables: []
59
65
  extensions: []
60
66
  extra_rdoc_files:
61
- - HISTORY.md
62
- - LICENSE.md
67
+ - CHANGELOG.md
63
68
  - Manifest.txt
64
69
  - README.md
65
70
  files:
66
- - HISTORY.md
67
- - LICENSE.md
71
+ - CHANGELOG.md
68
72
  - Manifest.txt
69
73
  - README.md
70
74
  - Rakefile
@@ -81,11 +85,11 @@ files:
81
85
  - test/test_block_proof_of_work.rb
82
86
  - test/test_blockchain.rb
83
87
  - test/test_version.rb
84
- homepage: https://github.com/openblockchains/blockchain.lite.rb
88
+ homepage: https://github.com/rubycoco/blockchain
85
89
  licenses:
86
90
  - Public Domain
87
91
  metadata: {}
88
- post_install_message:
92
+ post_install_message:
89
93
  rdoc_options:
90
94
  - "--main"
91
95
  - README.md
@@ -102,9 +106,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
106
  - !ruby/object:Gem::Version
103
107
  version: '0'
104
108
  requirements: []
105
- rubyforge_project:
106
- rubygems_version: 2.5.2
107
- signing_key:
109
+ rubygems_version: 3.1.4
110
+ signing_key:
108
111
  specification_version: 4
109
112
  summary: blockchain-lite - build your own blockchain with crypto hashes - revolutionize
110
113
  the world with blockchains, blockchains, blockchains one block at a time
data/LICENSE.md DELETED
@@ -1,116 +0,0 @@
1
- CC0 1.0 Universal
2
-
3
- Statement of Purpose
4
-
5
- The laws of most jurisdictions throughout the world automatically confer
6
- exclusive Copyright and Related Rights (defined below) upon the creator and
7
- subsequent owner(s) (each and all, an "owner") of an original work of
8
- authorship and/or a database (each, a "Work").
9
-
10
- Certain owners wish to permanently relinquish those rights to a Work for the
11
- purpose of contributing to a commons of creative, cultural and scientific
12
- works ("Commons") that the public can reliably and without fear of later
13
- claims of infringement build upon, modify, incorporate in other works, reuse
14
- and redistribute as freely as possible in any form whatsoever and for any
15
- purposes, including without limitation commercial purposes. These owners may
16
- contribute to the Commons to promote the ideal of a free culture and the
17
- further production of creative, cultural and scientific works, or to gain
18
- reputation or greater distribution for their Work in part through the use and
19
- efforts of others.
20
-
21
- For these and/or other purposes and motivations, and without any expectation
22
- of additional consideration or compensation, the person associating CC0 with a
23
- Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
24
- and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
25
- and publicly distribute the Work under its terms, with knowledge of his or her
26
- Copyright and Related Rights in the Work and the meaning and intended legal
27
- effect of CC0 on those rights.
28
-
29
- 1. Copyright and Related Rights. A Work made available under CC0 may be
30
- protected by copyright and related or neighboring rights ("Copyright and
31
- Related Rights"). Copyright and Related Rights include, but are not limited
32
- to, the following:
33
-
34
- i. the right to reproduce, adapt, distribute, perform, display, communicate,
35
- and translate a Work;
36
-
37
- ii. moral rights retained by the original author(s) and/or performer(s);
38
-
39
- iii. publicity and privacy rights pertaining to a person's image or likeness
40
- depicted in a Work;
41
-
42
- iv. rights protecting against unfair competition in regards to a Work,
43
- subject to the limitations in paragraph 4(a), below;
44
-
45
- v. rights protecting the extraction, dissemination, use and reuse of data in
46
- a Work;
47
-
48
- vi. database rights (such as those arising under Directive 96/9/EC of the
49
- European Parliament and of the Council of 11 March 1996 on the legal
50
- protection of databases, and under any national implementation thereof,
51
- including any amended or successor version of such directive); and
52
-
53
- vii. other similar, equivalent or corresponding rights throughout the world
54
- based on applicable law or treaty, and any national implementations thereof.
55
-
56
- 2. Waiver. To the greatest extent permitted by, but not in contravention of,
57
- applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
58
- unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
59
- and Related Rights and associated claims and causes of action, whether now
60
- known or unknown (including existing as well as future claims and causes of
61
- action), in the Work (i) in all territories worldwide, (ii) for the maximum
62
- duration provided by applicable law or treaty (including future time
63
- extensions), (iii) in any current or future medium and for any number of
64
- copies, and (iv) for any purpose whatsoever, including without limitation
65
- commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
66
- the Waiver for the benefit of each member of the public at large and to the
67
- detriment of Affirmer's heirs and successors, fully intending that such Waiver
68
- shall not be subject to revocation, rescission, cancellation, termination, or
69
- any other legal or equitable action to disrupt the quiet enjoyment of the Work
70
- by the public as contemplated by Affirmer's express Statement of Purpose.
71
-
72
- 3. Public License Fallback. Should any part of the Waiver for any reason be
73
- judged legally invalid or ineffective under applicable law, then the Waiver
74
- shall be preserved to the maximum extent permitted taking into account
75
- Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
76
- is so judged Affirmer hereby grants to each affected person a royalty-free,
77
- non transferable, non sublicensable, non exclusive, irrevocable and
78
- unconditional license to exercise Affirmer's Copyright and Related Rights in
79
- the Work (i) in all territories worldwide, (ii) for the maximum duration
80
- provided by applicable law or treaty (including future time extensions), (iii)
81
- in any current or future medium and for any number of copies, and (iv) for any
82
- purpose whatsoever, including without limitation commercial, advertising or
83
- promotional purposes (the "License"). The License shall be deemed effective as
84
- of the date CC0 was applied by Affirmer to the Work. Should any part of the
85
- License for any reason be judged legally invalid or ineffective under
86
- applicable law, such partial invalidity or ineffectiveness shall not
87
- invalidate the remainder of the License, and in such case Affirmer hereby
88
- affirms that he or she will not (i) exercise any of his or her remaining
89
- Copyright and Related Rights in the Work or (ii) assert any associated claims
90
- and causes of action with respect to the Work, in either case contrary to
91
- Affirmer's express Statement of Purpose.
92
-
93
- 4. Limitations and Disclaimers.
94
-
95
- a. No trademark or patent rights held by Affirmer are waived, abandoned,
96
- surrendered, licensed or otherwise affected by this document.
97
-
98
- b. Affirmer offers the Work as-is and makes no representations or warranties
99
- of any kind concerning the Work, express, implied, statutory or otherwise,
100
- including without limitation warranties of title, merchantability, fitness
101
- for a particular purpose, non infringement, or the absence of latent or
102
- other defects, accuracy, or the present or absence of errors, whether or not
103
- discoverable, all to the greatest extent permissible under applicable law.
104
-
105
- c. Affirmer disclaims responsibility for clearing rights of other persons
106
- that may apply to the Work or any use thereof, including without limitation
107
- any person's Copyright and Related Rights in the Work. Further, Affirmer
108
- disclaims responsibility for obtaining any necessary consents, permissions
109
- or other rights required for any use of the Work.
110
-
111
- d. Affirmer understands and acknowledges that Creative Commons is not a
112
- party to this document and has no duty or obligation with respect to this
113
- CC0 or use of the Work.
114
-
115
- For more information, please see
116
- <http://creativecommons.org/publicdomain/zero/1.0/>