bitcoin-ruby 0.0.6 → 0.0.7
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/.gitignore +0 -1
- data/.travis.yml +2 -7
- data/COPYING +1 -1
- data/Gemfile +2 -6
- data/Gemfile.lock +34 -0
- data/README.rdoc +16 -68
- data/Rakefile +3 -6
- data/bin/bitcoin_shell +0 -1
- data/{concept-examples/blockchain-pow.rb → examples/concept-blockchain-pow.rb} +0 -0
- data/lib/bitcoin.rb +350 -296
- data/lib/bitcoin/builder.rb +3 -1
- data/lib/bitcoin/connection.rb +2 -1
- data/lib/bitcoin/contracthash.rb +76 -0
- data/lib/bitcoin/dogecoin.rb +97 -0
- data/lib/bitcoin/ffi/bitcoinconsensus.rb +74 -0
- data/lib/bitcoin/ffi/openssl.rb +98 -2
- data/lib/bitcoin/ffi/secp256k1.rb +144 -0
- data/lib/bitcoin/key.rb +12 -2
- data/lib/bitcoin/logger.rb +3 -12
- data/lib/bitcoin/protocol/block.rb +3 -9
- data/lib/bitcoin/protocol/parser.rb +6 -2
- data/lib/bitcoin/protocol/tx.rb +44 -13
- data/lib/bitcoin/protocol/txin.rb +4 -2
- data/lib/bitcoin/protocol/txout.rb +2 -2
- data/lib/bitcoin/script.rb +212 -37
- data/lib/bitcoin/trezor/mnemonic.rb +130 -0
- data/lib/bitcoin/version.rb +1 -1
- data/spec/bitcoin/bitcoin_spec.rb +32 -3
- data/spec/bitcoin/builder_spec.rb +18 -0
- data/spec/bitcoin/contracthash_spec.rb +45 -0
- data/spec/bitcoin/dogecoin_spec.rb +176 -0
- data/spec/bitcoin/ffi_openssl.rb +45 -0
- data/spec/bitcoin/fixtures/156e6e1b84c5c3bd3a0927b25e4119fadce6e6d5186f363317511d1d680fae9a.json +24 -0
- data/spec/bitcoin/fixtures/8d0b238a06b5a70be75d543902d02d7a514d68d3252a949a513865ac3538874c.json +24 -0
- data/spec/bitcoin/fixtures/coinbase-toshi.json +33 -0
- data/spec/bitcoin/fixtures/coinbase.json +24 -0
- data/spec/bitcoin/fixtures/dogecoin-block-60323982f9c5ff1b5a954eac9dc1269352835f47c2c5222691d80f0d50dcf053.bin +0 -0
- data/spec/bitcoin/fixtures/rawtx-01-toshi.json +46 -0
- data/spec/bitcoin/fixtures/rawtx-02-toshi.json +46 -0
- data/spec/bitcoin/fixtures/rawtx-03-toshi.json +73 -0
- data/spec/bitcoin/fixtures/rawtx-testnet-04fdc38d6722ab4b12d79113fc4b2896bdcc5169710690ee4e78541b98e467b4.bin +0 -0
- data/spec/bitcoin/fixtures/rawtx-testnet-0b294c7d11dd21bcccb8393e6744fed7d4d1981a08c00e3e88838cc421f33c9f.bin +0 -0
- data/spec/bitcoin/fixtures/rawtx-testnet-3bc52ac063291ad92d95ddda5fd776a342083b95607ad32ed8bc6f8f7d30449e.bin +0 -0
- data/spec/bitcoin/fixtures/rawtx-testnet-6f0bbdd4e71a8af4305018d738184df32dbb6f27284fdebd5b56d16947f7c181.bin +0 -0
- data/spec/bitcoin/fixtures/rawtx-testnet-a7c9b06e275e8674cc19a5f7d3e557c72c6d93576e635b33212dbe08ab7cdb60.bin +0 -0
- data/spec/bitcoin/fixtures/rawtx-testnet-f80acbd2f594d04ddb0e1cacba662132104909157dff526935a3c88abe9201a5.bin +0 -0
- data/spec/bitcoin/protocol/block_spec.rb +0 -22
- data/spec/bitcoin/protocol/tx_spec.rb +145 -2
- data/spec/bitcoin/script/script_spec.rb +282 -0
- data/spec/bitcoin/secp256k1_spec.rb +48 -0
- data/spec/bitcoin/spec_helper.rb +0 -51
- data/spec/bitcoin/trezor/mnemonic_spec.rb +161 -0
- metadata +48 -98
- data/bin/bitcoin_dns_seed +0 -130
- data/bin/bitcoin_gui +0 -80
- data/bin/bitcoin_node +0 -153
- data/bin/bitcoin_node_cli +0 -81
- data/bin/bitcoin_wallet +0 -402
- data/doc/CONFIG.rdoc +0 -66
- data/doc/EXAMPLES.rdoc +0 -13
- data/doc/NAMECOIN.rdoc +0 -34
- data/doc/NODE.rdoc +0 -225
- data/doc/STORAGE.rdoc +0 -33
- data/doc/WALLET.rdoc +0 -102
- data/examples/balance.rb +0 -66
- data/examples/forwarder.rb +0 -73
- data/examples/index_nhash.rb +0 -24
- data/examples/reindex_p2sh_addrs.rb +0 -44
- data/examples/relay_tx.rb +0 -22
- data/examples/verify_tx.rb +0 -57
- data/lib/bitcoin/config.rb +0 -58
- data/lib/bitcoin/gui/addr_view.rb +0 -44
- data/lib/bitcoin/gui/bitcoin-ruby.png +0 -0
- data/lib/bitcoin/gui/bitcoin-ruby.svg +0 -80
- data/lib/bitcoin/gui/conn_view.rb +0 -38
- data/lib/bitcoin/gui/connection.rb +0 -70
- data/lib/bitcoin/gui/em_gtk.rb +0 -30
- data/lib/bitcoin/gui/gui.builder +0 -1643
- data/lib/bitcoin/gui/gui.rb +0 -292
- data/lib/bitcoin/gui/helpers.rb +0 -115
- data/lib/bitcoin/gui/tree_view.rb +0 -84
- data/lib/bitcoin/gui/tx_view.rb +0 -69
- data/lib/bitcoin/namecoin.rb +0 -280
- data/lib/bitcoin/network/command_client.rb +0 -104
- data/lib/bitcoin/network/command_handler.rb +0 -570
- data/lib/bitcoin/network/connection_handler.rb +0 -387
- data/lib/bitcoin/network/node.rb +0 -565
- data/lib/bitcoin/storage/dummy/dummy_store.rb +0 -179
- data/lib/bitcoin/storage/models.rb +0 -171
- data/lib/bitcoin/storage/sequel/migrations.rb +0 -99
- data/lib/bitcoin/storage/sequel/migrations/001_base_schema.rb +0 -52
- data/lib/bitcoin/storage/sequel/migrations/002_tx.rb +0 -45
- data/lib/bitcoin/storage/sequel/migrations/003_change_txin_script_sig_to_blob.rb +0 -18
- data/lib/bitcoin/storage/sequel/migrations/004_change_txin_prev_out_to_blob.rb +0 -18
- data/lib/bitcoin/storage/sequel/migrations/005_change_tx_hash_to_bytea.rb +0 -14
- data/lib/bitcoin/storage/sequel/migrations/006_add_tx_nhash.rb +0 -31
- data/lib/bitcoin/storage/sequel/migrations/007_add_prev_out_index_index.rb +0 -16
- data/lib/bitcoin/storage/sequel/migrations/008_add_txin_p2sh_type.rb +0 -31
- data/lib/bitcoin/storage/sequel/migrations/009_add_addrs_type.rb +0 -56
- data/lib/bitcoin/storage/sequel/sequel_store.rb +0 -551
- data/lib/bitcoin/storage/storage.rb +0 -517
- data/lib/bitcoin/storage/utxo/migrations/001_base_schema.rb +0 -52
- data/lib/bitcoin/storage/utxo/migrations/002_utxo.rb +0 -18
- data/lib/bitcoin/storage/utxo/migrations/003_update_indices.rb +0 -14
- data/lib/bitcoin/storage/utxo/migrations/004_add_addrs_type.rb +0 -14
- data/lib/bitcoin/storage/utxo/utxo_store.rb +0 -374
- data/lib/bitcoin/validation.rb +0 -400
- data/lib/bitcoin/wallet/coinselector.rb +0 -33
- data/lib/bitcoin/wallet/keygenerator.rb +0 -77
- data/lib/bitcoin/wallet/keystore.rb +0 -207
- data/lib/bitcoin/wallet/txdp.rb +0 -118
- data/lib/bitcoin/wallet/wallet.rb +0 -281
- data/spec/bitcoin/fixtures/freicoin-block-000000005d231b285e63af83edae2d8f5e50e70d396468643092b9239fd3be3c.bin +0 -0
- data/spec/bitcoin/fixtures/freicoin-block-000000005d231b285e63af83edae2d8f5e50e70d396468643092b9239fd3be3c.json +0 -43
- data/spec/bitcoin/fixtures/freicoin-genesis-block-000000005b1e3d23ecfd2dd4a6e1a35238aa0392c0a8528c40df52376d7efe2c.bin +0 -0
- data/spec/bitcoin/fixtures/freicoin-genesis-block-000000005b1e3d23ecfd2dd4a6e1a35238aa0392c0a8528c40df52376d7efe2c.json +0 -67
- data/spec/bitcoin/namecoin_spec.rb +0 -182
- data/spec/bitcoin/node/command_api_spec.rb +0 -663
- data/spec/bitcoin/storage/models_spec.rb +0 -104
- data/spec/bitcoin/storage/reorg_spec.rb +0 -236
- data/spec/bitcoin/storage/storage_spec.rb +0 -387
- data/spec/bitcoin/storage/validation_spec.rb +0 -300
- data/spec/bitcoin/wallet/coinselector_spec.rb +0 -38
- data/spec/bitcoin/wallet/keygenerator_spec.rb +0 -69
- data/spec/bitcoin/wallet/keystore_spec.rb +0 -190
- data/spec/bitcoin/wallet/txdp_spec.rb +0 -76
- data/spec/bitcoin/wallet/wallet_spec.rb +0 -238
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
# encoding: ascii-8bit
|
|
2
|
-
|
|
3
|
-
module Bitcoin::Storage::Backends
|
|
4
|
-
class DummyStore < StoreBase
|
|
5
|
-
|
|
6
|
-
attr_accessor :blk, :tx
|
|
7
|
-
|
|
8
|
-
def initialize *args
|
|
9
|
-
reset
|
|
10
|
-
super(*args)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def reset
|
|
14
|
-
@blk, @tx = [], {}
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def persist_block(blk, chain, depth, prev_work = 0)
|
|
18
|
-
return [depth, chain] unless blk && chain == 0
|
|
19
|
-
if block = get_block(blk.hash)
|
|
20
|
-
log.info { "Block already stored; skipping" }
|
|
21
|
-
return false
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
blk.tx.each {|tx| store_tx(tx) }
|
|
25
|
-
@blk << blk
|
|
26
|
-
|
|
27
|
-
log.info { "NEW HEAD: #{blk.hash} DEPTH: #{get_depth}" }
|
|
28
|
-
[depth, chain]
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def store_tx(tx, validate = true)
|
|
32
|
-
if @tx.keys.include?(tx.hash)
|
|
33
|
-
log.info { "Tx already stored; skipping" }
|
|
34
|
-
return tx
|
|
35
|
-
end
|
|
36
|
-
@tx[tx.hash] = tx
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def has_block(blk_hash)
|
|
40
|
-
!!get_block(blk_hash)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def has_tx(tx_hash)
|
|
44
|
-
!!get_tx(tx_hash)
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def get_depth
|
|
48
|
-
@blk.size - 1
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def get_head
|
|
52
|
-
wrap_block(@blk[-1])
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def get_block_by_depth(depth)
|
|
56
|
-
wrap_block(@blk[depth])
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def get_block_by_prev_hash(hash)
|
|
60
|
-
wrap_block(@blk.find {|blk| blk.prev_block == [hash].pack("H*").reverse})
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def get_block(blk_hash)
|
|
64
|
-
wrap_block(@blk.find {|blk| blk.hash == blk_hash})
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
def get_block_by_id(blk_id)
|
|
68
|
-
wrap_block(@blk[blk_id])
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def get_block_by_tx(tx_hash)
|
|
72
|
-
wrap_block(@blk.find {|blk| blk.tx.map(&:hash).include?(tx_hash) })
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def get_idx_from_tx_hash(tx_hash)
|
|
76
|
-
return nil unless tx = get_tx(tx_hash)
|
|
77
|
-
return nil unless blk = tx.get_block
|
|
78
|
-
blk.tx.index tx
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
def get_tx(tx_hash)
|
|
82
|
-
transaction = @tx[tx_hash]
|
|
83
|
-
return nil unless transaction
|
|
84
|
-
wrap_tx(transaction)
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def get_tx_by_id(tx_id)
|
|
88
|
-
wrap_tx(@tx[tx_id])
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def get_txin_for_txout(tx_hash, txout_idx)
|
|
92
|
-
txin = @tx.values.map(&:in).flatten.find {|i| i.prev_out_index == txout_idx &&
|
|
93
|
-
i.prev_out == [tx_hash].pack("H*").reverse }
|
|
94
|
-
wrap_txin(txin)
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def get_txout_for_txin(txin)
|
|
98
|
-
return nil unless tx = @tx[txin.prev_out.reverse_hth]
|
|
99
|
-
wrap_tx(tx).out[txin.prev_out_index]
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
def get_txouts_for_pk_script(script)
|
|
103
|
-
txouts = @tx.values.map(&:out).flatten.select {|o| o.pk_script == script}
|
|
104
|
-
txouts.map {|o| wrap_txout(o) }
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
def get_txouts_for_hash160(hash160, type = :hash160, unconfirmed = false)
|
|
108
|
-
@tx.values.map(&:out).flatten.map {|o|
|
|
109
|
-
o = wrap_txout(o)
|
|
110
|
-
if o.parsed_script.is_multisig?
|
|
111
|
-
o.parsed_script.get_multisig_pubkeys.map{|pk| Bitcoin.hash160(pk.unpack("H*")[0])}.include?(hash160) ? o : nil
|
|
112
|
-
else
|
|
113
|
-
o.hash160 == hash160 && o.type == type ? o : nil
|
|
114
|
-
end
|
|
115
|
-
}.compact
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
def wrap_block(block)
|
|
119
|
-
return nil unless block
|
|
120
|
-
data = { id: @blk.index(block), depth: @blk.index(block),
|
|
121
|
-
work: @blk.index(block), chain: MAIN, size: block.size }
|
|
122
|
-
blk = Bitcoin::Storage::Models::Block.new(self, data)
|
|
123
|
-
[:ver, :prev_block, :mrkl_root, :time, :bits, :nonce].each do |attr|
|
|
124
|
-
blk.send("#{attr}=", block.send(attr))
|
|
125
|
-
end
|
|
126
|
-
block.tx.each do |tx|
|
|
127
|
-
blk.tx << get_tx(tx.hash)
|
|
128
|
-
end
|
|
129
|
-
blk.recalc_block_hash
|
|
130
|
-
blk
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
def wrap_tx(transaction)
|
|
134
|
-
return nil unless transaction
|
|
135
|
-
blk = @blk.find{|b| b.tx.include?(transaction)}
|
|
136
|
-
data = { id: transaction.hash, blk_id: @blk.index(blk),
|
|
137
|
-
size: transaction.size }
|
|
138
|
-
tx = Bitcoin::Storage::Models::Tx.new(self, data)
|
|
139
|
-
tx.ver = transaction.ver
|
|
140
|
-
tx.lock_time = transaction.lock_time
|
|
141
|
-
transaction.in.each {|i| tx.add_in(wrap_txin(i))}
|
|
142
|
-
transaction.out.each {|o| tx.add_out(wrap_txout(o))}
|
|
143
|
-
tx.hash = tx.hash_from_payload(tx.to_payload)
|
|
144
|
-
tx
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
def wrap_txin(input)
|
|
148
|
-
return nil unless input
|
|
149
|
-
tx = @tx.values.find{|t| t.in.include?(input)}
|
|
150
|
-
data = { tx_id: tx.hash, tx_idx: tx.in.index(input)}
|
|
151
|
-
txin = Bitcoin::Storage::Models::TxIn.new(self, data)
|
|
152
|
-
[:prev_out, :prev_out_index, :script_sig_length, :script_sig, :sequence].each do |attr|
|
|
153
|
-
txin.send("#{attr}=", input.send(attr))
|
|
154
|
-
end
|
|
155
|
-
txin
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
def wrap_txout(output)
|
|
159
|
-
return nil unless output
|
|
160
|
-
tx = @tx.values.find{|t| t.out.include?(output)}
|
|
161
|
-
data = {tx_id: tx.hash, tx_idx: tx.out.index(output), hash160: output.parsed_script.get_hash160}
|
|
162
|
-
txout = Bitcoin::Storage::Models::TxOut.new(self, data)
|
|
163
|
-
[:value, :pk_script_length, :pk_script].each do |attr|
|
|
164
|
-
txout.send("#{attr}=", output.send(attr))
|
|
165
|
-
end
|
|
166
|
-
txout
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
def to_s
|
|
170
|
-
"DummyStore"
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
def check_consistency(*args)
|
|
174
|
-
log.warn { "Dummy store doesn't support consistency check" }
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
end
|
|
179
|
-
end
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
# encoding: ascii-8bit
|
|
2
|
-
|
|
3
|
-
# StorageModels defines objects that are returned from storage.
|
|
4
|
-
# These objects inherit from their Bitcoin::Protocol counterpart
|
|
5
|
-
# and add some additional data and methods.
|
|
6
|
-
#
|
|
7
|
-
# * Bitcoin::Storage::Models::Block
|
|
8
|
-
# * Bitcoin::Storage::Models::Tx
|
|
9
|
-
# * Bitcoin::Storage::Models::TxIn
|
|
10
|
-
# * Bitcoin::Storage::Models::TxOut
|
|
11
|
-
module Bitcoin::Storage::Models
|
|
12
|
-
|
|
13
|
-
# Block retrieved from storage. (see Bitcoin::Protocol::Block)
|
|
14
|
-
class Block < Bitcoin::Protocol::Block
|
|
15
|
-
|
|
16
|
-
attr_accessor :ver, :prev_block, :mrkl_root, :time, :bits, :nonce, :tx
|
|
17
|
-
attr_reader :store, :id, :depth, :chain, :work, :size
|
|
18
|
-
|
|
19
|
-
def initialize store, data
|
|
20
|
-
@store = store
|
|
21
|
-
@id = data[:id]
|
|
22
|
-
@depth = data[:depth]
|
|
23
|
-
@chain = data[:chain]
|
|
24
|
-
@work = data[:work]
|
|
25
|
-
@size = data[:size]
|
|
26
|
-
@tx = []
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# get the block this one builds upon
|
|
30
|
-
def get_prev_block
|
|
31
|
-
@store.get_block(@prev_block.reverse_hth)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# get the block that builds upon this one
|
|
35
|
-
def get_next_block
|
|
36
|
-
@store.get_block_by_prev_hash(@hash)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def total_out
|
|
40
|
-
@total_out ||= tx.inject(0){ |m,t| m + t.total_out }
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def total_in
|
|
44
|
-
@total_in ||= tx.inject(0){ |m,t| m + t.total_in }
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def total_fee
|
|
48
|
-
@total_fee ||= tx.inject(0){ |m,t| m + t.fee }
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
# Transaction retrieved from storage. (see Bitcoin::Protocol::Tx)
|
|
53
|
-
class Tx < Bitcoin::Protocol::Tx
|
|
54
|
-
|
|
55
|
-
attr_accessor :ver, :lock_time, :hash
|
|
56
|
-
attr_reader :store, :id, :blk_id, :size, :idx
|
|
57
|
-
|
|
58
|
-
def initialize store, data
|
|
59
|
-
@store = store
|
|
60
|
-
@id = data[:id]
|
|
61
|
-
@blk_id = data[:blk_id]
|
|
62
|
-
@size = data[:size]
|
|
63
|
-
@idx = data[:idx]
|
|
64
|
-
super(nil)
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
# get the block this transaction is in
|
|
68
|
-
def get_block
|
|
69
|
-
return nil unless @blk_id
|
|
70
|
-
@block ||= @store.get_block_by_id(@blk_id)
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
# get the number of blocks that confirm this tx in the main chain
|
|
74
|
-
def confirmations
|
|
75
|
-
return 0 unless get_block
|
|
76
|
-
@store.get_head.depth - get_block.depth + 1
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def total_out
|
|
80
|
-
@total_out ||= self.out.inject(0){ |e, o| e + o.value }
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
# if tx_in is coinbase, set in value as total_out, fee could be 0
|
|
84
|
-
def total_in
|
|
85
|
-
@total_in ||= self.in.inject(0){ |m, input|
|
|
86
|
-
m + (input.coinbase? ? total_out : (input.get_prev_out.try(:value) || 0))
|
|
87
|
-
}
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def fee
|
|
91
|
-
@fee ||= total_in - total_out
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
# Transaction input retrieved from storage. (see Bitcoin::Protocol::TxIn
|
|
96
|
-
class TxIn < Bitcoin::Protocol::TxIn
|
|
97
|
-
|
|
98
|
-
attr_reader :store, :id, :tx_id, :tx_idx, :p2sh_type
|
|
99
|
-
|
|
100
|
-
def initialize store, data
|
|
101
|
-
@store = store
|
|
102
|
-
@id = data[:id]
|
|
103
|
-
@tx_id = data[:tx_id]
|
|
104
|
-
@tx_idx = data[:tx_idx]
|
|
105
|
-
@p2sh_type = data[:p2sh_type]
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
# get the transaction this input is in
|
|
109
|
-
def get_tx
|
|
110
|
-
@tx ||= @store.get_tx_by_id(@tx_id)
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
# get the previous output referenced by this input
|
|
114
|
-
def get_prev_out
|
|
115
|
-
@prev_tx_out ||= begin
|
|
116
|
-
prev_tx = @store.get_tx(@prev_out.reverse_hth)
|
|
117
|
-
return nil unless prev_tx
|
|
118
|
-
prev_tx.out[@prev_out_index]
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
# Transaction output retrieved from storage. (see Bitcoin::Protocol::TxOut)
|
|
125
|
-
class TxOut < Bitcoin::Protocol::TxOut
|
|
126
|
-
|
|
127
|
-
attr_reader :store, :id, :tx_id, :tx_idx, :type
|
|
128
|
-
|
|
129
|
-
def initialize store, data
|
|
130
|
-
@store = store
|
|
131
|
-
@id = data[:id]
|
|
132
|
-
@tx_id = data[:tx_id]
|
|
133
|
-
@tx_idx = data[:tx_idx]
|
|
134
|
-
@type = data[:type]
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
def hash160
|
|
138
|
-
parsed_script.get_hash160
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
# get the transaction this output is in
|
|
142
|
-
def get_tx
|
|
143
|
-
@tx ||= @store.get_tx_by_id(@tx_id)
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
# get the next input that references this output
|
|
147
|
-
def get_next_in
|
|
148
|
-
@store.get_txin_for_txout(get_tx.hash, @tx_idx)
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
# get all addresses this txout corresponds to (if possible)
|
|
152
|
-
def get_address
|
|
153
|
-
parsed_script.get_address
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
# get the single address this txout corresponds to (first for multisig tx)
|
|
157
|
-
def get_addresses
|
|
158
|
-
parsed_script.get_addresses
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
def get_namecoin_name
|
|
162
|
-
@store.get_name_by_txout_id(@id)
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
def type
|
|
166
|
-
parsed_script.type
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
end
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
# encoding: ascii-8bit
|
|
2
|
-
|
|
3
|
-
module Bitcoin::Storage::Backends::SequelMigrations
|
|
4
|
-
|
|
5
|
-
def migrate
|
|
6
|
-
binary = @db.database_type == :postgres ? :bytea : :blob
|
|
7
|
-
|
|
8
|
-
unless @db.tables.include?(:blk)
|
|
9
|
-
@db.create_table :blk do
|
|
10
|
-
primary_key :id
|
|
11
|
-
column :hash, binary, :null => false, :unique => true, :index => true
|
|
12
|
-
column :depth, :int, :null => false, :index => true
|
|
13
|
-
column :version, :bigint, :null => false
|
|
14
|
-
column :prev_hash, binary, :null => false, :index => true
|
|
15
|
-
column :mrkl_root, binary, :null => false
|
|
16
|
-
column :time, :bigint, :null => false
|
|
17
|
-
column :bits, :bigint, :null => false
|
|
18
|
-
column :nonce, :bigint, :null => false
|
|
19
|
-
column :blk_size, :int, :null => false
|
|
20
|
-
column :chain, :int, :null => false
|
|
21
|
-
column :work, binary, :index => true
|
|
22
|
-
column :aux_pow, binary
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
unless @db.tables.include?(:tx)
|
|
27
|
-
@db.create_table :tx do
|
|
28
|
-
primary_key :id
|
|
29
|
-
column :hash, binary, :null => false, :unique => true, :index => true
|
|
30
|
-
column :version, :bigint, :null => false
|
|
31
|
-
column :lock_time, :bigint, :null => false
|
|
32
|
-
column :coinbase, :bool, :null => false
|
|
33
|
-
column :tx_size, :int, :null => false
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
unless @db.tables.include?(:blk_tx)
|
|
38
|
-
@db.create_table :blk_tx do
|
|
39
|
-
column :blk_id, :int, :null => false, :index => true
|
|
40
|
-
column :tx_id, :int, :null => false, :index => true
|
|
41
|
-
column :idx, :int, :null => false
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
unless @db.tables.include?(:txin)
|
|
46
|
-
@db.create_table :txin do
|
|
47
|
-
primary_key :id
|
|
48
|
-
column :tx_id, :int, :null => false, :index => true
|
|
49
|
-
column :tx_idx, :int, :null => false
|
|
50
|
-
column :script_sig, binary, :null => false
|
|
51
|
-
column :prev_out, binary, :null => false, :index => true
|
|
52
|
-
column :prev_out_index, :bigint, :null => false
|
|
53
|
-
column :sequence, :bigint, :null => false
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
unless @db.tables.include?(:txout)
|
|
58
|
-
@db.create_table :txout do
|
|
59
|
-
primary_key :id
|
|
60
|
-
column :tx_id, :int, :null => false, :index => true
|
|
61
|
-
column :tx_idx, :int, :null => false
|
|
62
|
-
column :pk_script, binary, :null => false
|
|
63
|
-
column :value, :bigint
|
|
64
|
-
column :type, :int, :null => false, :index => true
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
unless @db.tables.include?(:addr)
|
|
69
|
-
@db.create_table :addr do
|
|
70
|
-
primary_key :id
|
|
71
|
-
column :hash160, String, :null => false, :index => true
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
unless @db.tables.include?(:addr_txout)
|
|
76
|
-
@db.create_table :addr_txout do
|
|
77
|
-
column :addr_id, :int, :null => false, :index => true
|
|
78
|
-
column :txout_id, :int, :null => false, :index => true
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
unless @db.views.include?(:unconfirmed)
|
|
83
|
-
@db.create_view(:unconfirmed,
|
|
84
|
-
"SELECT * FROM tx WHERE NOT EXISTS " +
|
|
85
|
-
"(SELECT 1 FROM blk_tx WHERE blk_tx.tx_id = tx.id)" +
|
|
86
|
-
"ORDER BY tx.id DESC")
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
unless @db.tables.include?(:names)
|
|
90
|
-
@db.create_table :names do
|
|
91
|
-
column :txout_id, :int, :null => false, :index => true
|
|
92
|
-
column :hash, binary, :index => true
|
|
93
|
-
column :name, binary, :index => true
|
|
94
|
-
column :value, binary
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
end
|