bitcoin-ruby 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- 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>
|