December 26, 2022

StarkNet Deploy Smart Contract

Все действия выполнялись через workspace на сайте gitpod.

Выполняем каждую команду отдельно:

  • sudo apt install -y libgmp3-dev
  • sudo apt install python3.9
  • pip3 install cairo-lang

Везде, где просит нажимаем "y"

Создаем кошелёк:

  • export STARKNET_NETWORK=alpha-goerli
  • export STARKNET_WALLET=starkware.starknet.wallets.open_zeppelin.OpenZeppelinAccount
  • starknet new_account

Сохраняем account address и public key. Получаем тестовые токены через StarkNet Faucet

  • starknet deploy_account

Получаем Transaction Hash и ждём пока аккаунт задеплоится, отслеживать транзакцию можно через Starscan.

  • mkdir starknet
  • cd starknet
  • vim contract.cairo

Нажимаем "Ctrl+Z" и идём в папку starknet. Открываем файл contract.cairo и вставляем в него следующий код:

// Declare this file as a StarkNet contract.
%lang starknet

from starkware.cairo.common.cairo_builtins import HashBuiltin

// Define a storage variable.
@storage_var
func balance() -> (res: felt) {
}

// Increases the balance by the given amount.
@external
func increase_balance{
    syscall_ptr: felt*,
    pedersen_ptr: HashBuiltin*,
    range_check_ptr,
}(amount: felt) {
    let (res) = balance.read();
    balance.write(res + amount);
    return ();
}

// Returns the current balance.
@view
func get_balance{
    syscall_ptr: felt*,
    pedersen_ptr: HashBuiltin*,
    range_check_ptr,
}() -> (res: felt) {
    let (res) = balance.read();
    return (res=res);
}

Удаляем из названия файла первую точку и .swp что-бы финальное название было "contract.cairo".

  • starknet-compile contract.cairo \
    --output contract_compiled.json \
    --abi contract_abi.json
  • starknet declare --contract contract_compiled.json

Сохраняем contract class hash для следующего шага и ждём завершения транзакции.

  • starknet deploy --class_hash $CLASS_HASH (заменяем $CLASS_HASH на contract class hash из предыдущего шага)

Сохраняем contract address и ждём завершения транзакции.

  • starknet invoke \
    --address ${CONTRACT_ADDRESS} \
    --abi contract_abi.json \
    --function increase_balance \
    --inputs 1234

Заменяем ${CONTRACT_ADDRESS} на contract address из предыдущего шага.

Проверяем прошла ли последняя транзакция и радуемся запущеному контракту.