bitcoin2graphdb 0.1.2 → 0.1.3

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: e0656566bb7bb0137ebbd55e71a542a93cfd5c10
4
- data.tar.gz: 8cab3c87318083f179255f4d9fea1087785aa549
3
+ metadata.gz: 186af84d22b883f287e9f11d946b592f83ca6bc2
4
+ data.tar.gz: ccc22259ee9fed122c00bba36075258409bb7a05
5
5
  SHA512:
6
- metadata.gz: 21f51cb0185d54b98c0570f630d21e853abe1871ce8189fb093b277ea15087ced068409bfb073cdc8a9d2d52919d4bdc7b3fa2033e110df2279c130237695343
7
- data.tar.gz: 4e60e3234297aa8b04322def668d149e2c56d181d9df9773a497887aa6a4258c4031c3173f889002e5cc888f2171d6b87dbb235cb377ac8777352781e5e3351b
6
+ metadata.gz: ab9d19e3661d8d1eb375ecf74697ac8f680a2ef99f63b1f872c2b73e2eaacd9d05392bf526ef6246060b89b6d6415be0df33d1a8dd4cc080001f7969456e6f0e
7
+ data.tar.gz: e7d56c1e9246dd7d8a6406ba3c86fd94c56e64e5eaac5573ac0078638f60da784ca67c3a2ffbb1f5ae24de1c2718a6c49cbfa3879f6a0e236cd38b4cb1b50a11
data/README.md CHANGED
@@ -60,6 +60,30 @@ $ bitcoin2graphdb start -c <configuration file path>
60
60
  $ bitcoin2graphdb stop
61
61
  ```
62
62
 
63
+ ## Extensions
64
+
65
+ Bitcoin2Graphdb currently supports following extensions.
66
+
67
+ |Extension Key Name|Description|
68
+ |:-----------|:------------|
69
+ |open_assets| Add Open Assets Protocol support. If this extension is enabled, the asset quantity and Graphdb::Model::AssetId association will be added to the Graphdb::Model::TxOut.|
70
+ * Open Assets Protocol
71
+
72
+ To enable extension, add an extension key name to enable the Configuration file like following.
73
+
74
+ ```yaml
75
+ bitcoin2graphdb:
76
+ ...
77
+ extensions:
78
+ - 'open_assets'
79
+ ```
80
+
81
+ # Testing
82
+
83
+ When you run rspec, you need to run neo4j test server(http://localhost:7475) in advance.
84
+ Others are the same as normal rspec.
85
+
86
+
63
87
  ## Contributing
64
88
 
65
89
  Bug reports and pull requests are welcome on GitHub at https://github.com/haw-itn/bitcoin2graphdb.
data/Rakefile CHANGED
@@ -2,7 +2,17 @@ require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
3
  load 'neo4j/tasks/neo4j_server.rake'
4
4
  load 'neo4j/tasks/migration.rake'
5
+ require 'base'
5
6
 
6
7
  RSpec::Core::RakeTask.new(:spec)
7
8
 
8
9
  task :default => :spec
10
+
11
+ namespace :b2g do
12
+ desc 'Import specified block to neo4j database.'
13
+ task :import_block, [:block_height,:config_path] do |task, args|
14
+ config = YAML.load(File.read(args.config_path)).deep_symbolize_keys
15
+ puts "import #{args.block_height} block."
16
+ Bitcoin2Graphdb::Migration.new(config[:bitcoin2graphdb]).run_with_height(args.block_height.to_i)
17
+ end
18
+ end
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_runtime_dependency "openassets-ruby", "~> 0.3.7"
22
+ spec.add_runtime_dependency "openassets-ruby", "~> 0.3.8"
23
23
  spec.add_runtime_dependency "daemon-spawn"
24
24
  spec.add_runtime_dependency 'neo4j', '~> 5.0.0'
25
25
  spec.add_runtime_dependency "activesupport", "~> 4.0.2"
@@ -35,6 +35,10 @@ module Bitcoin2Graphdb
35
35
  api.provider.getrawtransaction(txid, 1)
36
36
  end
37
37
 
38
+ def oa_outputs(txid)
39
+ api.get_outputs_from_txid(txid, true)
40
+ end
41
+
38
42
  end
39
43
  end
40
44
  end
@@ -1,9 +1,14 @@
1
+ require 'base'
1
2
  module Bitcoin2Graphdb
2
3
  class Migration
3
4
 
4
5
  def initialize(config)
6
+ Graphdb.configure do |c|
7
+ c.neo4j_server = config[:neo4j][:server]
8
+ c.extensions = config[:extensions] unless config[:extensions].nil?
9
+ end
5
10
  Bitcoin2Graphdb::Bitcoin.provider = Bitcoin2Graphdb::Bitcoin::BlockchainProvider.new(config[:bitcoin])
6
- Neo4j::Session.open(:server_db, config[:neo4j][:server_url], {basic_auth: config[:neo4j][:basic_auth]})
11
+ Neo4j::Session.open(:server_db, config[:neo4j][:server], {basic_auth: config[:neo4j][:basic_auth]})
7
12
  end
8
13
 
9
14
  def run
@@ -14,15 +19,18 @@ module Bitcoin2Graphdb
14
19
 
15
20
  def run_with_height(block_height)
16
21
  puts "start migration for block height = #{block_height}. #{Time.now}"
17
- begin
18
- Neo4j::Transaction.run do |tx|
22
+ Neo4j::Transaction.run do |tx|
23
+ begin
19
24
  Graphdb::Model::Block.create_from_block_height(block_height)
20
25
  @block_height = block_height
21
- end
22
- rescue OpenAssets::Provider::ApiError => e
23
- if e.message == '{"code"=>-8, "message"=>"Block height out of range"}'
24
- puts "Block height out of range. sleep 10 min."
25
- sleep 600
26
+ rescue OpenAssets::Provider::ApiError => e
27
+ if e.message == '{"code"=>-8, "message"=>"Block height out of range"}'
28
+ puts "Block height out of range. sleep 10 min."
29
+ sleep 600
30
+ else
31
+ tx.failure
32
+ raise e
33
+ end
26
34
  end
27
35
  end
28
36
  puts "end migration for block height #{block_height}. #{Time.now}"
@@ -1,3 +1,3 @@
1
1
  module Bitcoin2Graphdb
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
data/lib/graphdb.rb CHANGED
@@ -13,4 +13,5 @@ module Graphdb
13
13
  configuration.load_extensions
14
14
  end
15
15
 
16
+ Neo4j::Config[:association_model_namespace] = Graphdb::Model
16
17
  end
@@ -4,19 +4,19 @@ module Graphdb
4
4
  autoload :Base, 'graphdb/model/extensions/base'
5
5
  autoload :OpenAssets, 'graphdb/model/extensions/open_assets'
6
6
 
7
- EXTENSIONS = {open_assets: 'graphdb/model/extensions/open_assets'}
8
-
9
7
  attr_accessor :extensions
10
8
 
11
9
  def load_extensions
12
10
  extensions.each do |e|
13
- load_module = "Graphdb::Model::Extensions::#{e.camelize}".constantize
14
- load_module::EXTENSIONS_TARGETS.each do |target|
15
- target.origin_class.include target
16
- end
11
+ require "graphdb/model/extensions/#{e}"
17
12
  end
18
13
  end
19
14
 
15
+ def unload_extensions
16
+ Graphdb::Model.send(:remove_const, :Transaction)
17
+ load 'graphdb/model/transaction.rb'
18
+ end
19
+
20
20
  end
21
21
  end
22
22
  end
@@ -1,10 +1,15 @@
1
1
  module Graphdb
2
2
  module Model
3
+
4
+ autoload :AssetId, 'graphdb/model/extensions/open_assets/asset_id'
5
+
3
6
  module Extensions
4
7
  module OpenAssets
5
- autoload :OaTransaction, 'graphdb/model/extensions/open_assets/oa_transaction'
8
+ Graphdb::Model::Extensions::OpenAssets.autoload :TxOut, 'graphdb/model/extensions/open_assets/tx_out'
9
+ Graphdb::Model::Extensions::OpenAssets.autoload :Transaction, 'graphdb/model/extensions/open_assets/transaction'
6
10
 
7
- EXTENSIONS_TARGETS = [OaTransaction]
11
+ Graphdb::Model::Transaction.prepend(Graphdb::Model::Extensions::OpenAssets::Transaction)
12
+ Graphdb::Model::TxOut.prepend(Graphdb::Model::Extensions::OpenAssets::TxOut)
8
13
  end
9
14
  end
10
15
  end
@@ -0,0 +1,22 @@
1
+ module Graphdb
2
+ module Model
3
+
4
+ class AssetId < ActiveNodeBase
5
+ property :asset_id, index: :exact, constraint: :unique
6
+
7
+ validates :asset_id, :presence => true
8
+
9
+ scope :with_asset_id, ->(asset_id){where(asset_id: asset_id)}
10
+
11
+ def self.find_or_create(asset_id)
12
+ a = with_asset_id(asset_id).first
13
+ unless a
14
+ a = new
15
+ a.asset_id = asset_id
16
+ a.save!
17
+ end
18
+ a
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ module Graphdb
2
+ module Model
3
+ module Extensions
4
+ module OpenAssets
5
+
6
+ module Transaction
7
+
8
+ def self.prepended(base)
9
+ class << base
10
+ self.prepend(ClassMethods)
11
+ end
12
+ end
13
+
14
+ module ClassMethods
15
+
16
+ def create_from_txid(txid)
17
+ tx = super(txid)
18
+ outputs = Bitcoin2Graphdb::Bitcoin.provider.oa_outputs(txid)
19
+ outputs.each{|o|tx.outputs[o['vout']].apply_oa_attributes(o)}
20
+ tx.save!
21
+ tx
22
+ end
23
+
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,35 @@
1
+ module Graphdb
2
+ module Model
3
+ module Extensions
4
+ module OpenAssets
5
+ module TxOut
6
+
7
+ def self.prepended(base)
8
+ class << base
9
+ self.prepend(ClassMethods)
10
+
11
+ end
12
+ base.class_eval do
13
+ property :asset_quantity, type: Integer
14
+ property :oa_output_type
15
+ has_one :out, :asset_id, type: :asset_id
16
+ end
17
+ end
18
+
19
+ module ClassMethods
20
+
21
+ end
22
+
23
+ def apply_oa_attributes(oa_out)
24
+ self.asset_quantity = oa_out['asset_quantity']
25
+ self.oa_output_type = oa_out['output_type']
26
+ self.asset_id = AssetId.find_or_create(oa_out['asset_id']) unless oa_out['asset_id'].nil?
27
+ self.oa_output_type = 'uncolored' if self.asset_id.nil? && self.oa_output_type != 'marker'
28
+ save!
29
+ end
30
+
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -10,7 +10,7 @@ module Graphdb
10
10
  property :sequence
11
11
 
12
12
  has_one :out, :transaction, type: :transaction, model_class: Transaction
13
- has_one :in, :out_point, origin: :out_point, model_class: TxOut
13
+ has_one :in, :out_point, origin: :out_point, model_class: Graphdb::Model::TxOut
14
14
 
15
15
  validates :sequence, :presence => true
16
16
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitcoin2graphdb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - azuchi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-03-08 00:00:00.000000000 Z
11
+ date: 2016-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: openassets-ruby
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.3.7
19
+ version: 0.3.8
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.3.7
26
+ version: 0.3.8
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: daemon-spawn
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -157,9 +157,10 @@ files:
157
157
  - lib/graphdb/model/address.rb
158
158
  - lib/graphdb/model/block.rb
159
159
  - lib/graphdb/model/extensions.rb
160
- - lib/graphdb/model/extensions/base.rb
161
160
  - lib/graphdb/model/extensions/open_assets.rb
162
- - lib/graphdb/model/extensions/open_assets/oa_transaction.rb
161
+ - lib/graphdb/model/extensions/open_assets/asset_id.rb
162
+ - lib/graphdb/model/extensions/open_assets/transaction.rb
163
+ - lib/graphdb/model/extensions/open_assets/tx_out.rb
163
164
  - lib/graphdb/model/transaction.rb
164
165
  - lib/graphdb/model/tx_in.rb
165
166
  - lib/graphdb/model/tx_out.rb
@@ -1,15 +0,0 @@
1
- module Graphdb
2
- module Model
3
- module Extensions
4
- module Base
5
-
6
- attr_accessor :origin_class
7
-
8
- def set_origin(clazz)
9
- @origin_class ||= clazz
10
- end
11
-
12
- end
13
- end
14
- end
15
- end
@@ -1,24 +0,0 @@
1
- module Graphdb
2
- module Model
3
- module Extensions
4
- module OpenAssets
5
-
6
- module OaTransaction
7
-
8
- extend Graphdb::Model::Extensions::Base
9
-
10
- def self.included(base)
11
- base.class_eval do
12
- # asset output type (:issuance, :transfer, :uncolored)
13
- property :output_type
14
- end
15
- end
16
-
17
- set_origin Graphdb::Model::Transaction
18
-
19
- end
20
-
21
- end
22
- end
23
- end
24
- end