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

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

什么是StarkNet?
在深入开发之前,我们首先需要简要了解StarkNet,StarkNet是一个无需许可的、去中心化的ZK-Rollup,它将大量交易的计算和证明处理在链下完成,然后将压缩后的证明提交到以太坊主网,这意味着:
StarkNet使用Cairo语言编写智能合约,Cairo是一种专为编写可生成STARK证明的程序而图灵完备的编程语言。
开发环境准备
在开始StarkNet开发之前,你需要准备好以下工具和环境:
cairo-compile和cairo-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中。
pip install starknet-devnet
pip install starknet-py
你的第一个StarkNet智能合约:一个简单的Counter
让我们从最简单的“Counter”合约开始,体验Cairo语言和StarkNet合约的基本结构。
创建项目目录:
mkdir starknet-counter && cd starknet-counter
编写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 ()
编译合约: 在项目根目录下运行:
starknet-compile counter.cairo counter_compiled.json
这将生成编译后的合约文件counter_compiled.json。
部署合约到StarkNet Devnet
启动Devnet: 在一个终端窗口中运行:
starknet-devnet --host 0.0.0.0 --port 5000
Devnet默认会在端口5000启动,并生成一些预资助的测试账户。
部署合约:
在另一个终端窗口中,使用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智能合约的编写、部署和交互