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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 91e10d82fd5acba46f864ff828545fdec5f7df6118abe8779b8f493211a66e29 |
|
MD5 | 716b7684d444d81aadf0f1c3bf7365bb |
|
BLAKE2b-256 | 0095f50144e6f943ae53ba699283ac73e1d0cef6f5c2ce22d7a4b63780f349ff |
ape_starknet-0.6.0-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | f644eb38b82f4f7d45249e1fef5211d52f9c3aecf9c2eda1ee8a97f30358721d |
|
MD5 | 9675eb997d41d179d874debe07b9171e |
|
BLAKE2b-256 | 64c0a7b02c74ebc00514d5a77a283e2373175ea69dec31c341349a76c8c5cedc |