# Get The Basic Idea About Solana Program ###### tags: `solana` ## Index - Concepts - Accounts - Executable & Writable - Program & Client - Counter Example ## Concepts ### Accounts Accounts are just **buffers** that store serialized binary data on chain. | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---| | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ### Executable & Writable - Programs are stored in **executable** accounts - Programs are stateless on Solana. - States are stored in non-executable accounts which can be **writable** or **read-only** - Think state accounts as rows in database. They can be modified and queried ### Program & Client You may think programs (smart contract) as AWS Lambda functions. Just like client-server model that we are familiar in web2, we develop and deploy prgrams then use clients to interact with them. ## Counter Example [offical repo](https://github.com/solana-labs/example-helloworld) Program ```rust= pub fn process_instruction( program_id: &Pubkey, // Public key of the account the hello world program was loaded into accounts: &[AccountInfo], // The account to say hello to _instruction_data: &[u8], // Ignored, all helloworld instructions are hellos ) -> ProgramResult { msg!("Hello World Rust program entrypoint"); // Iterating accounts is safer than indexing let accounts_iter = &mut accounts.iter(); // Get the account to say hello to let account = next_account_info(accounts_iter)?; // The account must be owned by the program in order to modify its data if account.owner != program_id { msg!("Greeted account does not have the correct program id"); return Err(ProgramError::IncorrectProgramId); } // Increment and store the number of times the account has been greeted let mut greeting_account = GreetingAccount::try_from_slice(&account.data.borrow())?; greeting_account.counter += 1; greeting_account.serialize(&mut &mut account.data.borrow_mut()[..])?; msg!("Greeted {} time(s)!", greeting_account.counter); Ok(()) } ``` Client (partial) ```javascript= ... // Establish connection to the cluster const connection = new Connection(RPCURL, 'confirmed'); const version = await connection.getVersion(); console.log('Connection to cluster established:', RPCURL, version); // Get the payer to pay this transaction var secretKeyString = await fs.readFile(payer_keypair_path, {encoding: 'utf8'}); var secretKey = Uint8Array.from(JSON.parse(secretKeyString)); const payerKeypair = Keypair.fromSecretKey(secretKey); console.log("Payer: ", payerKeypair.publicKey.toBase58()); // Get the program's pubkey (ID) secretKeyString = await fs.readFile(program_keypair_path, {encoding: 'utf8'}); secretKey = Uint8Array.from(JSON.parse(secretKeyString)); const programKeypair = Keypair.fromSecretKey(secretKey); const programId = programKeypair.publicKey console.log("Program ID: ", programId.toBase58()); // Invoke our Hello Solana Program const instruction = new TransactionInstruction({ keys: [], programId, data: Buffer.alloc(0), }); await sendAndConfirmTransaction( connection, new Transaction().add(instruction), [payerKeypair], ); ``` ## Resources - Learn Solana by examples: [Solana By Example](https://n795113.github.io/solana-by-example/) - Concept Overview: [ok so what the fuck is the deal with solana anyway](https://2501babe.github.io/posts/solana101.html) - All dev knowledge about Solana: https://solanacookbook.com - Taiwan Solana dev community: https://solmeet.dev/ - Learn Rust From scratch: https://rust-lang.tw/book-tw/ - Learn Ethereum: [https://cryptozombies.io/](https://cryptozombies.io/)