
Solana 혼잡: Solana 트랜잭션을 가장 효과적으로 전송하는 방법
초저지연 트랜잭션 전송 서비스 Sender로 모든 거래에서 경쟁력을 확보하세요. 문서에서 Solana 트랜잭션을 더 빠르게 처리하는 방법을 확인하고 거래 우위를 선점하세요.
소개
"트랜잭션 시뮬레이션 실패: 블록 해시를 찾을 수 없습니다." "트랜잭션 전송 실패." 이제 너무나 익숙한 오류 메시지입니다. 네트워크 혼잡으로 기본적인 트랜잭션조차 운에 맡겨야 하는 상황이 되었습니다. 이런 어려움은 피할 수 있습니다.
이 가이드에서는 트래픽이 많은 시간에도 트랜잭션을 효과적으로 처리할 수 있는 간단한 전략을 살펴봅니다. 우선순위 수수료, 컴퓨트 유닛 최적화, 트랜잭션을 항상 처리할 수 있는 Helius만의 비법을 포함해 네트워크 혼잡에 대응하는 종합적인 방법을 설명합니다.
이 가이드에서 다룰 내용은 다음과 같습니다.
- 직렬화된 트랜잭션으로 우선순위 수수료 설정하기
- 계정 키로 우선순위 수수료 설정하기
- 고급 우선순위 수수료 전략
- 트랜잭션 최적화 기법
- 스테이킹된 엔드포인트를 활용해 전송 보장받기
우선순위 수수료
우선순위 수수료는 입찰 메커니즘으로 작동하며, 검증인에게 트랜잭션의 중요도를 알릴 수 있습니다. 이 수수료는 컴퓨트 유닛당 마이크로 램포트로 책정되며, 트랜잭션이 상호작용하는 특정 계정에 따라 결정됩니다. 따라서 계정별로 독립적인 수수료 시장이 형성됩니다. 계정별 혼잡도를 기준으로 수수료를 전략적으로 설정하면 트랜잭션이 다음 블록에 포함될 가능성을 크게 높일 수 있습니다.
이제 Helius의 Priority Fee API를 사용해 다양한 방식으로 우선순위 수수료를 올바르게 설정하는 방법을 살펴보겠습니다.
직렬화된 트랜잭션
우선순위 수수료를 설정하는 가장 간단한 방법은 직렬화된 트랜잭션을 사용하는 것입니다. 직렬화된 트랜잭션은 트랜잭션을 네트워크로 전송할 수 있는 와이어 형식 버퍼로 변환한 바이너리 표현입니다.
- 트랜잭션을 직렬화한 후 API에 전달합니다.
const serializedTx = transaction.serialize();
const response = await fetch(heliusEndpoint, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 'helius-example',
method: 'getPriorityFeeEstimate',
params: [{
transaction: serializedTx,
options: { recommended: true }
}]
}),
});
const { result } = await response.json();
const priorityFee = result.priorityFeeEstimate;- 권장 수수료를 트랜잭션에 추가합니다. 명령어 순서는 중요하지 않습니다.
transaction.add(
ComputeBudgetProgram.setComputeUnitPrice({
microLamports: priorityFee
})
);계정 키
또 다른 방법은 트랜잭션에 포함된 계정 키 목록을 Priority Fee API에 제공하는 것입니다.
- 트랜잭션에서 계정 키를 추출합니다.
const transaction = new Transaction();
// Add your instructions to the transaction
// Extract all account keys from the transaction
const accountKeys = transaction.compileMessage().accountKeys;
// Convert PublicKeys to base58 strings
const publicKeys = accountKeys.map(key => key.toBase58());- 계정 키를 Priority Fee API에 전달합니다.
const response = await fetch(heliusEndpoint, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 'helius-example',
method: 'getPriorityFeeEstimate',
params: [{
accountKeys: publicKeys,
options: { recommended: true }
}]
}),
});
const { result } = await response.json();
const priorityFee = result.priorityFeeEstimate;- 권장 수수료를 트랜잭션에 추가합니다.
transaction.add(
ComputeBudgetProgram.setComputeUnitPrice({
microLamports: priorityFee
})
);두 방법 모두 사용할 수 있지만, 직렬화된 트랜잭션 방식을 권장합니다. 계정 키를 사용하려면 관련된 모든 계정을 직접 추적해 포함해야 합니다. 계정을 하나라도 누락하면 수수료 추정치가 부정확해질 수 있습니다.
직렬화된 트랜잭션 방식은 필요한 모든 계정을 자동으로 포함하고 전체 트랜잭션 맥락을 바탕으로 더 정확한 수수료 추정치를 제공해 이러한 위험을 없앱니다.
고급 우선순위 수수료 전략
대부분의 상황에서는 권장 우선순위 수수료와 함께 직렬화된 트랜잭션을 사용하면 충분합니다. 더 세밀하게 제어하려면 Priority Fee API에서 다양한 우선순위 수준의 추정치를 요청하고 빈 슬롯 평가를 활성화할 수 있습니다.
우선순위 수준
모든 우선순위 수수료 수준을 요청하는 방법의 예시는 다음과 같습니다.
const response = await fetch(heliusEndpoint, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 'helius-example',
method: 'getPriorityFeeEstimate',
params: [{
transaction: serializedTx,
options: {
includeAllPriorityFeeLevels: true
}
}]
}),
});
const { result } = await response.json();
console.log(result.priorityFeeLevels);서로 다른 우선순위 수준이 포함된 객체가 반환됩니다.
{
"priorityFeeLevels": {
"min": 10000.0,
"low": 10000.0,
"medium": 10000.0,
"high": 100000.0,
"veryHigh": 5483924.800000011,
"unsafeMax": 8698904817.0
}
}우선순위 수준은 최근 트랜잭션 수수료의 백분위수에 해당합니다.
min: 0번째 백분위수low: 25번째 백분위수medium: 50번째 백분위수high: 75번째 백분위수veryHigh: 95번째 백분위수unsafeMax: 100번째 백분위수(주의해서 사용하세요)
트랜잭션 처리율을 더 높이려면 high 또는 very high 우선순위 수준을 고려하세요. 다만 높은 우선순위 수준, 특히 veryHigh 및 unsafeMax은 트랜잭션 비용을 크게 높일 수 있으므로 주의해야 합니다.
recommended: true 옵션을 사용할 때 중간값(50번째 백분위수) 우선순위 수수료가 10,000을 초과하면 API는 해당 값을 반환합니다. 중간값이 10,000 미만이면 API는 10,000을 반환합니다. 이를 통해 트랜잭션에 기본 우선순위 수수료가 적용됩니다.
빈 슬롯 평가
최근 Priority Fee API 업데이트를 통해 빈 슬롯을 고려하여 수수료를 더 지능적으로 추정할 수 있게 되었습니다. 특정 계정에 대한 트랜잭션이 블록에 없으면 API가 해당 슬롯의 수수료를 0으로 평가하도록 설정할 수 있습니다. 네트워크 활동이 적을 때 더 정확한 추정치를 제공합니다.
const response = await fetch(heliusEndpoint, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 'helius-example',
method: 'getPriorityFeeEstimate',
params: [{
transaction: serializedTx,
options: {
recommended: true,
evaluateEmptySlotAsZero: true
}
}]
}),
});evaluateEmptySlotAsZero을 활성화하면 API는 다음과 같이 작동합니다.
- 계정에 대한 트랜잭션이 없는 블록을 식별합니다
- 이러한 빈 슬롯의 수수료를 0으로 계산합니다
- 혼잡도가 낮을 때 추정치를 낮춥니다
- 네트워크 활동이 적을 때 과도한 수수료 지불을 방지합니다
트랜잭션 최적화 전략
우선순위 수수료 외에도 트랜잭션 최적화에는 처리율을 높이기 위해 함께 작동하는 몇 가지 핵심 요소가 있습니다.
컴퓨트 유닛 관리
- Helius SDK를 사용해 트랜잭션에 필요한 최적의 컴퓨트 유닛을 가져옵니다.
const response = await helius.rpc.getComputeUnits({
transaction: serializedTransaction
});
const computeUnits = response.computeUnits;- 트랜잭션에 컴퓨트 유닛 한도를 추가합니다.
transaction.add(
ComputeBudgetProgram.setComputeUnitLimit({
units: computeUnits
})
);커밋 수준
대부분의 애플리케이션에서는 processed 커밋 수준이 가장 균형 잡힌 선택입니다. 장점은 다음과 같습니다.
- 확인 시간이 가장 빠릅니다
- 대부분의 사용 사례에 충분한 보안 수준을 제공합니다
- 블록 해시 만료 위험을 줄입니다
- 혼잡 시 누락되는 트랜잭션을 최소화합니다
애플리케이션 동작의 일관성을 유지하려면 트랜잭션을 전송하고 확인할 때 항상 동일한 커밋 수준을 사용하세요.
RPC 구성
트랜잭션 재전송을 더 세밀하게 제어하려면 maxRetries를 0으로 설정하고 자체 재시도 로직을 구현하세요. 지연 시간을 줄이려면 skipPreflight: true를 사용하세요. 혼잡도가 높은 시간대에 특히 유용합니다.
const signature = await connection.sendTransaction(transaction, {
maxRetries: 0,
skipPreflight: true
});스테이킹된 엔드포인트 사용하기
Helius 스테이킹된 엔드포인트는 스테이킹된 연결에 직접적이고 보장된 액세스를 제공하므로 우선순위 수수료를 직접 최적화할 필요가 없습니다.
const connection = new Connection(
'https://staked.helius-rpc.com?api-key=YOUR_API_KEY'
);
// Transaction will be processed with optimal priority
const signature = await connection.sendTransaction(transaction);스테이킹된 엔드포인트의 장점은 다음과 같습니다.
- 스테이킹된 대역폭을 보장합니다
- 혼잡 시 트랜잭션 실패를 줄입니다
- 전용 인프라를 통해 트랜잭션을 더 빠르게 전파합니다
결론
특히 네트워크가 혼잡할 때 Solana에서 트랜잭션을 성공적으로 처리하려면 우선순위 수수료를 효과적으로 사용하는 것이 중요합니다. Helius Priority Fee API를 활용하고 여기서 설명한 전략을 구현하면 비용을 적절히 관리하면서 트랜잭션 성공률을 크게 높일 수 있습니다. 최적의 결과를 얻으려면 최신 정보를 확인하고 네트워크 상황에 맞춰 대응하세요.
끝까지 읽어주셔서 감사합니다! 이 가이드가 Solana 트랜잭션 최적화 방법을 이해하는 데 도움이 되었기를 바랍니다. Solana의 최신 소식을 놓치지 않도록 뉴스레터를 구독하세요.
더 자세히 알아볼 준비가 되셨나요?
지금 Helius 블로그의 최신 글을 살펴보고 Solana 여정을 이어가세요.
관련 아티클
Helius 구독하기
최신 Solana 개발 소식을 확인하고 새 게시물 알림을 받아보세요


