openassets-ruby 0.5.1 → 0.5.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 +1 -1
- data/lib/openassets/api.rb +10 -5
- data/lib/openassets/cache/ssl_certificate_cache.rb +1 -1
- data/lib/openassets/protocol.rb +2 -0
- data/lib/openassets/protocol/asset_definition.rb +0 -13
- data/lib/openassets/protocol/asset_definition_loader.rb +22 -0
- data/lib/openassets/protocol/http_asset_definition_loader.rb +27 -0
- data/lib/openassets/protocol/marker_output.rb +25 -18
- data/lib/openassets/protocol/transaction_output.rb +4 -1
- data/lib/openassets/transaction/transaction_builder.rb +19 -17
- data/lib/openassets/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: feddc0050a29a509975ae29fdd81e8f464612c99
|
4
|
+
data.tar.gz: e8c6b8bb501b03f12833613d3fd8cb12c29e9d9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 82c528c39eaa375f6a888164cb2e8edbaa4524bfd13dfd8d24fa5dd73c44225d6ff72f41a4503a69ef60cae193e1dda8c7d87d69f001b22b8d2233a1110dcea3
|
7
|
+
data.tar.gz: 30b2d8a9e9e60b425f7fb8ffcc863c5dd150405ffcb647c7b5626bb22e2950ba6f64a6cf860c0107da6adb788cb02af7ba4e179112770ee99cdec82eeed0f53e
|
data/README.md
CHANGED
@@ -38,7 +38,7 @@ The configuration options are as follows:
|
|
38
38
|
|---|---|---|
|
39
39
|
|**network**|The using network. "mainnet" or "testnet" or "regtest" |mainnet|
|
40
40
|
|**provider**|The RPC server. Specify possible now only "bitcoind".|bitcoind|
|
41
|
-
|**cache**|The path to the database file. If you want to use in-memory database, specify ':memory:'.|cache.db|
|
41
|
+
|**cache**|The path to the database file. If you want to use in-memory database, specify ':memory:'. If do not use cache, specify :none .|cache.db|
|
42
42
|
|**dust_limit**|The amount of Bitcoin, which is set to the each output of the Open Assets Protocol(issue or transfer).|600 (satoshi)|
|
43
43
|
|**default_fees**|The default transaction fee in satoshi. If you want to use auto fee settings, specify ':auto'. (used by issue_asset and send_asset, send_bitcoin )|10000 (satoshi)|
|
44
44
|
|**min_confirmation**|The minimum number of confirmations the transaction containing an output that used to get UTXO.|1|
|
data/lib/openassets/api.rb
CHANGED
@@ -28,8 +28,10 @@ module OpenAssets
|
|
28
28
|
else
|
29
29
|
raise OpenAssets::Error, 'specified unsupported provider.'
|
30
30
|
end
|
31
|
-
|
32
|
-
|
31
|
+
unless @config[:cache] == :none
|
32
|
+
@tx_cache = Cache::TransactionCache.new(@config[:cache])
|
33
|
+
@output_cache = Cache::OutputCache.new(@config[:cache])
|
34
|
+
end
|
33
35
|
change_network
|
34
36
|
end
|
35
37
|
|
@@ -209,12 +211,14 @@ module OpenAssets
|
|
209
211
|
end
|
210
212
|
|
211
213
|
def get_output(txid, output_index)
|
212
|
-
|
213
|
-
|
214
|
+
if output_cache
|
215
|
+
cached = output_cache.get(txid, output_index)
|
216
|
+
return cached unless cached.nil?
|
217
|
+
end
|
214
218
|
decode_tx = load_cached_tx(txid)
|
215
219
|
tx = Bitcoin::Protocol::Tx.new(decode_tx.htb)
|
216
220
|
colored_outputs = get_color_outputs_from_tx(tx)
|
217
|
-
colored_outputs.each_with_index { |o, index| output_cache.put(txid, index, o)}
|
221
|
+
colored_outputs.each_with_index { |o, index| output_cache.put(txid, index, o)} if output_cache
|
218
222
|
colored_outputs[output_index]
|
219
223
|
end
|
220
224
|
|
@@ -387,6 +391,7 @@ module OpenAssets
|
|
387
391
|
end
|
388
392
|
|
389
393
|
def load_cached_tx(txid)
|
394
|
+
return load_tx(txid) unless tx_cache
|
390
395
|
decode_tx = tx_cache.get(txid)
|
391
396
|
if decode_tx.nil?
|
392
397
|
decode_tx = load_tx(txid)
|
@@ -3,7 +3,7 @@ module OpenAssets
|
|
3
3
|
class SSLCertificateCache < SQLiteBase
|
4
4
|
|
5
5
|
def initialize
|
6
|
-
path = OpenAssets.configuration ? OpenAssets.configuration[:cache] : ':memory:'
|
6
|
+
path = OpenAssets.configuration && OpenAssets.configuration[:cache] != :none ? OpenAssets.configuration[:cache] : ':memory:'
|
7
7
|
super(path)
|
8
8
|
end
|
9
9
|
|
data/lib/openassets/protocol.rb
CHANGED
@@ -3,6 +3,8 @@ module OpenAssets
|
|
3
3
|
autoload :MarkerOutput, 'openassets/protocol/marker_output'
|
4
4
|
autoload :TransactionOutput, 'openassets/protocol/transaction_output'
|
5
5
|
autoload :OutputType, 'openassets/protocol/output_type'
|
6
|
+
autoload :AssetDefinitionLoader, 'openassets/protocol/asset_definition_loader'
|
7
|
+
autoload :HttpAssetDefinitionLoader, 'openassets/protocol/http_asset_definition_loader'
|
6
8
|
autoload :AssetDefinition, 'openassets/protocol/asset_definition'
|
7
9
|
end
|
8
10
|
end
|
@@ -53,19 +53,6 @@ module OpenAssets
|
|
53
53
|
definition
|
54
54
|
end
|
55
55
|
|
56
|
-
# Parse the JSON obtained from the URL, and create a AssetDefinition object.
|
57
|
-
# @param[String] url The URL of Asset Definition.
|
58
|
-
def self.parse_url(url)
|
59
|
-
begin
|
60
|
-
definition = parse_json(RestClient::Request.execute(:method => :get, :url => url, :timeout => 10, :open_timeout => 10))
|
61
|
-
definition.asset_definition_url = url
|
62
|
-
definition
|
63
|
-
rescue => e
|
64
|
-
puts e
|
65
|
-
nil
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
56
|
def include_asset_id?(asset_id)
|
70
57
|
return false if asset_ids.nil? || asset_ids.empty?
|
71
58
|
asset_ids.include?(asset_id)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module OpenAssets
|
2
|
+
module Protocol
|
3
|
+
|
4
|
+
class AssetDefinitionLoader
|
5
|
+
|
6
|
+
attr_reader :loader
|
7
|
+
|
8
|
+
def initialize(metadata)
|
9
|
+
if metadata.start_with?('http://') || metadata.start_with?('https://')
|
10
|
+
@loader = HttpAssetDefinitionLoader.new(metadata)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# load Asset Definition File
|
15
|
+
# @return[OpenAssets::Protocol::AssetDefinition] loaded asset definition object
|
16
|
+
def load_definition
|
17
|
+
@loader.load
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module OpenAssets
|
2
|
+
module Protocol
|
3
|
+
|
4
|
+
# Asset Definition loader for http or https uri scheme
|
5
|
+
class HttpAssetDefinitionLoader
|
6
|
+
|
7
|
+
attr_reader :url
|
8
|
+
|
9
|
+
def initialize(url)
|
10
|
+
@url = url
|
11
|
+
end
|
12
|
+
|
13
|
+
# load asset definition
|
14
|
+
def load
|
15
|
+
begin
|
16
|
+
definition = AssetDefinition.parse_json(RestClient::Request.execute(:method => :get, :url => url, :timeout => 10, :open_timeout => 10))
|
17
|
+
definition.asset_definition_url = url
|
18
|
+
definition
|
19
|
+
rescue => e
|
20
|
+
puts e
|
21
|
+
nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -43,6 +43,7 @@ module OpenAssets
|
|
43
43
|
# @param [String] payload The Open Assets Payload.
|
44
44
|
# @return [OpenAssets::Protocol::MarkerOutput] The marker output object.
|
45
45
|
def self.deserialize_payload(payload)
|
46
|
+
return nil unless valid?(payload)
|
46
47
|
payload = payload[8..-1] # exclude OAP_MARKER,VERSION
|
47
48
|
asset_quantity, payload = parse_asset_qty(payload)
|
48
49
|
list = to_bytes(payload).map{|x|(x.to_i(16)>=128 ? x : x+"|")}.join.split('|')[0..(asset_quantity - 1)].join
|
@@ -57,24 +58,7 @@ module OpenAssets
|
|
57
58
|
# @return [String] The byte string of the marker output payload if the output fits the pattern, nil otherwise.
|
58
59
|
def self.parse_script(output_script)
|
59
60
|
data = Bitcoin::Script.new(output_script).get_op_return_data
|
60
|
-
return data if data
|
61
|
-
# check open assets marker
|
62
|
-
return nil unless data.start_with?(OAP_MARKER + VERSION)
|
63
|
-
# check asset quantity
|
64
|
-
offset = [OAP_MARKER + VERSION].pack('H*').length
|
65
|
-
count, offset = read_var_integer(data, offset)
|
66
|
-
return nil unless count
|
67
|
-
# check metadata
|
68
|
-
count.times do
|
69
|
-
quantity, length = read_leb128(data, offset)
|
70
|
-
return nil if quantity.nil? || (length - offset) > 9
|
71
|
-
offset = length
|
72
|
-
end
|
73
|
-
# check metadata
|
74
|
-
length, offset = read_var_integer(data, offset)
|
75
|
-
return nil unless length
|
76
|
-
return nil if [data].pack('H*').bytes.length < length + offset
|
77
|
-
data
|
61
|
+
return data if valid?(data)
|
78
62
|
end
|
79
63
|
|
80
64
|
# Creates an output script containing an OP_RETURN and a PUSHDATA from payload.
|
@@ -117,6 +101,29 @@ module OpenAssets
|
|
117
101
|
end
|
118
102
|
end
|
119
103
|
|
104
|
+
# validate marker output format
|
105
|
+
# @param[String] data marker output data with start with 4f41
|
106
|
+
def self.valid?(data)
|
107
|
+
return false if data.nil?
|
108
|
+
# check open assets marker
|
109
|
+
return false unless data.start_with?(OAP_MARKER + VERSION)
|
110
|
+
# check asset quantity
|
111
|
+
offset = [OAP_MARKER + VERSION].pack('H*').length
|
112
|
+
count, offset = read_var_integer(data, offset)
|
113
|
+
return false unless count
|
114
|
+
# check metadata
|
115
|
+
count.times do
|
116
|
+
quantity, length = read_leb128(data, offset)
|
117
|
+
return false if quantity.nil? || (length - offset) > 9
|
118
|
+
offset = length
|
119
|
+
end
|
120
|
+
# check metadata
|
121
|
+
length, offset = read_var_integer(data, offset)
|
122
|
+
return false unless length
|
123
|
+
return false if [data].pack('H*').bytes.length < length + offset
|
124
|
+
true
|
125
|
+
end
|
126
|
+
|
120
127
|
end
|
121
128
|
|
122
129
|
end
|
@@ -120,7 +120,10 @@ module OpenAssets
|
|
120
120
|
end
|
121
121
|
|
122
122
|
def load_asset_definition(url)
|
123
|
-
|
123
|
+
unless @@definition_cache.has_key?(url)
|
124
|
+
loader = AssetDefinitionLoader.new(metadata_url)
|
125
|
+
@@definition_cache[url] = loader.load_definition
|
126
|
+
end
|
124
127
|
@@definition_cache[url]
|
125
128
|
end
|
126
129
|
end
|
@@ -193,28 +193,30 @@ module OpenAssets
|
|
193
193
|
# Only when assets are transferred
|
194
194
|
asset_based_specs = {}
|
195
195
|
asset_transfer_specs.each{|asset_id, transfer_spec|
|
196
|
-
asset_based_specs[asset_id] =
|
197
|
-
asset_based_specs[asset_id]
|
196
|
+
asset_based_specs[asset_id] = {} unless asset_based_specs.has_key?(asset_id)
|
197
|
+
asset_based_specs[asset_id][transfer_spec.change_script] = [] unless asset_based_specs[asset_id].has_key?(transfer_spec.change_script)
|
198
|
+
asset_based_specs[asset_id][transfer_spec.change_script] << transfer_spec
|
198
199
|
}
|
199
200
|
|
200
|
-
asset_based_specs.each{|asset_id,
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
201
|
+
asset_based_specs.each{|asset_id, address_based_specs|
|
202
|
+
address_based_specs.values.each{|transfer_specs|
|
203
|
+
transfer_amount = transfer_specs.inject(0){|sum, s| sum + s.amount}
|
204
|
+
colored_outputs, total_amount = TransactionBuilder.collect_colored_outputs(transfer_specs[0].unspent_outputs, asset_id, transfer_amount)
|
205
|
+
inputs = inputs + colored_outputs
|
206
|
+
transfer_specs.each{|spec|
|
207
|
+
# add asset transfer output
|
208
|
+
spec.split_output_amount.each {|amount|
|
209
|
+
outputs << create_colored_output(oa_address_to_address(spec.to_script))
|
210
|
+
asset_quantities << amount
|
211
|
+
}
|
209
212
|
}
|
213
|
+
# add the rest of the asset to the origin address
|
214
|
+
if total_amount > transfer_amount
|
215
|
+
outputs << create_colored_output(oa_address_to_address(transfer_specs[0].change_script))
|
216
|
+
asset_quantities << (total_amount - transfer_amount)
|
217
|
+
end
|
210
218
|
}
|
211
|
-
# add the rest of the asset to the origin address
|
212
|
-
if total_amount > transfer_amount
|
213
|
-
outputs << create_colored_output(oa_address_to_address(transfer_specs[0].change_script))
|
214
|
-
asset_quantities << (total_amount - transfer_amount)
|
215
|
-
end
|
216
219
|
}
|
217
|
-
|
218
220
|
# End of asset settings
|
219
221
|
|
220
222
|
## For bitcoins transfer
|
data/lib/openassets/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openassets-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- azuchi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bitcoin-ruby
|
@@ -183,6 +183,8 @@ files:
|
|
183
183
|
- lib/openassets/medhod_filter.rb
|
184
184
|
- lib/openassets/protocol.rb
|
185
185
|
- lib/openassets/protocol/asset_definition.rb
|
186
|
+
- lib/openassets/protocol/asset_definition_loader.rb
|
187
|
+
- lib/openassets/protocol/http_asset_definition_loader.rb
|
186
188
|
- lib/openassets/protocol/marker_output.rb
|
187
189
|
- lib/openassets/protocol/output_type.rb
|
188
190
|
- lib/openassets/protocol/transaction_output.rb
|
@@ -224,7 +226,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
224
226
|
version: '0'
|
225
227
|
requirements: []
|
226
228
|
rubyforge_project:
|
227
|
-
rubygems_version: 2.4.
|
229
|
+
rubygems_version: 2.4.5
|
228
230
|
signing_key:
|
229
231
|
specification_version: 4
|
230
232
|
summary: The implementation of the Open Assets Protocol for Ruby.
|