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