Skip to content

Commit 86c4e91

Browse files
committed
move contract args to binary only
1 parent 1d955a3 commit 86c4e91

12 files changed

Lines changed: 137 additions & 117 deletions

File tree

ex/lib/api/api_contractstate.ex

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
defmodule API.ContractState do
2-
def get(key) do
2+
def get(key, parse_term \\ false) do
33
%{db: db, cf: cf} = :persistent_term.get({:rocksdb, Fabric})
4-
RocksDB.get(key, %{db: db, cf: cf.contractstate, term: true})
4+
RocksDB.get(key, %{db: db, cf: cf.contractstate, term: parse_term})
55
end
66

7-
def get_prefix(prefix) do
7+
def get_prefix(prefix, parse_term \\ false) do
88
%{db: db, cf: cf} = :persistent_term.get({:rocksdb, Fabric})
9-
RocksDB.get_prefix(prefix, %{db: db, cf: cf.contractstate, term: true})
9+
RocksDB.get_prefix(prefix, %{db: db, cf: cf.contractstate, term: parse_term})
1010
end
1111
end

ex/lib/api/api_wallet.ex

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,26 @@
11
defmodule API.Wallet do
2-
def balance() do
2+
def balance(symbol \\ "AMA") do
33
pk = Application.fetch_env!(:ama, :trainer_pk)
4-
balance(pk)
4+
balance(pk, symbol)
55
end
66

7-
def balance(pk) do
7+
def balance(pk, symbol \\ "AMA") do
88
pk = if byte_size(pk) != 48, do: Base58.decode(pk), else: pk
9-
coins = Consensus.chain_balance(pk)
9+
coins = Consensus.chain_balance(pk, symbol)
1010
%{flat: coins, float: BIC.Coin.from_flat(coins)}
1111
end
1212

13-
def transfer(to, amount) do
13+
def transfer(symbol, to, amount) do
1414
sk = Application.fetch_env!(:ama, :trainer_sk)
15-
transfer(sk, to, amount)
15+
transfer(sk, symbol, to, amount)
1616
end
1717

18-
def transfer(from_sk, to, amount) do
18+
def transfer(from_sk, symbol, to, amount) do
1919
from_sk = if byte_size(from_sk) != 64, do: Base58.decode(from_sk), else: from_sk
2020
to = if byte_size(to) != 48, do: Base58.decode(to), else: to
2121
amount = if is_float(amount) do trunc(amount * 1_000_000_000) else amount end
22-
tx_packed = TX.build(from_sk, "Coin", "transfer", [to, amount])
22+
amount = if is_integer(amount) do :erlang.integer_to_binary(amount) else amount end
23+
tx_packed = TX.build(from_sk, "Coin", "transfer", [symbol, to, amount])
2324
TXPool.insert(tx_packed)
2425
NodeGen.broadcast(:txpool, :trainers, [[tx_packed]])
2526
end

ex/lib/bic/base.ex

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,20 @@ defmodule BIC.Base do
1010
BIC.Coin.balance(env.txu.tx.signer) >= exec_cost(env.txu)
1111
end
1212

13+
def call_txs_pre_parallel(env, txus) do
14+
Process.delete(:mutations)
15+
Process.delete(:mutations_reverse)
16+
17+
Enum.each(txus, fn(txu)->
18+
kv_put("bic:base:nonce:#{txu.tx.signer}", txu.tx.nonce |> :erlang.integer_to_binary())
19+
exec_cost = exec_cost(txu)
20+
kv_increment("bic:coin:balance:#{txu.tx.signer}:AMA", -exec_cost |> :erlang.integer_to_binary())
21+
kv_increment("bic:coin:balance:#{env.entry.header_unpacked.signer}:AMA", exec_cost |> :erlang.integer_to_binary())
22+
end)
23+
24+
{Process.get(:mutations, []), Process.get(:mutations_reverse, [])}
25+
end
26+
1327
def call_exit(env) do
1428
Process.delete(:mutations)
1529
Process.delete(:mutations_reverse)
@@ -18,15 +32,15 @@ defmodule BIC.Base do
1832
signer = env.entry.header_unpacked.signer
1933

2034
#thank you come again
21-
kv_increment("bic:coin:balance:#{signer}", BIC.Coin.to_flat(1))
35+
kv_increment("bic:coin:balance:#{signer}:AMA", BIC.Coin.to_flat(1) |> :erlang.integer_to_binary())
2236

2337
if rem(env.entry.header_unpacked.height, 1000) == 0 do
2438
kv_put("bic:epoch:segment_vr", env.entry.header_unpacked.vr)
2539
end
2640

2741
cond do
2842
env.entry.header_unpacked.height == 0 ->
29-
kv_put("bic:epoch:trainers:0", [signer])
43+
kv_put("bic:epoch:trainers:0", [signer] |> :erlang.term_to_binary([:deterministic]))
3044
kv_put("bic:epoch:pop:#{signer}", EntryGenesis.pop())
3145
rem(env.entry.header_unpacked.height, 100_000) == 99_999 ->
3246
BIC.Epoch.next(env)
@@ -36,20 +50,6 @@ defmodule BIC.Base do
3650
{Process.get(:mutations, []), Process.get(:mutations_reverse, [])}
3751
end
3852

39-
def call_txs_pre_parallel(env, txus) do
40-
Process.delete(:mutations)
41-
Process.delete(:mutations_reverse)
42-
43-
Enum.each(txus, fn(txu)->
44-
kv_put("bic:base:nonce:#{txu.tx.signer}", txu.tx.nonce)
45-
exec_cost = exec_cost(txu)
46-
kv_increment("bic:coin:balance:#{txu.tx.signer}", -exec_cost)
47-
kv_increment("bic:coin:balance:#{env.entry.header_unpacked.signer}", exec_cost)
48-
end)
49-
50-
{Process.get(:mutations, []), Process.get(:mutations_reverse, [])}
51-
end
52-
5353
def call_tx_actions(env) do
5454
Process.delete(:mutations)
5555
Process.delete(:mutations_reverse)

ex/lib/bic/coin.ex

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ defmodule BIC.Coin do
1212
coins * 10_000_000
1313
end
1414

15+
def to_tenthousandth(coins) when is_integer(coins) do
16+
coins * 100_000
17+
end
18+
1519
def from_flat(coins) do
1620
Float.round(coins / 1_000_000_000, 9)
1721
end
@@ -20,22 +24,25 @@ defmodule BIC.Coin do
2024
@burn_address
2125
end
2226

23-
def burn_balance() do
24-
kv_get("bic:coin:balance:#{@burn_address}") || 0
27+
def burn_balance(symbol \\ "AMA") do
28+
balance(@burn_address)
2529
end
2630

27-
def balance(pubkey) do
28-
kv_get("bic:coin:balance:#{pubkey}") || 0
31+
def balance(pubkey, symbol \\ "AMA") do
32+
case kv_get("bic:coin:balance:#{pubkey}:#{symbol}") do
33+
nil -> 0
34+
value -> :erlang.binary_to_integer(value)
35+
end
2936
end
3037

31-
def call(:transfer, env, [receiver, amount]) do
38+
def call(:transfer, env, [symbol, receiver, amount]) do
3239
if byte_size(receiver) != 48, do: throw(%{error: :invalid_receiver_pk})
3340
amount = if is_binary(amount) do :erlang.binary_to_integer(amount) else amount end
3441
if !is_integer(amount), do: throw(%{error: :invalid_amount})
3542
if amount <= 0, do: throw(%{error: :invalid_amount})
36-
if amount > balance(env.txu.tx.signer), do: throw(%{error: :insufficient_funds})
43+
if amount > balance(env.txu.tx.signer, symbol), do: throw(%{error: :insufficient_funds})
3744

38-
kv_increment("bic:coin:balance:#{env.txu.tx.signer}", -amount)
39-
kv_increment("bic:coin:balance:#{receiver}", amount)
45+
kv_increment("bic:coin:balance:#{env.txu.tx.signer}:#{symbol}", -amount |> :erlang.integer_to_binary())
46+
kv_increment("bic:coin:balance:#{receiver}:#{symbol}", amount |> :erlang.integer_to_binary())
4047
end
4148
end

ex/lib/bic/epoch.ex

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,19 @@ defmodule BIC.Epoch do
22
import ConsensusKV
33

44
@epoch_emission_base BIC.Coin.to_flat(1_000_000)
5+
@epoch_emission_fixed BIC.Coin.to_flat(100_000)
56
@epoch_interval 100_000
67

7-
def epoch_emission(_epoch, acc \\ @epoch_emission_base)
8-
def epoch_emission(0, acc) do acc end
9-
def epoch_emission(epoch, acc) do
8+
def epoch_emission(epoch) do
9+
epoch_emission_1(epoch) + @epoch_emission_fixed
10+
end
11+
12+
defp epoch_emission_1(_epoch, acc \\ @epoch_emission_base)
13+
defp epoch_emission_1(0, acc) do acc end
14+
defp epoch_emission_1(epoch, acc) do
1015
sub = div(acc * 333, 1000000)
11-
epoch_emission(epoch - 1, acc - sub)
16+
emitted = acc - sub
17+
epoch_emission_1(epoch - 1, emitted)
1218
end
1319

1420
def circulating_without_burn(_epoch, _acc \\ 0)
@@ -49,21 +55,20 @@ defmodule BIC.Epoch do
4955
end
5056

5157
# slash sols for malicious trainers
52-
removedTrainers = kv_get("bic:epoch:trainers:removed:#{epoch_fin}") || []
53-
kv_get_prefix("bic:epoch:solutions:")
54-
|> Enum.each(fn({sol, sol_pk})->
55-
if sol_pk in removedTrainers do
56-
kv_delete("bic:epoch:solutions:#{sol}")
57-
end
58-
end)
59-
58+
removedTrainers = kv_get("bic:epoch:trainers:removed:#{epoch_fin}")
59+
removedTrainers = if removedTrainers do :erlang.binary_to_term(removedTrainers, [:safe]) else [] end
6060
leaders = kv_get_prefix("bic:epoch:solutions:")
6161
|> Enum.reduce(%{}, fn({_sol, pk}, acc)->
62-
Map.put(acc, pk, Map.get(acc, pk, 0) + 1)
62+
if pk in removedTrainers do
63+
acc
64+
else
65+
Map.put(acc, pk, Map.get(acc, pk, 0) + 1)
66+
end
6367
end)
6468
|> Enum.sort_by(& {elem(&1,1), elem(&1,0)}, :desc)
6569

6670
trainers = kv_get("bic:epoch:trainers:#{epoch_fin}")
71+
trainers = if trainers do :erlang.binary_to_term(trainers, [:safe]) else [] end
6772
trainers_to_recv_emissions = leaders
6873
|> Enum.filter(& elem(&1,0) in trainers)
6974
|> Enum.take(top_x)
@@ -74,9 +79,9 @@ defmodule BIC.Epoch do
7479

7580
emission_address = kv_get("bic:epoch:emission_address:#{trainer}")
7681
if emission_address do
77-
kv_increment("bic:coin:balance:#{emission_address}", coins)
82+
kv_increment("bic:coin:balance:#{emission_address}:AMA", coins |> :erlang.integer_to_binary())
7883
else
79-
kv_increment("bic:coin:balance:#{trainer}", coins)
84+
kv_increment("bic:coin:balance:#{trainer}:AMA", coins |> :erlang.integer_to_binary())
8085
end
8186
end)
8287

@@ -96,10 +101,10 @@ defmodule BIC.Epoch do
96101
#end
97102
end
98103
new_trainers = Enum.shuffle(new_trainers)
99-
kv_put("bic:epoch:trainers:#{epoch_next}", new_trainers)
104+
kv_put("bic:epoch:trainers:#{epoch_next}", new_trainers |> :erlang.term_to_binary([:deterministic]))
100105

101106
height = String.pad_leading("#{env.entry.header_unpacked.height+1}", 12, "0")
102-
kv_put("bic:epoch:trainers:height:#{height}", new_trainers)
107+
kv_put("bic:epoch:trainers:height:#{height}", new_trainers |> :erlang.term_to_binary([:deterministic]))
103108
end
104109

105110
def slash_trainer_verify(cur_epoch, malicious_pk, trainers, mask, signature) do
@@ -117,12 +122,16 @@ defmodule BIC.Epoch do
117122
end
118123

119124
def call(:slash_trainer, env, [epoch, malicious_pk, signature, mask_size, mask]) do
125+
epoch = if is_binary(epoch) do :erlang.binary_to_integer(epoch) else epoch end
126+
mask_size = if is_binary(mask_size) do :erlang.binary_to_integer(mask_size) else mask_size end
127+
120128
cur_epoch = Entry.epoch(env.entry)
121129
<<mask::size(mask_size)-bitstring, _::bitstring>> = mask
122130

123131
if cur_epoch != epoch, do: throw(%{error: :invalid_epoch})
124132

125133
trainers = kv_get("bic:epoch:trainers:#{cur_epoch}")
134+
trainers = if trainers do :erlang.binary_to_term(trainers, [:safe]) else [] end
126135
if malicious_pk not in trainers, do: throw(%{error: :invalid_trainer_pk})
127136

128137
# 75% vote
@@ -134,14 +143,15 @@ defmodule BIC.Epoch do
134143
msg = <<"slash_trainer", cur_epoch::32-little, malicious_pk::binary>>
135144
if !BlsEx.verify?(apk, signature, msg, BLS12AggSig.dst_motion()), do: throw %{error: :invalid_signature}
136145

137-
removed = kv_get("bic:epoch:trainers:removed:#{cur_epoch}") || []
138-
kv_put("bic:epoch:trainers:removed:#{cur_epoch}", removed ++ [malicious_pk])
146+
removed = kv_get("bic:epoch:trainers:removed:#{cur_epoch}")
147+
removed = if removed do :erlang.binary_to_term(removed, [:safe]) else [] end
148+
kv_put("bic:epoch:trainers:removed:#{cur_epoch}", (removed ++ [malicious_pk]) |> :erlang.term_to_binary([:deterministic]))
139149

140150
new_trainers = trainers -- [malicious_pk]
141-
kv_put("bic:epoch:trainers:#{cur_epoch}", new_trainers)
151+
kv_put("bic:epoch:trainers:#{cur_epoch}", new_trainers |> :erlang.term_to_binary([:deterministic]))
142152

143153
height = String.pad_leading("#{env.entry.header_unpacked.height+1}", 12, "0")
144-
kv_put("bic:epoch:trainers:height:#{height}", new_trainers)
154+
kv_put("bic:epoch:trainers:height:#{height}", new_trainers |> :erlang.term_to_binary([:deterministic]))
145155
end
146156

147157
@doc """

ex/lib/consensus/consensus.ex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,12 @@ defmodule Consensus do
108108

109109
def chain_nonce(pk) do
110110
%{db: db, cf: cf} = :persistent_term.get({:rocksdb, Fabric})
111-
RocksDB.get("bic:base:nonce:#{pk}", %{db: db, cf: cf.contractstate, term: true})
111+
RocksDB.get("bic:base:nonce:#{pk}", %{db: db, cf: cf.contractstate, to_integer: true})
112112
end
113113

114-
def chain_balance(pk) do
114+
def chain_balance(pk, symbol \\ "AMA") do
115115
%{db: db, cf: cf} = :persistent_term.get({:rocksdb, Fabric})
116-
RocksDB.get("bic:coin:balance:#{pk}", %{db: db, cf: cf.contractstate, term: true}) || 0
116+
RocksDB.get("bic:coin:balance:#{pk}:#{symbol}", %{db: db, cf: cf.contractstate, to_integer: true}) || 0
117117
end
118118

119119
def chain_tip() do

0 commit comments

Comments
 (0)