Mapping
Maps are created with storage functions with one or more parameter fields. Nested maps are created by adding more parameters:
func map_a(key : felt) -> (value : felt)
.- Equivalent to
map_a[key]
.
- Equivalent to
func map_b(key1 : felt, key2 : felt) -> (value : felt)
.- Equivalent to
map_b[key1][key2]
.
- Equivalent to
%lang starknet
%builtins pedersen range_check
from starkware.cairo.common.cairo_builtins import HashBuiltin
from starkware.starknet.common.storage import Storage
# A single value.
@storage_var
func store_a() -> (count : felt):
end
# A single mapping of key -> value.
# Specific id_number -> count.
@storage_var
func store_b(id_number : felt) -> (count : felt):
end
# Nested mapping of key1 and key2 -> value
# Specific item size and item price combination -> count.
# Within a storage type (large_cheap, small_expensive).
@storage_var
func store_c(size : felt, price : felt) -> (count : felt):
end
@external
func record_inventory{
storage_ptr : Storage*, pedersen_ptr : HashBuiltin*,
range_check_ptr}(a_val : felt, b_id : felt, b_val : felt,
c_size : felt, c_price : felt, c_val : felt):
store_a.write(a_val)
store_b.write(b_id, b_val)
store_c.write(c_size, c_price, c_val)
return ()
end
@view
func read_inventory{
storage_ptr : Storage*, pedersen_ptr : HashBuiltin*,
range_check_ptr}(b_id : felt, c_size : felt,
c_price : felt) -> (storage_a : felt, storage_b : felt,
storage_c : felt):
alloc_locals
# Read the requested parts of each inventory.
# "let (local xyz)" = func() pattern is used for function return values.
let (local count_a) = store_a.read()
let (local count_b) = store_b.read(b_id)
let (local count_c) = store_c.read(c_size, c_price)
return (count_a, count_b, count_c)
end
Save as mapping.cairo
.
Compile
Then, to compile:
starknet-compile mapping.cairo \
--output mapping_compiled.json \
--abi mapping_contract_abi.json
Deploy
Then, to deploy:
starknet deploy --contract mapping_compiled.json \
--network=alpha
Returns:
Deploy transaction was sent.
Contract address: 0x03408bba79d86ab45ee5ee2b93f36c7fac8786baf6f05d6a666d1d9aa239c86d.
Transaction ID: 497986.
Note: Remove the zero after the x
, 0x[0]12345. E.g., 0x0123abc becomes 0x123abc.
Monitor
Check the status of the transaction:
starknet tx_status --network=alpha --id=497986
Returns:
{
"block_id": 23910,
"tx_status": "PENDING"
}
Interact
Then, to interact, set the inputs to match the order they appear. In this case, recording the inventory of
- 100 type A goods
- 3030 type B goods (with ID 37)
- 44 type C goods that are size 9889, and price $12.
a_val b_id b_val c_size c_price c_val
100 37 3030 9889 12 44
starknet invoke \
--network=alpha \
--address 0x3408bba79d86ab45ee5ee2b93f36c7fac8786baf6f05d6a666d1d9aa239c86d \
--abi mapping_contract_abi.json \
--function record_inventory \
--inputs 100 37 3030 9889 12 44
Returns:
Invoke transaction was sent.
Contract address: 0x03408bba79d86ab45ee5ee2b93f36c7fac8786baf6f05d6a666d1d9aa239c86d.
Transaction ID: 497987.
starknet tx_status --network=alpha --id=497987
Returns:
{
"block_id": 23911,
"tx_status": "PENDING"
}
Read the inventory, specifying the nature of the items from b and c that were stored in the last transaction:
b_id c_size c_price
37 9889 12
Where invoke requires a transaction, call does not.
starknet call \
--network=alpha \
--address 0x3408bba79d86ab45ee5ee2b93f36c7fac8786baf6f05d6a666d1d9aa239c86d \
--abi mapping_contract_abi.json \
--function read_inventory \
--inputs 37 9889 12
Returns:
100 3030 44
Status options:
- NOT_RECEIVED: The transaction has not been received yet (i.e., not written to storage).
- RECEIVED: The transaction was received by the operator.
- PENDING: The transaction passed the validation and is waiting to be sent on-chain.
- REJECTED: The transaction failed validation and thus was skipped.
- ACCEPTED_ONCHAIN: The transaction was accepted on-chain.
- PENDING: The transaction passed the validation and is waiting to be sent on-chain.
Visit the voyager explorer to see the transactions.