hyperledger_cli 0.0.10 → 0.1.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: 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.