# Announcing Rustic: a Rust canister development framework for ETH devs

**URL:** <https://forum.dfinity.org/t/announcing-rustic-a-rust-canister-development-framework-for-eth-devs/22582>\
**Category:** Developers\
**Created:** [September 6, 2023, 10:31am UTC](https://forum.dfinity.org/t/announcing-rustic-a-rust-canister-development-framework-for-eth-devs/22582 "2023-09-06T10:31:52Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![benji](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/benji/32/8069_2.png) [@benji](https://forum.dfinity.org/u/benji)\
**Post date:** [September 6, 2023, 10:31am UTC](https://forum.dfinity.org/t/announcing-rustic-a-rust-canister-development-framework-for-eth-devs/22582/1 "2023-09-06T10:31:52Z")

</div>

Hey all, I made a Rust canister development framework called [Rustic](https://github.com/internet-computer-protocol/rustic).

This is a thin wrapper around `ic-cdk` and provides some functionalities familiar to EVM Solidity developers such as _access control_ and _reentrancy guard_. It also incorporates some know-how in canister development such as using stable memory for storing data. The goal is to save much boilerplate code and hide away some IC implementation details, in order to provide an easy entry for new developers coming into the ecosystem.

This is only the first version now and is unstable. Next up I will work to add some examples and improve test coverage.

Your comments, suggestions, and code contributions are welcome.

[Posts are my own and do not represent DFINITY]

---

<div class="post-metadata">

**Author:** ![peterparker](https://avatars.discourse-cdn.com/v4/letter/p/b9bd4f/32.png) [@peterparker](https://forum.dfinity.org/u/peterparker)\
**Post date:** [September 6, 2023, 11:37am UTC](https://forum.dfinity.org/t/announcing-rustic-a-rust-canister-development-framework-for-eth-devs/22582/2 "2023-09-06T11:37:24Z")

</div>

I’m a simple man. I notice cool stuff, I star the related GitHub repo. ⭐  
Interesting features and code, thanks for the share. 👍

---

<div class="post-metadata">

**Author:** ![0xAegir](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/0xaegir/32/7569_2.png) [@0xAegir](https://forum.dfinity.org/u/0xAegir)\
**Post date:** [September 8, 2023, 7:53am UTC](https://forum.dfinity.org/t/announcing-rustic-a-rust-canister-development-framework-for-eth-devs/22582/3 "2023-09-08T07:53:16Z")

</div>

Seems interesting! With the `modifiers` macro usage it feels a lot like solidity. Looking forward to some examples.

Random thoughts & suggestions:

- I’d particularly like to see lifecycle examples. It seems there’s an idea there? But I’m not quite sure how it’s meant to be used, or how it improves on preupgrade/postupgrade.

- Also, fwiw, I’ve been considering moving from an explicit concept of “owners” and “admins” to just querying the canister’s controllers. If you can deploy new code to the canister you’re basically a super-admin anyway, and it reduces the number of concepts and amount of code. Maybe you could have `is_owner`, `is_admin`, and a third, `is_controller`?

- Building on the modifiers, could you could add a `non_reentrant` modifier (like openzeppelin) which just does the `let _guard = ReentrancyGuard::new()` before your main function? Or would the `drop` happen to early in that case? That might help people avoid the subtle `let _ =` trap.

- The LogBuffer stuff looks pretty nice. I have a similar thing implemented for error tracking, but yours is pretty clean.

Overall 👍 Looking forward to see where it goes

Edit: I should add, that most of what I write is in motoko. Wen motokoic? 😅

---

<div class="post-metadata">

**Author:** ![benji](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/benji/32/8069_2.png) [@benji](https://forum.dfinity.org/u/benji)\
**Post date:** [September 8, 2023, 9:38pm UTC](https://forum.dfinity.org/t/announcing-rustic-a-rust-canister-development-framework-for-eth-devs/22582/4 "2023-09-08T21:38:21Z")

</div>

Great suggestions! The `non_reentrant` feature is implemented in `rustic-macros = "0.1.3"`.
