blockchain-lite 1.3.1 → 1.4.0

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
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