Skip to content

Commit

Permalink
feat: add raw data pointers support for ceres (#1708)
Browse files Browse the repository at this point in the history
  • Loading branch information
vatanasov committed Apr 2, 2024
1 parent c84392b commit f220f48
Show file tree
Hide file tree
Showing 8 changed files with 86 additions and 24 deletions.
2 changes: 1 addition & 1 deletion .github/actions/node-setup/action.yml
Expand Up @@ -7,5 +7,5 @@ runs:
- name: Setup Node
shell: bash
run: |
curl -L https://github.com/aeternity/aeternity/releases/download/v6.7.0/aeternity-v6.7.0-ubuntu-x86_64.tar.gz -o aeternity.tgz \
curl -L https://github.com/aeternity/aeternity/releases/download/v6.12.0/aeternity-v6.12.0-ubuntu-x86_64.tar.gz -o aeternity.tgz\
&& mkdir -p ${NODEROOT}/rel/aeternity && tar xf aeternity.tgz -C ${NODEROOT}/rel/aeternity && cp -rf ${NODEROOT}/rel/aeternity/lib/ ${NODEROOT}
3 changes: 2 additions & 1 deletion lib/ae_mdw/db/format.ex
Expand Up @@ -113,9 +113,10 @@ defmodule AeMdw.Db.Format do
end)
end

@spec enc_id(aeser_id() | nil) :: nil | String.t()
@spec enc_id(aeser_id() | Names.raw_data_pointer() | nil) :: nil | String.t()
def enc_id(nil), do: nil
def enc_id({:id, _type, _pk} = id), do: Enc.encode(:id_hash, id)
def enc_id({:data, binary}) when is_binary(binary), do: Enc.encode(:bytearray, binary)

defp custom_raw_data(_state, :contract_create_tx, tx, tx_rec, _signed_tx, block_hash) do
init_call_details = Contract.get_init_call_details(tx_rec, block_hash)
Expand Down
1 change: 1 addition & 0 deletions lib/ae_mdw/names.ex
Expand Up @@ -40,6 +40,7 @@ defmodule AeMdw.Names do
@type ttl :: non_neg_integer()
@type pointer :: term()
@type pointers :: [pointer()]
@type raw_data_pointer :: {:data, binary()}
@type query :: %{binary() => binary()}

@typep state() :: State.t()
Expand Down
6 changes: 5 additions & 1 deletion lib/ae_mdw/validate.ex
Expand Up @@ -4,13 +4,14 @@ defmodule AeMdw.Validate do
alias AeMdw.Node, as: AE
alias AeMdw.Db.State
alias AeMdw.Error.Input, as: ErrInput
alias AeMdw.Names
alias :aeser_api_encoder, as: Enc

@typep pubkey :: AE.Db.pubkey()
@typep hash_str :: String.t()
@typep hash_type :: :micro_block_hash | :key_block_hash
@typep hash :: AE.Db.hash()
@typep id :: String.t() | {:id, atom(), pubkey()}
@typep id :: String.t() | {:id, atom(), pubkey()} | Names.raw_data_pointer()
@typep tx_type :: AE.tx_type()
@typep tx_group :: AE.tx_group()
@typep tx_field :: atom()
Expand Down Expand Up @@ -39,6 +40,9 @@ defmodule AeMdw.Validate do
def id({:id, _tag, <<_pk::256>> = pk}),
do: {:ok, pk}

def id({:data, pk}) when is_binary(pk),
do: {:ok, pk}

def id(id),
do: {:error, {ErrInput.Id, id}}

Expand Down
59 changes: 57 additions & 2 deletions test/ae_mdw/db/name_test.exs
Expand Up @@ -20,6 +20,7 @@ defmodule AeMdw.Db.NameTest do
name = "binarypointer.chain"
pointer_id = :aeser_id.create(:account, <<1::256>>)
oracle_id = :aeser_id.create(:oracle, <<1::256>>)
raw_data_pointer = {:data, "raw data pointer"}

non_string_pointer_key =
<<104, 65, 117, 174, 49, 251, 29, 202, 69, 174, 147, 56, 60, 150, 188, 247, 149, 85, 150,
Expand All @@ -43,7 +44,8 @@ defmodule AeMdw.Db.NameTest do
name_ttl: 1_000,
pointers: [
{:pointer, non_string_pointer_key, pointer_id},
{:pointer, "oracle_pubkey", oracle_id}
{:pointer, "oracle_pubkey", oracle_id},
{:pointer, "account_pubkey", raw_data_pointer}
],
client_ttl: 1_000,
fee: 5_000
Expand All @@ -65,7 +67,60 @@ defmodule AeMdw.Db.NameTest do

pointers_map = %{
non_string_pointer_key64 => Format.enc_id(pointer_id),
"oracle_pubkey" => Format.enc_id(oracle_id)
"oracle_pubkey" => Format.enc_id(oracle_id),
"account_pubkey" => Format.enc_id(raw_data_pointer)
}

assert ^pointers_map =
Name.pointers(
State.new(store),
Model.name(index: name, active: active_height)
)
end
end

test "encodes raw data pointer key to base64" do
name = "binarypointer.chain"
raw_data_pointer = {:data, "raw data pointer"}

active_height = 123
tx_hash = :crypto.strong_rand_bytes(32)

with_mocks [
{AeMdw.Node.Db, [:passthrough],
[
get_tx_data: fn ^tx_hash ->
{:ok, name_hash} = :aens.get_name_hash(name)

{:ok, aetx} =
:aens_update_tx.new(%{
account_id: :aeser_id.create(:account, <<2::256>>),
nonce: 1,
name_id: :aeser_id.create(:name, name_hash),
name_ttl: 1_000,
pointers: [
{:pointer, "oracle_pubkey", raw_data_pointer}
],
client_ttl: 1_000,
fee: 5_000
})

{_mod, tx_rec} = :aetx.specialize_type(aetx)
{nil, :name_update_tx, nil, tx_rec}
end
]}
] do
store =
NullStore.new()
|> MemStore.new()
|> Store.put(
Model.Tx,
Model.tx(index: 2, id: tx_hash, block_index: {1, 1})
)
|> Store.put(Model.NameUpdate, Model.name_update(index: {name, active_height, {2, -1}}))

pointers_map = %{
"oracle_pubkey" => Format.enc_id(raw_data_pointer)
}

assert ^pointers_map =
Expand Down
31 changes: 13 additions & 18 deletions test/ae_mdw/db/sync/name_test.exs
Expand Up @@ -18,6 +18,16 @@ defmodule AeMdw.Db.Sync.NameTest do

require Model

setup do
pointers = [
{:pointer, <<2::256>>, :aeser_id.create(:account, <<3::256>>)},
{:pointer, <<4::256>>, :aeser_id.create(:account, <<5::256>>)},
{:pointer, <<6::256>>, {:data, "raw data pointer"}}
]

%{pointers: pointers}
end

describe "name_claim_mutations/4" do
test "includes origin mutations for auction name" do
plain_name = "auction-name.chain"
Expand Down Expand Up @@ -115,18 +125,13 @@ defmodule AeMdw.Db.Sync.NameTest do
end

describe "update_mutations/4" do
test "updates name and expiration on ttl > 0" do
test "updates name and expiration on ttl > 0", %{pointers: pointers} do
plain_name = new_name()
block_index = {Enum.random(100_000..200_000), 1}
txi = Enum.random(100_000_000..999_999_999)
absolute_ttl = 100
name_hash = :crypto.strong_rand_bytes(32)

pointers = [
{:pointer, <<2::256>>, :aeser_id.create(:account, <<3::256>>)},
{:pointer, <<4::256>>, :aeser_id.create(:account, <<5::256>>)}
]

{:ok, aetx} =
:aens_update_tx.new(%{
account_id: :aeser_id.create(:account, <<1::256>>),
Expand Down Expand Up @@ -156,18 +161,13 @@ defmodule AeMdw.Db.Sync.NameTest do
end
end

test "updates name and expiration on delta ttl > 0" do
test "updates name and expiration on delta ttl > 0", %{pointers: pointers} do
plain_name = new_name()
block_index = {height, _mbi} = {Enum.random(100_000..200_000), 1}
txi = Enum.random(100_000_000..999_999_999)
delta_ttl = 100
name_hash = :crypto.strong_rand_bytes(32)

pointers = [
{:pointer, <<2::256>>, :aeser_id.create(:account, <<3::256>>)},
{:pointer, <<4::256>>, :aeser_id.create(:account, <<5::256>>)}
]

{:ok, aetx} =
:aens_update_tx.new(%{
account_id: :aeser_id.create(:account, <<1::256>>),
Expand Down Expand Up @@ -197,18 +197,13 @@ defmodule AeMdw.Db.Sync.NameTest do
end
end

test "ignores zero ttl and update when call is internal" do
test "ignores zero ttl and update when call is internal", %{pointers: pointers} do
plain_name = new_name()
block_index = {Enum.random(100_000..200_000), 1}
txi = Enum.random(100_000_000..999_999_999)
ttl = 0
name_hash = :crypto.strong_rand_bytes(32)

pointers = [
{:pointer, <<2::256>>, :aeser_id.create(:account, <<3::256>>)},
{:pointer, <<4::256>>, :aeser_id.create(:account, <<5::256>>)}
]

{:ok, aetx} =
:aens_update_tx.new(%{
account_id: :aeser_id.create(:account, <<1::256>>),
Expand Down
5 changes: 4 additions & 1 deletion test/support/ae_mdw/node/aetx_fixtures.ex
Expand Up @@ -18,7 +18,10 @@ defmodule AeMdw.Node.AeTxFixtures do
nonce: 1,
name_id: :aeser_id.create(:name, name_hash),
name_ttl: name_ttl,
pointers: [:aens_pointer.new("account_pubkey", account_id)],
pointers: [
:aens_pointer.new("account_pubkey", account_id),
:aens_pointer.new("account_pubkey_binary", "raw data pointer")
],
client_ttl: 0,
fee: 17_780_000_000_000
})
Expand Down
3 changes: 3 additions & 0 deletions test/support/blockchain_sim.ex
Expand Up @@ -220,6 +220,9 @@ defmodule AeMdwWeb.BlockchainSim do
header = :aec_blocks.to_header(top_block)
{:ok, block_hash} = :aec_headers.hash_header(header)
block_hash
end,
ensure_activity: fn _type, fun ->
fun.()
end
]

Expand Down

0 comments on commit f220f48

Please sign in to comment.