Madara 是一个开放源代码 Rollup 堆栈,让开发者快速构建基于 Cairo 和 Starknet 技术驱动的应用链,本指南将带你快速而轻松地启动和部署合约的Madara节点
欢迎来到这个 Madara 快速入门指南! Madara 是一个开放源代码 Rollup 堆栈,让开发者快速构建基于 Cairo 和 Starknet 技术驱动的应用链。
本指南将带你快速而轻松地启动和部署合约的Madara节点。让我们开始吧!
请确保已安装以下软件
asdf
安装不同版本asdf
安装Linux 用户可能需要添加这些依赖 build-essential
, libclang1
,clang1
,protobuf-compiler
你将克隆这两个仓库
克隆 Madara 仓库
首先是克隆仓库。
git clone git@github.com:keep-starknet-strange/madara.git
克隆后,从这个新克隆的仓库的 madara
文件夹内运行以下命令。将 /User/desmo/madara-state
替换为你想要存储Madara状态的位置:/home/user/directory
注意
这些命令与Madara仓库中给出的命令不同,允许我们在本地保存节点状态。
cargo run --release -- setup --from-local ./configs/ --chain=dev --base-path=/Users/desmo/madara-state
cargo run --release -- --alice --base-path /Users/desmo/madara-state --rpc-cors=all --chain=dev
这将启动链并指向我们存储状态的位置,你应该用前一个命令中使用的文件路径替换文件路径。
如果成功,你应该会得到类似于以下内容的输出:
Finished release [optimized] target(s) in 1.80s
Running \`target/release/madara --alice --base-path /Users/desmo/madara-state --rpc-cors=all --chain=dev\`
2024-03-06 17:54:44 Madara initialized w/o DA layer
2024-03-06 17:54:44 Madara initialized w/o settlement layer
2024-03-06 17:54:44 Madara Node
2024-03-06 17:54:44 ✌️ version 0.7.0-5e68494fe9d
2024-03-06 17:54:44 ❤️ by Abdelhamid Bakhta <@keep-starknet-strange>:Substrate DevHub <https://github.com/substrate-developer-hub>, 2017-2024
2024-03-06 17:54:44 📋 Chain specification: Development
2024-03-06 17:54:44 🏷 Node name: Alice
2024-03-06 17:54:44 👤 Role: AUTHORITY
2024-03-06 17:54:44 💾 Database: RocksDb at /Users/desmo/madara-state/chains/dev/db/full
2024-03-06 17:54:44 🧪 Using the following development accounts:
2024-03-06 17:54:44 🧪 NO VALIDATE with address: 0x1 and no pk
2024-03-06 17:54:44 🧪 ARGENT with address: 0x2 and pk: 0xc1cf1490de1352865301bb8705143f3ef938f97fdf892f1090dcb5ac7bcd1d
2024-03-06 17:54:44 🧪 OZ with address: 0x3 and pk: 0xc1cf1490de1352865301bb8705143f3ef938f97fdf892f1090dcb5ac7bcd1d
2024-03-06 17:54:44 🧪 CAIRO 1 with address: 0x4 and no pk
2024-03-06 17:54:44 Using default protocol ID "sup" because none is configured in the chain specs
2024-03-06 17:54:44 🏷 Local node identity is: 12D3KooWLngNFrmtGSXsdWV8RG1aKbNs7dHrt8NfBmt9TCtHc4CY
现在我们成功启动了节点,我们将构建一个合约,它可以是任何合约,但让我们从 Starknet by Example 开始,一个计数器合约,我们将进行一些简单的修改。
让我们从使用 scarb 创建我们的项目开始
scarb new counter_contract
然后进入你的 counter_contract
并使用你喜欢的编辑器打开你新创建的项目。
scarb.toml
我们需要向我们的 toml
文件中添加几行以使其与我们的Madara节点兼容。
[package]
name = "counter_contract"
version = "0.1.0"
# 查看更多键及其定义,请访问 https://docs.swmansion.com/scarb/docs/reference/manifest.html
[dependencies]
starknet = ">=2.1.0"
[[target.starknet-contract]]
casm = true
lib.rs
如果你正在运行自己的 hello_world
(或其他)合约,则无需执行此操作,但如果你正在跟随我们,我们需要通过删除和添加代码的小部分来修改计数器合约。
#[starknet::interface]
// 删除 pub 修饰符
trait ISimpleCounter<TContractState> {
fn get_current_count(self: @TContractState) -> u128;
fn increment(ref self: TContractState);
fn decrement(ref self: TContractState);
}
#[starknet::contract]
// 删除 pub 修饰符
mod SimpleCounter {
#[storage]
struct Storage {
// 计数器变量
counter: u128,
}
#[constructor]
// 删除 \`init_valule\` 参数
fn constructor(ref self: ContractState) {
// 存储初始值
self.counter.write(1); // 在这里添加 \`1\`
}
// 这个宏很重要,以确保我们可以从外部访问这些函数
#[external(v0)]
impl SimpleCounter of super::ISimpleCounter<ContractState> {
fn get_current_count(self: @ContractState) -> u128 {
return self.counter.read();
}
fn increment(ref self: ContractState) {
// 存储计数器值 + 1
let counter = self.counter.read() + 1;
self.counter.write(counter);
}
fn decrement(ref self: ContractState) {
// 存储计数器值 - 1
let counter = self.counter.read() - 1;
self.counter.write(counter);
}
}
}
在代码的注释中,你可以看到我们所做的修改,但为了明确起见,我们已经:
trait ISimpleCounter
和 mod SimpleCounter
中的 pub
修饰符fn constructor()
和 self.counter.write()
中删除了 init_value
参数impl SimpleCounter
上面的宏更改为 #[external(v0)
lib.rs
合约准备就绪后,你可以使用以下命令构建合约
scarb build
如果一切顺利,你应该在新生成的 target/dev
文件夹中有 3 个新文件
counter_contract.starknet_artifacts.json
counter_contract_SimpleCounter.sierra.json #ABI 文件
counter_contract_SimpleCounter.casm.json
有了这些导出的合约,我们可以继续下一步,即声明和部署,为此我们需要 Karnot: Madara get Started 仓库。
我们首先克隆该仓库,你可能希望在 madara
节点目录之外执行此操作
git clone git@github.com:karnotxyz/madara-get-started.git
然后
npm i
注意
你应该运行 Node v20.5.1 — 因此在运行 Node 命令之前,请确保你正在运行该版本,可以使用 asdf
或 nvm
来运行 Node 命令## 清理合约文件夹
在 madara-get-started/contracts
文件夹中,你有一些预构建的合约
➜ madara-get-started git:(main) ls ./contracts/\*
./contracts/ERC20.json ./contracts/OpenZeppelinAccountCairoOne.sierra.json
./contracts/OpenZeppelinAccountCairoOne.casm.json
从你的合约文件夹中删除合约
rm ./contracts/*
现在,你需要回到你的 counter_contract
项目,并获取在 target/dev
文件夹中构建的合约,并将这些合约:
counter_contract.starknet_artifacts.json
counter_contract_SimpleCounter.sierra.json
counter_contract_SimpleCounter.casm.json
放入 madara-get-started/contracts
文件夹
在我们尝试声明和部署之前,让我们确保我们的环境变量已设置,通过在你的终端上运行:
export STARKNET_RPC="http://localhost:9944/"
你也可以设置一个更持久的解决方案,但目前这样做就可以了。通过运行以下命令确认一切正确:
echo $STARKNET_RPC
你应该会收到 http://localhost:9944/
。
既然我们已经确认我们设置了正确的 STARNKET_RPC
,我们需要进入我们的 madera
目录,并打开 pallets.rs
文件,该文件位于 madara/crates/runtime/src/pallets.rs
在这里,我们将把 SN_GOERLI_CHAIN_ID
更改为 MADARA_CHAIN_ID
,你可以搜索,但我在第 13
行和第 164
行找到了它们
// line 13
pub use mp_chain_id::MADARA_CHAIN_ID;
...
per = MADARA_CHAIN_ID;
保存此文件并关闭它,现在我们准备重新启动节点
继续停止之前的 Madara 节点,使用 ctrl+C,并从你的 madara
文件夹内运行与之前启动节点相同的命令:
cargo run --release -- --alice --base-path /Users/desmo/madara-state --rpc-cors=all --chain=dev
它应该从你的节点离开的地方继续,但现在具有正确的链 ID。
现在,我们需要回到你的 madara-get-started
文件夹,并使用 node 运行脚本。记得使用 v.20.5.1
的正确版本,并运行:
node scripts/declare.js ./contracts/counter_contract_SimpleCounter.sierra.json ./contracts/counter_contract_SimpleCounter.casm.json
.seirra.json
和 .casm.json
文件应该是你的合约名称,如果你正在使用 counter_contract
示例进行跟踪,它应该与上述相同,你应该能够运行相同的脚本,但如果由于某种原因它们位于不同位置,你可以使用正确的位置运行命令。
node scripts/declare.js <path_to_sierra> <path_to_casm>
如果成功,你应该看到类似以下内容:
This is the declare result - {
transaction_hash: '0x4d9495073404c0ed2fd42bec07fc5c91d32005fedc20702d6f90612a69d78ce',
class_hash: '0x5c9b0add4b036cef0eef4fa593f29da8554c162186be99c563c3ef10d31628d'
}
完成后,我们应该能够部署合约
node scripts/deploy.js ./contracts/counter_contract_SimpleCounter.sierra.json
如果成功,你应该看到类似以下内容:
This is the deploy result - {
transaction_hash: '0x46803b2cb6d9b20902a04f6f23db165846e90a6f6096a5435198773c78912a2',
contract_address: [
'0x18a91f3352b686058894699654e470dfa65f20da5bc08317fb1a6aa3faaee78'
]
}
现在,我们应该能够使用 starkli
与我们的合约进行交互,
starkli call 0x18a91f3352b686058894699654e470dfa65f20da5bc08317fb1a6aa3faaee78 get_current_count
那应该输出
[
"0x0000000000000000000000000000000000000000000000000000000000000001"
]
这显示我们的“计数器”正在工作,因为我们的输出是 1
,这是我们通过初始值传递的 1
fn constructor(ref self: ContractState) {
// 存储初始值
self.counter.write(1); // 在这里添加 \`1\`
}
现在,你只需部署一些更复杂的合约。
恭喜!你已成功设置了 Madara 节点,创建并部署了一个简单的合约,并与之交互。本指南应该为你提供了一个坚实的基础,以开始使用 Madara 和 Starknet 进行工作。祝编码愉快!
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!