.前面的部署代码)

时间: 2026-02-20 2:21 阅读数: 1人阅读

StarkNet开发入门:从零开始构建你的去中心化应用**


StarkNet作为以太坊Layer 2扩容解决方案的代表之一,以其基于STARK证明的高安全性、低交易成本和强大的隐私保护潜力,正吸引着越来越多开发者的关注,如果你对构建去中心化应用(DApp)并希望利用高性能和安全的底层技术充满兴趣,那么这份StarkNet开发教程将为你铺平道路。

什么是StarkNet?

在深入开发之前,我们首先需要简要了解StarkNet,StarkNet是一个无需许可的、去中心化的ZK-Rollup,它将大量交易的计算和证明处理在链下完成,然后将压缩后的证明提交到以太坊主网,这意味着:

  • 高吞吐量: 能够处理每秒数千笔交易。
  • 低 gas 费用: 大部分计算成本由用户承担,显著降低了交易费用。
  • 强安全性: 基于STARK(可扩展透明知识论证)密码学技术,提供与以太坊主网等效的安全性。
  • 隐私保护: STARK证明允许交易数据保持私密,同时仍能被验证。

StarkNet使用Cairo语言编写智能合约,Cairo是一种专为编写可生成STARK证明的程序而图灵完备的编程语言。

开发环境准备

在开始StarkNet开发之前,你需要准备好以下工具和环境:

  1. 安装Rustup(推荐): Cairo可以编译成Rust目标,因此安装Rust工具链会很有帮助,访问 https://rustup.rs/ 按照说明安装。
  2. 安装Cairo编译器: Cairo是StarkNet的智能合约编程语言,你需要安装cairo-compilecairo-run等工具,你可以通过StarkNet官方提供的安装脚本或包管理器进行安装。
    # 使用curl安装(请参考StarkNet官方文档获取最新安装命令)
    curl --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/starkware-libs/cairo/main/scripts/install.sh | sh

    安装完成后,确保将~/.cargo/bin(或cairo安装路径)添加到你的系统PATH中。

  3. 安装StarkNet Devnet: StarkNet Devnet是一个本地开发网络,用于测试和部署你的智能合约,无需消耗真实的ETH。
    pip install starknet-devnet
  4. 安装StarkNet Python库: 用于与StarkNet网络交互(包括Devnet)。
    pip install starkne
    随机配图
    t-py
  5. 代码编辑器: Visual Studio Code(推荐)配合Cairo和Solidity插件(因为StarkNet也使用类似Solidity的合约部署语法)。
  6. 钱包: 像Argent X、Braavos这样的StarkNet兼容钱包,用于测试和交互。

你的第一个StarkNet智能合约:一个简单的Counter

让我们从最简单的“Counter”合约开始,体验Cairo语言和StarkNet合约的基本结构。

  1. 创建项目目录:

    mkdir starknet-counter && cd starknet-counter
  2. 编写Counter合约(counter.cairo):

    // 引入必要的库
    from starkware.cairo.common.cairo_builtins import HashBuiltin
    from starkware.cairo.common.signature import Signature
    from starkware.cairo.common.alloc import alloc_locals
    from starkware.cairo.common.registers import get_fp_and_pc
    // 定义合约存储结构
    @storage_var
    func counter() -> (res: felt):
        pass
    // 增加计数器的函数
    @external
    func increase{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}():
        # 获取当前计数器值
        let (current_value) = counter.read()
        # 计算新值
        let new_value = current_value + 1
        # 写入新值
        counter.write(new_value)
        return ()
    // 减少计数器的函数(确保不为负)
    @external
    func decrease{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}():
        let (current_value) = counter.read()
        assert current_value >= 0
        let new_value = current_value - 1
        counter.write(new_value)
        return ()
    // 获取当前计数器值的函数
    @external
    func get_counter{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}() -> (res: felt):
        let (current_value) = counter.read()
        return (current_value)
    // 合约构造函数(在部署时调用)
    @constructor
    func constructor{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}():
        counter.write(0)
        return ()
  3. 编译合约: 在项目根目录下运行:

    starknet-compile counter.cairo counter_compiled.json

    这将生成编译后的合约文件counter_compiled.json

部署合约到StarkNet Devnet

  1. 启动Devnet: 在一个终端窗口中运行:

    starknet-devnet --host 0.0.0.0 --port 5000

    Devnet默认会在端口5000启动,并生成一些预资助的测试账户。

  2. 部署合约: 在另一个终端窗口中,使用starknet CLI或Python脚本部署合约,这里以Python脚本为例(确保starknet-py已安装):

    from starknet_py.contract import Contract
    from starknet_py.net.full_node_client import FullNodeClient
    from starknet_py.net.gateway_client import GatewayClient
    from starknet_py.net.models import StarknetChainId
    from starknet_py.common import create_compiled_contract
    import json
    # 连接到本地Devnet
    client = GatewayClient(net="testnet", # 使用"testnet"连接到正式测试网,本地开发用"testnet"指向devnet
                           chain=StarknetChainId.TESTNET) # 如果是本地devnet,chain_id可以省略或使用特定值
    # 读取编译后的合约
    with open("counter_compiled.json", "r") as f:
        compiled_contract = json.load(f)
    # 部署合约
    # 注意:你需要一个有效的账户地址和私钥(Devnet会提供)
    # Devnet默认账户0: address=0x025da4... , private_key=0x0000...
    account_address = 0x025da4... # 替换为你的Devnet账户地址
    private_key = 0x0000...      # 替换为你的Devnet账户私钥
    async def deploy_contract():
        # 创建合约部署交易
        deploy_tx = await Contract.deploy(
            client=client,
            compiled_contract=compiled_contract,
            constructor_args=[] # 我们的构造函数没有参数
        )
        # 等待交易确认
        await deploy_tx.wait_for_acceptance()
        print(f"Contract deployed at: {deploy_tx.contract_address}")
    import asyncio
    asyncio.run(deploy_contract())

    运行后,如果成功,你会看到合约的部署地址。

与合约交互

部署成功后,我们可以调用合约的函数来增加、减少计数器并获取值。

继续使用上面的Python脚本,我们可以添加交互代码:

async def interact_with_contract(contract_address):
    # 创建合约实例
    contract = Contract(
        client=client,
        address=contract_address,
        abi=compiled_contract["abi"], # 从编译文件中获取ABI
        provider=account # 使用账户来签名交易
    )
    # 调用 get_counter
    current_count = await contract.functions["get_counter"].call()
    print(f"Initial counter value: {current_count}")
    # 调用 increase
    await contract.functions["increase"].invoke()
    print("Increased counter by 1")
    # 再次获取计数器值
    new_count = await contract.functions["get_counter"].call()
    print(f"New counter value: {new_count}")
    # 调用 decrease
    await contract.functions["decrease"].invoke()
    print("Decreased counter by 1")
    final_count = await contract.functions["get_counter"].call()
    print(f"Final counter value: {final_count}")
# 假设我们已经知道部署地址,或者从部署函数中获取
# deployed_contract_address = "0x..." # 替换为实际部署地址
# asyncio.run(interact_with_contract(deployed_contract_address))

StarkNet进阶学习资源

恭喜你完成了第一个StarkNet智能合约的编写、部署和交互