blockchain-lite 1.3.1 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ccf43eee1725688110917d1fa4f252448b08c10f
4
- data.tar.gz: 56476b389bcdf4abdb42b623485e303686f32f34
3
+ metadata.gz: 9fb07dad5bc09c884d56005cca1811efa4b97885
4
+ data.tar.gz: 3ec43658943f4e9890d627effdbd1944abeea133
5
5
  SHA512:
6
- metadata.gz: 6d069c0c8a7c2d58268cb2c56a5fae5126f36bd10f75238f3ccefdff32c90599467465c9683bc0c56e3d748f81e364d7b568b7b09a105faba34ee51f91fce3a9
7
- data.tar.gz: c9d6579d3b24560fb709631b2682afd37ae8fd4af9bc8202db278011a4ca711ec836f37e61ea5932313ec6f5ecfb0163b9d672f8c48ba3d95166c694e5a1b094
6
+ metadata.gz: 52a6008f77adf15d70f0f8a71b41c880fc1015eb5144cf849b829337f6ab4dc67afeacd2b0ecbdf3b4e47e4adacbb257c2af857c831052dbe13cf9e7b00e74cf
7
+ data.tar.gz: 8ac88194f2f5791d83326f2c3fd4bdf8d71af6f9452fcffea13861cc954ef0db777c8f9cf902543facc6acbad56a28e3b537f99630fd521f8be30824abcb6e39
@@ -4,9 +4,9 @@ Manifest.txt
4
4
  README.md
5
5
  Rakefile
6
6
  lib/blockchain-lite.rb
7
+ lib/blockchain-lite/base.rb
7
8
  lib/blockchain-lite/basic/block.rb
8
9
  lib/blockchain-lite/bitcoin/block.rb
9
- lib/blockchain-lite/block.rb
10
10
  lib/blockchain-lite/blockchain.rb
11
11
  lib/blockchain-lite/proof_of_work/block.rb
12
12
  lib/blockchain-lite/version.rb
@@ -15,3 +15,4 @@ test/test_block.rb
15
15
  test/test_block_basic.rb
16
16
  test/test_block_proof_of_work.rb
17
17
  test/test_blockchain.rb
18
+ test/test_version.rb
data/README.md CHANGED
@@ -281,13 +281,18 @@ resulting in:
281
281
  ```
282
282
 
283
283
 
284
- ## Install
284
+ ## Blockchain Lite in the Real World
285
285
 
286
- Just install the gem:
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
287
295
 
288
- ```
289
- $ gem install blockchain-lite
290
- ```
291
296
 
292
297
 
293
298
  ## License
@@ -1,29 +1,11 @@
1
- # encoding: utf-8
2
-
3
- require 'digest' # for hash checksum digest function SHA256
4
- require 'pp' # for pp => pretty printer
5
-
6
- require 'date'
7
- require 'time'
8
- require 'json'
9
- require 'uri'
10
-
11
-
12
- ## 3rd party libs
13
- require 'merkletree'
14
-
15
-
16
- ## our own code
17
- require 'blockchain-lite/version' # note: let version always go first
18
-
19
- require 'blockchain-lite/basic/block'
20
- require 'blockchain-lite/proof_of_work/block'
21
-
22
- require 'blockchain-lite/blockchain'
23
-
24
- require 'blockchain-lite/block' ## configure "standard" default block (e.g. basic, proof-of-work, etc.)
25
-
26
-
27
-
28
- # say hello
29
- puts BlockchainLite.banner if defined?($RUBYLIBS_DEBUG) && $RUBYLIBS_DEBUG
1
+ # encoding: utf-8
2
+
3
+
4
+ ## our own code (without "top-level" shortcuts e.g. "modular version")
5
+ require 'blockchain-lite/base'
6
+
7
+ ###
8
+ # add convenience top-level shortcut / alias
9
+ # "standard" default block for now block with proof of work
10
+ Block = BlockchainLite::ProofOfWork::Block
11
+ Blockchain = BlockchainLite::Blockchain
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+
3
+ require 'digest' # for hash checksum digest function SHA256
4
+ require 'pp' # for pp => pretty printer
5
+
6
+ require 'forwardable'
7
+ require 'date'
8
+ require 'time'
9
+ require 'json'
10
+ require 'uri'
11
+
12
+
13
+ ## 3rd party libs
14
+ require 'merkletree'
15
+
16
+
17
+ ## our own code
18
+ require 'blockchain-lite/version' # note: let version always go first
19
+
20
+ require 'blockchain-lite/basic/block'
21
+ require 'blockchain-lite/proof_of_work/block'
22
+
23
+ require 'blockchain-lite/blockchain'
24
+
25
+
26
+
27
+ # say hello
28
+ puts BlockchainLite.banner if defined?($RUBYLIBS_DEBUG) && $RUBYLIBS_DEBUG
@@ -4,64 +4,49 @@
4
4
  ##
5
5
  # convenience wrapper for array holding blocks (that is, a blockchain)
6
6
 
7
+ module BlockchainLite
7
8
 
8
- class Blockchain
9
9
 
10
- def initialize( chain=nil, block_class: nil )
11
- if chain.nil?
12
- @block_class = if block_class
13
- block_class
14
- else
15
- ## check if Block is defined
16
- ## if yes, use it othwerwise fallback for ProofOfWork::Block
17
- defined?( Block ) ? Block : BlockchainLite::ProofOfWork::Block
18
- end
10
+ class Blockchain
11
+ extend Forwardable
19
12
 
20
- b0 = @block_class.first( 'Genesis' )
21
- @chain = [b0]
22
- else
23
- @chain = chain # "wrap" passed in blockchain (in array)
24
- @block_class = if block_class
25
- block_class
26
- else
27
- ### no block class configured; use class of first block
28
- if @chain.first
29
- @chain.first.class
30
- else
31
- ## todo/fix: throw except if chain is empty (no class configured) - why? why not??
32
- ## throw exception on add block if not a block - why? why not??
33
- end
34
- end
35
- end
13
+ def initialize( chain=[] )
14
+ @chain = chain # "wrap" passed in blockchain (in array)
36
15
  end
37
16
 
17
+ ##
18
+ # todo/check: can we make it work without "virtual" block_class method
19
+ ## e.g. use constant lookup with singleton class or something - possible?
20
+ def block_class() Block; end # if not configured; fallback to "top level" Block
38
21
 
39
22
 
40
- def last() @chain.last; end ## return last block in chain
41
23
 
24
+ ## delegate some methods (and operators) to chain array (for easier/shortcut access)
25
+ def_delegators :@chain, :[], :size, :each, :last, :empty?, :any?
42
26
 
43
- ###
44
- ## make method-<< abstract/virtual - why? why not?
45
- ## must be added by to make sure proper block_class is always used - why? why not??
46
27
 
47
28
  def <<( arg )
48
- if arg.is_a?( Array ) ## assume its (just) data
49
- data = arg
50
- bl = @chain.last
51
- b = @block_class.next( bl, data )
52
- elsif arg.class.respond_to?( :first ) && ## check if respond_to? Block.first? and Block.next? - assume it's a block
53
- arg.class.respond_to?( :next ) ## check/todo: use is_a? @block_class why? why not?
29
+ if arg.is_a?( block_class )
54
30
  b = arg
55
- else ## fallback; assume single transaction record; wrap in array - allow fallback - why? why not??
56
- data = [arg]
57
- bl = @chain.last
58
- b = @block_class.next( bl, data )
31
+ else
32
+ if arg.is_a?( Array ) ## assume its (just) data
33
+ data = arg
34
+ else ## fallback; assume single transaction record; wrap in array - allow fallback - why? why not??
35
+ data = [arg]
36
+ end
37
+
38
+ if @chain.empty?
39
+ b = block_class.first( data )
40
+ else
41
+ bl = @chain.last
42
+ b = block_class.next( bl, data )
43
+ end
59
44
  end
45
+
60
46
  @chain << b ## add/append (new) block to chain
61
47
  end
62
48
 
63
49
 
64
-
65
50
  def broken?
66
51
  ## check for validation conventions
67
52
  ## - start with first block?
@@ -110,3 +95,5 @@ class Blockchain
110
95
  def valid?() !broken?; end
111
96
 
112
97
  end ## class Blockchain
98
+
99
+ end ## module BlockchainLite
@@ -4,8 +4,8 @@
4
4
  module BlockchainLite
5
5
 
6
6
  MAJOR = 1
7
- MINOR = 3
8
- PATCH = 1
7
+ MINOR = 4
8
+ PATCH = 0
9
9
  VERSION = [MAJOR,MINOR,PATCH].join('.')
10
10
 
11
11
  def self.version
@@ -7,4 +7,22 @@ require 'minitest/autorun'
7
7
 
8
8
  ## our own code
9
9
 
10
- require 'blockchain-lite'
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
@@ -10,13 +10,7 @@ require 'helper'
10
10
 
11
11
  class TestBlock < MiniTest::Test
12
12
 
13
- def test_version
14
- pp BlockchainLite.version
15
- pp BlockchainLite.banner
16
- pp BlockchainLite.root
17
-
18
- assert true ## (for now) everything ok if we get here
19
- end
13
+ include ProofOfWork ## adds Block = BlockchainLite::ProofOfWork::Block etc.
20
14
 
21
15
 
22
16
  def test_example
@@ -36,20 +30,20 @@ end
36
30
 
37
31
  def test_tulips_example
38
32
  b0 = Block.first(
39
- { from: "Dutchgrown", to: "Vincent", what: "Tulip Bloemendaal Sunset", qty: 10 },
40
- { from: "Keukenhof", to: "Anne", what: "Tulip Semper Augustus", qty: 7 } )
33
+ { from: "Dutchgrown", to: "Vincent", name: "Tulip Bloemendaal Sunset", qty: 10 },
34
+ { from: "Keukenhof", to: "Anne", name: "Tulip Semper Augustus", qty: 7 } )
41
35
 
42
36
  b1 = Block.next( b0,
43
- { from: "Flowers", to: "Ruben", what: "Tulip Admiral van Eijck", qty: 5 },
44
- { from: "Vicent", to: "Anne", what: "Tulip Bloemendaal Sunset", qty: 3 },
45
- { from: "Anne", to: "Julia", what: "Tulip Semper Augustus", qty: 1 },
46
- { from: "Julia", to: "Luuk", what: "Tulip Semper Augustus", qty: 1 } )
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 } )
47
41
 
48
42
  b2 = Block.next( b1,
49
- { from: "Bloom & Blossom", to: "Daisy", what: "Tulip Admiral of Admirals", qty: 8 },
50
- { from: "Vincent", to: "Max", what: "Tulip Bloemendaal Sunset", qty: 2 },
51
- { from: "Anne", to: "Martijn", what: "Tulip Semper Augustus", qty: 2 },
52
- { from: "Ruben", to: "Julia", what: "Tulip Admiral van Eijck", qty: 2 } )
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 } )
53
47
 
54
48
  blockchain = [b0, b1, b2]
55
49
 
@@ -71,22 +65,22 @@ def timestamp1637
71
65
  def test_tulips_1637_example
72
66
 
73
67
  b0 = Block.first(
74
- { from: "Dutchgrown", to: "Vincent", what: "Tulip Bloemendaal Sunset", qty: 10 },
75
- { from: "Keukenhof", to: "Anne", what: "Tulip Semper Augustus", qty: 7 },
68
+ { from: "Dutchgrown", to: "Vincent", name: "Tulip Bloemendaal Sunset", qty: 10 },
69
+ { from: "Keukenhof", to: "Anne", name: "Tulip Semper Augustus", qty: 7 },
76
70
  timestamp: timestamp1637 )
77
71
 
78
72
  b1 = Block.next( b0,
79
- { from: "Flowers", to: "Ruben", what: "Tulip Admiral van Eijck", qty: 5 },
80
- { from: "Vicent", to: "Anne", what: "Tulip Bloemendaal Sunset", qty: 3 },
81
- { from: "Anne", to: "Julia", what: "Tulip Semper Augustus", qty: 1 },
82
- { from: "Julia", to: "Luuk", what: "Tulip Semper Augustus", qty: 1 },
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 },
83
77
  timestamp: timestamp1637 )
84
78
 
85
79
  b2 = Block.next( b1,
86
- { from: "Bloom & Blossom", to: "Daisy", what: "Tulip Admiral of Admirals", qty: 8 },
87
- { from: "Vincent", to: "Max", what: "Tulip Bloemendaal Sunset", qty: 2 },
88
- { from: "Anne", to: "Martijn", what: "Tulip Semper Augustus", qty: 2 },
89
- { from: "Ruben", to: "Julia", what: "Tulip Admiral van Eijck", qty: 2 },
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 },
90
84
  timestamp: timestamp1637 )
91
85
 
92
86
  blockchain = [b0, b1, b2]
@@ -10,15 +10,16 @@ require 'helper'
10
10
 
11
11
  class TestBlockBasic < MiniTest::Test
12
12
 
13
- def test_example
13
+ include Basic ## adds Block = BlockchainLite::Basic::Block etc.
14
+
14
15
 
15
- block_class = BlockchainLite::Basic::Block
16
+ def test_example
16
17
 
17
- b0 = block_class.first( 'Genesis' )
18
- b1 = block_class.next( b0, 'Transaction Data...' )
19
- b2 = block_class.next( b1, 'Transaction Data...', 'Transaction Data...' )
20
- b3 = block_class.next( b2 ) ## no transaction data
21
- b4 = block_class.next( b3, ['Transaction Data...', 'Transaction Data...'] )
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...'] )
22
23
 
23
24
  blockchain = [b0, b1, b2, b3, b4]
24
25
 
@@ -10,15 +10,16 @@ require 'helper'
10
10
 
11
11
  class TestBlockProofOfWork < MiniTest::Test
12
12
 
13
- def test_example
13
+ include ProofOfWork ## adds Block = BlockchainLite::ProofOfWork::Block etc.
14
+
14
15
 
15
- block_class = BlockchainLite::ProofOfWork::Block
16
+ def test_example
16
17
 
17
- b0 = block_class.first( 'Genesis' )
18
- b1 = block_class.next( b0, 'Transaction Data...' )
19
- b2 = block_class.next( b1, 'Transaction Data...', 'Transaction Data...' )
20
- b3 = block_class.next( b2 ) ## no transaction data
21
- b4 = block_class.next( b3, ['Transaction Data...', 'Transaction Data...'] )
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...'] )
22
23
 
23
24
  blockchain = [b0, b1, b2, b3, b4]
24
25
 
@@ -9,10 +9,18 @@ require 'helper'
9
9
 
10
10
  class TestBlockchain < MiniTest::Test
11
11
 
12
+ include ProofOfWork ## adds:
13
+ ## Block = BlockchainLite::ProofOfWork::Block etc.
14
+ ## class Blockchain < BlockchainLite::Blockchain
15
+ ## def block_class() Block; end
16
+ ## end
17
+
18
+
12
19
  def test_new
13
20
 
14
21
  b = Blockchain.new
15
22
 
23
+ b << 'Genesis'
16
24
  b << 'Transaction Data...'
17
25
  b << ['Transaction Data...']
18
26
  b << ['Transaction Data...', 'Transaction Data...']
@@ -29,20 +37,6 @@ def test_new
29
37
  end
30
38
 
31
39
 
32
- def test_with_block_class
33
-
34
- b = Blockchain.new( block_class: BlockchainLite::Basic::Block )
35
-
36
- b << 'Transaction Data...'
37
- b << 'Transaction Data...'
38
- b << 'Transaction Data...'
39
-
40
- pp b
41
-
42
- assert true ## (for now) everything ok if we get here
43
- end
44
-
45
-
46
40
  def test_wrap
47
41
 
48
42
  b0 = Block.first( 'Genesis' )
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ ###
4
+ # to run use
5
+ # ruby -I ./lib -I ./test test/test_version.rb
6
+
7
+
8
+ require 'helper'
9
+
10
+
11
+ class TestVersion < MiniTest::Test
12
+
13
+ def test_version
14
+ pp BlockchainLite.version
15
+ pp BlockchainLite.banner
16
+ pp BlockchainLite.root
17
+
18
+ assert true ## (for now) everything ok if we get here
19
+ end
20
+
21
+ end # class TestVersion
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.3.1
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-23 00:00:00.000000000 Z
11
+ date: 2018-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: merkletree
@@ -69,9 +69,9 @@ files:
69
69
  - README.md
70
70
  - Rakefile
71
71
  - lib/blockchain-lite.rb
72
+ - lib/blockchain-lite/base.rb
72
73
  - lib/blockchain-lite/basic/block.rb
73
74
  - lib/blockchain-lite/bitcoin/block.rb
74
- - lib/blockchain-lite/block.rb
75
75
  - lib/blockchain-lite/blockchain.rb
76
76
  - lib/blockchain-lite/proof_of_work/block.rb
77
77
  - lib/blockchain-lite/version.rb
@@ -80,6 +80,7 @@ files:
80
80
  - test/test_block_basic.rb
81
81
  - test/test_block_proof_of_work.rb
82
82
  - test/test_blockchain.rb
83
+ - test/test_version.rb
83
84
  homepage: https://github.com/openblockchains/blockchain.lite.rb
84
85
  licenses:
85
86
  - Public Domain
@@ -1,5 +0,0 @@
1
- # encoding: utf-8
2
-
3
-
4
- ## "standard" default block for now block with proof of work
5
- Block = BlockchainLite::ProofOfWork::Block