btcruby 1.1.5 → 1.1.6
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/RELEASE_NOTES.md +7 -0
- data/lib/btcruby/open_assets/issuance_id.rb +3 -5
- data/lib/btcruby/script/script_error.rb +1 -0
- data/lib/btcruby/script/script_number.rb +0 -107
- data/lib/btcruby/version.rb +1 -1
- data/spec/open_assets/issuance_id_spec.rb +5 -5
- data/spec/script_number_spec.rb +128 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e73f94175000adb419e6113bafc872a4ed2085fe
|
4
|
+
data.tar.gz: d77e81499ba58dcfbb3b46e3be208fc5680d60a4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29ef9077eae00c04723693c7ca5ce068010f8f1c419344e89c6ca7272de4c4cc46c4ab3cd483104a8857ba131e8ecfbfcba99dff4060a2cda43471b762aecabf
|
7
|
+
data.tar.gz: 0bb1d1e596806f3700cdcb2869440d3432be01b95b19d8eddf86771785f5e605ea9a0160559287ccc1d10d2f8b58992a7ec9da78e5cfa9d2ca6d0ebfca88a68c
|
data/RELEASE_NOTES.md
CHANGED
@@ -2,6 +2,13 @@
|
|
2
2
|
BTCRuby Release Notes
|
3
3
|
=====================
|
4
4
|
|
5
|
+
1.1.6 (August 26, 2015)
|
6
|
+
-----------------------
|
7
|
+
|
8
|
+
* Re-defined Issuance ID to not include amount. Now it is defined purely by an outpoint.
|
9
|
+
* Fixed namespace issue with `BTC::ScriptError`.
|
10
|
+
|
11
|
+
|
5
12
|
1.1.5 (August 20, 2015)
|
6
13
|
-----------------------
|
7
14
|
|
@@ -13,11 +13,9 @@ module BTC
|
|
13
13
|
125 # 's' prefix
|
14
14
|
end
|
15
15
|
|
16
|
-
def initialize(string: nil, hash: nil, network: nil, outpoint: nil,
|
17
|
-
if outpoint
|
18
|
-
|
19
|
-
raise ArgumentError, "Amount is missing" if !amount || amount < 0
|
20
|
-
data = outpoint.transaction_hash + WireFormat.encode_uint32be(outpoint.index) + WireFormat.encode_uint64le(amount)
|
16
|
+
def initialize(string: nil, hash: nil, network: nil, outpoint: nil, _raw_data: nil)
|
17
|
+
if outpoint
|
18
|
+
data = outpoint.transaction_hash + WireFormat.encode_uint32be(outpoint.index)
|
21
19
|
super(hash: BTC.hash160(data), network: network)
|
22
20
|
else
|
23
21
|
super(string: string, hash: hash, network: network, _raw_data: _raw_data)
|
@@ -145,110 +145,3 @@ module BTC
|
|
145
145
|
|
146
146
|
end
|
147
147
|
end
|
148
|
-
|
149
|
-
if $0 == __FILE__
|
150
|
-
require 'btcruby'
|
151
|
-
|
152
|
-
include BTC
|
153
|
-
def run_tests
|
154
|
-
|
155
|
-
# Decoding
|
156
|
-
|
157
|
-
[-1000000000000000,-10000,-100,-1,0,1,10,1000,100000000000000].each do |i|
|
158
|
-
should_equal(ScriptNumber.new(integer: i).to_i, i, "Must return integer as-is.")
|
159
|
-
end
|
160
|
-
|
161
|
-
should_equal(ScriptNumber.new(data: "").to_i, 0, "Must parse empty string as zero.")
|
162
|
-
should_equal(ScriptNumber.new(data: "\x01").to_i, 1, "Must parse 0x01 as 1.")
|
163
|
-
should_equal(ScriptNumber.new(data: "\xff").to_i, -127, "Must parse 0xff as -127.")
|
164
|
-
should_equal(ScriptNumber.new(data: "\xff\x00").to_i, 255, "Must parse 0xff00 as 255.")
|
165
|
-
should_equal(ScriptNumber.new(data: "\x81").to_i, -1, "Must parse 0x81 as -1.")
|
166
|
-
should_equal(ScriptNumber.new(data: "\x8f").to_i, -15, "Must parse 0x8f as -0x0f.")
|
167
|
-
should_equal(ScriptNumber.new(data: "\x00\x81").to_i, -256, "Must parse 0x0081 as -256.")
|
168
|
-
should_equal(ScriptNumber.new(data: "\xff\x80").to_i, -255, "Must decode -255.")
|
169
|
-
|
170
|
-
should_raise('non-minimally encoded script number') { ScriptNumber.new(data: "\x00") }
|
171
|
-
should_raise('non-minimally encoded script number') { ScriptNumber.new(data: "\x80") }
|
172
|
-
should_raise('non-minimally encoded script number') { ScriptNumber.new(data: "\x00\x80") }
|
173
|
-
should_raise('non-minimally encoded script number') { ScriptNumber.new(data: "\x01\x80") }
|
174
|
-
should_raise('non-minimally encoded script number') { ScriptNumber.new(data: "\x00\x00\x80") }
|
175
|
-
should_raise('non-minimally encoded script number') { ScriptNumber.new(data: "\x00\x10\x80") }
|
176
|
-
should_raise('non-minimally encoded script number') { ScriptNumber.new(data: "\x10\x00\x80") }
|
177
|
-
should_raise('script number overflow (3 > 2)') { ScriptNumber.new(data: "\x00\x00\x80", max_size: 2) }
|
178
|
-
|
179
|
-
# Encoding
|
180
|
-
|
181
|
-
should_equal(ScriptNumber.new(integer: 0).to_hex, "")
|
182
|
-
should_equal(ScriptNumber.new(integer: 1).to_hex, "01")
|
183
|
-
should_equal(ScriptNumber.new(integer: -1).to_hex, "81")
|
184
|
-
should_equal(ScriptNumber.new(integer: 255).to_hex, "ff00")
|
185
|
-
should_equal(ScriptNumber.new(integer: -255).to_hex, "ff80")
|
186
|
-
should_equal(ScriptNumber.new(integer: 0xffff).to_hex, "ffff00")
|
187
|
-
should_equal(ScriptNumber.new(integer: -0xffff).to_hex, "ffff80")
|
188
|
-
|
189
|
-
# Back and forth test
|
190
|
-
|
191
|
-
(-100000..10000).each do |i|
|
192
|
-
d = ScriptNumber.new(integer: i).data
|
193
|
-
#puts BTC.to_hex(d) if i % 16 == 0
|
194
|
-
i2 = ScriptNumber.new(data: d).to_i
|
195
|
-
should_equal(i, i2)
|
196
|
-
end
|
197
|
-
|
198
|
-
# Booleans
|
199
|
-
|
200
|
-
should_equal(ScriptNumber.new(boolean: true), 1)
|
201
|
-
should_equal(ScriptNumber.new(boolean: false), 0)
|
202
|
-
|
203
|
-
# Equality
|
204
|
-
|
205
|
-
should_equal(ScriptNumber.new(integer: 0) == 0, true)
|
206
|
-
should_equal(ScriptNumber.new(integer: 1) == 1, true)
|
207
|
-
should_equal(ScriptNumber.new(integer: -1) == -1, true)
|
208
|
-
|
209
|
-
should_equal(ScriptNumber.new(integer: 0) == ScriptNumber.new(integer: 0), true)
|
210
|
-
should_equal(ScriptNumber.new(integer: 1) == ScriptNumber.new(integer: 1), true)
|
211
|
-
should_equal(ScriptNumber.new(integer: -1) == ScriptNumber.new(integer: -1), true)
|
212
|
-
|
213
|
-
should_equal(ScriptNumber.new(integer: 0) != 0, false)
|
214
|
-
should_equal(ScriptNumber.new(integer: 1) != 1, false)
|
215
|
-
should_equal(ScriptNumber.new(integer: -1) != -1, false)
|
216
|
-
|
217
|
-
should_equal(ScriptNumber.new(integer: 0) != ScriptNumber.new(integer: 0), false)
|
218
|
-
should_equal(ScriptNumber.new(integer: 1) != ScriptNumber.new(integer: 1), false)
|
219
|
-
should_equal(ScriptNumber.new(integer: -1) != ScriptNumber.new(integer: -1), false)
|
220
|
-
|
221
|
-
# Arithmetic
|
222
|
-
|
223
|
-
sn = ScriptNumber.new(integer: 123)
|
224
|
-
sn -= 1
|
225
|
-
should_equal(sn, 122)
|
226
|
-
|
227
|
-
puts "All tests passed."
|
228
|
-
end
|
229
|
-
|
230
|
-
def should_equal(a, b, msg = 'Must equal')
|
231
|
-
a == b or raise "#{msg} Expected #{b.inspect}, received #{a.inspect}."
|
232
|
-
end
|
233
|
-
|
234
|
-
def should_raise(message)
|
235
|
-
raised = false
|
236
|
-
begin
|
237
|
-
yield
|
238
|
-
rescue => e
|
239
|
-
if e.message == message
|
240
|
-
raised = true
|
241
|
-
else
|
242
|
-
raise "Raised unexpected exception: #{e}"
|
243
|
-
end
|
244
|
-
end
|
245
|
-
if !raised
|
246
|
-
raise "Should have raised #{message.inspect}!"
|
247
|
-
end
|
248
|
-
end
|
249
|
-
|
250
|
-
run_tests
|
251
|
-
end
|
252
|
-
|
253
|
-
|
254
|
-
|
data/lib/btcruby/version.rb
CHANGED
@@ -3,14 +3,14 @@ require_relative '../spec_helper'
|
|
3
3
|
describe BTC::IssuanceID do
|
4
4
|
it "should encode script to a correct address" do
|
5
5
|
key = BTC::Key.new(private_key: "18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725".from_hex, public_key_compressed: false)
|
6
|
-
issuance_id = BTC::IssuanceID.new(outpoint: BTC::Outpoint.new(transaction_hash: BTC.hash256("tx1"), index:1),
|
7
|
-
issuance_id.hash.to_hex.must_equal "
|
8
|
-
issuance_id.to_s.must_equal "
|
6
|
+
issuance_id = BTC::IssuanceID.new(outpoint: BTC::Outpoint.new(transaction_hash: BTC.hash256("tx1"), index:1), network: BTC::Network.mainnet)
|
7
|
+
issuance_id.hash.to_hex.must_equal "601a635e4f95178e999b9957cc8cea255e988a4f"
|
8
|
+
issuance_id.to_s.must_equal "SW49WjotbWmG4GMWXZmpP3bdCrABmC8LRG"
|
9
9
|
issuance_id.is_a?(BTC::IssuanceID).must_equal true
|
10
10
|
end
|
11
11
|
it "should decode an asset address" do
|
12
|
-
issuance_id = BTC::Address.parse("
|
12
|
+
issuance_id = BTC::Address.parse("SW49WjotbWmG4GMWXZmpP3bdCrABmC8LRG")
|
13
13
|
issuance_id.is_a?(BTC::IssuanceID).must_equal true
|
14
|
-
issuance_id.hash.to_hex.must_equal "
|
14
|
+
issuance_id.hash.to_hex.must_equal "601a635e4f95178e999b9957cc8cea255e988a4f"
|
15
15
|
end
|
16
16
|
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe BTC::ScriptNumber do
|
4
|
+
|
5
|
+
[-1000000000000000,-10000,-100,-1,0,1,10,1000,100000000000000].each do |i|
|
6
|
+
it "should return integer #{i} as-is after a round-trip" do
|
7
|
+
BTC::ScriptNumber.new(integer: i).to_i.must_equal i
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should validate a range of back-and-forth conversions" do
|
12
|
+
(-100000..10000).each do |i|
|
13
|
+
BTC::ScriptNumber.new(integer: i).to_i.must_equal i
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should parse empty string as zero" do
|
18
|
+
BTC::ScriptNumber.new(data: "").to_i.must_equal 0
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should parse 0x01 as 1" do
|
22
|
+
BTC::ScriptNumber.new(data: "\x01").to_i.must_equal 1
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should parse 0xff as -127" do
|
26
|
+
BTC::ScriptNumber.new(data: "\xff").to_i.must_equal -127
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should parse 0xff00 as 255." do
|
30
|
+
BTC::ScriptNumber.new(data: "\xff\x00").to_i.must_equal 255
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should parse 0x81 as -1." do
|
34
|
+
BTC::ScriptNumber.new(data: "\x81").to_i.must_equal -1
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should parse 0x8f as -0x0f." do
|
38
|
+
BTC::ScriptNumber.new(data: "\x8f").to_i.must_equal -15
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should parse 0x0081 as -256." do
|
42
|
+
BTC::ScriptNumber.new(data: "\x00\x81").to_i.must_equal -256
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should decode -255." do
|
46
|
+
BTC::ScriptNumber.new(data: "\xff\x80").to_i.must_equal -255
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should raise exception for non-minimally-encoded data" do
|
50
|
+
should_raise('non-minimally encoded script number') { BTC::ScriptNumber.new(data: "\x00") }
|
51
|
+
should_raise('non-minimally encoded script number') { BTC::ScriptNumber.new(data: "\x80") }
|
52
|
+
should_raise('non-minimally encoded script number') { BTC::ScriptNumber.new(data: "\x00\x80") }
|
53
|
+
should_raise('non-minimally encoded script number') { BTC::ScriptNumber.new(data: "\x01\x80") }
|
54
|
+
should_raise('non-minimally encoded script number') { BTC::ScriptNumber.new(data: "\x00\x00\x80") }
|
55
|
+
should_raise('non-minimally encoded script number') { BTC::ScriptNumber.new(data: "\x00\x10\x80") }
|
56
|
+
should_raise('non-minimally encoded script number') { BTC::ScriptNumber.new(data: "\x10\x00\x80") }
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should raise exception for invalid encoding" do
|
60
|
+
should_raise('script number overflow (3 > 2)') { BTC::ScriptNumber.new(data: "\x00\x00\x80", max_size: 2) }
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should encode booleans" do
|
64
|
+
BTC::ScriptNumber.new(boolean: true).must_equal 1
|
65
|
+
BTC::ScriptNumber.new(boolean: true).data.must_equal "\x01"
|
66
|
+
BTC::ScriptNumber.new(boolean: false).must_equal 0
|
67
|
+
BTC::ScriptNumber.new(boolean: false).data.must_equal ""
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should check equality checks" do
|
71
|
+
(BTC::ScriptNumber.new(integer: 0) == 0).must_equal true
|
72
|
+
(BTC::ScriptNumber.new(integer: 1) == 1).must_equal true
|
73
|
+
(BTC::ScriptNumber.new(integer: -1) == -1).must_equal true
|
74
|
+
|
75
|
+
(BTC::ScriptNumber.new(integer: 0) == BTC::ScriptNumber.new(integer: 0)).must_equal true
|
76
|
+
(BTC::ScriptNumber.new(integer: 1) == BTC::ScriptNumber.new(integer: 1)).must_equal true
|
77
|
+
(BTC::ScriptNumber.new(integer: -1) == BTC::ScriptNumber.new(integer: -1)).must_equal true
|
78
|
+
|
79
|
+
(BTC::ScriptNumber.new(integer: 0) != 0).must_equal false
|
80
|
+
(BTC::ScriptNumber.new(integer: 1) != 1).must_equal false
|
81
|
+
(BTC::ScriptNumber.new(integer: -1) != -1).must_equal false
|
82
|
+
(BTC::ScriptNumber.new(integer: 0) != BTC::ScriptNumber.new(integer: 0)).must_equal false
|
83
|
+
(BTC::ScriptNumber.new(integer: 1) != BTC::ScriptNumber.new(integer: 1)).must_equal false
|
84
|
+
(BTC::ScriptNumber.new(integer: -1) != BTC::ScriptNumber.new(integer: -1)).must_equal false
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should support #-" do
|
88
|
+
sn = BTC::ScriptNumber.new(integer: 123)
|
89
|
+
sn = sn - 20
|
90
|
+
sn -= 3
|
91
|
+
sn.must_equal 100
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should support #+" do
|
95
|
+
sn = BTC::ScriptNumber.new(integer: 123)
|
96
|
+
sn = sn + 20
|
97
|
+
sn += 7
|
98
|
+
sn.must_equal 150
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should support unary minus operator" do
|
102
|
+
sn = BTC::ScriptNumber.new(integer: 123)
|
103
|
+
sn = -sn
|
104
|
+
sn.must_equal -123
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should support unary plus operator" do
|
108
|
+
sn = BTC::ScriptNumber.new(integer: 123)
|
109
|
+
sn = +sn
|
110
|
+
sn.must_equal 123
|
111
|
+
end
|
112
|
+
|
113
|
+
def should_raise(message)
|
114
|
+
raised = false
|
115
|
+
begin
|
116
|
+
yield
|
117
|
+
rescue => e
|
118
|
+
if e.message == message
|
119
|
+
raised = true
|
120
|
+
else
|
121
|
+
raise "Raised unexpected exception: #{e}"
|
122
|
+
end
|
123
|
+
end
|
124
|
+
if !raised
|
125
|
+
raise "Should have raised #{message.inspect}!"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: btcruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oleg Andreev
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-08-
|
12
|
+
date: 2015-08-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ffi
|
@@ -156,6 +156,7 @@ files:
|
|
156
156
|
- spec/open_assets/issuance_id_spec.rb
|
157
157
|
- spec/proof_of_work_spec.rb
|
158
158
|
- spec/script_interpreter_spec.rb
|
159
|
+
- spec/script_number_spec.rb
|
159
160
|
- spec/script_spec.rb
|
160
161
|
- spec/secp256k1_spec.rb
|
161
162
|
- spec/spec_helper.rb
|
@@ -207,6 +208,7 @@ test_files:
|
|
207
208
|
- spec/open_assets/issuance_id_spec.rb
|
208
209
|
- spec/proof_of_work_spec.rb
|
209
210
|
- spec/script_interpreter_spec.rb
|
211
|
+
- spec/script_number_spec.rb
|
210
212
|
- spec/script_spec.rb
|
211
213
|
- spec/secp256k1_spec.rb
|
212
214
|
- spec/transaction_builder_spec.rb
|