beowulf-ruby 0.0.1 → 0.0.2
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/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
|