txcatcher 0.1.4 → 0.1.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1ad836b6bfc449c217c567752f17d24aa2b3656b
4
- data.tar.gz: db3033df9af8f9923c8aa21e2e41f8a8effab623
3
+ metadata.gz: 909ad770012c2bacccbb1e9f7438bf97e4c92d15
4
+ data.tar.gz: ec40ed49c4f006e30f4ff07be84fce1d2f05523f
5
5
  SHA512:
6
- metadata.gz: 2f2e45bf54b63f1262909a3f051a9d270edc9b88ae47b4abafda15a4e2af37423aa77a051d0b9cc2a5c50afd01aa45ca43a65ba3c7f827cdb3aa65cc745af080
7
- data.tar.gz: 9f86649d0540f376adb8d09bf820e84680335bbeb2fb0ea3880566f3fdfe1528b685c2ee4ffcda52f2b5bfa971bff17ccb3cd89817504dbe1a5fa9120ffba1da
6
+ metadata.gz: f12b5d7ef16ba43904ec6cebc3ab77a3f1c8fad8588a67b5ad17d1f5076260dee01f21d20928a5f6ae287955ab6c5a83233a05402d8350bd79523e0700095b02
7
+ data.tar.gz: 3f737f4a9d32f9ae4c8f9011a3a03856cd55cf9dd4af3e517e0ded3d0dfd656d938bcf8a59008b6a32b9cfc37379ef90e1e0f78317be7f7e8d2b8ca438a3b061
data/README.md CHANGED
@@ -1,11 +1,116 @@
1
- = txcatcher
1
+ TxCatcher
2
+ ========
2
3
 
3
- Dependencies
4
+ *TxCatcher* is a lightweight alternative to Bitpay's Insight (bitcoin and litecoin compatible)
5
+ The purpose of this software is to receive all incoming unconfirmed transactions,
6
+ store them in the DB along with addresses (outputs) and provide a simple API to check whether
7
+ a certain address received a deposit.
8
+
9
+ However, it doesn't rely on having full blockchain with either bitcoind or litecoind.
10
+ You can have pruning enabled (in fact, it's recommended) and the txcatcher's DB
11
+ is regularly cleaned, so it doesn't grow.
12
+
13
+ The point is to detect new transactions to an address and store them for at least a while,
14
+ but then get rid of them. It's ideal for lightweight payment processing.
15
+
16
+ API requests:
17
+ -------------
18
+ request: `/addr/2N8Xdi8FiWAT3Vuo2mzcCETnrBjeAtBiqiA`
19
+ response (JSON):
20
+
21
+ {
22
+ "address":"2N8Xdi8FiWAT3Vuo2mzcCETnrBjeAtBiqiA","received":2000000
23
+ "deposits":[
24
+ {
25
+ "txid":"4e6e1e491108b8302da8885b7e57b8809385d206346b3d287b6300408efe551c",
26
+ "amount":0.01,
27
+ "satoshis":1000000,
28
+ "confirmations":0,
29
+ "block_height":null
30
+ }
31
+ }
32
+
33
+ request: `/addr/2N8Xdi8FiWAT3Vuo2mzcCETnrBjeAtBiqiA/utxo`
34
+ response (JSON):
35
+
36
+ [{
37
+ "value":0.01,
38
+ "n":0,
39
+ "scriptPubKey":{"asm":"OP_HASH160 a7a458022e92dd04935c849ab2ea3b07373b7e4b OP_EQUAL","hex":"a914a7a458022e92dd04935c849ab2ea3b07373b7e4b87","reqSigs":1,"type":"scripthash","addresses":["2N8Xdi8FiWAT3Vuo2mzcCETnrBjeAtBiqiA"]},
40
+ "confirmations":5,
41
+ "txid":"4e6e1e491108b8302da8885b7e57b8809385d206346b3d287b6300408efe551c"
42
+ }]
43
+
44
+ You can also broadcast transactions by sending requests to `/tx/send` passing transaction in `rawtx` param.
45
+
46
+
47
+ Is that all?
48
+ -----------
49
+ For now - yes. It allows you to do basic stuff like checking what an address has received.
50
+
51
+ TODO:
52
+ * websockets for instant update notifications
53
+ * better configuration through command line args
54
+
55
+
56
+ What it does under the hood
57
+ ---------------------------
58
+ * it uses bitcoind or litecoind with ZeroMQ to receive new transactions from the mempool
59
+ * it receives newly mined blocks so that we can tell how many confirmations a transaction to a certain
60
+ address has.
61
+ * regularly cleans the DB
62
+
63
+ Installation
4
64
  ------------
5
65
 
6
- In order for bitcoin-core and litecoin-core to stream new transactions
7
- and blocks, we need ZeroMQ. Ubuntu/Debian installation instructions are here:
66
+ Install dependencies:
67
+ * zeromq
68
+ * rvm, ruby & rubygems
69
+ * sqlite3 or postgresql
70
+ * bitcoind or litecoind or both
71
+
72
+ Install txcatcher: `gem install txcatcher`
73
+
74
+ Configuring & Runing
75
+ --------------------
76
+ You're going to need a simple config file. By default, txcatcher looks in `~/.txcatcher` dir,
77
+ so create the dir and the file there: `mkdir ~/.txcatcher && touch ~/.txcatcher/config.yml`
78
+ Example config file can be found in [templates/config.yml](templates/config.yml), you might want
79
+ to copy the contents and edit it.
80
+
81
+ Once your bitcoin/litecoind finished syncing, you can start txcatcher with a simple command: `txcatcher`.
82
+ You can srart multiple instances of txcatcher, when, for example, you want instances of it
83
+ tracking both litecoin and bitcoin transactions:
84
+
85
+ txcatcher -c ~/.txcatcher/litecoin_config.yml
86
+ txcatcher -c ~/.txcatcher/bitcoin_config.yml
87
+
88
+ Upstart script
89
+ -------------
90
+ If running on Ubuntu, you may also want to create an upstart script, so here's an example (`/etc/init/txcatcher_btc.conf`):
91
+
92
+ start on started bitcoind
93
+ stop on shutdown
94
+ setuid deploy
95
+ respawn
96
+ respawn limit 10 90
97
+
98
+ env HOME="/home/deploy"
99
+ env RVM_WRAPPERS_PATH="/usr/local/rvm/gems/ruby-2.3.4/wrappers"
100
+ env TXCATCHER_CONFIG="/home/deploy/.txcatcher/config.yml"
8
101
 
9
- http://zeromq.org/distro:debian
102
+ exec ${RVM_WRAPPERS_PATH}/txcatcher -c ${TXCATCHER_CONFIG}
103
+
104
+ For this to work, you need a number of prerequisites:
105
+ * create a `deploy` user, make sure rvm works with this user (rvm multi-user installation)
106
+ * DO NOT daemonize the process in config.yml, set `daemonize: false` in `/home/deploy/.txcatcher/config.yml`
107
+ * Generate rvm wrapper for txcatcher: https://rvm.io/deployment/init-d
108
+ * Make sure your bitcoind or litecoind are also started with an upstart script: https://github.com/bitcoin/bitcoin/blob/0.13/contrib/init/bitcoind.conf
109
+
110
+ You can then start and stop txcatcher with `start txcatcher_btc` and `stop txcatcher_btc`.
10
111
 
11
- you can safely use a package weirdly located at download.opensuse.org.
112
+ Running unit tests
113
+ ------------------
114
+ Before running unit tests, make sure you have bitcoind running in mainnet mode,
115
+ with RPC enabled and blockchain synced. Copy the `spec/config/config.yml.sample` file
116
+ and change the RPC username/password to match your bitcoind settings.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.4
1
+ 0.1.5
@@ -1,6 +1,8 @@
1
1
  module TxCatcher
2
2
 
3
3
  class Transaction < Sequel::Model
4
+
5
+ plugin :validation_helpers
4
6
  one_to_many :deposits
5
7
 
6
8
  def before_validation
@@ -17,7 +19,7 @@ module TxCatcher
17
19
  end
18
20
  end
19
21
 
20
- def after_save
22
+ def after_create
21
23
  self.deposits.each do |d|
22
24
  d.transaction = self
23
25
  d.save
@@ -47,6 +49,8 @@ module TxCatcher
47
49
  end
48
50
 
49
51
  def validate
52
+ super
53
+ validates_unique :txid
50
54
  errors.add(:base, "No outputs for this transactions") if self.deposits.empty?
51
55
  end
52
56
 
@@ -28,19 +28,20 @@ module TxCatcher
28
28
  path = path.split("/").delete_if { |i| i.empty? }
29
29
  addr = path.last
30
30
 
31
- model = Address.where(address: addr).eager(deposits: :transactions).first
32
- if model
33
- transactions_ids = model.deposits.map { |d| d.transaction.txid }
34
- deposits = model.deposits.map do |d|
31
+ address = Address.where(address: addr).eager(deposits: :transactions).first
32
+ if address
33
+ transactions_ids = address.deposits.map { |d| d.transaction.txid }
34
+ deposits = address.deposits.map do |d|
35
35
  t = d.transaction
36
36
  {
37
37
  txid: t.txid,
38
38
  amount: d.amount_in_btc,
39
39
  satoshis: d.amount,
40
- confirmations: 0
40
+ confirmations: t.confirmations,
41
+ block_height: t.block_height
41
42
  }
42
43
  end
43
- [200, {}, { address: model.address, received: model.received, deposits: deposits }.to_json]
44
+ [200, {}, { address: address.address, received: address.received, deposits: deposits }.to_json]
44
45
  else
45
46
  [200, {}, { address: addr, received: 0, deposits: [] }.to_json]
46
47
  end
@@ -12,8 +12,8 @@ db:
12
12
 
13
13
  rpcnode:
14
14
  name: bitcoind
15
- user: roman
16
- password: 12990duxcibciwebf
15
+ user: user
16
+ password: password
17
17
  host: 127.0.0.1
18
18
  port: 8332
19
19
 
Binary file
@@ -17,10 +17,13 @@ RSpec.describe TxCatcher::Transaction do
17
17
  end
18
18
 
19
19
  it "doesn't create duplicate deposits if valid? called manually before save" do
20
+ TxCatcher::Transaction.select_all.delete
20
21
  transaction = TxCatcher::Transaction.new(hex: @hextx)
21
22
  transaction.valid?
22
23
  transaction.save
23
24
  expect(transaction.deposits.size).to eq(2)
25
+ transaction.update(block_height: 1)
26
+ expect(TxCatcher::Transaction.where(txid: transaction.txid).count).to eq(1)
24
27
  end
25
28
 
26
29
  end
data/templates/config.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  db:
2
2
  adapter: sqlite
3
- db_path: txcatcher_test.db
3
+ db_path: txcatcher.db
4
4
 
5
5
  # No need to set these options for sqlite,
6
6
  # but other DBs may require them.
@@ -12,8 +12,8 @@ db:
12
12
 
13
13
  rpcnode:
14
14
  name: bitcoind
15
- user: roman
16
- password: 12990duxcibciwebf
15
+ user: user
16
+ password: password
17
17
  host: 127.0.0.1
18
18
  port: 8332
19
19
 
@@ -21,3 +21,4 @@ zeromq: bitcoind
21
21
  max_db_transactions_stored: 100000
22
22
  db_clean_period_seconds: 300
23
23
  server_port: 9498
24
+ daemonize: false
data/txcatcher.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: txcatcher 0.1.4 ruby lib
5
+ # stub: txcatcher 0.1.5 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "txcatcher"
9
- s.version = "0.1.4"
9
+ s.version = "0.1.5"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Roman Snitko"]
14
- s.date = "2017-09-24"
14
+ s.date = "2017-09-25"
15
15
  s.description = "Ccurrently, the only job of this gem is to collect all new Bitcoin/Litecoin transactions, store them in a DB, index addresses."
16
16
  s.email = "roman.snitko@gmail.com"
17
17
  s.executables = ["goliath.log", "goliath_stdout.log", "txcatcher"]
@@ -49,7 +49,7 @@ Gem::Specification.new do |s|
49
49
  "lib/txcatcher/utils/hash_string_to_sym_keys.rb",
50
50
  "spec/catcher_spec.rb",
51
51
  "spec/cleaner_spec.rb",
52
- "spec/config/config.yml",
52
+ "spec/config/config.yml.sample",
53
53
  "spec/config/txcatcher_test.db",
54
54
  "spec/fixtures/transaction.txt",
55
55
  "spec/fixtures/transaction_decoded_no_outputs.txt",
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: txcatcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roman Snitko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-24 00:00:00.000000000 Z
11
+ date: 2017-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: goliath
@@ -135,7 +135,7 @@ files:
135
135
  - lib/txcatcher/utils/hash_string_to_sym_keys.rb
136
136
  - spec/catcher_spec.rb
137
137
  - spec/cleaner_spec.rb
138
- - spec/config/config.yml
138
+ - spec/config/config.yml.sample
139
139
  - spec/config/txcatcher_test.db
140
140
  - spec/fixtures/transaction.txt
141
141
  - spec/fixtures/transaction_decoded_no_outputs.txt