合约
什么是StarkNet 合约
StarkNet合约是一种在StarkNet平台上运行的智能合约。由StarkWare开发的Layer 2扩展性解决方案,旨在为以太坊网络提供更高的吞吐量和更低的交易费用。
与以太坊不同,StarkNet利用了零知识证明技术(Zero-Knowledge Proofs),这使得在链上进行更多的计算成为可能,同时减少了与主网络的互动次数,提高了扩展性和性能。
StarkNet合约允许开发者构建和部署基于StarkNet的分布式应用程序(DApps)。与以太坊的智能合约类似,StarkNet合约可以定义规则和逻辑,以执行各种操作,例如转账资产、记录数据和执行复杂的计算。
工具依赖
由于 madara 尚不支持高于 2.1.0 版本的 cairo。
工具链需要指定更低的版本!
- scarb(Cairo 和 Starknet 生态系统的构建工具链和软件包管理器)
- sncast (与星网智能合约交互、发送交易和获取链数据的一体化工具)
| # | 版本 | 描述 |
|---|---|---|
| sncast | 0.9.1 | 与星网智能合约交互、发送交易和获取链数据的一体化工具。 |
| scarb | 0.6.2 | 开罗和星网生态系统的构建工具链和软件包管理器。 |
安装 scarb
curl --proto '=https' --tlsv1.2 -sSf https://docs.swmansion.com/scarb/install.sh | sh -s -- -v 0.6.2
安装 sncast
curl -L https://raw.githubusercontent.com/foundry-rs/starknet-foundry/master/scripts/install.sh | sh
指定版本
snfoundryup -v 0.9.1
Scarb 是什么
scarb是什么?StarkNet 的官方包管理器。
scarb 通过以下方式 让开发StarkNet合约变得更轻松:
- 安装 Cairo 软件包时,它会处理添加、更新和删除依赖项。
- 您可以使用它来编译智能合约。
- 创建您自己的 Cairo 包时,它会负责从 Github 修补您需要的任何库,并让您知道是否存在版本不匹配。然后,您可以使用 Cairo 测试运行程序来构建和测试您的项目。速度相当快。
- 它包含内置的 Cairo 编译器,因此除非您实际上是编译器开发人员,否则不需要设置任何额外的工具。
- 它包含Cairo语言服务器的捆绑二进制文件,您可以使用它
- 它与 Cairo 生态系统中的其他工具(例如 Foundry 和 Dojo)配合良好。
什么是 sncast
sncast是什么?sncast 是一个命令行工具,用于与 StarkNet 智能合约进行交互、发送交易和获取链数据。
Starknet Foundry 包括以下功能:
- 快速测试框架 Forge。Forge 的性能可与 Cairo Test Runner 相媲美,但用户体验更好。您可以测试智能合约中的独立功能,并嵌入复杂的部署流程。
- 支持合约打印。根据文档,调试功能将在 Starknet 编译器中添加支持后推出。
- 在线 Foundry Book 提供了大量有用的信息和指导,有助于编写和运行测试以及与 Starknet 交互。
- sncast 是一个集成的 CLI,专门用于执行 Starknet RPC 调用、发送事务和获取 Starknet 链数据。你可以使用 sncast 来声明、部署和使用 Starknet JSON-RPC 与合约交互。
部署合约流程
- 编译合约
- 声明合约
- 部署
教程
Build 合约
下面是构建合约的示例
Clone 示例项目
git clone https://github.com/Generative-Labs/web3mq_bridge_contract.git
cd web3mq_bridge_contract
# 签出 cairo 2.1 版本分支 git checkout cairo_2.1.0
使用 scarb构建合约
scarb clean && scarb build
声明
sncast --account 0x3 --url http://127.0.0.1:9944 \
declare --contract-name Web3mqBridge

在部署步骤中需要当前声明合约时,服务端返回的class_hash。
部署
sncast \
--account 0x3 \
--url http://127.0.0.1:9944 \
deploy \
--class-hash <class-hash> \
--constructor-calldata "<Address> <Address>"
<class-hash> 是上一步声明后终端的输出 的 clash_hash 。
--constructor-calldata 是合约构造函数的参数。构造函数参数因合约而异,详情请参见合约代码。
在我们的桥接合约中,参数是两个地址的值(这里我们输入了刚刚部署的账户地址)。
如果你还没有部署过账户,可以阅读有关部署账户的文档。

命令行返回的 contract_address 是已成功部署的合同的地址。
NFT 合约
Build NFT 合约
下面是构建NFT合约的示例
git clone https://github.com/Generative-Labs/madara-nft-contract
cd madara-nft-contract
由于 madara 尚不支持高于 2.1.0 版本的 cairo。
工具链需要指定更低的版本!
curl --proto '=https' --tlsv1.2 -sSf https://docs.swmansion.com/scarb/install.sh | sh -s -- -v 0.6.2
使用 scarb构建合约
scarb clean && scarb build
声明NFT合约
sncast --account 0x3 --url http://127.0.0.1:9944 \
declare --contract-name MadaraNFT

在部署步骤中需要当前声明合约时,服务端返回的class_hash。
部署NFT合约
sncast \
--account <account_name> \
--url http://127.0.0.1:9944 \
deploy \
--class-hash <class-hash>
<class-hash> 是上一步声明后终端的输出 的 clash_hash 。
如果你还没有部署过账户,可以阅读有关部署账户的文档。

命令行返回的 contract_address 是已成功部署的合同的地址。
Mint
token_id 是cairo中的 u256 类型. u256有两部分组成,高位和低位,是一个数组的形式。
token_uri_hex 是cairo中的felt252类型
下面是在python中使用 token_uri_hex 的示例
token_uri = 'i.ibb.co/7XK7CDZ/im-394091.jpg'
token_uri_hex = hex(int.from_bytes(token_uri.encode('utf-8'), 'big'))
sncast -u http://127.0.0.1:9944 \
--account 0x3 \
invoke --contract-address <contract_address> \
--function "mint_with_url" \
--calldata "<token_id> <token_uri_hex>"

检查Mint 结果
sncast -u http://127.0.0.1:9944 \
call --contract-address <contract_address> \
--function "token_uri" --calldata "<token_id>"

转移 NFT
在转移NFT之前,需要先部署一个新的账户。
创建账号
sncast \
--url http://127.0.0.1:9944 \
account create \
--name <account_name> \
--class-hash 0x6280083f8c2a2db9f737320d5e3029b380e0e820fe24b8d312a6a34fdba0cd

更新账号余额
sncast -u http://127.0.0.1:9944 \
--account 0x3 \
invoke --contract-address 0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7 \
--function "transfer" \
--calldata "<YourAddress> 100000 100000"

部署新账号
sncast --url http://127.0.0.1:9944 \
account deploy \
--name <account_name> --max-fee 86460