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 +4 -4
- data/bin/hyperledger +60 -89
- data/hyperledger_cli.gemspec +1 -1
- data/lib/hyperledger_cli.rb +37 -2
- data/lib/hyperledger_cli/error_printer.rb +3 -4
- data/lib/hyperledger_cli/key.rb +40 -0
- data/lib/hyperledger_cli/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 192e7ce511fb3c24bbe2e05c656193dca94e0734
|
4
|
+
data.tar.gz: cd395c8633015a77a259ddd154bba12f02c8c8ca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
5
|
+
require_relative '../lib/hyperledger_cli'
|
6
|
+
require_relative '../lib/hyperledger_cli/key'
|
11
7
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
desc 'list', 'List all known
|
8
|
+
include HyperledgerCli
|
9
|
+
|
10
|
+
class Asset < Thor
|
11
|
+
desc 'list', 'List all known assets'
|
16
12
|
def list
|
17
|
-
|
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 <
|
23
|
-
def register(
|
24
|
-
|
25
|
-
primary_account_key =
|
26
|
-
|
27
|
-
|
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
|
-
|
30
|
-
|
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
|
-
|
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 <
|
63
|
-
def register(
|
64
|
-
|
65
|
-
data = {
|
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
|
-
|
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
|
-
|
58
|
+
class_option :server, type: :string, required: true
|
85
59
|
|
86
|
-
|
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> <
|
95
|
-
def issue(amount,
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
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
|
-
|
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
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
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
|
|
data/hyperledger_cli.gemspec
CHANGED
@@ -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 "
|
21
|
+
spec.add_runtime_dependency "rest-client", "~> 1.7"
|
22
22
|
spec.add_runtime_dependency "thor", "~> 0.19"
|
23
23
|
end
|
data/lib/hyperledger_cli.rb
CHANGED
@@ -1,4 +1,39 @@
|
|
1
|
-
require
|
1
|
+
require 'pp'
|
2
|
+
require 'json'
|
3
|
+
require 'restclient'
|
4
|
+
require 'hyperledger_cli/version'
|
5
|
+
require_relative 'hyperledger_cli/error_printer'
|
2
6
|
|
3
|
-
|
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
|
-
|
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
|
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
|
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:
|
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:
|
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.
|
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.
|