blockchain-lite 1.1.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 +5 -5
- data/{HISTORY.md → CHANGELOG.md} +3 -3
- data/Manifest.txt +3 -3
- data/README.md +310 -197
- data/Rakefile +30 -29
- data/lib/blockchain-lite.rb +11 -26
- data/lib/blockchain-lite/base.rb +28 -0
- data/lib/blockchain-lite/basic/block.rb +34 -12
- data/lib/blockchain-lite/blockchain.rb +30 -27
- data/lib/blockchain-lite/proof_of_work/block.rb +53 -20
- data/lib/blockchain-lite/version.rb +23 -23
- data/test/helper.rb +28 -10
- data/test/test_block.rb +93 -35
- data/test/test_block_basic.rb +9 -7
- data/test/test_block_proof_of_work.rb +9 -7
- data/test/test_blockchain.rb +18 -18
- data/test/test_version.rb +21 -0
- metadata +35 -17
- data/LICENSE.md +0 -116
- data/lib/blockchain-lite/block.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c23e20fae718239734cf599d73beded949a12312de4fc2535769fadaa71ca77e
|
4
|
+
data.tar.gz: 82dd5188d90c78c80f767ddb0be664d1bce6800fdebf80cd4723dec8b6440e20
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45e04027704febb2ee957b1547343a1b0829868a2256ea74d1656f7f79895d0b6d3862be2b546793372315ba4508d766c79993bf087a9a7b65acfd16102906d6
|
7
|
+
data.tar.gz: 073a34f50dbcb36da1d1a0e20268cfe3ca96e89f5e7f27cf195f3430e3dba5b4a631d662164d5db52b7c2f66ebf90104c5567474c8d8411bf06128a31c8036c1
|
data/{HISTORY.md → CHANGELOG.md}
RENAMED
@@ -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
|
data/Manifest.txt
CHANGED
@@ -1,12 +1,11 @@
|
|
1
|
-
|
2
|
-
LICENSE.md
|
1
|
+
CHANGELOG.md
|
3
2
|
Manifest.txt
|
4
3
|
README.md
|
5
4
|
Rakefile
|
6
5
|
lib/blockchain-lite.rb
|
6
|
+
lib/blockchain-lite/base.rb
|
7
7
|
lib/blockchain-lite/basic/block.rb
|
8
8
|
lib/blockchain-lite/bitcoin/block.rb
|
9
|
-
lib/blockchain-lite/block.rb
|
10
9
|
lib/blockchain-lite/blockchain.rb
|
11
10
|
lib/blockchain-lite/proof_of_work/block.rb
|
12
11
|
lib/blockchain-lite/version.rb
|
@@ -15,3 +14,4 @@ test/test_block.rb
|
|
15
14
|
test/test_block_basic.rb
|
16
15
|
test/test_block_proof_of_work.rb
|
17
16
|
test/test_blockchain.rb
|
17
|
+
test/test_version.rb
|
data/README.md
CHANGED
@@ -1,197 +1,310 @@
|
|
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/
|
6
|
-
* bugs :: [github.com/
|
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
|
-
|
13
|
-
|
14
|
-
>
|
15
|
-
>
|
16
|
-
>
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
def
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
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
|
+

|
308
|
+
|
309
|
+
The `blockchain.lite` scripts are dedicated to the public domain.
|
310
|
+
Use it as you please with no restrictions whatsoever.
|