{"content":{"title":"rust开发solana合约","body":"本地使用rust开发solana合约，并且部署上线，本地使用TypeScript与合约交互\r\n1. 创建cargo lib项目\r\n2. 编译项目为动态库（.so）\r\n3. 部署合约上链\r\n\r\n### 创建cargo lib项目\r\n~~~shell\r\ncargo new --lib program-solana\r\n~~~\r\n安装扩展\r\n~~~shell\r\ncd program-solana\r\ncargo add borsh  # 安装开源包，二进制编码包\r\ncargo add solana-program # solana开发包\r\n~~~\r\n### 编写合约\r\n~~~rust\r\nuse solana_program::{\r\n    account_info::AccountInfo,\r\n    entrypoint,\r\n    entrypoint::ProgramResult,\r\n    pubkey::Pubkey,\r\n    msg,\r\n};\r\n\r\n// declare and export the program's entrypoint\r\nentrypoint!(process_instruction);\r\n\r\n// program entrypoint's implementation\r\npub fn process_instruction(\r\n    program_id: &Pubkey,\r\n    accounts: &[AccountInfo],\r\n    instruction_data: &[u8]\r\n) -> ProgramResult {\r\n    // log a message to the blockchain\r\n    msg!(\"Hello, world!\");\r\n\r\n    // gracefully exit the program\r\n    Ok(())\r\n}\r\n~~~\r\n### 编译rust合约为动态库（.so文件）\r\n在cargo.toml添加\r\n\r\n~~~shell\r\n[lib]\r\nname = \"program_solana\"\r\ncrate-type = [\"cdylib\", \"lib\"]\r\n~~~\r\n\r\n编译合约\r\n\r\n~~~shell\r\ncargo build-bpf  # 会在target/deploy/program_solana.so文件\r\n~~~\r\n\r\n### 部署合约上链\r\n~~~shell\r\nsolana program deploy target/deploy/program_solana.so\r\nProgram Id: 5HHcKZifkrLLXLasmJCrV738GkXWTbw7UWbka3xH8Gff\r\n~~~\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2024/03/Yb4Eij0m65fbe08240c2d.png)\r\n\r\n### 合约交互\r\n~~~TypeScript\r\nimport solanaWeb3 from '@solana/web3.js';\r\nimport fs from 'fs';\r\n\r\nconst TESTNET_URL = \"https://api.devnet.solana.com\"\r\nconst TOKEN_PROGRAM_ID = new solanaWeb3.PublicKey('5HHcKZifkrLLXLasmJCrV738GkXWTbw7UWbka3xH8Gff');\r\n\r\nconst keyPairJson = JSON.parse(fs.readFileSync('/Users/admin/.config/solana/id.json', 'utf-8'));\r\nconst payer = solanaWeb3.Keypair.fromSecretKey(new Uint8Array(keyPairJson));\r\n// 创建连接和相关的密钥对\r\nconst connection = new solanaWeb3.Connection(TESTNET_URL);\r\n\r\nclass HelloProgram {\r\n    public ProgramId:solanaWeb3.PublicKey\r\n    constructor() {\r\n        this.ProgramId = TOKEN_PROGRAM_ID\r\n    }\r\n    public createHelloData() :Buffer {\r\n        return Buffer.from([0]);\r\n    }\r\n}\r\n\r\nasync function main() {\r\n    // 创建交易\r\n    const transaction = new solanaWeb3.Transaction();\r\n    console.log(\"address:\", payer.publicKey.toBase58());\r\n     // 创建指令\r\n    const instructionData =  new HelloProgram().createHelloData(); // instructionId 是一个标识方法的数字，args 是方法参数的字节表示。需要根据实际的智能合约进行构造。\r\n    const instruction = new solanaWeb3.TransactionInstruction({\r\n        keys: [{ pubkey: payer.publicKey, isSigner: false, isWritable: true }],\r\n        programId: TOKEN_PROGRAM_ID,\r\n        data: instructionData, \r\n     });\r\n    // 将指令添加到交易中\r\n    transaction.add(instruction);\r\n\r\n     // 为交易签名\r\n     const { blockhash,lastValidBlockHeight } = await connection.getLatestBlockhash(\"finalized\");\r\n     transaction.recentBlockhash = blockhash\r\n     transaction.sign(payer);\r\n\r\n      // 发送交易\r\n    const txid = await connection.sendRawTransaction(transaction.serialize());\r\n    console.log('Transaction sent:', txid);\r\n}\r\n\r\nmain();\r\n~~~"},"author":{"user":"https://learnblockchain.cn/people/5744","address":"0x5F12C3e92E008A076315f110f798AA579c2d732b"},"history":null,"timestamp":1711006190,"version":1}