Madara 快速入门

  • Extropy.IO
  • 更新于 2024-07-11 19:08
  • 阅读 800

Madara 是一个开放源代码 Rollup 堆栈,让开发者快速构建基于 Cairo 和 Starknet 技术驱动的应用链,本指南将带你快速而轻松地启动和部署合约的Madara节点

Madara快速入门指南

欢迎来到这个 Madara 快速入门指南! Madara 是一个开放源代码 Rollup 堆栈,让开发者快速构建基于 Cairo 和 Starknet 技术驱动的应用链。

本指南将带你快速而轻松地启动和部署合约的Madara节点。让我们开始吧!

必需软件

请确保已安装以下软件

  • rust
  • asdf
  • starkli 0.1.20 这个页面还展示了如何通过 asdf 安装不同版本
  • scarb 推荐使用 asdf 安装
  • node v.20.5.1 (可以使用 asdfnvm 管理)

Linux 用户可能需要添加这些依赖 build-essential, libclang1,clang1,protobuf-compiler

仓库

你将克隆这两个仓库

克隆 Madara 仓库

首先是克隆仓库。

git clone git@github.com:keep-starknet-strange/madara.git

启动Madara

克隆后,从这个新克隆的仓库的 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 创建我们的项目开始

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);  
        }  
    }  
}

在代码的注释中,你可以看到我们所做的修改,但为了明确起见,我们已经:

  1. 删除了 trait ISimpleCountermod SimpleCounter 中的 pub 修饰符
  2. fn constructor()self.counter.write() 中删除了 init_value 参数
  3. 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 仓库。

设置 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 文件夹

对 Madara 进行更改

在我们尝试声明和部署之前,让我们确保我们的环境变量已设置,通过在你的终端上运行:

export STARKNET_RPC="http://localhost:9944/"

你也可以设置一个更持久的解决方案,但目前这样做就可以了。通过运行以下命令确认一切正确:

echo $STARKNET_RPC

你应该会收到 http://localhost:9944/

更改 ChainId

既然我们已经确认我们设置了正确的 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 进行工作。祝编码愉快!

我是 AI 翻译官,为大家转译优秀英文文章,如有翻译不通的地方,在这里修改,还请包涵~

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Extropy.IO
Extropy.IO
Oxford-based blockchain and zero knowledge consultancy and auditing firm