hyperledger_cli 0.0.10 → 0.1.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: 6b86d37fbdfb3d386e12382486058a3815490bee
4
- data.tar.gz: b4a309fad0bbeabb9dd19867029b6cadc3705e32
3
+ metadata.gz: 192e7ce511fb3c24bbe2e05c656193dca94e0734
4
+ data.tar.gz: cd395c8633015a77a259ddd154bba12f02c8c8ca
5
5
  SHA512:
6
- metadata.gz: 743db9eb864a65a5424e56e0abe06518e51b5eb24e0ac29840d28957258c06a35ee8d7d1e658f1d1ef73c8b3c79890d15022e15d7604dd7c7714f26f07dc9f5f
7
- data.tar.gz: 728f0ca54f4c7f3da558a9ec9f33c73dc606bd1295f84d80b468b67c79ad21538c09f810d9849dbf1de6a8dc01252c2075230a13ad52c2c7aec2ecda25cfce29
6
+ metadata.gz: fbaf7e838575a3a568d74fedf8bf3ca2a3ed17f2287bd92ceed3acccee8b3704d8a149a0501b87e0434fdd757e456319ae66f70374b4de6704ab54651ad07272
7
+ data.tar.gz: 780ab64555d83a13c8f2390c77ffaf7b38639ee48d19dcbed6b6880a5593d47f0f9c529804cd112ac566e3f1410ce4f0a86bed65e697037bc5178ae7360017df
data/bin/hyperledger CHANGED
@@ -1,124 +1,95 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'thor'
4
- require 'fileutils'
5
- require 'openssl'
6
- require 'rest_client'
7
- require 'base64'
8
- require 'json'
9
4
  require 'securerandom'
10
- require_relative '../lib/hyperledger_cli/error_printer'
5
+ require_relative '../lib/hyperledger_cli'
6
+ require_relative '../lib/hyperledger_cli/key'
11
7
 
12
- class Ledger < Thor
13
- include HyperledgerCli::ErrorPrinter
14
-
15
- desc 'list', 'List all known ledgers'
8
+ include HyperledgerCli
9
+
10
+ class Asset < Thor
11
+ desc 'list', 'List all known assets'
16
12
  def list
17
- response = RestClient.get "#{options[:server]}/ledgers", content_type: :json, accept: :json
18
- data = JSON.parse(response.body, symbolize_names: true)
19
- data[:ledgers].each do |c| puts c[:name] end
13
+ get "#{options[:server]}/assets"
20
14
  end
21
15
 
22
- desc 'register <name> <url>', 'Registers a new ledger. The name must be unique, and the URL should contain more information about the ledger.'
23
- def register(name, url)
24
- ledger_key = OpenSSL::PKey::RSA.new 2048
25
- primary_account_key = OpenSSL::PKey::RSA.new 2048
26
- ledger_data = { public_key: ledger_key.public_key.to_pem, name: name, url: url }
27
- primary_account_data = { public_key: primary_account_key.public_key.to_pem }
16
+ desc 'register <hash>', 'Registers a new asset. The hash must be an unique hex encoded SHA265 hash.'
17
+ def register(hash)
18
+ asset_key = Key.new
19
+ primary_account_key = Key.new
20
+ data = {
21
+ asset: {
22
+ publicKey: asset_key.public_key,
23
+ hash: hash,
24
+ primaryAccountPublicKey: primary_account_key.public_key
25
+ }
26
+ }
27
+
28
+ post("#{options[:server]}/assets", data, asset_key)
28
29
 
29
- begin
30
- response = RestClient.post "#{options[:server]}/ledgers", { ledger: ledger_data, primary_account: primary_account_data }, content_type: :json, accept: :json
31
- ledger = JSON.parse(response.body, symbolize_names: true)[:ledger]
32
- puts 'New ledger created'
33
- puts "name:\t#{ledger[:name]}"
34
- puts "url:\t#{ledger[:url]}"
35
- puts "primary account code:\t#{ledger[:primary_account][:code]}"
36
-
37
- # Write key
38
- FileUtils.mkdir_p "#{ENV['HOME']}/.hyperledger"
39
- open "#{ENV['HOME']}/.hyperledger/#{ledger[:primary_account][:code]}.pem", 'w' do |io| io.write primary_account_key.to_pem end
40
- open "#{ENV['HOME']}/.hyperledger/#{name}.pem", 'w' do |io| io.write ledger_key.to_pem end
41
- rescue => e
42
- print_error(e)
43
- end
30
+ asset_key.write
31
+ primary_account_key.write
44
32
  end
45
33
  end
46
34
 
47
35
  class Account < Thor
48
- include HyperledgerCli::ErrorPrinter
49
-
50
36
  desc 'list', 'List all known accounts'
51
37
  def list
52
- response = RestClient.get "#{options[:server]}/accounts", content_type: :json, accept: :json
53
- data = JSON.parse(response.body, symbolize_names: true)
54
- data[:accounts].each do |a|
55
- a.each do |k, v|
56
- puts "#{k}:\t#{v}"
57
- end
58
- puts "\n"
59
- end
38
+ get "#{options[:server]}/accounts"
60
39
  end
61
40
 
62
- desc 'register <ledger>', 'Registers a new account in <ledger>.'
63
- def register(ledger)
64
- key = OpenSSL::PKey::RSA.new 2048
65
- data = { public_key: key.public_key.to_pem, ledger: ledger }
41
+ desc 'register <asset>', 'Registers a new account to hold <asset>.'
42
+ def register(asset)
43
+ account_key = Key.new
44
+ data = {
45
+ account: {
46
+ assetHash: asset,
47
+ publicKey: account_key.public_key
48
+ }
49
+ }
50
+
51
+ post("#{options[:server]}/accounts", data, account_key)
66
52
 
67
- begin
68
- resp = RestClient.post "#{options.server}/accounts", { account: data }, content_type: :json, accept: :json
69
- account = JSON.parse(resp.body, symbolize_names: true)[:account]
70
- puts 'New account created'
71
- puts "code:\t\t#{account[:code]}"
72
- puts "balance:\t#{account[:balance]}"
73
-
74
- # Write key
75
- FileUtils.mkdir_p "#{ENV['HOME']}/.hyperledger"
76
- open "#{ENV['HOME']}/.hyperledger/#{account[:code]}.pem", 'w' do |io| io.write key.to_pem end
77
- rescue => e
78
- print_error(e)
79
- end
53
+ account_key.write
80
54
  end
81
55
  end
82
56
 
83
57
  class Hyperledger < Thor
84
- include HyperledgerCli::ErrorPrinter
58
+ class_option :server, type: :string, required: true
85
59
 
86
- class_option :server, type: :string, default: 'http://hyperledger-staging-1.herokuapp.com'
87
-
88
- desc 'ledger SUBCOMMAND', 'Subcommands relating to ledgers.'
89
- subcommand 'ledger', Ledger
60
+ desc 'asset SUBCOMMAND', 'Subcommands relating to ledgers.'
61
+ subcommand 'asset', Asset
90
62
 
91
63
  desc 'account SUBCOMMAND', 'Subcommands relating to accounts.'
92
64
  subcommand 'account', Account
93
65
 
94
- desc 'issue <amount> <ledger>', 'Issue <amount> new units to <ledger>.'
95
- def issue(amount, ledger)
96
- data = { ledger: ledger, amount: amount.to_i, uuid: SecureRandom.uuid }
97
-
98
- key = OpenSSL::PKey::RSA.new File.read("#{ENV['HOME']}/.hyperledger/#{ledger.downcase}.pem")
99
- sign = Base64.encode64 key.sign(OpenSSL::Digest::SHA256.new, data.to_json)
66
+ desc 'issue <amount> <asset> <public key>', 'Issue <amount> new units of <asset> authorised by <public key>.'
67
+ def issue(amount, asset, public_key)
68
+ asset_key = Key.new(public_key)
69
+ data = {
70
+ issue: {
71
+ uuid: SecureRandom.uuid,
72
+ assetHash: asset,
73
+ amount: amount.to_i
74
+ }
75
+ }
100
76
 
101
- begin
102
- resp = RestClient.post "#{options[:server]}/issues", { issue: data.merge({resource_signature: sign}) }.to_json, content_type: :json, accept: :json
103
- puts "#{amount} new units issued to #{ledger}"
104
- rescue => e
105
- print_error(e)
106
- end
77
+ post("#{options.server}/assets/#{asset}/issues", data, asset_key)
107
78
  end
108
79
 
109
80
  desc 'transfer <amount> <source> <destination>', 'Transfer <amount> of units from <source> to <destination>'
110
81
  def transfer(amount, source, destination)
111
- key = OpenSSL::PKey::RSA.new File.read("#{ENV['HOME']}/.hyperledger/#{source}.pem")
112
-
113
- data = { source: source, destination: destination, amount: amount.to_i, uuid: SecureRandom.uuid }
114
- sign = Base64.encode64 key.sign(OpenSSL::Digest::SHA256.new, data.to_json)
115
-
116
- begin
117
- resp = RestClient.post "#{options.server}/transfers", { transfer: data.merge({resource_signature: sign}) }.to_json, content_type: :json, accept: :json
118
- puts 'Transfer completed!'
119
- rescue => e
120
- print_error(e)
121
- end
82
+ source_key = Key.new(source)
83
+ data = {
84
+ transfer: {
85
+ uuid: SecureRandom.uuid,
86
+ sourcePublicKey: source,
87
+ destinationPublicKey: destination,
88
+ amount: amount.to_i
89
+ }
90
+ }
91
+
92
+ post("#{options.server}/transfers", data, source_key)
122
93
  end
123
94
  end
124
95
 
@@ -18,6 +18,6 @@ Gem::Specification.new do |spec|
18
18
 
19
19
  spec.add_development_dependency "bundler", "~> 1.6"
20
20
  spec.add_development_dependency "rake", "~> 10.3"
21
- spec.add_runtime_dependency "rest_client", "~> 1.7"
21
+ spec.add_runtime_dependency "rest-client", "~> 1.7"
22
22
  spec.add_runtime_dependency "thor", "~> 0.19"
23
23
  end
@@ -1,4 +1,39 @@
1
- require "hyperledger_cli/version"
1
+ require 'pp'
2
+ require 'json'
3
+ require 'restclient'
4
+ require 'hyperledger_cli/version'
5
+ require_relative 'hyperledger_cli/error_printer'
2
6
 
3
- module HyperledgerCli
7
+ include HyperledgerCli::ErrorPrinter
8
+
9
+ module HyperledgerCli
10
+ def post(url, data, key = nil)
11
+ json_data = data.to_json
12
+ headers = {
13
+ content_type: :json,
14
+ accept: 'application/vnd.uber-amundsen+json'
15
+ }
16
+ if key
17
+ sig = key.sign(json_data)
18
+ headers.merge!({
19
+ authorization: "Hyper Key=#{key.public_key}, Signature=#{sig}"
20
+ })
21
+ end
22
+
23
+ begin
24
+ response = RestClient.post(url, json_data, headers)
25
+ pp JSON.parse(response)["uber"]["data"]
26
+ rescue => e
27
+ print_error(e)
28
+ end
29
+ end
30
+
31
+ def get(url)
32
+ begin
33
+ response = RestClient.get(url, accept: 'application/vnd.uber-amundsen+json')
34
+ pp JSON.parse(response)["uber"]["data"]
35
+ rescue => e
36
+ print_error(e)
37
+ end
38
+ end
4
39
  end
@@ -1,11 +1,10 @@
1
+ require 'pp'
2
+
1
3
  module HyperledgerCli
2
4
  module ErrorPrinter
3
5
  def print_error(err)
4
6
  puts "Error: #{err}"
5
- errors = JSON.parse(err.response, symbolize_names: true)[:errors]
6
- if errors
7
- errors.each do |k, v| puts "#{k}:\t#{v.join(', ')}" end
8
- end
7
+ pp err.response
9
8
  end
10
9
  end
11
10
  end
@@ -0,0 +1,40 @@
1
+ require 'openssl'
2
+ include OpenSSL
3
+
4
+ module HyperledgerCli
5
+ class Key
6
+ def initialize(public_key = nil)
7
+ @key = if public_key
8
+ PKey::EC.new(File.open(path(public_key)).read)
9
+ else
10
+ PKey::EC.new("secp256k1").generate_key
11
+ end
12
+ end
13
+
14
+ def path(public_key = nil)
15
+ root = "#{ENV['HOME']}/.hyperledger"
16
+ if public_key
17
+ "#{root}/#{public_key}.pem"
18
+ else
19
+ root
20
+ end
21
+ end
22
+
23
+ def write
24
+ FileUtils.mkdir_p path
25
+ open path(public_key), 'w' do |io|
26
+ io.write @key.to_pem
27
+ end
28
+ end
29
+
30
+ def public_key
31
+ @key.public_key.to_bn.to_s(16)
32
+ end
33
+
34
+ def sign(message)
35
+ digest = Digest::SHA256.digest(message)
36
+ signature = @key.dsa_sign_asn1(digest)
37
+ signature.unpack("H*").first.upcase
38
+ end
39
+ end
40
+ end
@@ -1,3 +1,3 @@
1
1
  module HyperledgerCli
2
- VERSION = "0.0.10"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyperledger_cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Feichtinger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-13 00:00:00.000000000 Z
11
+ date: 2015-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.3'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rest_client
42
+ name: rest-client
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
@@ -83,6 +83,7 @@ files:
83
83
  - hyperledger_cli.gemspec
84
84
  - lib/hyperledger_cli.rb
85
85
  - lib/hyperledger_cli/error_printer.rb
86
+ - lib/hyperledger_cli/key.rb
86
87
  - lib/hyperledger_cli/version.rb
87
88
  homepage:
88
89
  licenses:
@@ -104,7 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
105
  version: '0'
105
106
  requirements: []
106
107
  rubyforge_project:
107
- rubygems_version: 2.3.0
108
+ rubygems_version: 2.4.6
108
109
  signing_key:
109
110
  specification_version: 4
110
111
  summary: A sample CLI for the Hyperledger protocol.