Eylemler ve Blink'ler

Solana Eylemleri, Solana blok zincirinde önizlenecek, imzalanacak ve QR kodları, düğmeler + widget'lar ve internet genelindeki web siteleri dahil olmak üzere çeşitli bağlamlarda gönderilecek işlemleri döndüren, spesifikasyona uygun API'lerdir. Eylemler, geliştiricilerin Solana ekosistemi genelinde yapılabilecek şeyleri doğrudan ortamınıza entegre etmesini kolaylaştırır; böylece farklı bir uygulamaya veya web sayfasına gitmek zorunda kalmadan blok zinciri işlemleri gerçekleştirebilirsiniz.

Blok zinciri bağlantıları – ya da blink'ler – herhangi bir Solana Eylemini paylaşılabilir, meta veri açısından zengin bir bağlantıya dönüştürür. Blink'ler, Eylem uyumlu istemcilerin (tarayıcı uzantısı cüzdanları, botlar) kullanıcıya ek özellikler sunmasına olanak tanır. Bir web sitesinde, blink; merkeziyetsiz bir uygulamaya gitmeden doğrudan cüzdanda bir işlem önizlemesini tetikleyebilir. Discord'da ise bir bot, blink'i etkileşimli düğmeler kümesine dönüştürebilir. Bu sayede zincir üzerinde etkileşim kurma imkânı, URL görüntüleyebilen her web yüzeyine taşınır.

Başlarken

Özel Solana Eylemleri oluşturmaya hızlıca başlamak için:

npm install @solana/actions
  • uygulamanıza Solana Actions SDK'sını yükleyin
  • Eyleminizle ilgili meta verileri döndüren GET isteği için bir API uç noktası oluşturun
  • POST isteğini kabul eden ve kullanıcı için imzalanabilir işlemi döndüren bir API uç noktası oluşturun

@solana/actions SDK'sını kullanarak bir Solana Eylemi nasıl oluşturulur konusundaki video eğitimine göz atın.

Ayrıca yerel SOL transferi gerçekleştiren bir Eylem için kaynak kodu ve bu repoda birçok örnek Eylem bulabilirsiniz.

Özel Solana Eylemlerinizi üretime dağıtırken:

Eylemler ve blink'ler oluşturma konusunda ilham arıyorsanız, topluluk tarafından oluşturulan içerikler ve yeni fikirler için Awesome Blinks reposuna göz atın.

Eylemler

Solana Eylemleri spesifikasyonu, bir uygulamadan doğrudan kullanıcıya imzalanabilir işlemleri (ve ilerleyen süreçte imzalanabilir mesajları) iletmek için bir dizi standart API kullanır. Bunlar, kamuya açık URL'lerde barındırılır ve bu nedenle herhangi bir istemcinin URL aracılığıyla etkileşime girebileceği şekilde erişilebilir durumdadır.

Eylemleri, meta veri ve kullanıcının blok zinciri cüzdanıyla imzalayacağı bir şeyi (işlem veya kimlik doğrulama mesajı) döndüren bir API uç noktası olarak düşünebilirsiniz.

Eylemler API'si, bir Eylemin URL uç noktasına basit GET ve POST istekleri göndermekten ve Eylemler arayüzüne uygun yanıtları işlemekten oluşur.

  1. GET isteği, istemciye bu URL'de hangi eylemlerin mevcut olduğuna dair insan tarafından okunabilir bilgiler ve isteğe bağlı ilgili eylemler listesi içeren meta verileri döndürür.
  2. POST isteği, istemcinin ardından kullanıcının cüzdanından blok zincirinde veya başka bir zincir dışı hizmette imzalamasını ve yürütmesini istediği imzalanabilir bir işlem ya da mesaj döndürür.

Eylem Yürütme ve Yaşam Döngüsü

Pratikte, Eylemlerle etkileşim kurmak tipik bir REST API ile etkileşime çok benzer:

  • bir istemci, mevcut Eylemler hakkındaki meta verileri almak için bir Eylem URL'sine ilk GET isteğini gönderir
  • uç nokta, uç nokta hakkındaki meta verileri (uygulamanın başlığı ve simgesi gibi) ve bu uç nokta için mevcut eylemlerin listesini içeren bir yanıt döndürür
  • istemci uygulaması (mobil cüzdan, sohbet botu veya web sitesi gibi) kullanıcının eylemlerden birini gerçekleştirmesi için bir arayüz görüntüler
  • kullanıcı bir eylem seçtikten sonra (bir düğmeye tıklayarak), istemci; kullanıcının imzalaması için işlemi almak amacıyla uç noktaya bir POST isteği gönderir
  • cüzdan, kullanıcının işlemi imzalamasına aracılık eder ve nihayetinde onay için işlemi blok zincirine gönderir

Solana Eylemleri Yürütme ve Yaşam DöngüsüSolana Eylemleri Yürütme ve Yaşam Döngüsü

Eylemler URL'sinden işlem alırken, istemciler bu işlemlerin blok zincirine gönderilmesini yönetmeli ve durum yaşam döngülerini takip etmelidir.

Eylemler ayrıca yürütme öncesinde belirli düzeyde geçersiz kılmayı destekler. GET ve POST istekleri, eylemin gerçekleştirilebilir olup olmadığını belirten bazı meta veriler döndürebilir (örneğin disabled alanı ile).

Örneğin, oy verme süresi dolmuş bir DAO yönetim teklifine oy vermeyi kolaylaştıran bir Eylem uç noktası varsa, ilk GET isteği "Bu teklif artık oylamaya açık değil" hata mesajını ve "Evet Oyu Ver" ile "Hayır Oyu Ver" düğmelerini "devre dışı" olarak döndürebilir.

Blink'ler

Blink'ler (blok zinciri bağlantıları), Eylem API'lerini inceleyen ve Eylemlerle etkileşim kurmak ve bunları yürütmek için kullanıcı arayüzleri oluşturan istemci uygulamalarıdır.

Blink'leri destekleyen istemci uygulamaları, Eylem uyumlu URL'leri algılar, ayrıştırır ve kullanıcıların bunlarla standartlaştırılmış kullanıcı arayüzlerinde etkileşim kurmasına olanak tanır.

Bir Eylem için tam arayüz oluşturmak amacıyla bir Actions API'sini eksiksiz biçimde inceleyen herhangi bir istemci uygulaması bir blink'tir. Dolayısıyla, Actions API'lerini kullanan tüm istemciler blink değildir.

Bir blink URL'si, kullanıcının cüzdanıyla imzalama dahil olmak üzere bir Eylemin yürütme yaşam döngüsünü tamamlamasına olanak tanıyan bir istemci uygulamasını tanımlar.

https://example.domain/?action=<action_url>

Herhangi bir istemci uygulamasının blink'e dönüşmesi için:

  • Blink URL'si, değeri URL kodlanmış bir Eylem URL'si olan bir action sorgu parametresi içermelidir. Bu değer, diğer protokol parametreleriyle çakışmamak için URL kodlanmış olmalıdır.

  • İstemci uygulaması, action sorgu parametresini URL çözümlemeli ve sağlanan Eylem API bağlantısını incelemelidir (bkz. Eylem URL şeması).

  • İstemci, kullanıcının cüzdanıyla imzalama dahil olmak üzere bir Eylemin yürütme yaşam döngüsünü tamamlamasına olanak tanıyan zengin bir kullanıcı arayüzü oluşturmalıdır.

Tüm blink istemci uygulamaları (ör. web siteleri veya dApp'ler) tüm Eylemleri desteklemeyebilir. Uygulama geliştiricileri, blink arayüzlerinde hangi Eylemleri desteklemek istediklerini seçebilir.

Aşağıdaki örnek, URL kodlanmış solana-action:https://actions.alice.com/donate action değerine sahip geçerli bir blink URL'sini göstermektedir:

https://example.domain/?action=solana-action%3Ahttps%3A%2F%2Factions.alice.com%2Fdonate

Blink'ler Aracılığıyla Eylemleri Algılama

Blink'ler, en az 3 şekilde Eylemlerle ilişkilendirilebilir:

  1. Açık bir Eylem URL'si paylaşma: solana-action:https://actions.alice.com/donate

    Bu durumda yalnızca desteklenen istemciler blink'i oluşturabilir. Desteklemeyen istemci dışında ziyaret edilebilecek bir yedek bağlantı önizlemesi veya site bulunmayacaktır.

  2. Web sitesinin alan adı kökündeki bir actions.json dosyası aracılığıyla bir Actions API'sine bağlı bir web sitesi bağlantısı paylaşma.

    Örneğin, https://alice.com/actions.json; kullanıcıların Alice'e bağış yapabileceği bir web sitesi URL'si olan https://alice.com/donate adresini, Alice'e bağış yapmaya yönelik Eylemlerin barındırıldığı API URL'si https://actions.alice.com/donate ile eşleştirir.

  3. Eylemlerin nasıl ayrıştırılacağını anlayan bir "araya giren" site URL'sine Eylem URL'si yerleştirme.

    https://example.domain/?action=<action_url>

Blink'leri destekleyen istemciler, yukarıdaki formatların herhangi birini alabilmeli ve doğrudan istemcide eylemi yürütmeyi kolaylaştıracak bir arayüzü doğru şekilde oluşturabilmelidir.

Blink'leri desteklemeyen istemciler için altta yatan bir web sitesi bulunmalıdır (bu sayede tarayıcı evrensel yedek konumuna gelir).

Bir kullanıcı, istemcide eylem düğmesi veya metin giriş alanı olmayan herhangi bir yere dokunursa altta yatan siteye yönlendirilmelidir.

Solana Eylemleri ve blink'ler izinsiz bir protokol/spesifikasyon olsa da, istemci uygulamaları ve cüzdanlar yine de kullanıcıların işlemi imzalamasını nihai olarak kolaylaştırmakla yükümlüdür.

Blink'lerinizi ve eylemlerinizi doğrudan tarayıcınızda incelemek, hata ayıklamak ve test etmek için Blinks Inspector aracını kullanın. GET ve POST yanıt yüklerini, yanıt başlıklarını görüntüleyebilir ve bağlı Eylemlerinizin her birine ait tüm girdileri test edebilirsiniz.

Her istemci uygulaması veya cüzdan, sosyal medya platformlarında kullanıcılarına otomatik olarak hangi Eylem uç noktalarının gösterileceği konusunda farklı gereksinimlere sahip olabilir.

Örneğin, bazı istemciler; Dialect'in Eylemler Kayıt Defteri (aşağıda ayrıntılı olarak açıklanmıştır) gibi, istemcinin kullanıcılar için bir Eylemi açmadan önce doğrulama gerektiren "izin listesi" yaklaşımıyla çalışabilir.

Tüm blink'ler, Dialect'in dial.to blink'leri Araya Giren sitesinde oluşturulmaya ve imzalanmaya devam edecek olup kayıt defteri durumları blink içinde gösterilecektir.

Dialect'in Eylemler Kayıt Defteri

Solana ekosistemi için bir kamu yararı hizmeti olarak Dialect, Solana Foundation ve diğer topluluk üyelerinin yardımıyla birlikte, önceden doğrulanmış bilinen kaynaklardan gelen blok zinciri bağlantılarının kamuya açık bir kayıt defterini tutar. Lansmanı itibarıyla, yalnızca Dialect kayıt defterine kaydedilmiş Eylemler Twitter akışında paylaşıldığında görüntülenecektir.

İstemci uygulamaları ve cüzdanlar, kullanıcı güvenliğini sağlamaya yardımcı olmak için bu kamuya açık kayıt defterini veya başka bir çözümü özgürce kullanmayı tercih edebilir. Dialect kayıt defteri aracılığıyla doğrulanmamışsa, blok zinciri bağlantısına blink istemcisi tarafından dokunulmayacak ve tipik bir URL olarak oluşturulacaktır.

Geliştiriciler Dialect tarafından doğrulanmak için buraya başvurabilir: dial.to/register

Spesifikasyon

Solana Eylemleri spesifikasyonu, bir istek/yanıt etkileşim akışının parçası olan temel bölümlerden oluşur:

Bu isteklerin her biri, zengin kullanıcı arayüzleri için belirli meta verileri toplamak ve Actions API'ye kullanıcı girdisi sağlamayı kolaylaştırmak üzere Action istemcisi (örn. cüzdan uygulaması, tarayıcı uzantısı, dApp, web sitesi vb.) tarafından yapılır.

Yanıtların her biri bir uygulama (örn. web sitesi, sunucu arka ucu vb.) tarafından hazırlanır ve Action istemcisine döndürülür. Nihai olarak, cüzdanın kullanıcıdan onaylamasını, imzalamasını ve blokzincire göndermesini istemesi için imzalanabilir bir işlem veya mesaj sağlanır.

Bu readme dosyalarında bildirilen türler ve arayüzler genellikle okunabilirliği artırmak için türlerin basitleştirilmiş sürümüdür.

Daha iyi tür güvenliği ve iyileştirilmiş geliştirici deneyimi için @solana/actions-spec paketi daha karmaşık tür tanımları içerir. Bunların kaynak kodunu burada bulabilirsiniz.

URL Şeması

Bir Solana Action URL'si, solana-action protokolünü kullanarak imzalanabilir bir Solana işlemi veya mesajı için etkileşimli bir isteği tanımlar.

İstek etkileşimlidir çünkü URL'deki parametreler, kullanıcının cüzdanıyla imzalayacağı imzalanabilir bir işlem veya mesaj oluşturmak üzere bir dizi standart HTTP isteği yapmak için istemci tarafından kullanılır.

solana-action:<link>
  • Yol adı olarak tek bir link alanı zorunludur. Değer, koşula bağlı olarak URL olarak kodlanmış mutlak bir HTTPS URL'si olmalıdır.

  • URL sorgu parametreleri içeriyorsa URL olarak kodlanmalıdır. Değerin URL olarak kodlanması, protokol belirtimi aracılığıyla eklenebilecek Actions protokol parametreleriyle çakışmayı önler.

  • URL sorgu parametreleri içermiyorsa URL olarak kodlanmamalıdır. Bu, daha kısa bir URL ve daha az yoğun bir QR kodu üretir.

Her iki durumda da istemciler değerin URL kodunu çözmelidir. Değer URL olarak kodlanmamışsa bunun bir etkisi olmaz. Kodu çözülen değer mutlak bir HTTPS URL'si değilse cüzdan bunu hatalı biçimlendirilmiş olarak reddetmelidir.

OPTIONS yanıtı

Actions istemcileri (blinks dahil) içinde Cross-Origin Resource Sharing'e (CORS) izin vermek için tüm Action uç noktaları, OPTIONS yöntemi için yapılan HTTP isteklerine, istemde bulunan istemcilerin aynı kaynak alan adından gelen sonraki tüm isteklerde CORS kontrollerini geçmesini sağlayacak geçerli başlıklarla yanıt vermelidir.

Bir Actions istemcisi, Action URL'sine yapılacak sonraki GET isteğinin tüm CORS kontrollerini geçip geçmeyeceğini kontrol etmek için Action URL uç noktasına "ön kontrol" istekleri yapabilir. Bu CORS ön kontrol denetimleri OPTIONS HTTP yöntemi kullanılarak yapılır ve Action istemcilerinin (blinks gibi) kaynak alan adlarından gelen sonraki tüm istekleri düzgün şekilde yapmasını sağlayacak gerekli tüm HTTP başlıklarıyla yanıtlanmalıdır.

En azından gerekli HTTP başlıkları şunları içerir:

  • Access-Control-Allow-Origin, * değeriyle
    • bu, tüm Action istemcilerinin gerekli tüm istekleri yapmak için CORS kontrollerini güvenli şekilde geçebilmesini sağlar
  • Access-Control-Allow-Methods, GET,POST,PUT,OPTIONS değeriyle
    • Actions için gerekli tüm HTTP istek yöntemlerinin desteklenmesini sağlar
  • Access-Control-Allow-Headers, en az Content-Type, Authorization, Content-Encoding, Accept-Encoding değeriyle

Basitlik açısından geliştiriciler, OPTIONS isteklerine GET yanıtlarıyla aynı yanıtı ve başlıkları döndürmeyi düşünebilir.

actions.json için Cross-Origin başlıkları

actions.json dosya yanıtı da GET ve OPTIONS istekleri için geçerli Cross-Origin başlıkları, özellikle Access-Control-Allow-Origin başlığının * değerini döndürmelidir.

Daha fazla ayrıntı için aşağıdaki actions.json bölümüne bakın.

GET İsteği

Action istemcisi (örn. cüzdan, tarayıcı uzantısı vb.), Action'ın URL uç noktasına bir HTTP GET JSON isteği yapmalıdır.

  • İstek cüzdanı veya kullanıcıyı tanımlamamalıdır.
  • İstemci isteği bir Accept-Encoding başlığıyla yapmalıdır.
  • İstemci, istek yapılırken URL'nin alan adını göstermelidir.

GET Yanıtı

Action'ın URL uç noktası (örn. uygulama veya sunucu arka ucu), bir HTTP OK JSON yanıtıyla (gövdede geçerli bir payload ile) veya uygun bir HTTP hatasıyla yanıt vermelidir.

Hata yanıtları (yani HTTP 4xx ve 5xx durum kodları), kullanıcılara yararlı bir hata mesajı sunmak için ActionError yapısını izleyen bir JSON yanıt gövdesi döndürmelidir. Bkz. Action Hataları.

GET Yanıt Gövdesi

HTTP OK JSON yanıtı içeren bir GET yanıtı, arayüz belirtimini izleyen bir gövde payload'u içermelidir:

ActionGetResponse
export type ActionType = "action" | "completed";
export type ActionGetResponse = Action<"action">;
export interface Action<T extends ActionType> {
/** type of Action to present to the user */
type: T;
/** image url that represents the source of the action request */
icon: string;
/** describes the source of the action request */
title: string;
/** brief summary of the action to be performed */
description: string;
/** button text rendered to the user */
label: string;
/** UI state for the button being rendered to the user */
disabled?: boolean;
links?: {
/** list of related Actions a user could perform */
actions: LinkedAction[];
};
/** non-fatal error message to be displayed to the user */
error?: ActionError;
}
  • type - Kullanıcıya verilen action türü. Varsayılan değer actiondır. İlk ActionGetResponse için action türü zorunludur.

    • action - Kullanıcının herhangi bir LinkedActions ile etkileşime geçmesini sağlayacak standart action
    • completed - Action zincirleme içinde "tamamlandı" durumunu bildirmek için kullanılır.
  • icon - Değer, bir simge görselinin mutlak HTTP veya HTTPS URL'si olmalıdır. Dosya SVG, PNG veya WebP görseli olmalıdır; aksi takdirde istemci/cüzdan bunu hatalı biçimlendirilmiş olarak reddetmelidir.

  • title - Değer, action isteğinin kaynağını temsil eden bir UTF-8 dizesi olmalıdır. Örneğin bu, isteği yapan bir marka, mağaza, uygulama veya kişinin adı olabilir.

  • description - Değer, action hakkında bilgi sağlayan bir UTF-8 dizesi olmalıdır. Açıklama kullanıcıya gösterilmelidir.

  • label - Değer, kullanıcının tıklayacağı bir düğmede işlenecek bir UTF-8 dizesi olmalıdır. Tüm etiketler 5 kelimelik ifadeleri aşmamalı ve kullanıcının gerçekleştirmesini istediğiniz eylemi netleştirmek için bir fiille başlamalıdır. Örneğin, "NFT Mintle", "Evet Oyu Ver" veya "1 SOL Stake Et".

  • disabled - Değer, işlenen düğmenin (label dizesini gösteren) devre dışı durumunu temsil etmek için boolean olmalıdır. Değer sağlanmazsa disabled varsayılan olarak false olmalıdır (yani varsayılan olarak etkin). Örneğin, action uç noktası kapanmış bir yönetişim oylaması içinse disabled=true ayarlayın ve label "Oylama Kapandı" olabilir.

  • error - Kritik olmayan hatalar için isteğe bağlı bir hata göstergesi. Varsa, istemci bunu kullanıcıya göstermelidir. Ayarlanmışsa istemcinin action'ı yorumlamasını veya kullanıcıya göstermesini engellememelidir (bkz. Action Hataları). Örneğin hata, iş kısıtları, yetkilendirme, durum veya harici kaynak hatası gibi bir nedeni göstermek için disabled ile birlikte kullanılabilir.

  • links.actions - Uç nokta için ilgili action'ların isteğe bağlı bir dizisi. Kullanıcılara listelenen action'ların her biri için kullanıcı arayüzü gösterilmeli ve yalnızca birini gerçekleştirmeleri beklenmelidir. Örneğin, bir yönetişim oylaması action uç noktası kullanıcıya üç seçenek döndürebilir: "Evet Oyu Ver", "Hayır Oyu Ver" ve "Oylamada Çekimser Kal".

    • links.actions sağlanmamışsa istemci, kök label dizesini kullanarak tek bir düğme işlemeli ve POST isteğini ilk GET isteğiyle aynı action URL uç noktasına yapmalıdır.

    • Herhangi bir links.actions sağlanmışsa istemci yalnızca links.actions alanında listelenen öğelere göre düğmeleri ve giriş alanlarını işlemelidir. İstemci, kök label içeriği için bir düğme işlememelidir.

LinkedAction
export interface LinkedAction {
/** Type of action to be performed by user */
type: LinkedActionType;
/** URL endpoint for an action */
href: string;
/** button text rendered to the user */
label: string;
/**
* Parameters to accept user input within an action
* @see {ActionParameter}
* @see {ActionParameterSelectable}
*/
parameters?: Array<TypedActionParameter>;
}

ActionParameter, Action API'nin kullanıcıdan hangi girdiyi istediğini bildirmeye olanak tanır:

ActionParameter
/**
* Parameter to accept user input within an action
* note: for ease of reading, this is a simplified type of the actual
*/
export interface ActionParameter {
/** input field type */
type?: ActionParameterType;
/** parameter name in url */
name: string;
/** placeholder text for the user input field */
label?: string;
/** declare if this field is required (defaults to `false`) */
required?: boolean;
/** regular expression pattern to validate user input client side */
pattern?: string;
/** human-readable description of the `type` and/or `pattern`, represents a caption and error, if value doesn't match */
patternDescription?: string;
/** the minimum value allowed based on the `type` */
min?: string | number;
/** the maximum value allowed based on the `type` */
max?: string | number;
}

pattern, geçerli bir düzenli ifadenin dize karşılığı olmalıdır. Bu düzenli ifade deseni, POST isteği yapılmadan önce kullanıcı girdisini doğrulamak için blink istemcileri tarafından kullanılmalıdır. pattern geçerli bir düzenli ifade değilse istemciler tarafından yok sayılmalıdır.

patternDescription, kullanıcıdan beklenen giriş isteklerinin insan tarafından okunabilir bir açıklamasıdır. pattern sağlanmışsa patternDescription sağlanması zorunludur.

min ve max değerleri, kullanıcıdan istenen girdinin alt ve/veya üst sınırlarının belirlenmesine olanak tanır (yani min/maks sayı ve/veya min/maks karakter uzunluğu) ve istemci tarafı doğrulama için kullanılmalıdır. date veya datetime-local giriş typeları için bu değerler tarih dizeleri olmalıdır. Diğer dize tabanlı giriş typeları için değerler, min/maks karakter uzunluğunu temsil eden sayılar olmalıdır.

Kullanıcı giriş değeri pattern açısından geçerli kabul edilmiyorsa kullanıcı, giriş alanının geçerli olmadığını belirten ve patternDescription dizesinin gösterildiği bir istemci tarafı hata mesajı almalıdır.

type alanı, Action API'nin daha spesifik kullanıcı giriş alanları bildirmesine olanak tanır; bu da daha iyi istemci tarafı doğrulama sağlar ve kullanıcı deneyimini iyileştirir. Çoğu durumda bu tür, standart HTML input öğesine benzeyecektir.

ActionParameterType aşağıdaki türe basitleştirilebilir:

ActionParameterType
/**
* Input field type to present to the user
* @default `text`
*/
export type ActionParameterType =
| "text"
| "email"
| "url"
| "number"
| "date"
| "datetime-local"
| "checkbox"
| "radio"
| "textarea"
| "select";

type değerlerinin her biri normalde, daha iyi istemci tarafı doğrulama ve kullanıcı deneyimi sağlamak için ilgili type değerindeki standart bir HTML input öğesine (yani <input type="email" />) benzeyen bir kullanıcı giriş alanıyla sonuçlanmalıdır:

  • text - HTML “text” input öğesinin eşdeğeri
  • email - HTML “email” input öğesinin eşdeğeri
  • url - HTML “url” input öğesinin eşdeğeri
  • number - HTML “number” input öğesinin eşdeğeri
  • date - HTML “date” input öğesinin eşdeğeri
  • datetime-local - HTML “datetime-local” input öğesinin eşdeğeri
  • checkbox - Standart HTML “checkbox” input öğelerinden oluşan bir gruplandırmaya eşdeğerdir. Action API, aşağıda ayrıntılandırıldığı gibi options döndürmelidir. Kullanıcı, sağlanan checkbox seçeneklerinden birden fazlasını seçebilmelidir.
  • radio - Standart HTML “radio” input öğelerinden oluşan bir gruplandırmaya eşdeğerdir. Action API, aşağıda ayrıntılandırıldığı gibi options döndürmelidir. Kullanıcı, sağlanan radio seçeneklerinden yalnızca birini seçebilmelidir.
  • Yukarıda belirtilmeyen diğer HTML giriş türü eşdeğerleri (hidden, button, submit, file, vb.) şu an için desteklenmemektedir.

Yukarıdaki HTML giriş türlerine benzeyen öğelere ek olarak, aşağıdaki kullanıcı giriş öğeleri de desteklenmektedir:

  • textarea - HTML textarea öğesinin eşdeğeri. Kullanıcının çok satırlı giriş yapmasına olanak tanır.
  • select - HTML select öğesinin eşdeğeri; kullanıcının "açılır menü" tarzı bir alan deneyimlemesine olanak tanır. Action API, aşağıda ayrıntılı olarak belirtilen options değerini döndürmelidir.

type değeri select, checkbox veya radio olarak ayarlandığında, Action API en az birer label ve value içeren options dizisi döndürmelidir. Her seçenek, blink-client'ın kullanıcı için varsayılan olarak hangi seçeneğin seçili olacağını anlamasını sağlamak amacıyla bir selected değeri de içerebilir (farklılıklar için checkbox ve radio'ya bakınız).

Bu ActionParameterSelectable, aşağıdaki tür tanımına basitleştirilebilir:

ActionParameterSelectable
/**
* note: for ease of reading, this is a simplified type of the actual
*/
interface ActionParameterSelectable extends ActionParameter {
options: Array<{
/** displayed UI label of this selectable option */
label: string;
/** value of this selectable option */
value: string;
/** whether or not this option should be selected by default */
selected?: boolean;
}>;
}

Hiçbir type ayarlanmamışsa veya bilinmeyen/desteklenmeyen bir değer ayarlanmışsa, blink-client'lar varsayılan olarak text kullanmalı ve basit bir metin giriş alanı oluşturmalıdır.

Action API, kullanıcı giriş parametrelerinden gelen tüm verileri doğrulamak ve temizlemekten hâlâ sorumludur; gerektiğinde "zorunlu" kullanıcı girişlerini uygular.

HTML/web tabanlı olanlar dışındaki platformlarda (yerel mobil gibi), yukarıda açıklanan HTML/web giriş türleriyle eşdeğer deneyim ve istemci tarafı doğrulamasını sağlamak için eşdeğer yerel kullanıcı giriş bileşeni kullanılmalıdır.

Örnek GET Yanıtı

Aşağıdaki örnek yanıt, kullanıcıya "Claim Access Token" etiketli tek bir düğme olarak sunulması beklenen tek bir "kök" action sağlamaktadır:

{
"title": "HackerHouse Events",
"icon": "<url-to-image>",
"description": "Claim your Hackerhouse access token.",
"label": "Claim Access Token" // button text
}

Aşağıdaki örnek yanıt, kullanıcının bir DAO önerisi için oy kullanmak amacıyla 3 düğmeden birine tıklamasına olanak tanıyan 3 ilgili action bağlantısı sağlamaktadır:

{
"title": "Realms DAO Platform",
"icon": "<url-to-image>",
"description": "Vote on DAO governance proposals #1234.",
"label": "Vote",
"links": {
"actions": [
{
"label": "Vote Yes", // button text
"href": "/api/proposal/1234/vote?choice=yes"
},
{
"label": "Vote No", // button text
"href": "/api/proposal/1234/vote?choice=no"
},
{
"label": "Abstain from Vote", // button text
"href": "/api/proposal/1234/vote?choice=abstain"
}
]
}
}

Parametreli Örnek GET Yanıtı

Aşağıdaki örnek yanıtlar, kullanıcıdan metin girişinin (parameters aracılığıyla) nasıl kabul edileceğini ve bu girişin son POST isteği uç noktasına (LinkedAction içindeki href alanı aracılığıyla) nasıl dahil edileceğini göstermektedir:

Aşağıdaki örnek yanıt, kullanıcıya SOL stake etmek için 3 bağlantılı action sağlamaktadır: "Stake 1 SOL" etiketli bir düğme, "Stake 5 SOL" etiketli başka bir düğme ve kullanıcının Action API'ye gönderilecek belirli bir "amount" değeri girmesine olanak tanıyan bir metin giriş alanı:

{
"title": "Stake-o-matic",
"icon": "<url-to-image>",
"description": "Stake SOL to help secure the Solana network.",
"label": "Stake SOL", // not displayed since `links.actions` are provided
"links": {
"actions": [
{
"label": "Stake 1 SOL", // button text
"href": "/api/stake?amount=1"
// no `parameters` therefore not a text input field
},
{
"label": "Stake 5 SOL", // button text
"href": "/api/stake?amount=5"
// no `parameters` therefore not a text input field
},
{
"label": "Stake", // button text
"href": "/api/stake?amount={amount}",
"parameters": [
{
"name": "amount", // field name
"label": "SOL amount" // text input placeholder
}
]
}
]
}
}

Aşağıdaki örnek yanıt, kullanıcının POST isteğiyle gönderilen bir amount girmesi için tek bir giriş alanı sağlamaktadır (sorgu parametresi veya alt yol kullanılabilir):

{
"icon": "<url-to-image>",
"label": "Donate SOL",
"title": "Donate to GoodCause Charity",
"description": "Help support this charity by donating SOL.",
"links": {
"actions": [
{
"label": "Donate", // button text
"href": "/api/donate/{amount}", // or /api/donate?amount={amount}
"parameters": [
// {amount} input field
{
"name": "amount", // input field name
"label": "SOL amount" // text input placeholder
}
]
}
]
}
}

POST İsteği

İstemci, action URL'sine aşağıdaki gövde yüküyle bir HTTP POST JSON isteği yapmalıdır:

{
"account": "<account>"
}
  • account - Değer, işlemi imzalayabilecek bir hesabın base58 ile kodlanmış ortak anahtarı olmalıdır.

İstemci, isteği bir Accept-Encoding başlığıyla yapmalıdır; uygulama ise HTTP sıkıştırması için bir Content-Encoding başlığıyla yanıt verebilir.

İstemci, istek yapılırken action URL'sinin etki alanını görüntülemelidir. Bir GET isteği yapıldıysa, istemci title değerini de görüntülemeli ve o GET yanıtındaki icon görselini oluşturmalıdır.

POST Yanıtı

Action'ın POST uç noktası, bir HTTP OK JSON yanıtıyla (gövdede geçerli bir yük ile) veya uygun bir HTTP hatasıyla yanıt vermelidir.

Hata yanıtları (yani HTTP 4xx ve 5xx durum kodları), kullanıcılara yararlı bir hata mesajı sunmak için ActionError yapısını izleyen bir JSON yanıt gövdesi döndürmelidir. Bkz. Action Hataları.

POST Yanıt Gövdesi

HTTP OK JSON yanıtı içeren bir POST yanıtı, aşağıdaki gövde yükünü içermelidir:

ActionPostResponse
/**
* Response body payload returned from the Action POST Request
*/
export interface ActionPostResponse<T extends ActionType = ActionType> {
/** base64 encoded serialized transaction */
transaction: string;
/** describes the nature of the transaction */
message?: string;
links?: {
/**
* The next action in a successive chain of actions to be obtained after
* the previous was successful.
*/
next: NextActionLink;
};
}
  • transaction - Değer, base64 ile kodlanmış bir serileştirilmiş işlem olmalıdır. İstemci, işlemi base64 ile çözmeli ve seri dışı bırakmalıdır.

  • message - Değer, yanıtta yer alan işlemin niteliğini açıklayan bir UTF-8 dizesi olmalıdır. İstemci bu değeri kullanıcıya göstermelidir. Örneğin, bu satın alınan bir ürünün adı, satın alıma uygulanan bir indirim veya bir teşekkür notu olabilir.

  • links.next - Birden fazla Action'ı arka arkaya "zincirlemek" için kullanılan isteğe bağlı bir değer. Dahil edilen transaction zincir üzerinde onaylandıktan sonra istemci, bir sonraki action'ı alıp görüntüleyebilir. Daha fazla ayrıntı için Action Zincirleme bölümüne bakınız.

  • İstemci ve uygulama, gelecekteki spesifikasyon güncellemeleriyle eklenebilecek ek alanları istek gövdesinde ve yanıt gövdesinde desteklemelidir.

Uygulama, kısmen veya tamamen imzalanmış bir işlemle yanıt verebilir. İstemci ve cüzdan, işlemi güvenilmez olarak doğrulamalıdır.

POST Yanıtı - İşlem

İşlem signatures boşsa veya işlem kısmen imzalanmamışsa:

  • İstemci, işlemdeki feePayer değerini görmezden gelmeli ve feePayer olarak istekteki account değerini ayarlamalıdır.
  • İstemci, işlemdeki recentBlockhash değerini görmezden gelmeli ve recentBlockhash olarak en son blockhash değerini ayarlamalıdır.
  • İstemci, işlemi imzalamadan önce serileştirmeli ve seri dışı bırakmalıdır. Bu, hesap anahtarlarının tutarlı sıralanmasını sağlar ve bu sorun için bir geçici çözüm niteliği taşır.

İşlem kısmen imzalanmışsa:

  • İstemci, feePayer veya recentBlockhash değerlerini değiştirmemelidir; aksi takdirde mevcut imzalar geçersiz hale gelir.
  • İstemci mevcut imzaları doğrulamalı; herhangi bir imza geçersizse, işlemi hatalı biçimlendirilmiş olarak reddetmelidir.

İstemci, işlemi yalnızca istekteki account ile imzalamalı ve bunu yalnızca istekteki account için bir imza bekleniyorsa yapmalıdır.

İstekteki account imzası dışında başka bir imza bekleniyorsa, istemci işlemi kötü amaçlı olarak reddetmelidir.

Action Hataları

Actions API'leri, kullanıcıya yararlı hata mesajları sunmak için ActionError kullanarak hata döndürmelidir. Bağlama göre bu hata ölümcül veya ölümcül olmayan nitelikte olabilir.

ActionError
export interface ActionError {
/** simple error message to be displayed to the user */
message: string;
}

Bir Actions API'si HTTP hata durum koduyla (yani 4xx ve 5xx) yanıt verdiğinde, yanıt gövdesi ActionError yapısını izleyen bir JSON yükü olmalıdır. Hata ölümcül kabul edilir ve dahil edilen message kullanıcıya gösterilmelidir.

İsteğe bağlı error özniteliğini destekleyen API yanıtlarında (örneğin ActionGetResponse), hata ölümcül olmayan kabul edilir ve dahil edilen message kullanıcıya gösterilmelidir.

Action Zincirleme

Solana Actions, arka arkaya bir dizi hâlinde "zincirlenebilir". Bir Action'ın işlemi zincir üzerinde onaylandıktan sonra, bir sonraki action alınarak kullanıcıya sunulabilir.

Action zincirleme, geliştiricilerin blink'ler içinde daha karmaşık ve dinamik deneyimler oluşturmasına olanak tanır; bunlar şunları içerir:

  • kullanıcıya birden fazla işlem (ve ileride mesaj imzalama) sağlama
  • kullanıcının cüzdan adresine göre özelleştirilmiş action meta verileri
  • başarılı bir işlemin ardından blink meta verilerini yenileme
  • Action API sunucusunda ek doğrulama ve mantık için işlem imzasıyla bir API geri araması alma
  • görüntülenen meta verileri güncelleyerek özelleştirilmiş "başarı" mesajları (ör. yeni bir görsel ve açıklama)

Birden fazla action'ı birbirine zincirlemek için herhangi bir ActionPostResponse içinde aşağıdakilerden biri olan bir links.next ekleyin:

  • PostNextActionLink - Gövdede signature ve kullanıcının account bilgisini almak için aynı kaynaklı bir geri arama URL'siyle POST isteği bağlantısı. Bu geri arama URL'si NextAction ile yanıt vermelidir.
  • InlineNextActionLink - İşlem onaylandıktan hemen sonra kullanıcıya sunulacak bir sonraki action için satır içi meta veri. Herhangi bir geri arama yapılmaz.
export type NextActionLink = PostNextActionLink | InlineNextActionLink;
/** @see {NextActionPostRequest} */
export interface PostNextActionLink {
/** Indicates the type of the link. */
type: "post";
/** Relative or same origin URL to which the POST request should be made. */
href: string;
}
/**
* Represents an inline next action embedded within the current context.
*/
export interface InlineNextActionLink {
/** Indicates the type of the link. */
type: "inline";
/** The next action to be performed */
action: NextAction;
}

NextAction

ActionPostResponse içindeki transaction kullanıcı tarafından imzalanıp zincir üzerinde onaylandıktan sonra, blink istemcisi aşağıdakilerden birini yapmalıdır:

  • NextAction öğesini almak ve görüntülemek için geri arama isteğini yürütme, ya da
  • NextAction zaten links.next aracılığıyla sağlanmışsa, blink istemcisi görüntülenen meta verileri günceller ve herhangi bir geri arama isteği yapmaz

Geri arama URL'si ilk POST isteğiyle aynı kaynaktan değilse, geri arama isteği yapılmamalıdır. Blink istemcileri kullanıcıyı bilgilendiren bir hata göstermelidir.

NextAction
/** The next action to be performed */
export type NextAction = Action<"action"> | CompletedAction;
/** The completed action, used to declare the "completed" state within action chaining. */
export type CompletedAction = Omit<Action<"completed">, "links">;

type değerine göre, bir sonraki action blink istemcileri aracılığıyla kullanıcıya aşağıdaki yollardan biriyle sunulmalıdır:

  • action - (varsayılan) Kullanıcının dahil edilen Action meta verilerini görmesine, sağlanan LinkedActions ile etkileşime girmesine ve sonraki action'ları zincirlemeye devam etmesine olanak tanıyan standart bir action.

  • completed - Dahil edilen Action meta verileriyle blink arayüzünü güncelleyebilen, ancak kullanıcının daha fazla action gerçekleştirmesine izin vermeyen bir action zincirinin terminal durumu.

links.next sağlanmamışsa, blink istemcileri mevcut action'ın zincirdeki son action olduğunu varsaymalı ve işlem onaylandıktan sonra "tamamlandı" arayüz durumunu göstermelidir.

actions.json

actions.json dosyasının amacı, bir uygulamanın istemcilere hangi web sitesi URL'lerinin Solana Actions'ı desteklediğini bildirmesine ve bir Actions API sunucusuna GET istekleri gerçekleştirmek için kullanılabilecek bir eşleme sağlamasına olanak tanımaktır.

Cross-Origin başlıkları zorunludur

actions.json dosyası yanıtı, GET ve OPTIONS istekleri için, özellikle * değerinde Access-Control-Allow-Origin başlığı olmak üzere geçerli Cross-Origin başlıkları döndürmelidir.

Daha fazla ayrıntı için yukarıdaki OPTIONS yanıtına bakınız.

actions.json dosyası etki alanının kök dizininde saklanmalı ve evrensel olarak erişilebilir olmalıdır.

Örneğin, web uygulamanız my-site.com adresine dağıtılmışsa, actions.json dosyasına https://my-site.com/actions.json adresinden erişilebilir olmalıdır. Bu dosya ayrıca * değerinde bir Access-Control-Allow-Origin başlığına sahip olarak herhangi bir tarayıcı üzerinden Cross-Origin erişilebilir olmalıdır.

Kurallar

rules alanı, uygulamanın bir web sitesinin göreli rota yollarını başka yollarla eşleştirmesine olanak tanır.

Tür: ActionRuleObject'ten oluşan Array.

ActionRuleObject
interface ActionRuleObject {
/** relative (preferred) or absolute path to perform the rule mapping from */
pathPattern: string;
/** relative (preferred) or absolute path that supports Action requests */
apiPath: string;
}
  • pathPattern - Gelen her yol adıyla eşleşen bir desen.

  • apiPath - Mutlak bir yol adı veya harici URL olarak tanımlanmış bir hedef konum.

Kurallar - pathPattern

Gelen her yol adıyla eşleşen bir desen. Mutlak veya göreli bir yol olabilir ve aşağıdaki biçimleri destekler:

  • Tam Eşleşme: Tam URL yoluyla eşleşir.

    • Örnek: /exact-path
    • Örnek: https://website.com/exact-path
  • Joker Karakter Eşleşmesi: URL yolundaki herhangi bir karakter dizisiyle eşleşmek için joker karakterler kullanır. Tek bir segmentle (* kullanarak) veya birden fazla segmentle (** kullanarak) eşleşebilir. (aşağıdaki Yol Eşleştirme bölümüne bakın).

    • Örnek: /trade/*, /trade/123 ve /trade/abc ile eşleşir; yalnızca /trade/ sonrasındaki ilk segmenti yakalar.
    • Örnek: /category/*/item/**, /category/123/item/456 ve /category/abc/item/def ile eşleşir.
    • Örnek: /api/actions/trade/*/confirm, /api/actions/trade/123/confirm ile eşleşir.

Kurallar - apiPath

Eylem isteği için hedef yol. Mutlak bir yol adı veya harici bir URL olarak tanımlanabilir.

  • Örnek: /api/exact-path
  • Örnek: https://api.example.com/v1/donate/*
  • Örnek: /api/category/*/item/*
  • Örnek: /api/swap/**

Kurallar - Sorgu Parametreleri

Orijinal URL'deki sorgu parametreleri her zaman korunur ve eşlenen URL'ye eklenir.

Kurallar - Yol Eşleştirme

Aşağıdaki tablo, yol eşleştirme desenleri için sözdizimini özetlemektedir:

OperatörEşleşme
*Çevresindeki yol ayırıcı / karakterleri dahil olmadan tek bir yol segmenti.
**Birden fazla yol segmenti arasındaki yol ayırıcı / karakterleri dahil olmak üzere sıfır veya daha fazla karakterle eşleşir. Diğer operatörler dahil edilirse, ** operatörü son operatör olmak zorundadır.
?Desteklenmeyen desen.

Kural Örnekleri

Aşağıdaki örnek, sitenizin kökünden /buy adresine gelen istekleri sitenizin köküne göreli /api/buy tam yoluna eşlemek için tam eşleşme kuralının nasıl kullanıldığını göstermektedir:

actions.json
{
"rules": [
{
"pathPattern": "/buy",
"apiPath": "/api/buy"
}
]
}

Aşağıdaki örnek, sitenizin kökünden /actions/ altındaki herhangi bir yola (alt dizinler hariç) gelen istekleri sitenizin köküne göreli /api/actions/ altındaki karşılık gelen bir yola eşlemek için joker karakter yol eşleştirmesini kullanır:

actions.json
{
"rules": [
{
"pathPattern": "/actions/*",
"apiPath": "/api/actions/*"
}
]
}

Aşağıdaki örnek, sitenizin kökünden /donate/ altındaki herhangi bir yola (alt dizinler hariç) gelen istekleri harici bir sitedeki https://api.dialect.com/api/v1/donate/ mutlak yoluna eşlemek için joker karakter yol eşleştirmesini kullanır:

actions.json
{
"rules": [
{
"pathPattern": "/donate/*",
"apiPath": "https://api.dialect.com/api/v1/donate/*"
}
]
}

Aşağıdaki örnek, sitenizin kökünden /api/actions/ altındaki herhangi bir yola (alt dizinler dahil) gelen istekleri kendisiyle eşlemek için kendi kendine başvuru kuralında joker karakter yol eşleştirmesini kullanır:

Kendi kendine başvuru kuralları, blink istemcilerinin belirli bir yolun solana-action: URI'si ile öneklenmesine veya ek yanıt testleri yapılmasına gerek kalmadan Action API isteklerini destekleyip desteklemediğini daha kolay belirlemesine olanak tanır.

actions.json
{
"rules": [
{
"pathPattern": "/api/actions/**",
"apiPath": "/api/actions/**"
}
]
}

Eylem Kimliği

Eylem uç noktaları, kullanıcının imzalaması için döndürülen POST yanıtı içindeki işlemlere bir Eylem Kimliği ekleyebilir. Bu, dizin oluşturucuların ve analitik platformların zincir üstü etkinliği belirli bir Eylem Sağlayıcısına (yani hizmete) doğrulanabilir biçimde kolayca atfetmesine olanak tanır.

Eylem Kimliği, bir Memo talimatı kullanılarak işleme dahil edilen özel biçimlendirilmiş bir mesajı imzalamak için kullanılan bir keypair'dir. Bu Tanımlayıcı Mesaj, belirli bir Eylem Kimliğine doğrulanabilir şekilde atfedilebilir ve böylece işlemler belirli bir Eylem Sağlayıcısına atfedilebilir.

keypair'in işlemin kendisini imzalaması gerekmez. Bu, kullanıcıya döndürülen işlemde başka imza bulunmadığında cüzdanların ve uygulamaların işlem iletimini iyileştirmesine olanak tanır (bkz. POST yanıt işlemi).

Bir Eylem Sağlayıcısının kullanım senaryosu, kullanıcıdan önce arka uç hizmetlerinin işlemi önceden imzalamasını gerektiriyorsa, bu keypair'i Eylem Kimliği olarak kullanmaları gerekir. Bu, işleme dahil edilecek bir hesabın azaltılmasına ve toplam işlem boyutunun 32 bayt düşürülmesine olanak tanır.

Eylem Tanımlayıcı Mesajı

Eylem Tanımlayıcı Mesajı, tek bir SPL Memo talimatı kullanılarak bir işleme dahil edilen, iki nokta üst üste ile ayrılmış UTF-8 dizesidir.

protocol:identity:reference:signature
  • protocol - Kullanılan protokolün değeri (yukarıdaki URL Şeması uyarınca solana-action olarak ayarlanır)
  • identity - Değer, Eylem Kimliği keypair'inin base58 kodlu açık anahtar adresi olmalıdır
  • reference - Değer, base58 kodlu 32 baytlık dizi olmalıdır. Bu değer, eğri üzerinde veya dışında açık anahtarlar olabilir ya da olmayabilir ve Solana'daki hesaplara karşılık gelebilir ya da gelmeyebilir.
  • signature - Eylem Kimliği keypair'inin yalnızca reference değerini imzalamasıyla oluşturulan base58 kodlu imza.

reference değeri yalnızca bir kez ve tek bir işlemde kullanılmalıdır. İşlemleri bir Eylem Sağlayıcısıyla ilişkilendirme amacıyla yalnızca reference değerinin ilk kullanımı geçerli sayılır.

İşlemlerde birden fazla Memo talimatı bulunabilir. getSignaturesForAddress çalıştırılırken sonuçların memo alanı, her memo talimatının mesajını noktalı virgülle ayrılmış tek bir dize olarak döndürür.

Tanımlayıcı Mesajın Memo talimatına başka hiçbir veri dahil edilmemelidir.

identity ve reference, işlemdeki Tanımlayıcı Mesaj Memo talimatı OLMAYAN bir talimatta salt okunur, imzacı olmayan anahtarlar olarak dahil edilmelidir.

Tanımlayıcı Mesaj Memo talimatına sıfır hesap sağlanmalıdır. Herhangi bir hesap sağlanırsa, Memo programı bu hesapların geçerli imzacılar olmasını zorunlu kılar. Eylemleri tanımlama amacıyla bu durum esnekliği kısıtlar ve kullanıcı deneyimini olumsuz etkileyebilir. Bu nedenle anti-desen olarak kabul edilir ve kaçınılmalıdır.

Eylem Kimliği Doğrulama

identity hesabını içeren herhangi bir işlem, çok adımlı bir süreçle Eylem Sağlayıcısıyla doğrulanabilir biçimde ilişkilendirilebilir:

  1. Belirli bir identity için tüm işlemleri alın.
  2. Her işlemin memo dizesini ayrıştırın ve doğrulayın; signature'ın depolanan reference için geçerli olduğundan emin olun.
  3. Söz konusu işlemin reference'ın zincir üzerindeki ilk geçtiği yer olduğunu doğrulayın:
    • Bu işlem ilk geçtiği yerden işlem doğrulandı sayılır ve güvenle Eylem Sağlayıcısına atfedilebilir.
    • Bu işlem ilk geçtiği yer DEĞİLSE geçersiz sayılır ve dolayısıyla Eylem Sağlayıcısına atfedilmez.

Solana validator'ları işlemleri hesap anahtarlarına göre dizinlediğinden, getSignaturesForAddress RPC yöntemi identity hesabını içeren tüm işlemleri bulmak için kullanılabilir.

Bu RPC yönteminin yanıtı, memo alanındaki tüm Memo verilerini içerir. İşlemde birden fazla Memo talimatı kullanılmışsa, her memo mesajı bu memo alanına dahil edilir ve Kimlik Doğrulama Mesajını elde etmek için doğrulayıcı tarafından uygun şekilde ayrıştırılmalıdır.

Bu işlemler başlangıçta DOĞRULANMAMIŞ olarak değerlendirilmelidir. Bunun nedeni, identity'nin işlemi imzalamasının zorunlu olmaması; bu durum herhangi bir işlemin bu hesabı imzacı olmayan olarak eklemesine izin vermektedir. Bu durum, atıf ve kullanım sayılarının yapay olarak şişirilmesine yol açabilir.

Kimlik Doğrulama Mesajı, signature'ın identity'nin reference'ı imzalamasıyla oluşturulduğundan emin olmak için kontrol edilmelidir. Bu imza doğrulaması başarısız olursa, işlem geçersizdir ve Eylem Sağlayıcısına atfedilmemelidir.

İmza doğrulaması başarılı olursa, doğrulayıcı bu işlemin reference'ın zincir üzerindeki ilk geçtiği yer olduğundan emin olmalıdır. Aksi takdirde işlem geçersiz sayılır.

Is this page helpful?

© 2026 Solana Vakfı. Tüm hakları saklıdır.