如何验证Solana程序交易请求元数据未被用户篡改?
Solana交易请求防篡改验证方案
由于Solana交易在用户本地浏览器签名执行,前端参数确实存在被篡改的风险,以下是几个可行的验证方案,核心思路是把关键验证逻辑放在链上合约中,前端验证仅作为辅助:
1. 链上强制参数校验(最核心)
不管用户如何篡改前端的交易元数据,最终交易都会提交到链上执行,因此必须在Solana程序中对所有关键参数做严格校验:
- 验证指令类型:通过指令 discriminator 确认用户调用的是预期的功能,防止替换为恶意指令
- 校验参数范围:比如NFT铸造数量不超过上限、转账金额符合业务规则等
- 验证签名者权限:确保交易的签名者是被授权执行该操作的账户(比如只能铸造自己的NFT)
- 约束关联账户:如果涉及代币操作,验证必须使用用户的关联代币账户(ATA),防止篡改接收地址
示例代码(Rust):
pub fn process_instruction( program_id: &Pubkey, accounts: &[AccountInfo], instruction_data: &[u8], ) -> ProgramResult { let instruction = Instruction::unpack(instruction_data)?; match instruction { Instruction::MintNft { amount } => { // 校验铸造数量不超过上限 if amount > MAX_MINT_LIMIT { return Err(ProgramError::InvalidArgument); } // 验证签名者是调用账户 let signer = &accounts[0]; if !signer.is_signer { return Err(ProgramError::MissingRequiredSignature); } // 验证接收账户是签名者的关联账户 let recipient = &accounts[1]; let expected_ata = Pubkey::find_program_address( &[signer.key.as_ref(), &spl_token::id().as_ref(), &NFT_MINT.as_ref()], &spl_associated_token_account::id() ).0; if recipient.key != &expected_ata { return Err(ProgramError::InvalidAccountData); } // 执行铸造逻辑 mint_nft(program_id, accounts, amount)?; } } Ok(()) }
2. 前后端哈希一致性校验
前端将交易的关键参数(如指令类型、金额、目标地址)生成哈希,把哈希作为交易参数传入合约;合约端使用相同逻辑重新计算哈希,对比两者是否一致,不一致则拒绝执行。
- 注意:哈希计算逻辑必须前后端完全一致,避免因参数序列化方式不同导致哈希不匹配
- 示例(前端JS):
// 定义关键参数 const coreParams = { opType: "mint", amount: 1, mintAddress: "F9Yh1...", }; // 生成SHA-256哈希 const encoder = new TextEncoder(); const data = encoder.encode(JSON.stringify(coreParams)); const hashBuffer = await crypto.subtle.digest("SHA-256", data); const hashHex = Array.from(new Uint8Array(hashBuffer)) .map(b => b.toString(16).padStart(2, "0")) .join(""); // 将hashHex作为交易指令数据的一部分传入
3. 后端签名参数验证
前端将拟执行的交易参数发送到后端,后端验证参数符合业务规则后,用后端的授权密钥对参数进行签名;前端把签名和参数一起打包进交易,合约端预先存储后端授权密钥的公钥,验证签名有效性:
- 优势:完全由后端把控合法参数范围,用户篡改参数后签名会失效
- 注意:后端授权密钥需妥善保管,避免泄露
4. 固定交易模板限制(适合静态场景)
对于参数固定的操作(如固定金额的捐赠、固定数量的NFT铸造),后端预先生成合法的交易模板并签名,前端仅能使用该模板发起交易,无法修改核心参数;合约端验证交易模板的后端签名,确保未被篡改。
内容的提问来源于stack exchange,提问作者Subash Chaturanga
相关产品推荐
相关产品推荐

