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
data/examples/balance.rb
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
#
|
|
3
|
-
# Collect all unspent outputs for given address and display balance.
|
|
4
|
-
# Optionally display list of transactions.
|
|
5
|
-
#
|
|
6
|
-
# examples/balance.rb <address> [--list]
|
|
7
|
-
# examples/balance.rb 1Q2TWHE3GMdB6BZKafqwxXtWAWgFt5Jvm3
|
|
8
|
-
|
|
9
|
-
$:.unshift( File.expand_path("../../lib", __FILE__) )
|
|
10
|
-
require 'bitcoin'
|
|
11
|
-
|
|
12
|
-
Bitcoin.network = :bitcoin
|
|
13
|
-
store = Bitcoin::Storage.sequel(:db => "sqlite://bitcoin.db")
|
|
14
|
-
|
|
15
|
-
address = ARGV.shift
|
|
16
|
-
|
|
17
|
-
unless Bitcoin.valid_address?(address)
|
|
18
|
-
puts "Address #{address} is invalid for #{Bitcoin.network_name} network."
|
|
19
|
-
exit 1
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
# format value to be displayed
|
|
24
|
-
def str_val(val, pre = "")
|
|
25
|
-
("#{pre}#{"%.8f" % (val / 1e8)}").rjust(20)
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
if ARGV[0] == "--list"
|
|
29
|
-
txouts = store.get_txouts_for_address(address)
|
|
30
|
-
unless txouts.any?
|
|
31
|
-
puts "Address not seen."
|
|
32
|
-
exit
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
total = 0
|
|
36
|
-
txouts.each do |txout|
|
|
37
|
-
tx = txout.get_tx
|
|
38
|
-
total += txout.value
|
|
39
|
-
puts "#{tx.hash} |#{str_val(txout.value, '+ ')} |=> #{str_val(total)}"
|
|
40
|
-
|
|
41
|
-
tx = txout.get_tx
|
|
42
|
-
if tx.is_coinbase?
|
|
43
|
-
puts " "*12 + "generated (#{tx.get_block.hash})"
|
|
44
|
-
else
|
|
45
|
-
tx.in.each do |txin|
|
|
46
|
-
addresses = txin.get_prev_out.get_addresses.join(", ")
|
|
47
|
-
puts " #{str_val(txin.get_prev_out.value)} from #{addresses}"
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
puts
|
|
51
|
-
|
|
52
|
-
if txin = txout.get_next_in
|
|
53
|
-
tx = txin.get_tx
|
|
54
|
-
total -= txout.value
|
|
55
|
-
puts "#{tx.hash} |#{str_val(txout.value, '- ')} |=> #{str_val(total)}"
|
|
56
|
-
txin.get_tx.out.each do |out|
|
|
57
|
-
puts " #{str_val(out.value)} to #{out.get_addresses.join(", ")}"
|
|
58
|
-
end
|
|
59
|
-
puts
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
hash160 = Bitcoin.hash160_from_address(address)
|
|
65
|
-
balance = store.get_balance(hash160)
|
|
66
|
-
puts "Balance: %.8f" % (balance / 1e8)
|
data/examples/forwarder.rb
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
#
|
|
3
|
-
# Connect to a node's command socket, monitor incoming payments to one address
|
|
4
|
-
# and forward everything to another address.
|
|
5
|
-
# Needs the private key of the receiving address (to sign new tx) and the forwarding
|
|
6
|
-
# address where payments are sent to.
|
|
7
|
-
# Note how the private key does NOT have to be passed to the node, we just sign the
|
|
8
|
-
# sig_hash ourselves.
|
|
9
|
-
#
|
|
10
|
-
# examples/forwarder.rb <base58_privkey> <forwarding_address>
|
|
11
|
-
# examples/forwarder.rb KyZsiZiFyewBswJpdYywz4b5sif252iN5zZQjGzPVVgAsGYyMk8a 12bL22Pynmp7pDtDqD2w9iP7dRzdM1gNUd
|
|
12
|
-
|
|
13
|
-
$:.unshift( File.expand_path("../../lib", __FILE__) )
|
|
14
|
-
require 'eventmachine'
|
|
15
|
-
require 'bitcoin'
|
|
16
|
-
|
|
17
|
-
Bitcoin.network = :testnet3
|
|
18
|
-
|
|
19
|
-
EM.run do
|
|
20
|
-
|
|
21
|
-
# key/address where people can send money
|
|
22
|
-
KEY = Bitcoin::Key.from_base58(ARGV[0])
|
|
23
|
-
|
|
24
|
-
# address where received money is forwarded to
|
|
25
|
-
FORWARD = ARGV[1]
|
|
26
|
-
|
|
27
|
-
# number of confirmations tx need before being forwarded
|
|
28
|
-
CONFIRMATIONS = 1
|
|
29
|
-
|
|
30
|
-
# list of already forwarded txs, to prevent duplicates
|
|
31
|
-
FORWARDED_TXS = []
|
|
32
|
-
|
|
33
|
-
Bitcoin::Network::CommandClient.connect("127.0.0.1", 9999) do
|
|
34
|
-
|
|
35
|
-
on_connected do
|
|
36
|
-
request("monitor", "output", "output_#{CONFIRMATIONS}")
|
|
37
|
-
|
|
38
|
-
puts "Running bitcoin forwarder on address #{KEY.addr}."
|
|
39
|
-
puts "Forwarding every incoming payment to #{FORWARD}."
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
on_output do |tx_hash, recipient_addr, value, confirmations|
|
|
43
|
-
if recipient_addr == KEY.addr
|
|
44
|
-
if confirmations >= CONFIRMATIONS
|
|
45
|
-
next if FORWARDED_TXS.include?(tx_hash)
|
|
46
|
-
FORWARDED_TXS << tx_hash
|
|
47
|
-
puts "Payment of #{value.to_f/1e8} BTC confirmed. Forwarding..."
|
|
48
|
-
|
|
49
|
-
# Note: We could also pass KEY.priv instead of KEY.addr here.
|
|
50
|
-
# Then we would get the complete tx in one step without calling "assemble_tx".
|
|
51
|
-
request("create_tx", [KEY.addr], [[FORWARD, value]])
|
|
52
|
-
else
|
|
53
|
-
puts "Received unconfirmed payment of #{value.to_f/1e8} BTC."
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
on_create_tx do |unsigned_tx, sig_hashes|
|
|
59
|
-
sig_pubkeys = sig_hashes.map do |sig_hash, address|
|
|
60
|
-
[KEY.sign(sig_hash.htb).hth, KEY.pub]
|
|
61
|
-
end
|
|
62
|
-
request("assemble_tx", unsigned_tx, sig_pubkeys)
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
on_assemble_tx do |tx_in_hex|
|
|
66
|
-
tx = Bitcoin::P::Tx.new(tx_in_hex.htb)
|
|
67
|
-
puts "Relaying tx #{tx.hash}..."
|
|
68
|
-
request("relay_tx", tx_in_hex)
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
end
|
data/examples/index_nhash.rb
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
$:.unshift( File.expand_path("../../lib", __FILE__) )
|
|
4
|
-
require 'bitcoin'
|
|
5
|
-
|
|
6
|
-
Bitcoin.network = :testnet3
|
|
7
|
-
@store = Bitcoin::Storage.sequel(:db => "postgres://mhanne:password@localhost:5434/testnet3_full")
|
|
8
|
-
|
|
9
|
-
#@store.db.execute "DROP INDEX tx_nhash_index"
|
|
10
|
-
|
|
11
|
-
def process_block blk
|
|
12
|
-
print "\r#{blk.hash} - #{blk.depth}"
|
|
13
|
-
blk.tx.each do |tx|
|
|
14
|
-
@store.db[:tx].where(hash: tx.hash.htb.blob).update(nhash: tx.nhash.htb.blob)
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
blk = @store.get_block_by_depth(0)
|
|
19
|
-
process_block(blk)
|
|
20
|
-
while blk = blk.get_next_block
|
|
21
|
-
process_block(blk)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
@store.db.execute "CREATE INDEX tx_nhash_index ON tx (nhash)"
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
|
|
3
|
-
$:.unshift( File.expand_path("../../lib", __FILE__) )
|
|
4
|
-
require 'bitcoin'
|
|
5
|
-
|
|
6
|
-
Bitcoin.network = :testnet3
|
|
7
|
-
@store = Bitcoin::Storage.sequel(:db => "postgres://mhanne:password@localhost:5434/testnet3_full")
|
|
8
|
-
# @store = Bitcoin::Storage.sequel(:db => "postgres:/testnet3")
|
|
9
|
-
|
|
10
|
-
puts "move namecoin types up by one to make room for op_return"
|
|
11
|
-
if Bitcoin.network_name == :namecoin
|
|
12
|
-
@store.db.run "UPDATE txout SET type = 8 WHERE type = 7"
|
|
13
|
-
@store.db.run "UPDATE txout SET type = 7 WHERE type = 6"
|
|
14
|
-
@store.db.run "UPDATE txout SET type = 6 WHERE type = 5"
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
puts "create missing p2sh output <-> address mappings"
|
|
18
|
-
@store.db[:txout].where(type: 4).each do |txout|
|
|
19
|
-
script = Bitcoin::Script.new(txout[:pk_script])
|
|
20
|
-
if addr = @store.db[:addr][hash160: script.get_hash160]
|
|
21
|
-
addr_id = addr[:id]
|
|
22
|
-
else
|
|
23
|
-
addr_id = @store.db[:addr].insert(hash160: script.get_hash160)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
if addr_txout = @store.db[:addr_txout][addr_id: addr_id, txout_id: txout[:id]]
|
|
27
|
-
# mapping already exists
|
|
28
|
-
print "e"
|
|
29
|
-
else
|
|
30
|
-
print "C"
|
|
31
|
-
@store.db[:addr_txout].insert(addr_id: addr_id, txout_id: txout[:id])
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
puts
|
|
36
|
-
puts "scan all txouts of unknown type and check if they are op_returns"
|
|
37
|
-
@store.db[:txout].where(type: 0).each do |txout|
|
|
38
|
-
if Bitcoin::Script.new(txout[:pk_script]).is_op_return?
|
|
39
|
-
print "C"
|
|
40
|
-
@store.db[:txout].where(id: txout[:id]).update(type: 5)
|
|
41
|
-
else
|
|
42
|
-
print "s"
|
|
43
|
-
end
|
|
44
|
-
end
|
data/examples/relay_tx.rb
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
#
|
|
3
|
-
# Relay transaction to the network.
|
|
4
|
-
# TODO
|
|
5
|
-
|
|
6
|
-
require 'socket'
|
|
7
|
-
require 'json'
|
|
8
|
-
|
|
9
|
-
# TODO: use CommandClient
|
|
10
|
-
|
|
11
|
-
host, port = "127.0.0.1", 9999
|
|
12
|
-
if ARGV[0] == "-s"
|
|
13
|
-
host, port = ARGV[1].split(":")
|
|
14
|
-
ARGV.shift; ARGV.shift
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
s = TCPSocket.new("127.0.0.1", 9999)
|
|
18
|
-
s.puts ("relay_tx " + ARGF.read.unpack("H*")[0])
|
|
19
|
-
|
|
20
|
-
res = s.readline
|
|
21
|
-
puts JSON::pretty_generate(JSON::parse(res))
|
|
22
|
-
s.close
|
data/examples/verify_tx.rb
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env ruby
|
|
2
|
-
#
|
|
3
|
-
# Fetch a transaction and all its previous outputs from local storage and verify signatures.
|
|
4
|
-
#
|
|
5
|
-
# examples/verify_tx.rb <tx_hash>
|
|
6
|
-
# examples/verify_tx.rb f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16
|
|
7
|
-
#
|
|
8
|
-
# see Bitcoin::Protocol::Tx and Bitcoin::Script.
|
|
9
|
-
# Note: For this to work, you need to have the transactions in your storage. see NODE.
|
|
10
|
-
# Note: There is also Bitcoin::Validation::Tx which validates a lot more than signatures.
|
|
11
|
-
|
|
12
|
-
$:.unshift( File.expand_path("../../lib", __FILE__) )
|
|
13
|
-
require 'bitcoin'
|
|
14
|
-
|
|
15
|
-
Bitcoin.network = :bitcoin
|
|
16
|
-
store = Bitcoin::Storage.sequel(:db => "sqlite://bitcoin.db")
|
|
17
|
-
|
|
18
|
-
tx_hash = ARGV.shift
|
|
19
|
-
|
|
20
|
-
tx1 = store.get_tx(tx_hash)
|
|
21
|
-
|
|
22
|
-
unless tx1
|
|
23
|
-
puts "Tx #{tx_hash} not found."
|
|
24
|
-
exit
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
if tx1.in.all?{|txin| txin.coinbase? }
|
|
28
|
-
puts "Tx #{tx_hash} is a coinbase transaction. Check the block instead."
|
|
29
|
-
exit
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
tx1.in.each_with_index do |txin, idx|
|
|
33
|
-
if txin.coinbase?
|
|
34
|
-
puts "skipping coinbase transaction input.."; next
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
prev_tx = txin.get_prev_out.get_tx
|
|
38
|
-
if prev_tx
|
|
39
|
-
puts "Found prev tx #{prev_tx.hash}"
|
|
40
|
-
txout = prev_tx.out[txin.prev_out_index]
|
|
41
|
-
script = Bitcoin::Script.new(txout.pk_script)
|
|
42
|
-
puts "Output Script: #{script.to_string}"
|
|
43
|
-
else
|
|
44
|
-
puts "Missing prev tx for input #{idx}!"
|
|
45
|
-
exit
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
result = tx1.verify_input_signature(idx, prev_tx)
|
|
49
|
-
if result
|
|
50
|
-
puts "Valid signature for input #{idx}."
|
|
51
|
-
else
|
|
52
|
-
puts "Signature for input #{idx} is invalid!"
|
|
53
|
-
exit
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
puts "Tx #{tx_hash} is valid."
|
data/lib/bitcoin/config.rb
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
# encoding: ascii-8bit
|
|
2
|
-
|
|
3
|
-
require 'yaml'
|
|
4
|
-
module Bitcoin
|
|
5
|
-
|
|
6
|
-
# Load config files, merge options, etc.
|
|
7
|
-
#
|
|
8
|
-
# Multiple config files are loaded in order, and their settings merged into an
|
|
9
|
-
# existing +options+ hash.
|
|
10
|
-
#
|
|
11
|
-
# Each config file defines one or more +categories+ which hold the actual settings.
|
|
12
|
-
# Which categories are loaded, and in what order, is specified when you load
|
|
13
|
-
# the config (ie. the order in the file doesn't matter).
|
|
14
|
-
# The default category "all" is always used, and is always the first
|
|
15
|
-
# (gets overridden by all others)
|
|
16
|
-
module Config
|
|
17
|
-
|
|
18
|
-
CONFIG_PATHS = "./bitcoin-ruby.yml:~/.bitcoin-ruby.yml:/etc/bitcoin-ruby.yml"
|
|
19
|
-
|
|
20
|
-
# Load +categories+ from all files at +paths+ into given +options+ hash.
|
|
21
|
-
def self.load(options, categories = [], paths = CONFIG_PATHS)
|
|
22
|
-
paths.split(":").reverse.each do |path|
|
|
23
|
-
path.sub!("~", ENV["HOME"])
|
|
24
|
-
next unless File.exist?(path)
|
|
25
|
-
options = load_file(options, path, categories)
|
|
26
|
-
end
|
|
27
|
-
options
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
# Load categories +c+ of a single config +file+ into given +options+ hash.
|
|
31
|
-
def self.load_file(options, file, c = [])
|
|
32
|
-
categories = YAML::load_file(file)
|
|
33
|
-
[:all, *(c.is_a?(Array) ? c : [c])].each do |category|
|
|
34
|
-
options = merge(options, categories[category.to_s]) if categories[category.to_s]
|
|
35
|
-
end
|
|
36
|
-
options
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
# Deep-merge hash +b+ into +a+.
|
|
40
|
-
def self.merge(a, b)
|
|
41
|
-
return a unless b
|
|
42
|
-
symbolize(a).merge(symbolize(b)) do |k, o, n|
|
|
43
|
-
if o.is_a?(Hash) && n.is_a?(Hash)
|
|
44
|
-
merge(symbolize(o), symbolize(n))
|
|
45
|
-
else
|
|
46
|
-
n
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# Turn all keys in +hash+ into symbols.
|
|
52
|
-
def self.symbolize(hash)
|
|
53
|
-
Hash[hash.map{|k,v|[k.to_sym,v]}]
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
end
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# encoding: ascii-8bit
|
|
2
|
-
|
|
3
|
-
module Bitcoin::Gui
|
|
4
|
-
class AddrView < TreeView
|
|
5
|
-
|
|
6
|
-
def initialize gui
|
|
7
|
-
super(gui, :addr_view, [
|
|
8
|
-
[GObject::TYPE_STRING, "Address", :format_address_col],
|
|
9
|
-
[GObject::TYPE_STRING],
|
|
10
|
-
[GObject::TYPE_STRING, "Balance", :format_value_col],
|
|
11
|
-
[GObject::TYPE_BOOLEAN, "Mine?"]])
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def update addrs
|
|
15
|
-
EM.defer do
|
|
16
|
-
@model.clear
|
|
17
|
-
addrs.each do |addr|
|
|
18
|
-
row = @model.append(nil)
|
|
19
|
-
@model.set_value(row, 0, addr[:addr])
|
|
20
|
-
@model.set_value(row, 1, addr[:label] || "")
|
|
21
|
-
@model.set_value(row, 3, !!addr[:mine])
|
|
22
|
-
balance = 0
|
|
23
|
-
unconfirmed = @gui.check_unconfirmed.active
|
|
24
|
-
@gui.storage.get_txouts_for_address(addr[:addr]).each do |txout|
|
|
25
|
-
next if !unconfirmed && !txout.get_tx.get_block
|
|
26
|
-
tx_row = @model.append(row)
|
|
27
|
-
@model.set_value(tx_row, 0, txout.get_tx.hash)
|
|
28
|
-
@model.set_value(tx_row, 2, txout.value.to_s)
|
|
29
|
-
balance += txout.value
|
|
30
|
-
if txin = txout.get_next_in
|
|
31
|
-
tx_row = @model.append(row)
|
|
32
|
-
@model.set_value(tx_row, 0, txin.get_tx.hash)
|
|
33
|
-
@model.set_value(tx_row, 2, (0 - txout.value).to_s)
|
|
34
|
-
balance -= txout.value
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
@model.set_value(row, 2, balance.to_s)
|
|
38
|
-
end
|
|
39
|
-
@view.set_model @model
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
end
|
|
44
|
-
end
|
|
Binary file
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
2
|
-
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
3
|
-
|
|
4
|
-
<svg
|
|
5
|
-
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
6
|
-
xmlns:cc="http://creativecommons.org/ns#"
|
|
7
|
-
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
8
|
-
xmlns:svg="http://www.w3.org/2000/svg"
|
|
9
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
10
|
-
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
11
|
-
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
12
|
-
width="744.09448819"
|
|
13
|
-
height="1052.3622047"
|
|
14
|
-
id="svg2"
|
|
15
|
-
version="1.1"
|
|
16
|
-
inkscape:version="0.48.3.1 r9886"
|
|
17
|
-
sodipodi:docname="bitcoin-ruby.svg">
|
|
18
|
-
<defs
|
|
19
|
-
id="defs4" />
|
|
20
|
-
<sodipodi:namedview
|
|
21
|
-
id="base"
|
|
22
|
-
pagecolor="#ffffff"
|
|
23
|
-
bordercolor="#666666"
|
|
24
|
-
borderopacity="1.0"
|
|
25
|
-
inkscape:pageopacity="0.0"
|
|
26
|
-
inkscape:pageshadow="2"
|
|
27
|
-
inkscape:zoom="0.35"
|
|
28
|
-
inkscape:cx="-129.28571"
|
|
29
|
-
inkscape:cy="520"
|
|
30
|
-
inkscape:document-units="px"
|
|
31
|
-
inkscape:current-layer="layer1"
|
|
32
|
-
showgrid="false"
|
|
33
|
-
inkscape:window-width="1596"
|
|
34
|
-
inkscape:window-height="1180"
|
|
35
|
-
inkscape:window-x="2"
|
|
36
|
-
inkscape:window-y="18"
|
|
37
|
-
inkscape:window-maximized="0" />
|
|
38
|
-
<metadata
|
|
39
|
-
id="metadata7">
|
|
40
|
-
<rdf:RDF>
|
|
41
|
-
<cc:Work
|
|
42
|
-
rdf:about="">
|
|
43
|
-
<dc:format>image/svg+xml</dc:format>
|
|
44
|
-
<dc:type
|
|
45
|
-
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
46
|
-
<dc:title></dc:title>
|
|
47
|
-
</cc:Work>
|
|
48
|
-
</rdf:RDF>
|
|
49
|
-
</metadata>
|
|
50
|
-
<g
|
|
51
|
-
inkscape:label="Layer 1"
|
|
52
|
-
inkscape:groupmode="layer"
|
|
53
|
-
id="layer1">
|
|
54
|
-
<rect
|
|
55
|
-
style="fill:#8c0000;fill-opacity:1;stroke:#ffffff;stroke-width:0.75155282;stroke-opacity:1"
|
|
56
|
-
id="rect2987"
|
|
57
|
-
width="120.24844"
|
|
58
|
-
height="120.24844"
|
|
59
|
-
x="268.4472"
|
|
60
|
-
y="200.80939"
|
|
61
|
-
inkscape:export-filename="/home/mhanne/work/bitcoin-ruby/lib/bitcoin/gui/bitcoin-ruby.png"
|
|
62
|
-
inkscape:export-xdpi="74.380165"
|
|
63
|
-
inkscape:export-ydpi="74.380165" />
|
|
64
|
-
<text
|
|
65
|
-
xml:space="preserve"
|
|
66
|
-
style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
|
|
67
|
-
x="285.71429"
|
|
68
|
-
y="303.79077"
|
|
69
|
-
id="text2989"
|
|
70
|
-
sodipodi:linespacing="125%"
|
|
71
|
-
inkscape:export-filename="/home/mhanne/work/bitcoin-ruby/lib/bitcoin/gui/bitcoin-ruby.png"
|
|
72
|
-
inkscape:export-xdpi="74.380165"
|
|
73
|
-
inkscape:export-ydpi="74.380165"><tspan
|
|
74
|
-
sodipodi:role="line"
|
|
75
|
-
id="tspan2991"
|
|
76
|
-
x="285.71429"
|
|
77
|
-
y="303.79077"
|
|
78
|
-
style="font-size:144px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;fill-opacity:1;font-family:FreeMono;-inkscape-font-specification:FreeMono Bold">B</tspan></text>
|
|
79
|
-
</g>
|
|
80
|
-
</svg>
|