요약
Helius의 스테이킹 연결은 최소한의 확인 시간으로 100% 트랜잭션 전송을 보장합니다. 스테이킹 연결을 사용할 때 트랜잭션 랜딩 성공률을 최적화하려면 다음 모범 사례를 따르는 것이 좋습니다.- 최신 블록해시를 가져올 때 “confirmed” 커밋먼트를 사용하세요.
- 우선순위 수수료를 추가하고 동적으로 계산하세요.
- 컴퓨트 유닛(CU) 사용량을 최적화하세요.
maxRetries을 0으로 설정하고 견고한 재시도 로직을 구현하세요.skipPreflight을true으로 설정하여 전송하세요(선택 사항).
트레이더를 위한 권장 최적화
지연 시간에 민감한 거래 사용 사례에는 Sender 사용을 권장합니다. 하지만 스테이킹 연결을 사용하면서 지연 시간을 최대한 낮추도록 설정을 최적화하려면 위의 모범 사례와 함께 다음 최적화를 적용하는 것이 좋습니다.- 클라이언트 서버(트랜잭션을 전송하는 머신)는 미국 동부 또는 서유럽에 위치해야 합니다.
- Helius 트랜잭션 전송 서버와 코로케이션하려면 FRA 또는 PIT를 선택하세요.
- 검증자 네트워크에서 멀리 떨어진 리전(예: 라틴 아메리카, 남아프리카 공화국)에서는 전송하지 마세요.
- 꼬리 지연 시간을 최소화하려면 Helius 리전 캐시를 워밍업하세요.
- 리전별로 워밍업 스레드는 하나만 필요하며, 그 이상은 아무런 이점이 없습니다.
- 트랜잭션 전송에 사용하는 것과 동일한 엔드포인트와 API 키를 사용하여 매초
getHealthRPC 호출을 전송하세요.
스마트 트랜잭션 전송
Helius TypeScript 및 Rust SDK 모두 스마트 트랜잭션을 전송할 수 있습니다. 이 새로운 방식은 최적화된 트랜잭션을 빌드하고 전송하며 확인 상태까지 처리합니다. 트랜잭션이 프리플라이트 검사를 건너뛸지 여부와 같은 전송 옵션을 설정할 수 있습니다. 가장 기본적으로 사용자는 키페어와 실행하려는 명령어만 제공하면 되며, 나머지는 Helius가 처리합니다. Helius는 다음 작업을 수행합니다.- 최신 블록해시를 가져옵니다.
- 초기 트랜잭션을 빌드합니다.
- 초기 트랜잭션을 시뮬레이션하여 소비된 컴퓨트 유닛(CU)을 가져옵니다.
- 이전 단계에서 소비된 CU에 약간의 여유분을 더해 CU 한도를 설정합니다.
- Priority Fee API를 통해 Helius 권장 우선순위 수수료를 가져옵니다.
- 우선순위 수수료(CU당 마이크로램포트)를 Helius 권장 수수료로 설정합니다.
- 권장 수수료가 다음 몇 초 이내에 변경될 경우에 대비해 소액의 완충 수수료를 추가합니다.
- 최적화된 트랜잭션을 빌드하고 전송합니다.
- 성공하면 트랜잭션 서명을 반환합니다.
스테이킹 연결에 권장값 이상의 수수료를 요구하면 Helius가 고품질 트랜잭션을 전송할 수 있으며 검증자의 속도 제한도 받지 않습니다.
TypeScript SDK
sendSmartTransaction 메서드는 버전 >= 1.3.2의 Helius TypeScript SDK에서 사용할 수 있습니다. SDK를 최신 버전으로 업데이트하려면 npm update helius-sdk을 실행하세요.
이 예제는 원하는 계정으로 SOL을 전송합니다. sendSmartTransaction을 사용하여 프리플라이트 검사를 건너뛰지 않는 최적화된 트랜잭션을 전송합니다.
Rust SDK
send_smart_transaction 메서드는 버전 >= 0.1.5의 Rust SDK에서 사용할 수 있습니다. SDK를 최신 버전으로 업데이트하려면 cargo update helius을 실행하세요.
다음 예제는 원하는 계정으로 0.01 SOL을 전송합니다.
send_smart_transaction을 사용하여 프리플라이트 검사를 건너뛰고 필요한 경우 두 번 재시도하는 최적화된 트랜잭션을 전송합니다.
SDK 없이 트랜잭션 전송
SDK 중 하나를 사용하여 스마트 트랜잭션을 전송하는 것을 권장하지만, SDK 없이도 동일한 기능을 구현할 수 있습니다. TypeScript SDK와 Rust SDK는 모두 오픈 소스이므로 스마트 트랜잭션 전송 기능의 기반 코드를 언제든 확인할 수 있습니다.초기 트랜잭션 준비 및 빌드
먼저 초기 트랜잭션을 준비하고 빌드합니다. 여기에는 명령어 세트로 새 트랜잭션을 만들고, 최근 블록해시를 추가하고, 수수료 지불자를 지정하는 작업이 포함됩니다. 버전이 지정된 트랜잭션의 경우TransactionMessage을 만들고 조회 테이블이 있으면 이를 사용하여 컴파일하세요.
그런 다음 버전이 지정된 새 트랜잭션을 만들고 서명하세요. 다음 단계에서 트랜잭션을 시뮬레이션하려면 트랜잭션에 서명되어 있어야 하므로 이 과정이 필요합니다.
예를 들어 버전이 지정된 트랜잭션을 준비하려면 다음과 같이 합니다.
트랜잭션의 컴퓨트 유닛(CU) 사용량 최적화
트랜잭션의 컴퓨트 유닛(CU) 사용량을 최적화하려면simulateTransaction RPC 메서드로 트랜잭션을 시뮬레이션할 수 있습니다.
트랜잭션을 시뮬레이션하면 사용된 CU의 양이 반환되므로 이 값을 사용하여 컴퓨트 한도를 적절하게 설정할 수 있습니다.
먼저 원하는 명령어와 컴퓨트 한도를 140만 CU로 설정하는 명령어가 포함된 테스트 트랜잭션을 사용하는 것이 좋습니다.
이렇게 하면 트랜잭션 시뮬레이션이 성공하도록 할 수 있습니다.
예시는 다음과 같습니다.
트랜잭션 직렬화 및 인코딩
이 과정은 비교적 간단합니다. 먼저 트랜잭션을 직렬화하기 위해 Transaction과 VersionedTransaction 타입에 있는.serialize() 메서드를 사용합니다. 그런 다음 bs58 패키지를 사용하여 트랜잭션을 인코딩합니다.
코드는 bs58.encode(txt.serialize());과 유사해야 합니다.
적절한 우선순위 수수료 설정
먼저 Priority Fee API를 사용하여 예상 우선순위 수수료를 가져옵니다. 트랜잭션을 전달하고 recommended 매개변수를 통해 Helius 권장 수수료를 가져옵니다.최적화된 트랜잭션 빌드 및 전송
이 단계는 첫 번째 단계와 거의 동일합니다. 다만 초기 명령어 배열에 컴퓨트 유닛 한도와 가격을 최적으로 설정하는 명령어 두 개가 추가되었습니다. 이제 트랜잭션을 전송하세요. 프리플라이트 검사를 사용하거나 건너뛰는지 또는 다른 전송 옵션을 변경하는지는 중요하지 않습니다. 모든 유료 플랜에서 트랜잭션은 스테이킹 연결을 통해 라우팅됩니다.트랜잭션 상태 폴링 및 재브로드캐스트
sendTransaction RPC 메서드에는 RPC의 기본 재시도 로직을 재정의하도록 설정할 수 있는 maxRetries 매개변수가 있어 개발자가 재시도 프로세스를 더 세밀하게 제어할 수 있습니다.
getLatestBlockhash를 통해 현재 블록해시를 가져오고 lastValidBlockHeight을 저장한 다음 블록해시가 만료될 때까지 트랜잭션을 재시도하는 패턴이 일반적입니다.
블록해시가 더 이상 유효하지 않을 때만 트랜잭션에 다시 서명해야 합니다. 그렇지 않으면 두 트랜잭션이 모두 네트워크에서 승인될 수 있습니다.
트랜잭션을 전송한 후에는 재시도하기 전에 네트워크가 트랜잭션을 처리하고 확인했는지 파악하기 위해 확인 상태를 폴링해야 합니다. getSignatureStatuses RPC 메서드를 사용하여 트랜잭션 목록의 확인 상태를 검사하세요.
@solana/web3.js SDK의 Connection 클래스에도 여러 서명의 현재 상태를 가져오는 getSignatureStatuses 메서드가 있습니다.
sendSmartTransaction의 폴링 및 재브로드캐스트 처리 방식
sendSmartTransaction 메서드의 타임아웃은 60초입니다. 블록해시는 150개 슬롯 동안 유효하고 각 슬롯이 정확히 400ms라고 가정하면, 트랜잭션의 블록해시는 1분 후 유효하지 않게 된다고 합리적으로 가정할 수 있습니다.
이 메서드는 트랜잭션을 전송하고 이 타임아웃 동안 서명을 폴링합니다.
txtSig은 방금 전송한 트랜잭션의 서명으로 설정됩니다.
그런 다음 이 메서드는 pollTransactionConfirmation() 메서드로 트랜잭션의 확인 상태를 폴링합니다. 이 메서드는 5초마다 트랜잭션 상태를 최대 세 번 확인합니다.
이 시간 동안 트랜잭션이 확인되지 않으면 오류가 반환됩니다.