A comprehensive guide to using the Autonomi network with the Elixir SDK.
# Add to mix.exs dependencies
defp deps do
[
{:antd, "~> 0.1"}
]
end# Fetch dependencies
mix deps.get
# Start local testnet
ant dev start# REST transport (default)
{:ok, client} = Antd.Client.new()
# Custom endpoint
{:ok, client} = Antd.Client.new(transport: :rest, base_url: "http://localhost:8080")
# gRPC transport
{:ok, client} = Antd.Client.new(transport: :grpc, target: "localhost:50051")
# Bang variant (raises on error)
client = Antd.Client.new!(){:ok, status} = Antd.Client.health(client)
IO.puts("Healthy: #{status.ok}")
IO.puts("Network: #{status.network}") # "local", "default", or "alpha"
# Bang variant
status = Antd.Client.health!(client)Store and retrieve arbitrary bytes on the network.
# Store
{:ok, result} = Antd.Client.data_put_public(client, "Hello, Autonomi!")
IO.puts("Address: #{result.address}")
IO.puts("Cost: #{result.cost} atto tokens")
# Retrieve
{:ok, data} = Antd.Client.data_get_public(client, result.address)
IO.puts(data) # "Hello, Autonomi!"
# Cost estimation
{:ok, cost} = Antd.Client.data_cost(client, "some data")
IO.puts("Would cost: #{cost} atto tokens")
# Bang variants
result = Antd.Client.data_put_public!(client, "Hello, Autonomi!")
data = Antd.Client.data_get_public!(client, result.address)Encrypted data -- only accessible with the data map.
# Store (self-encrypting)
{:ok, result} = Antd.Client.data_put_private(client, "secret message")
data_map = result.address # Keep this secret!
# Retrieve (decrypt)
{:ok, data} = Antd.Client.data_get_private(client, data_map)
IO.puts(data)# Upload a file
{:ok, result} = Antd.Client.file_upload_public(client, "/path/to/file.txt")
IO.puts("File address: #{result.address}")
# Download a file
:ok = Antd.Client.file_download_public(client, result.address, "/path/to/output.txt")
# Upload a directory
{:ok, result} = Antd.Client.dir_upload_public(client, "/path/to/directory")
# Download a directory
:ok = Antd.Client.dir_download_public(client, result.address, "/path/to/output_dir")
# Cost estimation
{:ok, cost} = Antd.Client.file_cost(client, "/path/to/file.txt")key = :crypto.strong_rand_bytes(32) |> Base.encode16(case: :lower)
content = :crypto.strong_rand_bytes(32) |> Base.encode16(case: :lower)
# Create a root node
{:ok, result} = Antd.Client.graph_entry_put(client, key,
parents: [],
content: content,
descendants: []
)
IO.puts("Graph entry: #{result.address}")
# Read
{:ok, entry} = Antd.Client.graph_entry_get(client, result.address)
IO.puts("Owner: #{entry.owner}")
IO.puts("Content: #{entry.content}")
IO.puts("Parents: #{inspect(entry.parents)}")
IO.puts("Descendants: #{inspect(entry.descendants)}")
# Check existence
{:ok, exists} = Antd.Client.graph_entry_exists(client, result.address)The Elixir SDK returns {:ok, result} or {:error, reason} tuples. Bang variants (e.g., health!) raise an Antd.Error exception on failure.
case Antd.Client.data_get_public(client, "nonexistent") do
{:ok, data} ->
IO.puts("Got data")
{:error, %Antd.Error{code: :not_found}} ->
IO.puts("Not found")
{:error, %Antd.Error{code: :payment}} ->
IO.puts("Payment issue")
{:error, %Antd.Error{code: :network}} ->
IO.puts("Network unreachable")
{:error, %Antd.Error{code: code, message: message}} ->
IO.puts("Error (#{code}): #{message}")
end# Bang variant raises on error
try do
Antd.Client.data_get_public!(client, "nonexistent")
rescue
e in Antd.Error ->
IO.puts("Error (#{e.code}): #{e.message}")
endError codes:
| Code Atom | HTTP Code | When |
|---|---|---|
:bad_request |
400 | Invalid parameters |
:payment |
402 | Insufficient funds |
:not_found |
404 | Resource not found |
:already_exists |
409 | Duplicate creation |
:fork |
409 | Version conflict |
:too_large |
413 | Payload too large |
:internal |
500 | Server error |
:network |
502 | Network unreachable |
# Run individual examples
ant dev example connect -l elixir
ant dev example data -l elixir
ant dev example all -l elixir
# Or directly
mix run antd-elixir/examples/01_connect.exs
mix run antd-elixir/examples/02_data.exsSee antd-elixir/examples/ for the complete set of examples.