bitcoinrb 0.3.2 → 0.4.0

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
  SHA256:
3
- metadata.gz: df5d412165565c3dde3e626417f6a08e08d8698f66712c080b967f5d1e4e1688
4
- data.tar.gz: 305d2ffba9338edfb26364da1d76ed166c1d2bbb253a2f3337db346a565247ea
3
+ metadata.gz: 34ec1d9b1b20094213a29e9df2a47b901bdef1d537323446230b6ff2f3420a50
4
+ data.tar.gz: 5591f08d5909d1b18b60b091a41e4f6638d424ea0512dbd270001d8e9555e633
5
5
  SHA512:
6
- metadata.gz: 171bd45d707d1d49398d1f272ee7559bc88b5df66a8a4c15afbc107eb9c631eb243c3fad3ec3073d455c8e6c49048ddcd0bedbe96cb4c06b6af7daaad9d31c20
7
- data.tar.gz: ef995e0e5db4d6b7352de9f7efa7d97bd2a6c0de39c811e352595c89a6b79966ab50304b7e0059bc7c2afff1826a37c99748233f79956d1dca80a745d6aec888
6
+ metadata.gz: 8e1a4df59cb46fa6d35dab5dc3d83dac58aaf6b8f39ae2ccc782c10ce06821000a1e31732887b0019b2ac62f0f4d7e831d71a0a9ad8964868b24c168862b963a
7
+ data.tar.gz: 9f374d157b4c8814c771697365ffded665a17b36579130604fd8c85375e05fbaa41f8212006ef037f5d2442af67a6130a1d5400d5019b9685404b433de1dff77
data/README.md CHANGED
@@ -9,9 +9,9 @@ NOTE: Bitcoinrb work in progress, and there is a possibility of incompatible cha
9
9
 
10
10
  Bitcoinrb supports following feature:
11
11
 
12
- * Bitcoin script interpreter(including [BIP-65](https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki), [BIP-68](https://github.com/bitcoin/bips/blob/master/bip-0068.mediawiki), [BIP-112](https://github.com/bitcoin/bips/blob/master/bip-0112.mediawiki))
13
- * De/serialization of Bitcoin protocol network messages
14
- * De/serialization of blocks and transactions
12
+ * [Bitcoin script interpreter](https://github.com/chaintope/bitcoinrb/wiki/Script)(including [BIP-65](https://github.com/bitcoin/bips/blob/master/bip-0065.mediawiki), [BIP-68](https://github.com/bitcoin/bips/blob/master/bip-0068.mediawiki), [BIP-112](https://github.com/bitcoin/bips/blob/master/bip-0112.mediawiki))
13
+ * [De/serialization of Bitcoin protocol network messages](https://github.com/chaintope/bitcoinrb/wiki/P2P-Message)
14
+ * De/serialization of blocks and [transactions](https://github.com/chaintope/bitcoinrb/wiki/Transaction)
15
15
  * Key generation and verification for ECDSA, including [BIP-32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki) and [BIP-39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) supports.
16
16
  * ECDSA signature(RFC6979 -Deterministic ECDSA, LOW-S, LOW-R support)
17
17
  * Segwit support (parsing segwit payload, Bech32 address, sign for segwit tx, [BIP-141](https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki), [BIP-143](https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki), [BIP-144](https://github.com/bitcoin/bips/blob/master/bip-0144.mediawiki))
@@ -34,7 +34,6 @@ Gem::Specification.new do |spec|
34
34
  spec.add_runtime_dependency 'siphash'
35
35
  spec.add_runtime_dependency 'protobuf', '3.8.5'
36
36
  spec.add_runtime_dependency 'scrypt'
37
- spec.add_runtime_dependency 'activesupport', '~> 5.2.3'
38
37
 
39
38
  # for options
40
39
  spec.add_development_dependency 'leveldb-native'
@@ -43,5 +42,6 @@ Gem::Specification.new do |spec|
43
42
  spec.add_development_dependency 'rake', '~> 10.0'
44
43
  spec.add_development_dependency 'rspec', '~> 3.0'
45
44
  spec.add_development_dependency 'timecop'
45
+ spec.add_development_dependency 'webmock', '~> 3.0'
46
46
 
47
47
  end
@@ -54,6 +54,7 @@ module Bitcoin
54
54
  autoload :KeyPath, 'bitcoin/key_path'
55
55
  autoload :Descriptor, 'bitcoin/descriptor'
56
56
  autoload :SLIP39, 'bitcoin/slip39'
57
+ autoload :Aezeed, 'bitcoin/aezeed'
57
58
 
58
59
  require_relative 'bitcoin/constants'
59
60
 
@@ -36,9 +36,6 @@ module Bitcoin
36
36
 
37
37
  attr_accessor :dust_relay_fee
38
38
 
39
- # fork coin id.
40
- attr_accessor :fork_id
41
-
42
39
  # mainnet genesis
43
40
  def self.mainnet
44
41
  init('mainnet')
@@ -73,11 +70,6 @@ module Bitcoin
73
70
  Bitcoin::Block.new(header)
74
71
  end
75
72
 
76
- # whether fork coin.
77
- def fork_chain?
78
- !fork_id.nil?
79
- end
80
-
81
73
  def self.init(name)
82
74
  i = YAML.load(File.open("#{__dir__}/chainparams/#{name}.yml"))
83
75
  i.dust_relay_fee ||= Bitcoin::DUST_RELAY_TX_FEE
@@ -9,7 +9,7 @@ privkey_version: "ef"
9
9
  extended_privkey_version: "04358394"
10
10
  extended_pubkey_version: "043587cf"
11
11
  bip49_pubkey_p2wpkh_p2sh_version: "044a5262"
12
- bip49_pubkey_p2wsh_p2sh_version: "024285ef"
12
+ bip49_pubkey_p2wsh_p2sh_version: "024289ef"
13
13
  bip49_privkey_p2wpkh_p2sh_version: "044a4e28"
14
14
  bip49_privkey_p2wsh_p2sh_version: "024285b5"
15
15
  bip84_pubkey_p2wpkh_version: "045f1cf6"
@@ -9,7 +9,7 @@ privkey_version: "ef"
9
9
  extended_privkey_version: "04358394"
10
10
  extended_pubkey_version: "043587cf"
11
11
  bip49_pubkey_p2wpkh_p2sh_version: "044a5262"
12
- bip49_pubkey_p2wsh_p2sh_version: "024285ef"
12
+ bip49_pubkey_p2wsh_p2sh_version: "024289ef"
13
13
  bip49_privkey_p2wpkh_p2sh_version: "044a4e28"
14
14
  bip49_privkey_p2wsh_p2sh_version: "024285b5"
15
15
  bip84_pubkey_p2wpkh_version: "045f1cf6"
@@ -91,13 +91,6 @@ module Bitcoin
91
91
  # Signature hash types/flags
92
92
  SIGHASH_TYPE = { all: 1, none: 2, single: 3, anyonecanpay: 128 }
93
93
 
94
- # SIGHASH_FORK_ID for replay protection of the fork coin
95
- SIGHASH_FORK_ID = 0x40
96
-
97
- # fork coin id.
98
- FORK_ID_CASH = 0
99
- FORK_ID_GOLD = 79
100
-
101
94
  # Maximum number length in bytes
102
95
  DEFAULT_MAX_NUM_SIZE = 4
103
96
 
@@ -6,6 +6,9 @@ module Bitcoin
6
6
  # BIP32 Extended private key
7
7
  class ExtKey
8
8
 
9
+ MAX_DEPTH = 255
10
+ MASTER_FINGERPRINT = '00000000'
11
+
9
12
  attr_accessor :ver
10
13
  attr_accessor :depth
11
14
  attr_accessor :number
@@ -18,7 +21,7 @@ module Bitcoin
18
21
  def self.generate_master(seed)
19
22
  ext_key = ExtKey.new
20
23
  ext_key.depth = ext_key.number = 0
21
- ext_key.parent_fingerprint = '00000000'
24
+ ext_key.parent_fingerprint = MASTER_FINGERPRINT
22
25
  l = Bitcoin.hmac_sha512('Bitcoin seed', seed.htb)
23
26
  left = l[0..31].bth.to_i(16)
24
27
  raise 'invalid key' if left >= CURVE_ORDER || left == 0
@@ -94,6 +97,7 @@ module Bitcoin
94
97
  number += Bitcoin::HARDENED_THRESHOLD if harden
95
98
  new_key = ExtKey.new
96
99
  new_key.depth = depth + 1
100
+ raise IndexError, 'Depth over 255.' if new_key.depth > MAX_DEPTH
97
101
  new_key.number = number
98
102
  new_key.parent_fingerprint = fingerprint
99
103
  if number > (Bitcoin::HARDENED_THRESHOLD - 1)
@@ -143,6 +147,9 @@ module Bitcoin
143
147
  raise 'An unsupported version byte was specified.' unless ExtKey.support_version?(ext_key.ver)
144
148
  ext_key.depth = buf.read(1).unpack('C').first
145
149
  ext_key.parent_fingerprint = buf.read(4).bth
150
+ if ext_key.depth == 0
151
+ raise ArgumentError, 'Invalid parent fingerprint.' unless ext_key.parent_fingerprint == MASTER_FINGERPRINT
152
+ end
146
153
  ext_key.number = buf.read(4).unpack('N').first
147
154
  ext_key.chain_code = buf.read(32)
148
155
  buf.read(1) # 0x00
@@ -256,6 +263,7 @@ module Bitcoin
256
263
  def derive(number)
257
264
  new_key = ExtPubkey.new
258
265
  new_key.depth = depth + 1
266
+ raise IndexError, 'Depth over 255.' if new_key.depth > Bitcoin::ExtKey::MAX_DEPTH
259
267
  new_key.number = number
260
268
  new_key.parent_fingerprint = fingerprint
261
269
  raise 'hardened key is not support' if number > (Bitcoin::HARDENED_THRESHOLD - 1)
@@ -301,6 +309,9 @@ module Bitcoin
301
309
  raise 'An unsupported version byte was specified.' unless ExtPubkey.support_version?(ext_pubkey.ver)
302
310
  ext_pubkey.depth = buf.read(1).unpack('C').first
303
311
  ext_pubkey.parent_fingerprint = buf.read(4).bth
312
+ if ext_pubkey.depth == 0
313
+ raise ArgumentError, 'Invalid parent fingerprint.' unless ext_pubkey.parent_fingerprint == ExtKey::MASTER_FINGERPRINT
314
+ end
304
315
  ext_pubkey.number = buf.read(4).unpack('N').first
305
316
  ext_pubkey.chain_code = buf.read(32)
306
317
  ext_pubkey.pubkey = buf.read(33).bth
@@ -125,19 +125,19 @@ module Bitcoin
125
125
  # get pay to pubkey hash address
126
126
  # @deprecated
127
127
  def to_p2pkh
128
- Bitcoin::Script.to_p2pkh(hash160).addresses.first
128
+ Bitcoin::Script.to_p2pkh(hash160).to_addr
129
129
  end
130
130
 
131
131
  # get pay to witness pubkey hash address
132
132
  # @deprecated
133
133
  def to_p2wpkh
134
- Bitcoin::Script.to_p2wpkh(hash160).addresses.first
134
+ Bitcoin::Script.to_p2wpkh(hash160).to_addr
135
135
  end
136
136
 
137
137
  # get p2wpkh address nested in p2sh.
138
138
  # @deprecated
139
139
  def to_nested_p2wpkh
140
- Bitcoin::Script.to_p2wpkh(hash160).to_p2sh.addresses.first
140
+ Bitcoin::Script.to_p2wpkh(hash160).to_p2sh.to_addr
141
141
  end
142
142
 
143
143
  def compressed?
@@ -56,7 +56,7 @@ module Bitcoin
56
56
  post(server_url, @config[:timeout], @config[:open_timeout], data.to_json, content_type: :json) do |respdata, request, result|
57
57
  raise result.message if !result.kind_of?(Net::HTTPSuccess) && respdata.empty?
58
58
  response = JSON.parse(respdata.gsub(/\\u([\da-fA-F]{4})/) { [$1].pack('H*').unpack('n*').pack('U*').encode('ISO-8859-1').force_encoding('UTF-8') })
59
- raise response['error'] if response['error']
59
+ raise response['error'].to_s if response['error']
60
60
  response['result']
61
61
  end
62
62
  end
@@ -96,7 +96,7 @@ module Bitcoin
96
96
  script = Bitcoin::Script.parse_from_payload(hex_script.htb)
97
97
  h = script.to_h
98
98
  h.delete(:hex)
99
- h[:p2sh] = script.to_p2sh.addresses.first unless script.p2sh?
99
+ h[:p2sh] = script.to_p2sh.to_addr unless script.p2sh?
100
100
  h
101
101
  rescue Exception
102
102
  raise ArgumentError.new('Script decode failed')
@@ -148,7 +148,9 @@ module Bitcoin
148
148
  chunks.size == 0
149
149
  end
150
150
 
151
+ # @deprecated
151
152
  def addresses
153
+ puts "WARNING: Bitcoin::Script#addresses is deprecated. Use Bitcoin::Script#to_addr instead."
152
154
  return [p2pkh_addr] if p2pkh?
153
155
  return [p2sh_addr] if p2sh?
154
156
  return [bech32_addr] if witness_program?
@@ -156,6 +158,15 @@ module Bitcoin
156
158
  []
157
159
  end
158
160
 
161
+ # convert to address
162
+ # @return [String] if script type is p2pkh or p2sh or witness program, return address, otherwise nil.
163
+ def to_addr
164
+ return p2pkh_addr if p2pkh?
165
+ return p2sh_addr if p2sh?
166
+ return bech32_addr if witness_program?
167
+ nil
168
+ end
169
+
159
170
  # check whether standard script.
160
171
  def standard?
161
172
  p2pkh? | p2sh? | p2wpkh? | p2wsh? | multisig? | standard_op_return?
@@ -609,7 +609,6 @@ module Bitcoin
609
609
  return false if sig.empty?
610
610
  s = sig.unpack('C*')
611
611
  hash_type = s[-1] & (~(SIGHASH_TYPE[:anyonecanpay]))
612
- hash_type &= (~(Bitcoin::SIGHASH_FORK_ID)) if Bitcoin.chain_params.fork_chain? # for fork coin.
613
612
  return false if hash_type < SIGHASH_TYPE[:all] || hash_type > SIGHASH_TYPE[:single]
614
613
  true
615
614
  end
@@ -202,7 +202,7 @@ module Bitcoin
202
202
  raise ArgumentError, 'script_pubkey must be specified.' unless output_script
203
203
  raise ArgumentError, 'unsupported sig version specified.' unless SIG_VERSION.include?(sig_version)
204
204
 
205
- if sig_version == :witness_v0 || Bitcoin.chain_params.fork_chain?
205
+ if sig_version == :witness_v0
206
206
  raise ArgumentError, 'amount must be specified.' unless amount
207
207
  sighash_for_witness(input_index, output_script, hash_type, amount, skip_separator_index)
208
208
  else
@@ -225,7 +225,7 @@ module Bitcoin
225
225
  script_pubkey = redeem_script if redeem_script.p2wpkh?
226
226
  end
227
227
 
228
- if has_witness || Bitcoin.chain_params.fork_chain?
228
+ if has_witness
229
229
  verify_input_sig_for_witness(input_index, script_pubkey, amount, flags)
230
230
  else
231
231
  verify_input_sig_for_legacy(input_index, script_pubkey, flags)
@@ -310,7 +310,7 @@ module Bitcoin
310
310
  if (hash_type & SIGHASH_TYPE[:anyonecanpay]) != 0
311
311
  hash_prevouts = hash_sequence ="\x00".ljust(32, "\x00")
312
312
  end
313
- hash_type |= (Bitcoin.chain_params.fork_id << 8) if Bitcoin.chain_params.fork_chain?
313
+
314
314
  buf = [ [version].pack('V'), hash_prevouts, hash_sequence, outpoint,
315
315
  script_code ,amount, nsequence, hash_outputs, [@lock_time, hash_type].pack('VV')].join
316
316
  Bitcoin.double_sha256(buf)
@@ -1,3 +1,3 @@
1
1
  module Bitcoin
2
- VERSION = "0.3.2"
2
+ VERSION = "0.4.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitcoinrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - azuchi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-12-14 00:00:00.000000000 Z
11
+ date: 2019-12-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ecdsa
@@ -206,20 +206,6 @@ dependencies:
206
206
  - - ">="
207
207
  - !ruby/object:Gem::Version
208
208
  version: '0'
209
- - !ruby/object:Gem::Dependency
210
- name: activesupport
211
- requirement: !ruby/object:Gem::Requirement
212
- requirements:
213
- - - "~>"
214
- - !ruby/object:Gem::Version
215
- version: 5.2.3
216
- type: :runtime
217
- prerelease: false
218
- version_requirements: !ruby/object:Gem::Requirement
219
- requirements:
220
- - - "~>"
221
- - !ruby/object:Gem::Version
222
- version: 5.2.3
223
209
  - !ruby/object:Gem::Dependency
224
210
  name: leveldb-native
225
211
  requirement: !ruby/object:Gem::Requirement
@@ -290,6 +276,20 @@ dependencies:
290
276
  - - ">="
291
277
  - !ruby/object:Gem::Version
292
278
  version: '0'
279
+ - !ruby/object:Gem::Dependency
280
+ name: webmock
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - "~>"
284
+ - !ruby/object:Gem::Version
285
+ version: '3.0'
286
+ type: :development
287
+ prerelease: false
288
+ version_requirements: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - "~>"
291
+ - !ruby/object:Gem::Version
292
+ version: '3.0'
293
293
  description: "[WIP]The implementation of Bitcoin Protocol for Ruby."
294
294
  email:
295
295
  - azuchi@chaintope.com