btcruby 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/btcruby/block.rb +6 -6
- data/lib/btcruby/block_header.rb +2 -2
- data/lib/btcruby/data.rb +15 -2
- data/lib/btcruby/extensions.rb +2 -2
- data/lib/btcruby/hash_id.rb +2 -2
- data/lib/btcruby/open_assets/asset_definition.rb +1 -1
- data/lib/btcruby/open_assets/asset_marker.rb +1 -1
- data/lib/btcruby/openssl.rb +5 -5
- data/lib/btcruby/script.rb +3 -3
- data/lib/btcruby/transaction.rb +2 -2
- data/lib/btcruby/transaction_input.rb +7 -7
- data/lib/btcruby/transaction_output.rb +3 -3
- data/lib/btcruby/version.rb +1 -1
- data/lib/btcruby/wif.rb +1 -1
- data/spec/address_spec.rb +1 -1
- data/spec/base58_spec.rb +4 -4
- data/spec/data_spec.rb +25 -25
- data/spec/key_spec.rb +2 -2
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c08f34b042c6881e1117904400ed1fa066cf31f1
|
4
|
+
data.tar.gz: b4c4cf4fec603d4e9f04786fae3afefd46666bbe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 406d2ecfc50fdc0d019188e12d56e0c9a1f286768220ae5bf5fce5a4a95702da91f79ebb816d0d2b4aca1c6a1c19d15afb0f4c452b94d61c657ac152ec13a227
|
7
|
+
data.tar.gz: 12d8493b58fb45a00e1cd115ad1904bfc13dbfa1e31d0ce938706a8d265df7f818486485c210102af0c9c2c03c0507d03580ce74fae1b28c18d25614aae82674
|
data/lib/btcruby/block.rb
CHANGED
@@ -14,7 +14,7 @@ module BTC
|
|
14
14
|
self.new(
|
15
15
|
version: 1,
|
16
16
|
previous_block_hash: ZERO_HASH256,
|
17
|
-
merkle_root: BTC
|
17
|
+
merkle_root: BTC.from_hex("3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"),
|
18
18
|
timestamp: 1231006505,
|
19
19
|
bits: 0x1d00ffff,
|
20
20
|
nonce: 0x7c2bac1d,
|
@@ -22,7 +22,7 @@ module BTC
|
|
22
22
|
version: 1,
|
23
23
|
inputs: [
|
24
24
|
BTC::TransactionInput.new(
|
25
|
-
coinbase_data: BTC
|
25
|
+
coinbase_data: BTC.from_hex("04FFFF001D010445"+
|
26
26
|
"5468652054696D65732030332F4A616E2F32303039204368616E63656C6C6F72206F6E2062" +
|
27
27
|
"72696E6B206F66207365636F6E64206261696C6F757420666F722062616E6B73"),
|
28
28
|
)
|
@@ -30,7 +30,7 @@ module BTC
|
|
30
30
|
outputs: [
|
31
31
|
BTC::TransactionOutput.new(
|
32
32
|
value: 50*COIN,
|
33
|
-
script: Script.new(data: BTC
|
33
|
+
script: Script.new(data: BTC.from_hex("4104678AFDB0FE5548271967F1"+
|
34
34
|
"A67130B7105CD6A828E03909A67962E0EA1F61DEB649F6BC3F4CEF38"+
|
35
35
|
"C4F35504E51EC112DE5C384DF7BA0B8D578A4C702B6BF11D5FAC"))
|
36
36
|
)
|
@@ -45,7 +45,7 @@ module BTC
|
|
45
45
|
self.new(
|
46
46
|
version: 1,
|
47
47
|
previous_block_hash: ZERO_HASH256,
|
48
|
-
merkle_root: BTC
|
48
|
+
merkle_root: BTC.from_hex("3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"),
|
49
49
|
timestamp: 1296688602,
|
50
50
|
bits: 0x1d00ffff,
|
51
51
|
nonce: 0x18aea41a,
|
@@ -53,7 +53,7 @@ module BTC
|
|
53
53
|
version: 1,
|
54
54
|
inputs: [
|
55
55
|
BTC::TransactionInput.new(
|
56
|
-
coinbase_data: BTC
|
56
|
+
coinbase_data: BTC.from_hex("04FFFF001D010445"+
|
57
57
|
"5468652054696D65732030332F4A616E2F32303039204368616E63656C6C6F72206F6E2062" +
|
58
58
|
"72696E6B206F66207365636F6E64206261696C6F757420666F722062616E6B73"),
|
59
59
|
)
|
@@ -61,7 +61,7 @@ module BTC
|
|
61
61
|
outputs: [
|
62
62
|
BTC::TransactionOutput.new(
|
63
63
|
value: 50*COIN,
|
64
|
-
script: Script.new(data: BTC
|
64
|
+
script: Script.new(data: BTC.from_hex("4104678AFDB0FE5548271967F1"+
|
65
65
|
"A67130B7105CD6A828E03909A67962E0EA1F61DEB649F6BC3F4CEF38"+
|
66
66
|
"C4F35504E51EC112DE5C384DF7BA0B8D578A4C702B6BF11D5FAC"))
|
67
67
|
)
|
data/lib/btcruby/block_header.rb
CHANGED
@@ -57,7 +57,7 @@ module BTC
|
|
57
57
|
self.new(
|
58
58
|
version: 1,
|
59
59
|
previous_block_hash: ZERO_HASH256,
|
60
|
-
merkle_root: BTC
|
60
|
+
merkle_root: BTC.from_hex("3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"),
|
61
61
|
timestamp: 1231006505,
|
62
62
|
bits: 0x1d00ffff,
|
63
63
|
nonce: 0x7c2bac1d,
|
@@ -69,7 +69,7 @@ module BTC
|
|
69
69
|
self.new(
|
70
70
|
version: 1,
|
71
71
|
previous_block_hash: ZERO_HASH256,
|
72
|
-
merkle_root: BTC
|
72
|
+
merkle_root: BTC.from_hex("3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a"),
|
73
73
|
timestamp: 1296688602,
|
74
74
|
bits: 0x1d00ffff,
|
75
75
|
nonce: 0x18aea41a,
|
data/lib/btcruby/data.rb
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
require 'securerandom'
|
2
2
|
|
3
3
|
module BTC
|
4
|
+
|
5
|
+
# This allows doing `BTC.to_hex(...)`
|
6
|
+
module Data; end
|
7
|
+
include Data
|
8
|
+
extend self
|
9
|
+
|
4
10
|
module Data
|
5
11
|
extend self
|
6
|
-
|
7
|
-
|
12
|
+
|
8
13
|
HEX_PACK_CODE = "H*".freeze
|
9
14
|
BYTE_PACK_CODE = "C*".freeze
|
10
15
|
|
@@ -29,6 +34,14 @@ module BTC
|
|
29
34
|
raise ArgumentError, "Data is missing" if !data
|
30
35
|
return data.unpack(HEX_PACK_CODE).first
|
31
36
|
end
|
37
|
+
|
38
|
+
def to_hex(data)
|
39
|
+
hex_from_data(data)
|
40
|
+
end
|
41
|
+
|
42
|
+
def from_hex(hex)
|
43
|
+
data_from_hex(hex)
|
44
|
+
end
|
32
45
|
|
33
46
|
# Converts a binary string to an array of bytes (list of integers).
|
34
47
|
# Returns a much more efficient slice of bytes if offset/limit or
|
data/lib/btcruby/extensions.rb
CHANGED
@@ -14,12 +14,12 @@ module BTC
|
|
14
14
|
|
15
15
|
# Converts binary data into hex string
|
16
16
|
def to_hex
|
17
|
-
BTC
|
17
|
+
BTC.to_hex(self)
|
18
18
|
end
|
19
19
|
|
20
20
|
# Converts hex string into a binary data
|
21
21
|
def from_hex
|
22
|
-
BTC
|
22
|
+
BTC.from_hex(self)
|
23
23
|
end
|
24
24
|
|
25
25
|
# Various hash functions
|
data/lib/btcruby/hash_id.rb
CHANGED
@@ -6,13 +6,13 @@ module BTC
|
|
6
6
|
# Converts string transaction or block ID into binary hash.
|
7
7
|
def self.hash_from_id(identifier)
|
8
8
|
return nil if !identifier # so we can convert optional ID into optional hash without extra headache
|
9
|
-
BTC
|
9
|
+
BTC.from_hex(identifier).reverse
|
10
10
|
end
|
11
11
|
|
12
12
|
# Converts binary hash to hex identifier (as a big-endian 256-bit integer).
|
13
13
|
def self.id_from_hash(hash)
|
14
14
|
return nil if !hash # so we can convert optional hash into optional ID without extra headache
|
15
|
-
BTC
|
15
|
+
BTC.to_hex(hash.reverse)
|
16
16
|
end
|
17
17
|
|
18
18
|
end
|
@@ -25,7 +25,7 @@ module BTC
|
|
25
25
|
data = BTC::Data.ensure_binary_encoding(data)
|
26
26
|
|
27
27
|
raise ArgumentError, "Data must be at least 6 bytes long (4 bytes prefix and 2 bytes for varints)" if data.bytesize < 6
|
28
|
-
raise ArgumentError, "Prefix is invalid. Expected #{BTC
|
28
|
+
raise ArgumentError, "Prefix is invalid. Expected #{BTC.to_hex(PREFIX_V1)}" if data[0, PREFIX_V1.bytesize] != PREFIX_V1
|
29
29
|
|
30
30
|
offset = PREFIX_V1.bytesize
|
31
31
|
count, bytesread = WireFormat.read_varint(data: data, offset: offset)
|
data/lib/btcruby/openssl.rb
CHANGED
@@ -152,7 +152,7 @@ module BTC
|
|
152
152
|
buf = FFI::MemoryPointer.from_string(pubkey)
|
153
153
|
eckey = o2i_ECPublicKey(pointer_to_pointer(eckey), pointer_to_pointer(buf), buf.size-1)
|
154
154
|
if eckey.null?
|
155
|
-
raise BTCError, "OpenSSL failed to create EC_KEY with public key: #{BTC
|
155
|
+
raise BTCError, "OpenSSL failed to create EC_KEY with public key: #{BTC.to_hex(pubkey).inspect}"
|
156
156
|
end
|
157
157
|
|
158
158
|
# 2. Extract re-compressed pubkey from EC_KEY
|
@@ -358,7 +358,7 @@ module BTC
|
|
358
358
|
buf = FFI::MemoryPointer.from_string(signature)
|
359
359
|
psig = d2i_ECDSA_SIG(nil, pointer_to_pointer(buf), buf.size-1)
|
360
360
|
if psig.null?
|
361
|
-
raise BTCError, "OpenSSL failed to read ECDSA signature with DER: #{BTC
|
361
|
+
raise BTCError, "OpenSSL failed to read ECDSA signature with DER: #{BTC.to_hex(signature).inspect}"
|
362
362
|
end
|
363
363
|
|
364
364
|
sig = ECDSA_SIG.new(psig) # read sig from its pointer
|
@@ -400,7 +400,7 @@ module BTC
|
|
400
400
|
buf = FFI::MemoryPointer.from_string(public_key)
|
401
401
|
eckey = o2i_ECPublicKey(pointer_to_pointer(eckey), pointer_to_pointer(buf), buf.size - 1)
|
402
402
|
if eckey.null?
|
403
|
-
raise BTCError, "OpenSSL failed to create EC_KEY with public key: #{BTC
|
403
|
+
raise BTCError, "OpenSSL failed to create EC_KEY with public key: #{BTC.to_hex(public_key).inspect}"
|
404
404
|
end
|
405
405
|
|
406
406
|
# -1 = error, 0 = bad sig, 1 = good
|
@@ -413,9 +413,9 @@ module BTC
|
|
413
413
|
end
|
414
414
|
|
415
415
|
if result == 0
|
416
|
-
Diagnostics.current.add_message("OpenSSL detected invalid ECDSA signature. Signature: #{BTC
|
416
|
+
Diagnostics.current.add_message("OpenSSL detected invalid ECDSA signature. Signature: #{BTC.to_hex(signature).inspect}; Hash: #{BTC.to_hex(hash).inspect}; Pubkey: #{BTC.to_hex(public_key).inspect}")
|
417
417
|
else
|
418
|
-
raise BTCError, "OpenSSL failed with error while verifying ECDSA signature. Signature: #{BTC
|
418
|
+
raise BTCError, "OpenSSL failed with error while verifying ECDSA signature. Signature: #{BTC.to_hex(signature).inspect}; Hash: #{BTC.to_hex(hash).inspect}; Pubkey: #{BTC.to_hex(public_key).inspect}"
|
419
419
|
end
|
420
420
|
return false
|
421
421
|
end
|
data/lib/btcruby/script.rb
CHANGED
@@ -20,7 +20,7 @@ module BTC
|
|
20
20
|
public_keys: nil, signatures_required: nil # multisig
|
21
21
|
)
|
22
22
|
if data || hex
|
23
|
-
data ||= BTC
|
23
|
+
data ||= BTC.from_hex(hex)
|
24
24
|
data = BTC::Data.ensure_binary_encoding(data)
|
25
25
|
@chunks = []
|
26
26
|
offset = 0
|
@@ -266,7 +266,7 @@ module BTC
|
|
266
266
|
end
|
267
267
|
|
268
268
|
def to_hex
|
269
|
-
BTC
|
269
|
+
BTC.to_hex(self.data)
|
270
270
|
end
|
271
271
|
|
272
272
|
# Returns an array of opcodes or pushdata strings.
|
@@ -629,7 +629,7 @@ module BTC
|
|
629
629
|
# Wrap in single quotes. Why not double? Because they are already used in JSON and we don't want to multiply the mess.
|
630
630
|
string = "'#{string}'"
|
631
631
|
else
|
632
|
-
string = BTC
|
632
|
+
string = BTC.to_hex(pushdata)
|
633
633
|
# Shorter than 128-bit chunks are wrapped in square brackets to avoid ambiguity with big all-decimal numbers.
|
634
634
|
if (pushdata.bytesize < 16)
|
635
635
|
string = "[#{string}]"
|
data/lib/btcruby/transaction.rb
CHANGED
@@ -97,7 +97,7 @@ module BTC
|
|
97
97
|
fee: nil,
|
98
98
|
inputs_amount: nil)
|
99
99
|
|
100
|
-
data = BTC
|
100
|
+
data = BTC.from_hex(hex) if hex
|
101
101
|
stream = StringIO.new(data) if data
|
102
102
|
if stream
|
103
103
|
init_with_stream(stream)
|
@@ -451,7 +451,7 @@ module BTC
|
|
451
451
|
|
452
452
|
# Returns hex representation of the transaction.
|
453
453
|
def to_hex
|
454
|
-
BTC
|
454
|
+
BTC.to_hex(self.data)
|
455
455
|
end
|
456
456
|
|
457
457
|
# Makes a deep copy of a transaction (all inputs and outputs are copied too).
|
@@ -147,7 +147,7 @@ module BTC
|
|
147
147
|
|
148
148
|
if dict["prev_out"]
|
149
149
|
if hashhex = dict["prev_out"]["hash"]
|
150
|
-
prevhash = BTC
|
150
|
+
prevhash = BTC.from_hex(hashhex)
|
151
151
|
if prevhash.bytesize != 32
|
152
152
|
raise ArgumentError, "prev_out.hash is not 32 bytes long."
|
153
153
|
end
|
@@ -165,11 +165,11 @@ module BTC
|
|
165
165
|
coinbase_data = nil
|
166
166
|
script = nil
|
167
167
|
if hex = dict["coinbase"]
|
168
|
-
coinbase_data = BTC
|
168
|
+
coinbase_data = BTC.from_hex(hex)
|
169
169
|
elsif dict["scriptSig"]
|
170
170
|
if dict["scriptSig"].is_a?(Hash)
|
171
171
|
if hex = dict["scriptSig"]["hex"]
|
172
|
-
script = BTC::Script.new(data: BTC
|
172
|
+
script = BTC::Script.new(data: BTC.from_hex(hex))
|
173
173
|
end
|
174
174
|
end
|
175
175
|
end
|
@@ -224,16 +224,16 @@ module BTC
|
|
224
224
|
dict = {}
|
225
225
|
|
226
226
|
dict["prev_out"] = {
|
227
|
-
"hash" => BTC
|
227
|
+
"hash" => BTC.to_hex(self.previous_hash),
|
228
228
|
"n" => self.previous_index
|
229
229
|
}
|
230
230
|
|
231
231
|
if self.coinbase?
|
232
|
-
dict["coinbase"] = BTC
|
232
|
+
dict["coinbase"] = BTC.to_hex(self.coinbase_data)
|
233
233
|
else
|
234
234
|
dict["scriptSig"] = {
|
235
235
|
"asm" => self.signature_script.to_s,
|
236
|
-
"hex" => BTC
|
236
|
+
"hex" => BTC.to_hex(self.signature_script.data)
|
237
237
|
}
|
238
238
|
end
|
239
239
|
|
@@ -247,7 +247,7 @@ module BTC
|
|
247
247
|
end
|
248
248
|
|
249
249
|
def to_s
|
250
|
-
BTC
|
250
|
+
BTC.to_hex(self.data)
|
251
251
|
end
|
252
252
|
|
253
253
|
def ==(other)
|
@@ -142,7 +142,7 @@ module BTC
|
|
142
142
|
@script = nil
|
143
143
|
if dict["scriptPubKey"] && dict["scriptPubKey"].is_a?(Hash)
|
144
144
|
if hex = dict["scriptPubKey"]["hex"]
|
145
|
-
@script = Script.new(data: BTC
|
145
|
+
@script = Script.new(data: BTC.from_hex(hex))
|
146
146
|
if !@script
|
147
147
|
raise ArgumentError, "Failed to parse script from scriptPubKey.hex"
|
148
148
|
end
|
@@ -162,7 +162,7 @@ module BTC
|
|
162
162
|
"value" => CurrencyFormatter.btc_long_formatter.string_from_number(self.value),
|
163
163
|
"scriptPubKey" => {
|
164
164
|
"asm" => self.script.to_s,
|
165
|
-
"hex" => BTC
|
165
|
+
"hex" => BTC.to_hex(self.script.data)
|
166
166
|
}
|
167
167
|
}
|
168
168
|
end
|
@@ -270,7 +270,7 @@ module BTC
|
|
270
270
|
end
|
271
271
|
|
272
272
|
def to_s
|
273
|
-
BTC
|
273
|
+
BTC.to_hex(self.data)
|
274
274
|
end
|
275
275
|
|
276
276
|
def ==(other)
|
data/lib/btcruby/version.rb
CHANGED
data/lib/btcruby/wif.rb
CHANGED
@@ -97,7 +97,7 @@ module BTC
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def inspect
|
100
|
-
%{#<#{self.class}:#{to_s} privkey:#{BTC
|
100
|
+
%{#<#{self.class}:#{to_s} privkey:#{BTC.to_hex(data)} (#{@public_key_compressed ? '' : 'un'}compressed pubkey)>}
|
101
101
|
end
|
102
102
|
|
103
103
|
end
|
data/spec/address_spec.rb
CHANGED
@@ -17,7 +17,7 @@ describe BTC::Address do
|
|
17
17
|
address.script.to_s.must_equal "OP_DUP OP_HASH160 5a73e920b7836c74f9e740a5bb885e8580557038 OP_EQUALVERIFY OP_CHECKSIG"
|
18
18
|
|
19
19
|
address.to_s.must_equal("19FGfswVqxNubJbh1NW8A4t51T9x9RDVWQ")
|
20
|
-
address.data.must_equal(BTC
|
20
|
+
address.data.must_equal(BTC.from_hex("5a73e920b7836c74f9e740a5bb885e8580557038"))
|
21
21
|
end
|
22
22
|
|
23
23
|
it "should decode/encode testnet pay-to-pubkey-hash address" do
|
data/spec/base58_spec.rb
CHANGED
@@ -11,18 +11,18 @@ describe BTC::Base58 do
|
|
11
11
|
|
12
12
|
def check_valid_base58(hex_string, base58_string)
|
13
13
|
# Convert to Base58
|
14
|
-
Base58.base58_from_data(BTC
|
14
|
+
Base58.base58_from_data(BTC.from_hex(hex_string)).must_equal(base58_string)
|
15
15
|
|
16
16
|
# Convert from Base58
|
17
|
-
BTC
|
17
|
+
BTC.to_hex(Base58.data_from_base58(base58_string)).must_equal(hex_string)
|
18
18
|
end
|
19
19
|
|
20
20
|
def check_valid_base58check(hex, string)
|
21
21
|
# Convert to Base58Check
|
22
|
-
Base58.base58check_from_data(BTC
|
22
|
+
Base58.base58check_from_data(BTC.from_hex(hex)).must_equal(string)
|
23
23
|
|
24
24
|
# Convert from Base58Check
|
25
|
-
BTC
|
25
|
+
BTC.to_hex(Base58.data_from_base58check(string)).must_equal(hex)
|
26
26
|
end
|
27
27
|
|
28
28
|
describe "Base58" do
|
data/spec/data_spec.rb
CHANGED
@@ -3,48 +3,48 @@ require_relative 'spec_helper'
|
|
3
3
|
describe BTC::Data do
|
4
4
|
|
5
5
|
it "should decode valid hex" do
|
6
|
-
lambda { BTC
|
7
|
-
BTC
|
8
|
-
BTC
|
9
|
-
BTC
|
10
|
-
BTC
|
11
|
-
BTC
|
6
|
+
lambda { BTC.from_hex(nil) }.must_raise ArgumentError
|
7
|
+
BTC.from_hex("fe").bytes.must_equal "\xfe".bytes
|
8
|
+
BTC.from_hex("deadBEEF").bytes.must_equal "\xde\xad\xbe\xef".bytes
|
9
|
+
BTC.from_hex(" \r\n\tdeadBEEF \t \r \n").bytes.must_equal "\xde\xad\xbe\xef".bytes
|
10
|
+
BTC.from_hex("").bytes.must_equal "".bytes
|
11
|
+
BTC.from_hex(" \t ").bytes.must_equal "".bytes
|
12
12
|
end
|
13
13
|
|
14
14
|
it "should not decode invalid hex" do
|
15
|
-
lambda { BTC
|
16
|
-
lambda { BTC
|
17
|
-
lambda { BTC
|
15
|
+
lambda { BTC.from_hex("f") }.must_raise FormatError
|
16
|
+
lambda { BTC.from_hex("dxadBEEF") }.must_raise FormatError
|
17
|
+
lambda { BTC.from_hex("-") }.must_raise FormatError
|
18
18
|
end
|
19
19
|
|
20
20
|
it "should encode valid hex" do
|
21
|
-
lambda { BTC
|
22
|
-
BTC
|
23
|
-
BTC
|
24
|
-
BTC
|
21
|
+
lambda { BTC.to_hex(nil) }.must_raise ArgumentError
|
22
|
+
BTC.to_hex("\xfe").bytes.must_equal "fe".bytes
|
23
|
+
BTC.to_hex("\xde\xad\xbe\xef").bytes.must_equal "deadbeef".bytes
|
24
|
+
BTC.to_hex("").bytes.must_equal "".bytes
|
25
25
|
end
|
26
26
|
|
27
27
|
it "should encode bytes" do
|
28
|
-
BTC
|
29
|
-
BTC
|
30
|
-
BTC
|
28
|
+
BTC.bytes_from_data("Hello, world").must_equal "Hello, world".bytes
|
29
|
+
BTC.bytes_from_data("Hello, world").must_equal [72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100]
|
30
|
+
BTC.data_from_bytes([72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100]).must_equal "Hello, world"
|
31
31
|
end
|
32
32
|
|
33
33
|
it "should access ranges of bytes" do
|
34
|
-
BTC
|
35
|
-
BTC
|
34
|
+
BTC.bytes_from_data("Hello, world", offset: 1).must_equal "ello, world".bytes
|
35
|
+
BTC.bytes_from_data("Hello, world", offset: 0, limit: 3).must_equal "Hel".bytes
|
36
36
|
|
37
37
|
# Range takes precedence over offset/limit.
|
38
|
-
BTC
|
38
|
+
BTC.bytes_from_data("Hello, world", offset: 0, limit: 3, range: 1..2).must_equal "el".bytes
|
39
39
|
|
40
|
-
BTC
|
41
|
-
BTC
|
40
|
+
BTC.bytes_from_data("Hello, world", range: 1..3).must_equal "ell".bytes
|
41
|
+
BTC.bytes_from_data("Hello, world", range: 1...3).must_equal "el".bytes
|
42
42
|
|
43
43
|
# Outside bounds
|
44
|
-
BTC
|
45
|
-
BTC
|
46
|
-
BTC
|
47
|
-
BTC
|
44
|
+
BTC.bytes_from_data("Hello, world", offset: 110, limit: 3).must_equal []
|
45
|
+
BTC.bytes_from_data("Hello, world", offset: 0, limit: 0).must_equal []
|
46
|
+
BTC.bytes_from_data("Hello, world", range: 100..101).must_equal []
|
47
|
+
BTC.bytes_from_data("Hello, world", range: 0...0).must_equal []
|
48
48
|
end
|
49
49
|
|
50
50
|
end
|
data/spec/key_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require_relative 'spec_helper'
|
|
3
3
|
describe BTC::Key do
|
4
4
|
|
5
5
|
def verify_rfc6979_nonce(keyhex, msg, khex)
|
6
|
-
keybin = BTC
|
6
|
+
keybin = BTC.from_hex(keyhex)
|
7
7
|
hash = BTC.sha256(msg)
|
8
8
|
k = BTC::OpenSSL.rfc6979_ecdsa_nonce(hash, keybin)
|
9
9
|
k.to_hex.must_equal khex
|
@@ -86,7 +86,7 @@ describe BTC::Key do
|
|
86
86
|
end
|
87
87
|
|
88
88
|
it "should support uncompressed public keys" do
|
89
|
-
k = BTC::Key.new(private_key: BTC
|
89
|
+
k = BTC::Key.new(private_key: BTC.from_hex("c4bbcb1fbec99d65bf59d85c8cb62ee2db963f0fe106f483d9afa73bd4e39a8a"), public_key_compressed: false)
|
90
90
|
k.private_key.to_hex.must_equal "c4bbcb1fbec99d65bf59d85c8cb62ee2db963f0fe106f483d9afa73bd4e39a8a"
|
91
91
|
k.public_key.to_hex.must_equal "0478d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71a1518063243acd4dfe96b66e3f2ec8013c8e072cd09b3834a19f81f659cc3455"
|
92
92
|
k.address.to_s.must_equal "1JwSSubhmg6iPtRjtyqhUYYH7bZg3Lfy1T"
|