coloredcoins 0.0.0 → 0.0.1
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/README.md +3 -0
- data/lib/coloredcoins.rb +5 -3
- data/lib/coloredcoins/multisig.rb +47 -0
- data/lib/coloredcoins/multisig_tx.rb +11 -30
- data/lib/coloredcoins/transaction.rb +13 -17
- data/lib/coloredcoins/version.rb +1 -1
- data/spec/coloredcoins/api_spec.rb +23 -1
- data/spec/coloredcoins/multisig_tx_spec.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6dc49542256b1f86ce32aa7e6a107e7abd8fa590
|
4
|
+
data.tar.gz: fca4a8dfe2efe63b375429dcdf28e8b8e2635020
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ab10c67df4296f21fc45b78751860bd191c5cea6504c5f443fd9e43016aa382ef25f683620986f206d65b9f00eae5910a08f2ddd3bd23a1415b84cf57dbfb49
|
7
|
+
data.tar.gz: 16887fe9d1b9eede983785c6fe111aa808ed05dbe9071da01b67bf62f095aea6f79bb8f5b70b2cde2e5688025f847b667b5e9aaed5d041fb31a67b5d89a65282
|
data/README.md
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# Coloredcoins
|
2
2
|
|
3
|
+
[![Gem Version][rubygems-image]][rubygems-url]
|
3
4
|
[![Build Status][travis-image]][travis-url]
|
4
5
|
[![Coverage Status][coverage-image]][coverage-url]
|
5
6
|
|
@@ -122,6 +123,8 @@ Coloredcoins.asset_metadata(asset_id, utxo)
|
|
122
123
|
4. Push to the branch (`git push origin my-new-feature`)
|
123
124
|
5. Create a new Pull Request
|
124
125
|
|
126
|
+
[rubygems-image]: https://badge.fury.io/rb/coloredcoins.svg
|
127
|
+
[rubygems-url]: https://badge.fury.io/rb/coloredcoins
|
125
128
|
[travis-image]: https://travis-ci.org/genaromadrid/coloredcoins-ruby.svg?branch=master
|
126
129
|
[travis-url]: https://travis-ci.org/genaromadrid/coloredcoins-ruby
|
127
130
|
[coverage-image]: https://coveralls.io/repos/github/genaromadrid/coloredcoins-ruby/badge.svg?branch=master
|
data/lib/coloredcoins.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
+
require 'bitcoin'
|
1
2
|
require 'coloredcoins/version'
|
2
3
|
|
3
4
|
module Coloredcoins
|
4
|
-
autoload :API,
|
5
|
-
autoload :Connection,
|
5
|
+
autoload :API, 'coloredcoins/api'
|
6
|
+
autoload :Connection, 'coloredcoins/connection'
|
6
7
|
autoload :Transaction, 'coloredcoins/transaction'
|
7
|
-
autoload :
|
8
|
+
autoload :Multisig, 'coloredcoins/multisig'
|
9
|
+
autoload :MultisigTx, 'coloredcoins/multisig_tx'
|
8
10
|
|
9
11
|
attr_writer :api
|
10
12
|
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Coloredcoins
|
2
|
+
class Multisig
|
3
|
+
attr_reader :m, :pub_keys
|
4
|
+
attr_accessor :redeem_script
|
5
|
+
|
6
|
+
def self.valid_sig?(i, script)
|
7
|
+
tx.verify_input_signature(i, script)
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(m = nil, pub_keys = nil)
|
11
|
+
@m = m
|
12
|
+
@pub_keys = pub_keys
|
13
|
+
end
|
14
|
+
|
15
|
+
def sign(tx, key)
|
16
|
+
key = Coloredcoins::Transaction.build_key(key)
|
17
|
+
tx.inputs.each_with_index do |input, i|
|
18
|
+
sig_hash = tx.signature_hash_for_input(i, redeem_script)
|
19
|
+
sigs = Coloredcoins::Transaction.build_sigs(key, sig_hash)
|
20
|
+
initial = input.script_sig.or(initial_script)
|
21
|
+
|
22
|
+
input.script_sig = build_script_sig(sigs, sig_hash, initial)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def address
|
27
|
+
@address ||= Bitcoin.hash160_to_p2sh_address(Bitcoin.hash160(redeem_script.hth))
|
28
|
+
end
|
29
|
+
|
30
|
+
def redeem_script
|
31
|
+
@redeem_script ||= Bitcoin::Script.to_p2sh_multisig_script(m, *pub_keys).last
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def initial_script
|
37
|
+
@initial_script ||= Bitcoin::Script.to_p2sh_multisig_script_sig(redeem_script)
|
38
|
+
end
|
39
|
+
|
40
|
+
def build_script_sig(sigs, sig_hash, initial)
|
41
|
+
sigs.each do |sig|
|
42
|
+
Bitcoin::Script.add_sig_to_multisig_script_sig(sig, initial)
|
43
|
+
end
|
44
|
+
Bitcoin::Script.sort_p2sh_multisig_signatures(initial, sig_hash)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -1,6 +1,9 @@
|
|
1
1
|
module Coloredcoins
|
2
2
|
class MultisigTx < Transaction
|
3
|
-
attr_accessor :m,
|
3
|
+
attr_accessor :m,
|
4
|
+
:pub_keys,
|
5
|
+
:redeem_script,
|
6
|
+
:multisig
|
4
7
|
|
5
8
|
def self.build(tx_hex)
|
6
9
|
transaction = MultisigTx.new(tx_hex)
|
@@ -10,45 +13,23 @@ module Coloredcoins
|
|
10
13
|
|
11
14
|
def sign(key)
|
12
15
|
check
|
13
|
-
|
14
|
-
tx.inputs.each_with_index do |input, i|
|
15
|
-
sig_hash = tx.signature_hash_for_input(i, redeem_script)
|
16
|
-
sigs = build_sigs(key, sig_hash)
|
17
|
-
initial = input.script_sig.or(initial_script)
|
18
|
-
|
19
|
-
input.script_sig = build_script_sig(sigs, sig_hash, initial)
|
20
|
-
end
|
16
|
+
multisig.sign(tx, key)
|
21
17
|
true
|
22
18
|
end
|
23
19
|
|
24
|
-
def
|
25
|
-
@
|
20
|
+
def multisig
|
21
|
+
@multisig ||= Coloredcoins::Multisig.new(m, pub_keys)
|
26
22
|
end
|
27
23
|
|
28
|
-
def
|
29
|
-
|
24
|
+
def redeem_script=(script)
|
25
|
+
multisig.redeem_script = script
|
30
26
|
end
|
31
27
|
|
32
28
|
private
|
33
29
|
|
34
|
-
def initial_script
|
35
|
-
@initial_script ||= Bitcoin::Script.to_p2sh_multisig_script_sig(redeem_script)
|
36
|
-
end
|
37
|
-
|
38
|
-
def build_script_sig(sigs, sig_hash, initial)
|
39
|
-
sigs.each do |sig|
|
40
|
-
Bitcoin::Script.add_sig_to_multisig_script_sig(sig, initial)
|
41
|
-
end
|
42
|
-
Bitcoin::Script.sort_p2sh_multisig_signatures(initial, sig_hash)
|
43
|
-
end
|
44
|
-
|
45
|
-
def valid_sig?(i, script)
|
46
|
-
tx.verify_input_signature(i, script)
|
47
|
-
end
|
48
|
-
|
49
30
|
def check
|
50
|
-
raise ArgumentError, 'Set "m" before signing' unless m
|
51
|
-
if !pub_keys && !redeem_script
|
31
|
+
raise ArgumentError, 'Set "m" before signing' unless multisig.m
|
32
|
+
if !multisig.pub_keys && !multisig.redeem_script
|
52
33
|
raise ArgumentError, 'Set "pub_keys" or "redeem_script" before signing'
|
53
34
|
end
|
54
35
|
end
|
@@ -1,9 +1,20 @@
|
|
1
|
-
require 'bitcoin'
|
2
|
-
|
3
1
|
module Coloredcoins
|
4
2
|
class Transaction
|
5
3
|
attr_reader :tx
|
6
4
|
|
5
|
+
def self.build_key(key)
|
6
|
+
return key if key.is_a?(Array)
|
7
|
+
key = Bitcoin::Key.from_base58(key) unless key.is_a?(Bitcoin::Key)
|
8
|
+
key
|
9
|
+
rescue RuntimeError => e
|
10
|
+
raise InvalidKeyError, 'Invalid key' if e.message == 'Invalid version'
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.build_sigs(key, sig_hash)
|
14
|
+
key = [key] unless key.is_a?(Array)
|
15
|
+
key.map { |k| k.sign(sig_hash) }
|
16
|
+
end
|
17
|
+
|
7
18
|
def initialize(hex)
|
8
19
|
@tx = Bitcoin::P::Tx.new([hex].pack('H*'))
|
9
20
|
end
|
@@ -27,20 +38,5 @@ module Coloredcoins
|
|
27
38
|
return response[:txId] if response[:txId]
|
28
39
|
response
|
29
40
|
end
|
30
|
-
|
31
|
-
protected
|
32
|
-
|
33
|
-
def build_key(key)
|
34
|
-
return key if key.is_a?(Array)
|
35
|
-
key = Bitcoin::Key.from_base58(key) unless key.is_a?(Bitcoin::Key)
|
36
|
-
key
|
37
|
-
rescue RuntimeError => e
|
38
|
-
raise InvalidKeyError, 'Invalid key' if e.message == 'Invalid version'
|
39
|
-
end
|
40
|
-
|
41
|
-
def build_sigs(key, sig_hash)
|
42
|
-
key = [key] unless key.is_a?(Array)
|
43
|
-
key.map { |k| k.sign(sig_hash) }
|
44
|
-
end
|
45
41
|
end
|
46
42
|
end
|
data/lib/coloredcoins/version.rb
CHANGED
@@ -27,7 +27,7 @@ describe Coloredcoins::API do
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
describe '
|
30
|
+
describe 'connection methods' do
|
31
31
|
before do
|
32
32
|
allow(subject.connection).to receive(:post)
|
33
33
|
allow(subject.connection).to receive(:get)
|
@@ -74,5 +74,27 @@ describe Coloredcoins::API do
|
|
74
74
|
expect(subject.connection).to have_received(:get).with(/assetmetadata/)
|
75
75
|
end
|
76
76
|
end
|
77
|
+
|
78
|
+
describe 'called from class' do
|
79
|
+
before do
|
80
|
+
@api = Coloredcoins::API.new
|
81
|
+
allow(Coloredcoins).to receive(:api).and_return @api
|
82
|
+
allow(@api).to receive(:send).and_return true
|
83
|
+
end
|
84
|
+
|
85
|
+
%w(
|
86
|
+
issue_asset
|
87
|
+
send_asset
|
88
|
+
broadcast
|
89
|
+
address_info
|
90
|
+
asset_holders
|
91
|
+
asset_metadata
|
92
|
+
).each do |method|
|
93
|
+
it do
|
94
|
+
Coloredcoins.send(method)
|
95
|
+
expect(@api).to have_received(:send)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
77
99
|
end
|
78
100
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: coloredcoins
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Genaro Madrid
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02
|
11
|
+
date: 2016-03-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -178,6 +178,7 @@ files:
|
|
178
178
|
- lib/coloredcoins.rb
|
179
179
|
- lib/coloredcoins/api.rb
|
180
180
|
- lib/coloredcoins/connection.rb
|
181
|
+
- lib/coloredcoins/multisig.rb
|
181
182
|
- lib/coloredcoins/multisig_tx.rb
|
182
183
|
- lib/coloredcoins/transaction.rb
|
183
184
|
- lib/coloredcoins/version.rb
|