# Effortlessly Submit Your First zkwasm Application Working with zero-knowledge proofs (ZKPs) can be challenging, and developing applications that utilize ZKPs can be even more complex. Our team of engineers experienced these challenges firsthand while building ZKCross. To address this, we leveraged the contributions of the Rust community and integrated the Rust Playground with the ZKCross node to streamline the development of your zk applications. Explore the ZKCross Playground, an intuitive platform that allows you to write code online, compile it into zkwasm-compatible bytecode, sign it with your private key, and upload it to the ZKCross node. From there, our node handles the remaining tasks such as proof generation, proof storage, and store tx and proof into the Data Availability. Experience seamless zk application development with ZKCross by the link https://play.zkcross.org ## First, lets guide you through how to use the playground to get your application submitted to zkwasm prover cloud. Edit your Rust code in the code block. Put the logic you need to verify using zero-knowledge proofs into the function zkmain(). Put the private parameter inputs into the function zkexec(). ![zkc-play-editor](https://hackmd.io/_uploads/B16WxH6XR.png) Click the ‘SHOW WASM’ button to compile your code into WASM. Wait until the result appears at the bottom. ![zkc-play-compile](https://hackmd.io/_uploads/S1x_xrpQ0.png) Click the ‘CONNECT WALLET’ button to connect your Metamask wallet. Make sure your wallet is on Ethereum Sepolia testnet. Click the ‘UPLOAD WASM’ button and sign the transaction in Metamask. Then your WASM image is signed and uploaded to the ZKCross Node. The ZKCross Node will automatically submit your WASM image to the zkWASM prover network. Then the setup is ready. You can see your setup appears as the latest setups in the zkWASM task explorer. ![zkwasm-explorer](https://hackmd.io/_uploads/ryHolB6mA.png) From now on, you can use any tools, languages to submit request to zkc node to use your wasm image, for example: ```bash= curl https://testrpc.zkcross.org/' -H 'Accept: application/json, text/plain, */*' -H 'Content-Type: application/json;charset=UTF-8' --data-raw '{"jsonrpc": "2.0", "method": "submit-tx", "params": {"image_md5": "FBE1ADD84935782493030FF335475D81", "weight": 100, "params": [1,2]}}' --compressed ; ``` This is a image already existing in both zkc node and DelphinusLab’s zk prover cloud. It will pass two parameters to the image on zkc node, zkc node has a wasm runtime builtin, it takes the parameters from the user, execute the code, submit it the execution combined with the parameters as private and public input to Delphinus’s zkwasm cloud. After the proof generated by the zkwasm cloud, zkc node will call the batcher to process tx, submit to the settlement layer and DA. ## What does the ZKCross Node do? Provides an RPC interface for applications to interact with the prover network (such as Delphinus Lab’s zkWASM cloud). Facilitates the execution WebAssembly bytecode on node, make it very similar to run services on server side. Provide adaptor layers to provide components required by a rollup, like ordering transactions, batch processing proofs, data availability, proof generation, etc. To know more about ZKCross node, we will provide a detailed documentation of our node ## How to write a zkwasm compatible application with Rust? Here is an example, this code carries two mandatory functions, which one is for zkwasm, the other is for executing the code on zkc node. ```rust= mod utils; extern crate zkwasm_rust_sdk; use self::zkwasm_rust_sdk::{require, wasm_input}; use wasm_bindgen::prelude::*; #[wasm_bindgen] pub unsafe fn zkexec(a: u64, b: u64) -> u64 { a+b } #[wasm_bindgen] pub unsafe fn zkmain() -> u64 { let a = wasm_input(1); let b = wasm_input(1); let c = wasm_input(0); require(a+b == c); 0 } ```