openassets-ruby 0.4.9 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/openassets/protocol/marker_output.rb +19 -1
- data/lib/openassets/util.rb +44 -0
- data/lib/openassets/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b72bda7683e85f0fab9de4bb661bf18126246157
|
4
|
+
data.tar.gz: d212bd8bcd3b784bd280c4f0f21c73a5e285113c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8bde1f5913c9a701e57b48050cdf1ad2953c706daa66c186326ca7aaccb939a6504607c4e0946efef3eb7c7749e8af14d2d560743e867995b32c4cc6bec21ea
|
7
|
+
data.tar.gz: 72ed9e77591d9af4cfc8774580c1d866908fb1204e64e21b9a3b55f0e01ede935cf95181bb30ec9ec0b9830dbaf8c87a1914b4a5951db9e28862d2085065994a
|
@@ -58,7 +58,25 @@ module OpenAssets
|
|
58
58
|
def self.parse_script(output_script)
|
59
59
|
data = Bitcoin::Script.new(output_script).get_op_return_data
|
60
60
|
return data if data.nil?
|
61
|
-
|
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
|
+
puts [data].pack('H*').bytes.length
|
77
|
+
puts length + offset
|
78
|
+
return nil if [data].pack('H*').bytes.length < length + offset
|
79
|
+
data
|
62
80
|
end
|
63
81
|
|
64
82
|
# Creates an output script containing an OP_RETURN and a PUSHDATA from payload.
|
data/lib/openassets/util.rb
CHANGED
@@ -120,9 +120,53 @@ module OpenAssets
|
|
120
120
|
pubkey_hash_to_asset_id(pubkey_hash)
|
121
121
|
end
|
122
122
|
|
123
|
+
# read variable integer
|
124
|
+
# @param [String] data reading data
|
125
|
+
# @param [Integer] offset the position when reading from data.
|
126
|
+
# @return [[Integer, Integer]] decoded integer value and the reading byte length.
|
127
|
+
# https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer
|
128
|
+
def read_var_integer(data, offset = 0)
|
129
|
+
raise ArgumentError, "data is nil." unless data
|
130
|
+
bytes = [data].pack('H*').bytes[offset..(offset + 9)] # 9 is variable integer max storage length.
|
131
|
+
first_byte = bytes[0]
|
132
|
+
if first_byte < 0xfd
|
133
|
+
[first_byte, offset + 1]
|
134
|
+
elsif first_byte == 0xfd
|
135
|
+
[calc_var_integer_val(bytes[1..2]), offset + 3]
|
136
|
+
elsif first_byte == 0xfe
|
137
|
+
[calc_var_integer_val(bytes[1..4]), offset + 5]
|
138
|
+
elsif first_byte == 0xff
|
139
|
+
[calc_var_integer_val(bytes[1..8]), offset + 9]
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
# read leb128 value
|
144
|
+
# @param [String] data reading data
|
145
|
+
# @param [Integer] offset start position when reading from data.
|
146
|
+
# @return [[Integer, Integer]] decoded integer value and the reading byte length.
|
147
|
+
def read_leb128(data, offset = 0)
|
148
|
+
bytes = [data].pack('H*').bytes
|
149
|
+
result = 0
|
150
|
+
shift = 0
|
151
|
+
while true
|
152
|
+
return [nil, offset] if bytes.length < 1 + offset
|
153
|
+
byte = bytes[offset..(offset + 1)][0]
|
154
|
+
result |= (byte & 0x7f) << shift
|
155
|
+
break if byte & 0x80 == 0
|
156
|
+
shift += 7
|
157
|
+
offset += 1
|
158
|
+
end
|
159
|
+
[result, offset + 1]
|
160
|
+
end
|
161
|
+
|
123
162
|
private
|
124
163
|
def oa_version_byte
|
125
164
|
Bitcoin.network[:address_version] == "6f" ? OA_VERSION_BYTE_TESTNET : OA_VERSION_BYTE
|
126
165
|
end
|
166
|
+
|
167
|
+
def calc_var_integer_val(byte_array)
|
168
|
+
byte_array.each_with_index.inject(0){|sum, pair| pair[1] == 0 ? pair[0] : sum + pair[0]*(256**pair[1])}
|
169
|
+
end
|
170
|
+
|
127
171
|
end
|
128
172
|
end
|
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.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- azuchi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bitcoin-ruby
|