교차 프로그램 호출
이 섹션에서는 이전 PDA 섹션의 CRUD 프로그램이 Solana 프로그램이 서로를 호출할 수 있게 해주는 기능인 교차 프로그램 호출(CPI)을 추가하여 업데이트됩니다.
이 튜토리얼은 또한 프로그램이 교차 프로그램 호출을 할 때 프로그램 파생 주소(PDA)에 대해 어떻게 "서명"할 수 있는지 보여줍니다.
update
및 delete
명령어는 System Program을 호출하여 계정 간 SOL 전송을
처리하도록 수정이 필요합니다.
이 섹션의 목적은 Anchor 프레임워크를 사용하여 Solana 프로그램에서 CPI를 구현하는 과정을 안내하고, 이전 섹션에서 살펴본 PDA 개념을 기반으로 합니다. 자세한 내용은 교차 프로그램 호출 페이지를 참조하세요.
참고로, 이 링크에는 PDA와 CPI 섹션을 모두 완료한 후의 최종 코드가 포함되어 있습니다.
이 섹션의 시작 코드에는 PDA 섹션만 완료되어 있습니다.
업데이트 명령어 수정하기
먼저, 프로그램은 Update
구조체와 update
함수를 변경하여 간단한 "업데이트
유료" 메커니즘이 필요합니다.
lib.rs
파일을 업데이트하여 system_program
모듈의 항목들을 범위에 포함시키는
것부터 시작하세요.
use anchor_lang::system_program::{transfer, Transfer};
다음으로, Update
구조체를 업데이트하여 vault_account
라는 새 계정을
포함시킵니다. 이 계정은 프로그램에 의해 제어되며, 사용자가 메시지 계정을
업데이트할 때 SOL을 받습니다.
#[account(mut,seeds = [b"vault", user.key().as_ref()],bump,)]pub vault_account: SystemAccount<'info>,
다음으로, update
명령어에 CPI 로직을 추가하여 사용자 계정에서 금고 계정으로
0.001 SOL을 전송합니다.
let transfer_accounts = Transfer {from: ctx.accounts.user.to_account_info(),to: ctx.accounts.vault_account.to_account_info(),};let cpi_context = CpiContext::new(ctx.accounts.system_program.to_account_info(),transfer_accounts,);transfer(cpi_context, 1_000_000)?;
프로그램을 다시 빌드하세요.
$build
삭제 명령 업데이트하기
이제 Delete
구조체와 delete
함수를 변경하여 "삭제 시 환불" 메커니즘을
추가하세요.
먼저 Delete
구조체를 업데이트하여 vault_account
를 포함시키세요. 이를
통해 사용자가 메시지 계정을 닫을 때 금고에 있는 SOL을 사용자에게 다시 전송할 수
있습니다.
#[account(mut,seeds = [b"vault", user.key().as_ref()],bump,)]pub vault_account: SystemAccount<'info>,
또한 전송을 위한 CPI는 System Program을 호출해야 하므로 system_program
를
추가하세요.
pub system_program: Program<'info, System>,
다음으로, delete
명령어에 CPI 로직을 추가하여 볼트 계정에서 사용자 계정으로
SOL을 전송합니다.
let user_key = ctx.accounts.user.key();let signer_seeds: &[&[&[u8]]] =&[&[b"vault", user_key.as_ref(), &[ctx.bumps.vault_account]]];let transfer_accounts = Transfer {from: ctx.accounts.vault_account.to_account_info(),to: ctx.accounts.user.to_account_info(),};let cpi_context = CpiContext::new(ctx.accounts.system_program.to_account_info(),transfer_accounts,).with_signer(signer_seeds);transfer(cpi_context, ctx.accounts.vault_account.lamports())?;
*rs_ctx: Context<Delete>
*가 *rsctx: Context<Delete>
*로 변경되어 함수
본문에서 컨텍스트를 사용합니다.
프로그램을 다시 빌드하세요.
$build
프로그램 재배포
이러한 변경 사항을 적용한 후, 업데이트된 프로그램을 재배포하세요. 이렇게 하면 수정된 프로그램을 테스트할 수 있게 됩니다. Solana에서는 동일한 프로그램 ID에 프로그램을 배포하는 것만으로 프로그램을 업데이트할 수 있습니다.
Playground 지갑에 devnet SOL이 있는지 확인하세요. Solana Faucet에서 devnet SOL을 받을 수 있습니다.
$deploy
테스트 파일 업데이트
다음으로, anchor.test.ts
파일을 업데이트하여 명령어에 새로운 vault 계정을
포함시키세요. 이를 위해 vault PDA를 도출하고 업데이트 및 삭제 명령어 호출에
포함시켜야 합니다.
볼트 PDA 도출
먼저, 볼트 PDA 도출을 추가합니다:
const [vaultPda, vaultBump] = PublicKey.findProgramAddressSync([Buffer.from("vault"), wallet.publicKey.toBuffer()],program.programId);
업데이트 테스트 변경
그런 다음, vaultAccount
을 포함하도록 업데이트 명령어를
수정합니다
const transactionSignature = await program.methods.update(message).accounts({messageAccount: messagePda,vaultAccount: vaultPda}).rpc({ commitment: "confirmed" });
삭제 테스트 변경
그런 다음, vaultAccount
을 포함하도록 삭제 명령어를 수정합니다
const transactionSignature = await program.methods.delete().accounts({messageAccount: messagePda,vaultAccount: vaultPda}).rpc({ commitment: "confirmed" });
다음 단계
솔라나 퀵스타트 가이드를 완료한 것을 축하합니다. 다음과 같은 주요 솔라나 개념에 대한 실무 경험을 얻었습니다:
- 계정에서 데이터 가져오기 및 읽기
- 트랜잭션 구축 및 전송
- 솔라나 프로그램 배포 및 업데이트
- Program Derived Address(PDA) 작업
- Cross-Program Invocation(CPI) 수행
이러한 개념에 대한 이해를 깊게 하려면 이 가이드에서 다룬 주제에 대한 자세한 설명을 제공하는 핵심 개념 문서를 확인하세요.
더 많은 예제 탐색하기
예제를 통해 배우는 것을 선호한다면 다양한 예제 프로그램이 있는 프로그램 예제 저장소를 확인하세요.
솔라나 플레이그라운드는 GitHub 링크를 사용하여 프로젝트를 가져오거나 볼 수 있는 편리한 기능을 제공합니다. 예를 들어, 이 GitHub 저장소의 Anchor 프로젝트를 보려면 솔라나 플레이그라운드 링크를 열어보세요.
Import
버튼을 클릭하고 프로젝트 이름을 입력하여 솔라나 플레이그라운드의
프로젝트 목록에 추가하세요. 프로젝트가 가져와지면 모든 변경 사항이 자동으로
저장되고 유지됩니다.
Is this page helpful?