xrbp 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/examples/nodestore1.rb +3 -1
- data/lib/xrbp/common.rb +6 -0
- data/lib/xrbp/core_ext.rb +21 -0
- data/lib/xrbp/nodestore/format.rb +76 -26
- data/lib/xrbp/nodestore/ledger.rb +46 -14
- data/lib/xrbp/nodestore/parser.rb +47 -14
- data/lib/xrbp/nodestore/protocol/indexes.rb +11 -8
- data/lib/xrbp/nodestore/protocol/issue.rb +15 -0
- data/lib/xrbp/nodestore/protocol/rate.rb +13 -1
- data/lib/xrbp/nodestore/shamap/node_factory.rb +6 -1
- data/lib/xrbp/nodestore/shamap/node_id.rb +2 -2
- data/lib/xrbp/nodestore/sle/st_amount.rb +46 -181
- data/lib/xrbp/nodestore/sle/st_amount_arithmatic.rb +126 -0
- data/lib/xrbp/nodestore/sle/st_amount_comparison.rb +49 -0
- data/lib/xrbp/nodestore/sle/st_amount_conversion.rb +203 -0
- data/lib/xrbp/nodestore/sqldb.rb +69 -4
- data/lib/xrbp/overlay/handshake.rb +1 -1
- data/lib/xrbp/version.rb +1 -1
- data/spec/xrbp/crypto/account_spec.rb +7 -2
- data/spec/xrbp/nodestore/amendments_spec.rb +11 -0
- data/spec/xrbp/nodestore/db_parser.rb +64 -1
- data/spec/xrbp/nodestore/fees_spec.rb +3 -0
- data/spec/xrbp/nodestore/ledger_access.rb +87 -2
- data/spec/xrbp/nodestore/protocol/indexes_spec.rb +43 -0
- data/spec/xrbp/nodestore/protocol/rate_spec.rb +12 -0
- data/spec/xrbp/nodestore/shamap/inner_node_spec.rb +44 -0
- data/spec/xrbp/nodestore/shamap/node_factory_spec.rb +9 -0
- data/spec/xrbp/nodestore/shamap/node_id_spec.rb +6 -0
- data/spec/xrbp/nodestore/shamap/node_spec.rb +25 -0
- data/spec/xrbp/nodestore/shamap_spec.rb +144 -0
- data/spec/xrbp/nodestore/sle/st_amount_arithmatic_spec.rb +7 -0
- data/spec/xrbp/nodestore/sle/st_amount_comparison_spec.rb +11 -0
- data/spec/xrbp/nodestore/sle/st_amount_conversion_spec.rb +64 -0
- data/spec/xrbp/nodestore/sle/st_amount_spec.rb +47 -0
- data/spec/xrbp/nodestore/sle/st_ledger_entry_spec.rb +5 -0
- data/spec/xrbp/nodestore/sle/st_object_spec.rb +29 -0
- metadata +20 -2
@@ -6,10 +6,95 @@ shared_examples "ledger access" do |opts={}|
|
|
6
6
|
let(:iou1) { {:currency => 'USD', :account => issuer} }
|
7
7
|
let(:iou2) { {:currency => 'EUR', :account => issuer} }
|
8
8
|
|
9
|
-
let(:order1) { {
|
10
|
-
|
9
|
+
let(:order1) { {
|
10
|
+
:ledger_entry_type=>:offer,
|
11
|
+
:flags=>131072,
|
12
|
+
:sequence=>219,
|
13
|
+
:previous_txn_lgr_seq=>47926685,
|
14
|
+
:book_node=>0,
|
15
|
+
:owner_node=>0,
|
16
|
+
:previous_txn_id=>"e43add1bd4ac2049e0d9de6bc279b7fd95a99c8de2c4694a4a7623f6d9aaae29",
|
17
|
+
:book_directory=>"7e5f614417c2d0a7cefeb73c4aa773ed5b078de2b5771f6d56038d7ea4c68000",
|
18
|
+
:taker_pays=>XRBP::NodeStore::STAmount.new(:issue => XRBP::NodeStore::Issue.new("USD", "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B"), :mantissa => 2459108753792364, :exponent => -14),
|
19
|
+
:taker_gets => XRBP::NodeStore::STAmount.new(:issue => XRBP::NodeStore::Issue.new("EUR", "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B"), :mantissa => 2459108753792364, :exponent => -15),
|
20
|
+
:account=>"rnixnrMHHvR7ejMpJMRCWkaNrq3qREwMDu",
|
21
|
+
:owner_funds => XRBP::NodeStore::STAmount.new(:issue => XRBP::NodeStore::Issue.new("EUR", XRBP::Crypto.no_account), :mantissa => 2872409153061363, :exponent => -15),
|
22
|
+
:quality => XRBP::NodeStore::STAmount.new(:issue => XRBP::NodeStore.no_issue, :mantissa => 1000000000000000, :exponent => -14),
|
23
|
+
} }
|
24
|
+
|
25
|
+
let(:order2) { {
|
26
|
+
:ledger_entry_type=>:offer,
|
27
|
+
:flags=>131072,
|
28
|
+
:sequence=>19,
|
29
|
+
:previous_txn_lgr_seq=>43166305,
|
30
|
+
:book_node=>0,
|
31
|
+
:owner_node=>0,
|
32
|
+
:previous_txn_id=>"b63b2ecd124fe6b02bc2998929517266bd221a02fee51dde4992c1bcb7e86cd3",
|
33
|
+
:book_directory=>"7e5f614417c2d0a7cefeb73c4aa773ed5b078de2b5771f6d56038d7ea4c68000",
|
34
|
+
:taker_pays=>XRBP::NodeStore::STAmount.new(:issue => XRBP::NodeStore::Issue.new("USD", "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B"), :mantissa => 3520000000000000, :exponent => -14),
|
35
|
+
:taker_pays_funded=>XRBP::NodeStore::STAmount.new(:issue => XRBP::NodeStore::Issue.new("USD", "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B"), :mantissa => 3516160294182094, :exponent => -14),
|
36
|
+
:taker_gets => XRBP::NodeStore::STAmount.new(:issue => XRBP::NodeStore::Issue.new("EUR", "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B"), :mantissa => 3520000000000000, :exponent => -15), :account=>"rKwjWCKBaASEvtHCxtvReNd2i9n8DxSihk",
|
37
|
+
:taker_gets_funded => XRBP::NodeStore::STAmount.new(:issue => XRBP::NodeStore::Issue.new("EUR", XRBP::Crypto.no_account), :mantissa => 3516160294182094, :exponent => -15), :account=>"rKwjWCKBaASEvtHCxtvReNd2i9n8DxSihk",
|
38
|
+
:owner_funds => XRBP::NodeStore::STAmount.new(:issue => XRBP::NodeStore::Issue.new("EUR", XRBP::Crypto.no_account), :mantissa => 3523192614770459, :exponent => -15),
|
39
|
+
:quality => XRBP::NodeStore::STAmount.new(:issue => XRBP::NodeStore.no_issue, :mantissa => 1000000000000000, :exponent => -14),
|
40
|
+
} }
|
41
|
+
|
11
42
|
let(:order_book) { [order1, order2] }
|
12
43
|
|
44
|
+
it "provides access to ledger state map"
|
45
|
+
|
46
|
+
it "provides access to ledger tx map"
|
47
|
+
|
48
|
+
it "provides access to ledger info"
|
49
|
+
|
50
|
+
describe "#global_frozen?" do
|
51
|
+
context "account globally frozen in ledger" do
|
52
|
+
it "returns true"
|
53
|
+
end
|
54
|
+
|
55
|
+
context "account not globally frozen in ledger" do
|
56
|
+
it "returns false"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "#frozen?" do
|
61
|
+
context "account trust line frozen" do
|
62
|
+
it "returns true"
|
63
|
+
end
|
64
|
+
|
65
|
+
context "account trust line not frozen" do
|
66
|
+
it "returns false"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "#account_holds" do
|
71
|
+
it "returns balance of account iou trust line"
|
72
|
+
|
73
|
+
context "currency == 'XRP'" do
|
74
|
+
it "returns liquid xrp"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "#xrp_liquid" do
|
79
|
+
context "account not found" do
|
80
|
+
it "returns zero amount minus reserve"
|
81
|
+
end
|
82
|
+
|
83
|
+
it "returns xrp account balance minus reserve"
|
84
|
+
|
85
|
+
context "fix1141 in effect" do
|
86
|
+
it "confines owner account"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe "#confine_owner_account" do
|
91
|
+
it "adjusts and returns amount"
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "#transfer_rate" do
|
95
|
+
it "returns transfer rate for specified issuer"
|
96
|
+
end
|
97
|
+
|
13
98
|
it "provides access to order book" do
|
14
99
|
actual = ledger.order_book(iou1, iou2)
|
15
100
|
expect(actual).to eq(order_book)
|
@@ -0,0 +1,43 @@
|
|
1
|
+
describe XRBP::NodeStore::Indexes do
|
2
|
+
it "returns quality for base" do
|
3
|
+
base = 57159940697819848473151736347809673846048755675063285491534159019684120657920.byte_string
|
4
|
+
described_class.get_quality(base).should eq(6197953087261802496)
|
5
|
+
end
|
6
|
+
|
7
|
+
it "returns next quality for base" do
|
8
|
+
base = 57159940697819848473151736347809673846048755675063285491534159019684120657920.byte_string
|
9
|
+
nxt = 57159940697819848473151736347809673846048755675063285491552605763757830209536
|
10
|
+
described_class.get_quality_next(base).to_bn.should eq(nxt)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "returns directory node index"
|
14
|
+
|
15
|
+
it "returns page index"
|
16
|
+
|
17
|
+
it "returns account index" do
|
18
|
+
account = "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B"
|
19
|
+
described_class.account(account).to_bn.should eq(83149858826312963445632044328430706857892442949720032032422519427184563347763)
|
20
|
+
end
|
21
|
+
|
22
|
+
context "account > issuer" do
|
23
|
+
it "returns trust line index" do
|
24
|
+
account = "rnixnrMHHvR7ejMpJMRCWkaNrq3qREwMDu"
|
25
|
+
iou = {:currency=>"EUR", :account=>"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B"}
|
26
|
+
described_class.line(account, iou).to_bn.should eq(45370088078399581796930875479259405419767996706903582207576813674682296859050)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "account < issuer" do
|
31
|
+
it "returns trust line index" do
|
32
|
+
account = "rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B"
|
33
|
+
iou = {:currency=>"EUR", :account=>"rnixnrMHHvR7ejMpJMRCWkaNrq3qREwMDu"}
|
34
|
+
described_class.line(account, iou).to_bn.should eq(45370088078399581796930875479259405419767996706903582207576813674682296859050)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it "returns order book index" do
|
39
|
+
input = {:currency=>"USD", :account=>"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B"}
|
40
|
+
output = {:currency=>"EUR", :account=>"rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B"}
|
41
|
+
described_class.order_book(input, output).to_bn.should eq(57159940697819848473151736347809673846048755675063285491527961066596858855424)
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
describe XRBP::NodeStore::Rate do
|
2
|
+
it "is convertable to an amount" do
|
3
|
+
rate = described_class.new 2000000000
|
4
|
+
amount = rate.to_amount
|
5
|
+
|
6
|
+
amount.issue.should be(XRBP::NodeStore.no_issue)
|
7
|
+
amount.mantissa.should eq(2000000000000000)
|
8
|
+
amount.exponent.should eq(-15)
|
9
|
+
|
10
|
+
amount.iou_amount.should eq(2)
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
describe XRBP::SHAMap::InnerNode do
|
2
|
+
context "no branches" do
|
3
|
+
it "is empty"
|
4
|
+
|
5
|
+
it "always returns true empty_branch?"
|
6
|
+
|
7
|
+
it "always returns nil child hash"
|
8
|
+
|
9
|
+
it "always returns nil child"
|
10
|
+
end
|
11
|
+
|
12
|
+
context "child branches" do
|
13
|
+
before(:each) do
|
14
|
+
end
|
15
|
+
|
16
|
+
it "is not empty"
|
17
|
+
|
18
|
+
context "querying for non-empty child" do
|
19
|
+
it "returns false empty_branch?"
|
20
|
+
|
21
|
+
it "it returns child hash"
|
22
|
+
|
23
|
+
it "returns child"
|
24
|
+
end
|
25
|
+
|
26
|
+
context "querying for empty child" do
|
27
|
+
it "returns true empty_branch?"
|
28
|
+
|
29
|
+
it "returns nil child hash"
|
30
|
+
|
31
|
+
it "returns nil child"
|
32
|
+
end
|
33
|
+
|
34
|
+
context "querying for invalid branch" do
|
35
|
+
it "always return true empty_child?"
|
36
|
+
|
37
|
+
it "raises error when retrieving child hash"
|
38
|
+
|
39
|
+
it "raises error when retrieving child"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
it "updates hash"
|
44
|
+
end # describe XRBP::SHAMap::InnerNode
|
@@ -0,0 +1,25 @@
|
|
1
|
+
describe XRBP::SHAMap::Node do
|
2
|
+
it "is not a tree_node?" do
|
3
|
+
expect(described_class.new).to_not be_a_tree_node
|
4
|
+
end
|
5
|
+
|
6
|
+
it "is not an inner?" do
|
7
|
+
expect(described_class.new).to_not be_an_inner
|
8
|
+
end
|
9
|
+
|
10
|
+
it "does not allow hash to be updated" do
|
11
|
+
expect { described_class.new.update_hash }.to raise_error("abstract: must be called on a subclass")
|
12
|
+
end
|
13
|
+
|
14
|
+
context "leaf type" do
|
15
|
+
it "is a leaf?" do
|
16
|
+
expect(described_class.new(:type => :transaction_nm)).to be_a_leaf
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context "non leaf type" do
|
21
|
+
it "is not a leaf?" do
|
22
|
+
expect(described_class.new(:type => :infer)).to_not be_a_leaf
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end # describe XRBP::SHAMap::Node
|
@@ -0,0 +1,144 @@
|
|
1
|
+
describe XRBP::SHAMap do
|
2
|
+
describe "#each" do
|
3
|
+
it "iterates over all SHAMap items"
|
4
|
+
end
|
5
|
+
|
6
|
+
describe "#succ" do
|
7
|
+
it "returns next key in tree greater than specified one"
|
8
|
+
|
9
|
+
context "next item is map end" do
|
10
|
+
it "returns nil"
|
11
|
+
end
|
12
|
+
|
13
|
+
context "next item is >= last" do
|
14
|
+
it "returns nil"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "#read" do
|
19
|
+
it "returns SLE read from database"
|
20
|
+
|
21
|
+
context "specified key is zero" do
|
22
|
+
it "raises error"
|
23
|
+
end
|
24
|
+
|
25
|
+
context "not found" do
|
26
|
+
it "returns nil"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "#peek_item" do
|
31
|
+
it "returns item corresponding to database key"
|
32
|
+
|
33
|
+
context "item not found" do
|
34
|
+
it "returns nil"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "#peek_first_item" do
|
39
|
+
it "returns first item below root and stack"
|
40
|
+
|
41
|
+
context "no item" do
|
42
|
+
it "returns nil"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "#peek_next_item" do
|
47
|
+
it "returns next item in map"
|
48
|
+
|
49
|
+
context "specified stack is empty" do
|
50
|
+
it "raises error"
|
51
|
+
end
|
52
|
+
|
53
|
+
context "top of stack is not leaf" do
|
54
|
+
it "raises error"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "#fetch_node" do
|
59
|
+
it "retrieves node from db"
|
60
|
+
|
61
|
+
context "node not found" do
|
62
|
+
it "raises error"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "#fetch_node_nt" do
|
67
|
+
it "retrieves node from db"
|
68
|
+
|
69
|
+
context "node not found" do
|
70
|
+
it "does not raise error"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "#fetch_root" do
|
75
|
+
it "sets @root database node and returns true"
|
76
|
+
|
77
|
+
context "root already set" do
|
78
|
+
it "returns true"
|
79
|
+
end
|
80
|
+
|
81
|
+
context "node not found" do
|
82
|
+
it "returns false"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "#find_key" do
|
87
|
+
it "finds node corresponding to key in map"
|
88
|
+
|
89
|
+
context "key not found" do
|
90
|
+
it "returns nil"
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "#fetch_node_from_db" do
|
95
|
+
it "retrieves key from nodestore"
|
96
|
+
it "creates corresponding node"
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "#upper_bound" do
|
100
|
+
it "returns first item in tree with key > given key"
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "#walk_towards_key" do
|
104
|
+
it "returns path stack of node traversal to key"
|
105
|
+
end
|
106
|
+
|
107
|
+
describe "#descend_throw" do
|
108
|
+
it "descends to parent branch"
|
109
|
+
|
110
|
+
context "could not descend to non-empty branch" do
|
111
|
+
it "raises error"
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe "#descend" do
|
116
|
+
it "retrieve cached child node at parent branch"
|
117
|
+
|
118
|
+
context "parent branch child node not set" do
|
119
|
+
it "fetches and returns node"
|
120
|
+
|
121
|
+
context "not not able to be retrieved" do
|
122
|
+
it "returns nil"
|
123
|
+
end
|
124
|
+
|
125
|
+
context "node is inconsistent" do
|
126
|
+
it "returns nil"
|
127
|
+
end
|
128
|
+
|
129
|
+
it "stores child in parent"
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
describe "#first_below" do
|
134
|
+
it "returns first leaf node at or below the specified node"
|
135
|
+
end
|
136
|
+
|
137
|
+
describe "#cdir_first" do
|
138
|
+
it "returns the first directory index in the node specified by index"
|
139
|
+
end
|
140
|
+
|
141
|
+
describe "#cdir_next" do
|
142
|
+
it "returns the next directory index in the node specified by index"
|
143
|
+
end
|
144
|
+
end # describe XRBP::SHAMap
|
@@ -0,0 +1,64 @@
|
|
1
|
+
describe XRBP::NodeStore::STAmount do
|
2
|
+
it "is negatable"
|
3
|
+
|
4
|
+
it "is convertable to/from wire format" do
|
5
|
+
v = 1000000000000
|
6
|
+
s = described_class.new(:mantissa => v)
|
7
|
+
expect(described_class.from_wire(s.to_wire).to_h).to eq(s.to_h)
|
8
|
+
|
9
|
+
s = described_class.new(:mantissa => v,
|
10
|
+
:issue => XRBP::NodeStore.xrp_issue)
|
11
|
+
expect(described_class.from_wire(s.to_wire).to_h).to eq(s.to_h)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "can be parsed from string" do
|
15
|
+
s = "12345.6789"
|
16
|
+
expect(described_class.parse(s).iou_amount.to_f).to eq(s.to_f)
|
17
|
+
|
18
|
+
expect { described_class.parse("whatever") }.to raise_error("Number 'whatever' is not valid")
|
19
|
+
end
|
20
|
+
|
21
|
+
context "canonicalize" do
|
22
|
+
context "native amount" do
|
23
|
+
context "zero mantissa" do
|
24
|
+
it "zeros exponent"
|
25
|
+
it "is not negative"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "zeros exponent"
|
29
|
+
end
|
30
|
+
|
31
|
+
context "zero mantissa" do
|
32
|
+
it "sets exponent to -100"
|
33
|
+
it "is not negative"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "increases mantissa to >= MIN_VAL"
|
37
|
+
it "increases mantissa to <= MAX_VAL"
|
38
|
+
|
39
|
+
it "increases exponent to >= MIN_OFFSET"
|
40
|
+
it "descreases exponent to <= MAX_OFFSET"
|
41
|
+
|
42
|
+
context "offset cannot be set appropriately" do
|
43
|
+
it "raises value overflow"
|
44
|
+
end
|
45
|
+
|
46
|
+
context "manitssa out of bounds" do
|
47
|
+
it "raises error"
|
48
|
+
end
|
49
|
+
|
50
|
+
context "exponent out of bounds" do
|
51
|
+
it "raises error"
|
52
|
+
end
|
53
|
+
|
54
|
+
context "invalid mantissa / exponent combination" do
|
55
|
+
it "raises error"
|
56
|
+
end
|
57
|
+
end # describe #canoncialize
|
58
|
+
|
59
|
+
it "clears amount"
|
60
|
+
|
61
|
+
it "returns sn_value"
|
62
|
+
it "returns xrp_amount"
|
63
|
+
it "returns iou_amount"
|
64
|
+
end # describe XRBP::NodeStore::STAmount
|