跳转到主要内容

ape-starknet:用于StarkNet网络的ape插件

项目描述

快速开始

StarkNet Ethereum L2网络提供插件。

依赖项

  • python3版本3.8或更高,python3-dev

安装

通过pip

您可以通过pip安装最新版本

pip install ape-starknet

通过setuptools

您可以通过克隆仓库并使用setuptools来获取最新版本

git clone https://github.com/ApeWorX/ape-starknet.git
cd ape-starknet
python3 setup.py install

快速使用

账户管理

账户用于执行交易和签名调用数据。账户是Starknet中的智能合约。

默认情况下,ape-starknet自带开发账户。您可以这样访问它们

from ape import accounts

container = accounts.containers["starknet"]
owner = container.test_accounts[0]

查看下面的测试部分,了解有关测试账户的更多信息。

然而,当使用实时网络时,您必须首先导入或创建一个账户。

导入账户

要导入账户,请使用import命令

ape starknet accounts import <ALIAS> \
    --network testnet,testnet2 \
    --address 0x6b7111AA4111e5B2229c3332B66696888164440A773333143333B383333a183 \
    --class-hash "0x025ec026985a3bf9d0cc1fe17326b245dfdc3ff89b8fde106542a3ea56c5a918"
    --salt 123

上面的命令使用了testnet,testnet2的网络值,这意味着Starknet的Goerli测试网和Goerli测试网2网络。您可以多次运行导入命令,以在以后添加更多网络。要一次性添加所有网络,您也可以使用starknet--network值。

如果账户已添加,则可以省略--address标志并使用计算出的地址。如果您知道账户用于计算地址的盐值,则可以使用--salt标志提供该值。这将允许未来的部署使用相同的地址。

导入账户是复杂的。一个常见的用例是导入您的Argent-X钱包。要执行此操作,您可以使用以下命令

ape starknet accounts import <ArgentX-Alias> \
    --network starknet \
    --address 0x6b7111AA4111e5B2229c3332B66696888164440A773333143333B383333a183 \
    --class-hash argentx

然后从应用程序中导出Argent-X私钥并将其粘贴到CLI提示符中。现在,您可以使用您的argent-x账户来资助和创建其他账户!

创建账户

要创建新账户,您可以使用create命令

ape starknet accounts create <NEW-ALIAS>

默认情况下,新账户使用Open Zeppelin账户合约实现。但是,如果您想更改类,请使用--class-hash选项

CLASS_HASH="0x1a7820094feaf82d53f53f214b81292d717e7bb9a92bb2488092cd306f3993f"
ape starknet accounts create <NEW-ALIAS> --class-hash "${CLASS_HASH}"

注意:您可能还需要使用--constructor-calldata标志更改构造函数calldata,以使用不同的账户合约类型。

create命令将首先生成公钥和私钥组合,并存储账户的本地密钥文件。但是,它不会部署账户。它不部署的原因是账户需要资金来支付其部署费用,而且有几种方法可以实现这一点。请参阅Starknet官方指南中的本部分以获取更多信息。

部署账户

要部署新账户,请使用deploy命令

ape starknet accounts deploy <NEW-ALIAS> --network testnet

这仅在账户有资金的情况下才有效。为了方便起见,如果您有另一个有资金的账户,您可以使用该账户通过--funder选项来资助此账户的部署

ape starknet accounts deploy <NEW-ALIAS> --network testnet --funder <EXISTING-FUNDED-ALIAS>

注意:您不能使用Ethereum账户直接向Starknet账户发送资金。您必须使用StarkNet L2桥将现有的Goerli L1 ETH转移到和从L2账户。

列出账户

查看您的账户以及它们的所有部署地址

ape starknet accounts list

显示

Alias                      - <ALIAS>
Public key                 - 0x123444444d716666dd88882bE2e99991555DE1c7
Class hash                 - 0x25ec026985a3bf9d0cc1fe17326b245dfdc3ff89b8fde106542a3ea56c5a918
Contract address (testnet) - 0x6b7111AA4111e5B2229c3332B66696888164440A773333143333B383333a183
Contract address (mainnet) - 0x7873113A4111e5B2229c3332B66696388163440A373333143333B3833332122

删除账户

您还可以删除账户

ape starknet accounts delete <ALIAS> --network testnet,testnet2

delete命令的值取决于其--network--address

  • 要删除给定网络上所有部署,请使用不带--address--network选项。
  • 要删除与地址匹配的所有部署(无论网络如何),请使用不带--network--address选项。
  • 要删除具有特定地址的网络上部署,请使用同时使用--network--address
  • 排除这两个选项以删除整个账户。

请注意,您还可以指定多个网络,就像import一样。

自动签名消息

虽然通常是不好的做法,但有时需要未解锁的密钥文件账户自动签名消息。一个例子是在测试网自动化部署期间。要实现这一点,请使用密钥文件账户上的set_autosign()方法。

import keyring
from ape import accounts

# Use keyring package to store secrets
password = keyring.get_password("starknet-testnet-automations", "ci-shared-account")
testnet_account = accounts.load("starknet-testnet-account")
testnet_account.set_autosign(True, passphrase=password)

# Won't prompt for signing or unlocking
testnet_account.sign_message([123])

声明和部署合约

在 Starknet 中,您可以通过将它们发布到链上来声明合约类型。这允许其他合约使用 部署系统调用 创建它们的实例。

要使用 ape-starknet 声明合约,请按照以下步骤操作(在脚本或控制台)

from ape import accounts, project

account = accounts.load("<MY_STARK_ACCOUNT>")
declaration = account.declare(project.MyContract)
print(declaration.class_hash)

然后,您可以使用 deploy 方法部署合约。注意:在 ape-starknet 中的 deploy 方法会对 Starknet 公共 UDC 合约进行 invoke-function 调用。有关 UDC 合约的更多信息,请参阅这里

from ape import accounts, project

# This only works if `project.MyContract` was declared previously.
# The class hash is not necessary as an argument. Ape will look it up.
account = accounts.load("<MY_STARK_ACCOUNT>")
account.deploy(project.MyContact)

您还可以通过以下方式部署合约

from ape import accounts, project

account = accounts.load("<MY_STARK_ACCOUNT>")
my_contract = project.MyContract.deploy(sender=account)

或者,您可以在本地工厂合约中通过 deploy() 系统调用使用类哈希。例如,我有一个以下 Cairo 工厂合约

from starkware.cairo.common.alloc import alloc
from starkware.starknet.common.syscalls import deploy
from starkware.cairo.common.cairo_builtins import HashBuiltin

@storage_var
func class_hash() -> (class_hash: felt) {
}

@storage_var
func salt() -> (value: felt) {
}

@constructor
func constructor{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}(cls_hash: felt) {
    class_hash.write(value=cls_hash);
    return ();
}

@external
func deploy_my_contract{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}() {
    let (cls_hash) = class_hash.read();
    let (current_salt) = salt.read();
    let (ctor_calldata) = alloc();
    let (contract_addr) = deploy(
        class_hash=cls_hash,
        contract_address_salt=current_salt,
        constructor_calldata_size=0,
        constructor_calldata=ctor_calldata,
        deploy_from_zero=FALSE,
    );
    salt.write(value=current_salt + 1);
    return ();
}

此合约接受已声明合约的类哈希并部署它。以下示例展示了如何使用此工厂类部署其他合约

from ape import Contract, accounts, networks, project

account = accounts.load("<MY_STARK_ACCOUNT>")
declaration = account.declare(project.MyContract)

# NOTE: Assuming you have a contract named 'ContractFactory'.
factory = project.ContractFactory.deploy(declaration.class_hash, sender=account)

call_result = factory.deploy_my_contract()
contract_address = networks.starknet.decode_address(call_result)
contract = Contract(contract_address, contract_type=project.MyContract.contract_type)

合约交互

在您部署合约之后,您可以开始与它们交互。deploy 方法返回一个合约实例,您可以在其上调用方法

from ape import project

contract = project.MyContract.deploy(sender=account)

# Interact with deployed contract
receipt = contract.my_mutable_method(123)
value = contract.my_view_method()

您可以从可变方法的收据中访问返回数据

receipt = contract.my_mutable_method(123)
result = receipt.return_value

包含发送者以委托交易到账户合约

from ape import accounts

account = accounts.load("my_account")
receipt = contract.my_mutable_method(123, sender=account)

注意:目前,要作为参数传递数组,您还必须事先包含数组大小

receipt = contract.store_my_list(3, [1, 2, 3])

测试

账户

您可以在测试中使用 starknet-devnet 账户。

import pytest
import ape


@pytest.fixture
def devnet_accounts():
    return ape.accounts.containers["starknet"].test_accounts


@pytest.fixture
def owner(devnet_accounts):
    return devnet_accounts[0]

此外,在本地网络中部署的任何账户都不会保存到磁盘,并且是临时的。

import pytest
import ape


@pytest.fixture(scope="session")
def ephemeral_account():
    accounts = ape.accounts.containers["starknet"]
    accounts.deploy_account("ALIAS")

    # This account only exists in the devnet and is not a key-file account.
    return accounts.load("ALIAS")

支付费用

Starknet 费用目前以 ETH 支付,它是 Starknet 链上的 ERC-20。要检查您的账户余额(ETH),请在账户上使用 balance 属性

from ape import accounts

acct = accounts.load("Alias")
print(acct.balance)

如果您的账户有正余额,您就可以开始支付费用了!

要支付费用,您可以在调用 invoke-transaction 时手动设置 max_fee 参数

receipt = contract.my_mutable_method(123, max_fee=2900000000000)

注意:如果不设置 max_fee,它将自动设置为从提供者 estimate_gas_cost() 调用返回的值。您不需要显式调用 estimate_gas_cost()

主网 Alpha 白名单部署令牌

目前,要将合约部署到 Alpha-Mainnet,您的合约需要白名单。您可以通过多种方式提供您的 WL 令牌。

通过 Python 代码

from ape import project

my_contract = project.MyContract.deploy(token="MY_TOKEN")

通过环境变量

export ALPHA_MAINNET_WL_DEPLOY_TOKEN="MY_TOKEN"

开发

该项目处于开发中,应被视为测试版。事物可能尚未达到最终状态,可能会发生破坏性更改。欢迎评论、问题、批评和拉取请求。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

ape-starknet-0.6.0.tar.gz (120.4 kB 查看哈希值)

上传时间

构建分布

ape_starknet-0.6.0-py3-none-any.whl (53.6 kB 查看哈希值)

上传时间 Python 3

支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面