btcruby 1.1.5 → 1.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a64dd3f298bb55c7d1bc660b6318771030fa6e6f
4
- data.tar.gz: 6f9d6e72597bc798b2f025c3003d093f972a50ff
3
+ metadata.gz: e73f94175000adb419e6113bafc872a4ed2085fe
4
+ data.tar.gz: d77e81499ba58dcfbb3b46e3be208fc5680d60a4
5
5
  SHA512:
6
- metadata.gz: 38c83c30020fdc804fcd467bf20bd241709924c7b7708e8da72202c23717e9cb59b54c9916e6d5a09902b067107ebd8d4c14fa26b854495e4f1ac34693eb8ac7
7
- data.tar.gz: 7cbd2dc8332ae5e4756d813b207f592d541ff1d878b512bb902853b9b8fb6d626f28505cd1aea90f54706871544fcde1c45c9d1ccd81927aa85f2ff39e18e9ec
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, amount: nil, _raw_data: nil)
17
- if outpoint || amount
18
- raise ArgumentError, "Outpoint is missing" if !outpoint
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)
@@ -48,6 +48,7 @@ module BTC
48
48
  include ScriptErrors
49
49
 
50
50
  class ScriptError
51
+ include ScriptErrors
51
52
  attr_reader :code
52
53
  attr_reader :message
53
54
  attr_reader :description
@@ -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
-
@@ -1,3 +1,3 @@
1
1
  module BTC
2
- VERSION = "1.1.5".freeze
2
+ VERSION = "1.1.6".freeze
3
3
  end
@@ -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), amount:100, network: BTC::Network.mainnet)
7
- issuance_id.hash.to_hex.must_equal "29d2765469a299d1219a1cbf7561534eae4595f7"
8
- issuance_id.to_s.must_equal "SR78rsv5RCMMay22D3ZUZmMgPkRGpqphnQ"
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("SR78rsv5RCMMay22D3ZUZmMgPkRGpqphnQ")
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 "29d2765469a299d1219a1cbf7561534eae4595f7"
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.5
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-20 00:00:00.000000000 Z
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