beowulf-ruby 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -0
- data/lib/beowulf.rb +4 -0
- data/lib/beowulf/base_error.rb +2 -0
- data/lib/beowulf/operation.rb +2 -0
- data/lib/beowulf/transaction.rb +25 -2
- data/lib/beowulf/type/extension.rb +100 -0
- data/lib/beowulf/type/extension_ids.rb +13 -0
- data/lib/beowulf/type/extension_json.rb +27 -0
- data/lib/beowulf/type/extension_types.rb +19 -0
- data/lib/beowulf/version.rb +1 -1
- data/lib/beowulf/wallet.rb +7 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d80b10af00162deb40c9d71f723e81a093de9404d02fb92e53388942a8d5091b
|
4
|
+
data.tar.gz: 281e7fbe7473dc501b5197fcb7e3a4c1400fab14899a55d1e5c56b7b1f7cb94a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 62467694a5be6efa7831f0d951cbecba2ba44186a7fe1936e8b5177b609eacd266fd4769b335d4091b489a4c9b479c20bf050020e942373d69aaa49846a1f8a5
|
7
|
+
data.tar.gz: f20991a1c2c2604bd8061d51c2ab8030b3b11dad2005397d7f388a2b6c945eed19d9ea120dae9d6e2c96a018e88fbd154138848f065b0a2f7404a28501a324fc
|
data/README.md
CHANGED
data/lib/beowulf.rb
CHANGED
@@ -16,6 +16,10 @@ module Beowulf
|
|
16
16
|
require 'beowulf/type/future'
|
17
17
|
require 'beowulf/type/authority'
|
18
18
|
require 'beowulf/type/authority_update'
|
19
|
+
require 'beowulf/type/extension_ids'
|
20
|
+
require 'beowulf/type/extension_json'
|
21
|
+
require 'beowulf/type/extension_types'
|
22
|
+
require 'beowulf/type/extension'
|
19
23
|
require 'beowulf/logger'
|
20
24
|
require 'beowulf/chain_config'
|
21
25
|
require 'beowulf/api'
|
data/lib/beowulf/base_error.rb
CHANGED
@@ -19,3 +19,5 @@ module Beowulf; class ApiError < BaseError; end; end
|
|
19
19
|
module Beowulf; class TypeError < BaseError; end; end
|
20
20
|
module Beowulf; class OperationError < BaseError; end; end
|
21
21
|
module Beowulf; class TransactionError < BaseError; end; end
|
22
|
+
module Beowulf; class WalletError < BaseError; end; end
|
23
|
+
module Beowulf; class ExtensionError < BaseError; end; end
|
data/lib/beowulf/operation.rb
CHANGED
data/lib/beowulf/transaction.rb
CHANGED
@@ -6,6 +6,7 @@ module Beowulf
|
|
6
6
|
class Transaction
|
7
7
|
include ChainConfig
|
8
8
|
include Utils
|
9
|
+
include Type
|
9
10
|
|
10
11
|
VALID_OPTIONS = %w(
|
11
12
|
wif private_key ref_block_num ref_block_prefix expiration
|
@@ -54,6 +55,7 @@ module Beowulf
|
|
54
55
|
@ref_block_num ||= nil
|
55
56
|
@ref_block_prefix ||= nil
|
56
57
|
@expiration ||= nil
|
58
|
+
@extensions ||= []
|
57
59
|
@created_time ||= Time.now.utc.to_i
|
58
60
|
@immutable_expiration = !!@expiration
|
59
61
|
|
@@ -132,6 +134,19 @@ module Beowulf
|
|
132
134
|
@operations = operations
|
133
135
|
end
|
134
136
|
|
137
|
+
def extensions
|
138
|
+
@extensions = @extensions.map do |ex|
|
139
|
+
case ex
|
140
|
+
when Extension then ex
|
141
|
+
else; Extension.new(ex)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def extensions=(extensions)
|
147
|
+
@extensions = extensions
|
148
|
+
end
|
149
|
+
|
135
150
|
def shutdown
|
136
151
|
@api.shutdown if !!@api
|
137
152
|
@network_broadcast_api.shutdown if !!@network_broadcast_api
|
@@ -177,7 +192,7 @@ module Beowulf
|
|
177
192
|
ref_block_num: @ref_block_num,
|
178
193
|
ref_block_prefix: @ref_block_prefix,
|
179
194
|
operations: operations.map { |op| op.payload },
|
180
|
-
extensions:
|
195
|
+
extensions: extensions.map { |ex| ex.payload },
|
181
196
|
created_time: @created_time,
|
182
197
|
signatures: [hexlify(signature)]
|
183
198
|
}
|
@@ -250,7 +265,15 @@ module Beowulf
|
|
250
265
|
bytes << op.to_bytes # n-bit ...
|
251
266
|
end
|
252
267
|
|
253
|
-
|
268
|
+
if extensions.empty?
|
269
|
+
bytes << 0x0000 # extensions # 16-bit, 4 Hex
|
270
|
+
else
|
271
|
+
bytes << pakC(extensions.size) # 8-bit, 2 Hex
|
272
|
+
extensions.each do |ex|
|
273
|
+
bytes << ex.to_bytes
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
254
277
|
bytes << pakQ(@created_time.to_i) # 64-bit, 16 Hex
|
255
278
|
|
256
279
|
puts "Transaction.to_bytes:", hexlify(bytes)
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Beowulf
|
4
|
+
module Type
|
5
|
+
class Extension
|
6
|
+
include ExtensionIds
|
7
|
+
include ExtensionTypes
|
8
|
+
include Utils
|
9
|
+
|
10
|
+
def initialize(options = {})
|
11
|
+
opt = options.dup
|
12
|
+
@type = opt.delete(:type)
|
13
|
+
|
14
|
+
opt.each do |k, v|
|
15
|
+
instance_variable_set("@#{k}", type(@type, k, v))
|
16
|
+
end
|
17
|
+
|
18
|
+
unless Extension::known_extension_names.include? @type
|
19
|
+
raise ExtensionError, "Unsupported extension type: #{@type}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_bytes
|
24
|
+
bytes = [id(@type.to_sym)].pack('C')
|
25
|
+
|
26
|
+
Extension::param_names(@type.to_sym).each do |p|
|
27
|
+
next unless defined? p
|
28
|
+
# puts p
|
29
|
+
v = instance_variable_get("@#{p}")
|
30
|
+
# puts v
|
31
|
+
bytes += v.to_bytes and next if v.respond_to? :to_bytes
|
32
|
+
|
33
|
+
bytes += case v
|
34
|
+
when Symbol then pakStr(v.to_s)
|
35
|
+
when String then pakStr(v)
|
36
|
+
when Integer then paks(v)
|
37
|
+
when TrueClass then pakC(1)
|
38
|
+
when FalseClass then pakC(0)
|
39
|
+
when ::Array then pakArr(v)
|
40
|
+
when ::Hash then pakHash(v)
|
41
|
+
when ExtensionJson then v.to_bytes
|
42
|
+
when NilClass then next
|
43
|
+
else
|
44
|
+
raise ExtensionError, "Unsupported type: #{v.class}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
bytes
|
49
|
+
end
|
50
|
+
|
51
|
+
def payload
|
52
|
+
params = {}
|
53
|
+
params["type"] = @type.to_s
|
54
|
+
Extension::param_names(@type.to_sym).each do |p|
|
55
|
+
next unless defined? p
|
56
|
+
# puts p
|
57
|
+
v = instance_variable_get("@#{p}")
|
58
|
+
# puts v
|
59
|
+
next if v.nil?
|
60
|
+
next if v.class == Beowulf::Type::Future
|
61
|
+
|
62
|
+
params[p] = case v
|
63
|
+
when Beowulf::Type::ExtensionJson
|
64
|
+
v.to_s
|
65
|
+
else; v
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
params
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def self.list_extensions
|
75
|
+
data_exts = '[
|
76
|
+
{
|
77
|
+
"extension": "extension_json_type",
|
78
|
+
"params": [
|
79
|
+
"value"
|
80
|
+
]
|
81
|
+
}
|
82
|
+
]'
|
83
|
+
@list_extensions = JSON.parse(data_exts)
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.known_extension_names
|
87
|
+
list_extensions.map { |ex| ex["extension"].to_sym }
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.param_names(type)
|
91
|
+
list_extensions.each do |ex|
|
92
|
+
if ex['extension'].to_sym == type.to_sym
|
93
|
+
return ex['params'].map(&:to_sym)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Beowulf
|
4
|
+
module Type
|
5
|
+
class ExtensionJson
|
6
|
+
include Utils
|
7
|
+
|
8
|
+
def initialize(options = {})
|
9
|
+
@data = options[:data] || ""
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_bytes
|
13
|
+
pakStr(@data)
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
{"data" => @data}
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_json(options)
|
21
|
+
JSON.dump ({
|
22
|
+
:data => @data
|
23
|
+
})
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Beowulf
|
2
|
+
module ExtensionTypes
|
3
|
+
TYPES = {
|
4
|
+
void_t: {
|
5
|
+
},
|
6
|
+
extension_json_type: {
|
7
|
+
value: Type::ExtensionJson
|
8
|
+
}
|
9
|
+
}
|
10
|
+
|
11
|
+
def type(key, param, value)
|
12
|
+
return if value.nil?
|
13
|
+
t = TYPES[key] or return value
|
14
|
+
p = t[param] or return value
|
15
|
+
p.new(value)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
data/lib/beowulf/version.rb
CHANGED
data/lib/beowulf/wallet.rb
CHANGED
@@ -68,6 +68,7 @@ module Beowulf
|
|
68
68
|
if !(achs.eql? bnchs)
|
69
69
|
puts achs, bnchs
|
70
70
|
puts 'Invalid private key (checksum miss-match)'
|
71
|
+
raise WalletError, "Invalid private key (checksum miss-match): #{achs} != #{bnchs}"
|
71
72
|
end
|
72
73
|
# Create Public Key
|
73
74
|
bk = Bitcoin::Key.new(hexlify(tpk[1..-1]), nil, {compressed: true})
|
@@ -83,12 +84,15 @@ module Beowulf
|
|
83
84
|
# Validate
|
84
85
|
if password == nil || password.length == 0
|
85
86
|
puts "Password is not empty."
|
87
|
+
raise WalletError, "Password is not empty."
|
86
88
|
end
|
87
89
|
if password.length < 8
|
88
90
|
puts "Password length >= 8 character."
|
91
|
+
raise WalletError, "Password length >= 8 character."
|
89
92
|
end
|
90
93
|
if @name == nil || @name.length == 0
|
91
94
|
puts "name is not empty."
|
95
|
+
raise WalletError, "name is not empty."
|
92
96
|
end
|
93
97
|
|
94
98
|
# Encrypt data
|
@@ -138,9 +142,11 @@ module Beowulf
|
|
138
142
|
# Validate inputs
|
139
143
|
if wallet_path_file == nil || wallet_path_file.length == 0
|
140
144
|
puts "Path file wallet is not empty."
|
145
|
+
raise WalletError, "Path file wallet is not empty."
|
141
146
|
end
|
142
147
|
if password == nil || password.length == 0
|
143
148
|
puts "Password is not empty."
|
149
|
+
raise WalletError, "Password is not empty."
|
144
150
|
end
|
145
151
|
# Read file wallet
|
146
152
|
file = File.read(wallet_path_file)
|
@@ -162,6 +168,7 @@ module Beowulf
|
|
162
168
|
dechs = msg_json['checksum']
|
163
169
|
if !(chs.eql? dechs)
|
164
170
|
puts "Password wrong."
|
171
|
+
raise WalletError, "Password wrong."
|
165
172
|
end
|
166
173
|
keys = msg_json['keys']
|
167
174
|
keys.each do |key, value|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: beowulf-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- NghiaTC
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-02-
|
11
|
+
date: 2020-02-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -426,6 +426,10 @@ files:
|
|
426
426
|
- lib/beowulf/type/array.rb
|
427
427
|
- lib/beowulf/type/authority.rb
|
428
428
|
- lib/beowulf/type/authority_update.rb
|
429
|
+
- lib/beowulf/type/extension.rb
|
430
|
+
- lib/beowulf/type/extension_ids.rb
|
431
|
+
- lib/beowulf/type/extension_json.rb
|
432
|
+
- lib/beowulf/type/extension_types.rb
|
429
433
|
- lib/beowulf/type/future.rb
|
430
434
|
- lib/beowulf/type/hash.rb
|
431
435
|
- lib/beowulf/type/permission.rb
|