跳到主要内容

合约

什么是StarkNet 合约

StarkNet合约是一种在StarkNet平台上运行的智能合约。由StarkWare开发的Layer 2扩展性解决方案,旨在为以太坊网络提供更高的吞吐量和更低的交易费用。

信息

与以太坊不同,StarkNet利用了零知识证明技术(Zero-Knowledge Proofs),这使得在链上进行更多的计算成为可能,同时减少了与主网络的互动次数,提高了扩展性和性能。

StarkNet合约允许开发者构建和部署基于StarkNet的分布式应用程序(DApps)。与以太坊的智能合约类似,StarkNet合约可以定义规则和逻辑,以执行各种操作,例如转账资产、记录数据和执行复杂的计算。

工具依赖

注意

由于 madara 尚不支持高于 2.1.0 版本的 cairo。

工具链需要指定更低的版本!

  • scarb(Cairo 和 Starknet 生态系统的构建工具链和软件包管理器)
  • sncast (与星网智能合约交互、发送交易和获取链数据的一体化工具)
#版本描述
sncast0.9.1与星网智能合约交互、发送交易和获取链数据的一体化工具。
scarb0.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

DeclareCotract

在部署步骤中需要当前声明合约时,服务端返回的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 是合约构造函数的参数。构造函数参数因合约而异,详情请参见合约代码。

在我们的桥接合约中,参数是两个地址的值(这里我们输入了刚刚部署的账户地址)。

信息

如果你还没有部署过账户,可以阅读有关部署账户的文档。

部署账户

DeployContract

命令行返回的 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

NFTDeclare

在部署步骤中需要当前声明合约时,服务端返回的class_hash。

部署NFT合约

sncast \
--account <account_name> \
--url http://127.0.0.1:9944 \
deploy \
--class-hash <class-hash>

<class-hash> 是上一步声明后终端的输出 的 clash_hash 。

信息

如果你还没有部署过账户,可以阅读有关部署账户的文档。

Deploy Account

NFTDeploy

命令行返回的 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>"

MintToken

检查Mint 结果

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

NFTOwnerOf

转移 NFT

在转移NFT之前,需要先部署一个新的账户。

创建账号

sncast \
--url http://127.0.0.1:9944 \
account create \
--name <account_name> \
--class-hash 0x6280083f8c2a2db9f737320d5e3029b380e0e820fe24b8d312a6a34fdba0cd

AccountCreate

更新账号余额

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

UpdateCreateAccountBalance

部署新账号

sncast --url http://127.0.0.1:9944 \
account deploy \
--name <account_name> --max-fee 86460

DeployCreateAccount

转移NFT到新的账号

sncast -u http://127.0.0.1:9944 \
--account <origin_account_name> \
invoke --contract-address <contract_address> \
--function "transfer_from" \
--calldata "<origin_account_address> <new_account_address> <token_id>"

TransferNFT

检查NFT转移结果

sncast -u http://127.0.0.1:9944  \
call --contract-address <contract_address> \
--function "owner_of" --calldata "<token_id>"

CheckTransferNFTResult

可以看到NFT已经转移到了新的账号。