stream := client.SubscribeTransactions(filter)
defer stream.Close()
for {
resp, err := stream.Next(ctx)
if errors.Is(err, io.EOF) {
break
}
if err != nil {
break
}
switch {
case resp.GetTransaction() != nil:
ft := resp.GetTransaction()
// resp.GetSequence() - 单调递增的逐流序列号
// ft.GetFilterIds() - 本交易匹配了你的哪些过滤器
if tx := ft.GetTransaction(); tx != nil {
// tx.GetSlot(), tx.GetSignature(), tx.GetAccountKeys(), tx.GetInstructions()
// 富化(仅在设置了 IncludeEnrichment 时):tx.GetFeePayer(),
// tx.GetProgramIds(), tx.GetComputeUnitPrice(), tx.GetComputeLimit(),
// tx.GetLoadedWritableAddresses(), tx.GetLoadedReadonlyAddresses()
fmt.Printf("seq=%d slot=%d\n", resp.GetSequence(), tx.GetSlot())
}
case resp.GetFilterValidation() != nil:
r := resp.GetFilterValidation() // 每次添加/移除后每个过滤器一条
fmt.Printf("filter %s accepted=%v %s\n", r.GetFilterId(), r.GetAccepted(), r.GetRejectionReason())
case resp.GetHeartbeat() != nil:
// resp.GetHeartbeat().GetServerTsMs() - 服务器挂钟时间,自纪元起的毫秒数
case resp.GetPong() != nil:
// resp.GetPong().GetPingId()
}
}