给 Solidity 开发者的 Starknet 开发指南_全球资讯热分享网(专注热点收集平台)

给 Solidity 开发者的 Starknet 开发指南


给 Solidity 开发者的 Starknet 开发指南

  2023-12-03 20:55:27     简体|繁體
http://refenxiang.com/1011459.html

作者:Tiny熊;来源:登链社区

Starknet 是以太坊的二层 ZKRollup 扩容方案 ,与兼容 EVM 的二层扩容方案上的开发不同, Starknet 上开发有自己的模式。

这篇文章介绍如何开发Starknet[1]上的合约以及如何部署到Starknet测试网上,为了让 Solidity 智能开发者更快速理解 Starknet 开发,文章中也加入了一些概念的对比。

最近在跟着 Starknet Foundation 的Basecamp[2]和登链社区 与 Openbuild一起发起的Bootcamp[3]学习 Starknet 开发, 这篇是我的学习笔记。

来我们的 Bootcamp学习,完成作业还有奖励哦。在一月份还将有一场 Starknet 黑客马拉松。感兴趣的朋友可以联系晓娜(微信:upchainedu)先学习起来。

开发语言 Cairo vs Solidity

Solidity[4]是一个为 EVM 设计的语言,语法类似 Python 与 JavaScript ,以太坊执行客户端为了验证一致性,所有的调用合约的交易会在各个节点上重新执行,以检查时候运行的结果一样。

Starknet 使用开发语言 Cairo , Cairo 是一种写可证明的程序语言, 用Cairo编写的程序,会生成证明(不需要用户了解ZK知识 ),可证明结果是由特定的程序和特定的输入得到,而不用重复运行程序(从而可以节约大量重复运营的开销,达到扩容效果)。

Cairo 是一个通用的可证明的程序语言,除在 Starknet 中使用之外,可广泛使用在其他的场景中。

Cairo 运行于 CairoVM 之上,是类 Rust 语言,和 Rust 有类似的所有权模型,入门门槛有点高,Cairo 语言学习中文用户可参考 StarknetAstro翻译的Cairo 之书[6]

账户

在EVM[7]中,有两类账户:EOA(外部账号) 和 合约账户 ,用户通常使用 MetaMask 等钱包来管理外部账户。

在 Starknet 中,原生支持账户抽象(AA),所有的账户是智能合约,使用合约验证交易,支持多种验签方式,以及支持社交恢复、批量交易等。使用的钱包主要是 Braavos[8]、ArgentX[9]

项目管理工具

Solidity 项目通常使用 Foundry 或 Hardhat 开发。

Cairo 使用 scarb:Scarb是Cairo语言的项目管理工具。集成包管理器和编译器,Scarb 可管理依赖项,编译 Cairo 项目。

scarb 安装:

curl--proto'=https'--tlsv1.2-sSfhttps://docs.swmansion.com/scarb/install.sh|sh

第一个 Cairo 合约

scarb 安装后,可以创建项目了, 我们第一个 Cairo 合约为Ownable

scarbnewownable

其结构如下:

src/
lib.cairo
.gitignore
Scarb.toml

Scarb.toml

Scarb.toml是项目的清单文件(Manifest),包含了编译该项目的元数据,将以下内容复制到Scarb.toml文件:

[package]
name = "ownable"
version = "0.1.0"
[dependencies]
starknet = ">=2.2.0"
[[target.starknet-contract]]
sierra = true

Scarb.toml中的第一部分是[package],定义项目软件包,包含字段nameversion

dependencies定义库依赖项,我们的合约需要依赖官方库:starknet

target定义编译目标,使用.starknet-contract,这里目标中间语言sierra

Scarb.toml更多键值定义可参考:https://docs.swmansion.com/scarb/docs/reference/manifest.html

Cairo 合约代码

Starknet 合约实际上是一个 Cairo module ,我们用以下代码替换掉lib.cairo中的代码(见Github[10]):

#[starknet::contract]
mod ownable {
use starknet::ContractAddress;
#[storage]
struct Storage {
owner: ContractAddress,
}
#[constructor]
fn constructor(ref self: ContractState,
init_owner: ContractAddress ) {
self.owner.write(init_owner);
}
#[external(v0)]
fn get_owner(self: @ContractState) -> ContractAddress {
self.owner.read()
}
}

在这段合约代码中使用了一些宏(#开头)来定义合约、定义存储、定义构成函数及外部函数

宏是一个稍微复杂一点的概念,我们只要知道,其是在编译阶段用来对代码进行扩展。

编译

使用命令:

scarbbuild

如果代码没有问题,将有以下类似的输出:

Compilingownablev0.1.0(/Users/emmett/CairoProject/ownable/Scarb.toml)
Finishedreleasetarget(s)in1second

编译会在target/dev/下生成一个编译后的文件:ownable.starknet_artifacts.jsonownable_ownable.contract_class.json

在这里,合约就准备好了。

接下来看看如何部署到 Starknet 网络中去。

安装 Starkli

Starkli 是用来和 Starknet 网络 (包括本地网络) 进行交互的命令行工具。

Starkli 提供了一个名为 starkliup 的软件包管理器,允许获取并安装最新发布的二进制文件。类似于 Rust,其中 rustup 用于安装、管理和升级 rustc。

安装 starkliup:

curlhttps://get.starkli.sh|sh

按安装提示将starkliup加入到环境变量中(),使用 starkliup安装starkli, 命令如下:

starkliup

稍等一会后,starkli 就可以在我们的终端中使用。

starkli--version
0.1.20(e4d2307)

准备钱包

在链上部署合约,我们需要钱包账号来支付 Gas 费,因此需要我们有一个可使用的账户。

大家可以选择 Braavos[11]、ArgentX[12], 他们都有浏览器插件版本,操作方法和 MetaMask 类似,按提示创建钱包即可。并从官方水龙头[13]获取一些 ETH 。

在 Starknet 上的钱包账户都是智能合约,刚在钱包创建好后,我们看到的地址还是一个反事情地址(没有在链上实际存在),在发起第一次发起交易时将自动部署钱包合约。

在 Starknet 中,对于每个智能钱包,有两个部分来控制:一个签名者(signer)一个帐户描述

和以太坊上大家常用的 EOA 钱包不同, EOA 钱包由节点中验证签名,只支持一个私钥(或助记词、Keystore 文件)签名来管理账户。

智能钱包在合约中验签,可以支持多种签名方式(签名者),帐户描述则是用来描述签名与智能钱包账户的关系。

创建 signer

先创建一个名为 .wallets的新文件夹来存储智能钱包所需的文件。

mkdir.wallets

签名者(signer)可以是一个私钥或者是一个加密的keystore,为避免明文暴露私钥,通常选择后者。

我们可以从 Braavos 或 ArgentX 导出的私钥来创建keystore

>starklisignerkeystorefrom-key.wallets/keystore.json
Enterprivatekey:
Enterpassword:
Creatednewencryptedkeystorefile:/Users/emmett/CairoProject/ownable/.wallets/keystore.json
Publickey:0x075ce30939a0f44df2dbad6f24d1e82200a1ee084a387afc1bc657aba61f441b

该命令让我们输入私钥已经密码,私钥可以从钱包导出,如下图:

之后就会生成.wallets/keystore.json, 使用 Starkli 发起交易时,Starkli 就可以使用 keystore 来签名交易了。

创建帐户描述

如果在Starknet 上已经存在该账户,可以使用starkli account fetch获取账户信息来创建帐户描述文件:

starkliaccountfetch0x0325E8b88aedBac03c5dc9E22bF94d47E6508f9723FD085f5D7b5809afA48bC4--output.wallets/account.json--rpchttps://starknet-goerli.g.alchemy.com/v2/xxxxxxx

--output指定输出帐户描述文件位置。

--rpc指定节点 RPC ,这里使用的是Alchemy[14]的节点 RPC 。

如果账户没有在链上部署,你会遇到如下错误:

Error:code=ContractNotFound,message="Contractnotfound"

可以在钱包上执行一笔转账交易,这时会自动创建好该钱包账户。

声明合约(declare

在以太坊上,可以直接把 Solidity 合约部署到网络上,Starknet 分成了两个部分,先发布合约代码(编译生成的中间表示),再用合约代码创建合约实例。

第一部分称为:声明(declare)合约, 第二部分成为部署合约。

声明合约需要发起交易,方便起见,先把发起交易需要的账号及 RPC 写入到环境变量中:

创建文件:envsh:

exportSTARKNET_RPC="https://starknet-goerli.g.alchemy.com/v2/replace_with_your_key"
exportSTARKNET_ACCOUNT=".wallets/account.json"
exportSTARKNET_KEYSTORE=".wallets/keystore.json"

请在环境变量中使用你的 RPC key 及 账号文件。命令行中使用source envsh应用上环境变量。

使用starkli declare命令声明合约(将自动使用以上环境变量):

>starklideclaretarget/dev/ownable_ownable.contract_class.json
Enterkeystorepassword:
Sierracompilerversionnotspecified.Attemptingtoautomaticallydecideversiontouse...
Networkdetected:goerli-1.Usingthedefaultcompilerversionforthisnetwork:2.1.0.Usethe--compiler-versionflagtochooseadifferentversion.
DeclaringCairo1class:0x077bd1a78e208a5e73995278e4300066fa14259f48c33123fe0de13bf8b8a24d
CompilingSierraclasstoCASMwithcompilerversion2.1.0...
CASMclasshash:0x047ddccc9bd2effa6fd847b5338c59e629aab644fa847dc1ff4dfc9d37c2a318
Contractdeclarationtransaction:0x01c1bc0f998f237d4ebdb3a4e7f0ff4973fc6b9b1a1d1c2ea9832865c439b8df
Classhashdeclared:
0x077bd1a78e208a5e73995278e4300066fa14259f48c33123fe0de13bf8b8a24d

命令中的ownable_ownable.contract_class.jsonscarb build生成的文件。

声明合约成功后,会获取到一个 class hash 。

部署合约

部署合约使用命令:starkli deploy class_hash [参数], 因此:

starklideploy0x077bd1a78e208a5e73995278e4300066fa14259f48c33123fe0de13bf8b8a24d0x0325E8b88aedBac03c5dc9E22bF94d47E6508f9723FD085f5D7b5809afA48bC4

若无错误,会有类似以下返回:

Deployingclass0x077bd1a78e208a5e73995278e4300066fa14259f48c33123fe0de13bf8b8a24dwithsalt0x0633b1c1d0cbedc9f5cd924115b1dad08718d1c39fc53bc54da9d667b09a99af...
Thecontractwillbedeployedataddress0x03264b6bdb740c14b776972ce2065c4b79cc6002fb0438ade0bb480c4774b272
Contractdeploymenttransaction:0x013eaf1be2782413ded7049b48da459d9f41c3a3d68b69da7b38a2d2c3b84a8d
Contractdeployed:
0x03264b6bdb740c14b776972ce2065c4b79cc6002fb0438ade0bb480c4774b272

也可以在 starkscan 浏览器上查看到该合约:

https://testnet.starkscan.co/contract/0x03264b6bdb740c14b776972ce2065c4b79cc6002fb0438ade0bb480c4774b272#overview

调用合约

与合约交互有两个方法:call 和 invoke.

call 用于读方法,invoke 用于向合约写入数据。

现在,我们调用一下合约的 get_owner 方法:

starklicall0x03264b6bdb740c14b776972ce2065c4b79cc6002fb0438ade0bb480c4774b272get_owner

返回:

[
"0x0325e8b88aedbac03c5dc9e22bf94d47e6508f9723fd085f5d7b5809afa48bc4"
]

也可以在浏览器中调用合约。

https://testnet.starkscan.co/contract/0x03264b6bdb740c14b776972ce2065c4b79cc6002fb0438ade0bb480c4774b272#read-write-contract

小结

相信你对在 Starknet 开发合约有所了解,与 EVM 开发的不同点,这里整理了一个表格,方便大家对比:


EVMStarknet
开发语言SolidityCairo
开发工具使用 Foundry(forge)、Hardhat使用 Scarb(项目包管理及编译)
和链交互cast / chisel / 或在控制台直接调用 web3.jsstarkli
本地模拟节点anvil 或 Hardhat NodeKatana (后面介绍)
账号EOA 、 AA 钱包只有 AA 钱包
钱包如:MetaMaskBraavos、ArgentX
部署方法编译后,直接部署直接合约字节码先声明合约(代码),再部署合约实例




编辑:web3528btc 来源:加密钱包代币

分享到:

  • 上一篇
    下一篇

  • 分享知识|收获智慧

    全球资讯热分享网(专注热点收集平台)
    手机查看(二维码扫一扫)

    全球资讯热分享网,最有影响力热点信息分类网站,主要集合图文、知识、日常、娱乐、财经、文化、生活、致富、女性、地区、科技等多类信息分享交流,免费提供最有价值的头条信息平台。
    « 2026年 » « 03月 »
    1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031

    最新资讯

    我是天津创亿云的商务总监王敏敏,[代运营]腾讯k3, 教育户,全国资质可开,返点40+收量,朋友圈 腾讯视频 全部可投,我们是推广代运营服务商,欢迎点击对接合作与我联系。
  • 2026-03-18 18:25:24

     

    我是北京意克的广告销售王铎,[代运营][本地推一代]16+量大可谈 自家前审系统,欢迎渠道老板来洽谈合作哈 ,我们是乙方综合性服务商,欢迎点击对接合作与我联系。
  • 2026-03-18 18:16:20

     

    富士胶片召开iCell产品交流会 探讨前沿技术赋能行业应用拓展
  • 2026-03-18 18:07:17

     

    信用卡催收骚扰家人怎么办?可以报警吗?
  • 2026-03-18 17:58:13

     

    抖音放心借逾期了能不能协调延期?步骤是什么?成功后还有利息吗?4个步骤搞定
  • 2026-03-18 17:49:10

     

    抖音放心借逾期了怎么与借款方协商处理?4个步骤说透流程,亲测有用!
  • 2026-03-18 17:40:06

     

    我是巨划算的销售专员练文杰,[代运营]百度(baidu)电商高点开户代运营 对公47 对私53!❗❗❗❗!!!!!,我们是推广代运营服务商,欢迎点击对接合作与我联系。
  • 2026-03-18 17:31:02

     

    我是湖北亿星诚的商务销售刘洪,[代运营]血糖软文/咨询问答,肝囊肿,磷虾油,肺结节,耳鸣,痛风,驼奶,灵芝孢子粉,沙棘原浆,便秘,瑶浴,心脑,关节肽高打回,成单率高,我们是推广代运营服务商,欢迎点击对
  • 2026-03-18 17:21:59

     

    糖尿病伤眼别忽视!早期干预护视力,经典老药有新证
  • 2026-03-18 17:12:55

     

    物理抗菌新突破:不靠化学药剂,如何做到5年长效防护?
  • 2026-03-18 17:03:52

     

    桓仁县领导一行莅临享佳集团,共探中医药发展新路径
  • 2026-03-18 16:54:48

     

    我是河南众诺的负责人许岩,[开户]优质广点通养生粉 屏蔽农村流量! 百货/养生书/器械粉产出非常高,我们是乙方综合性服务商,欢迎点击对接合作与我联系。
  • 2026-03-18 16:45:44

     

    我是希谷数字的总经理钮亮,[开户]dk资质,我们是,欢迎点击对接合作与我联系。
  • 2026-03-18 16:36:41

     

    我是奕维网络的销售总监陈小凡,[开户]快手磁力智投 痛风,面瘫,静脉曲张,男科(可跑阳痿早泄)心理咨询,整形,中医骨科,糖尿病,生美,外阴白斑,hpv,妇科检查,私密,甲状腺,,我们是乙方综合性服务商
  • 2026-03-18 16:27:37

     

    我是微驰互动文化的销售经理杜洋,[开户]AI剪辑、AI漫剧开发培训、AI图文、买菜车、微压锅A结;腾讯+vivo,我们是广告媒体代理商,欢迎点击对接合作与我联系。
  • 2026-03-18 16:18:34