Index API
Camino-Node, bir dizinleyici ile çalışacak şekilde yapılandırılabilir. Yani, X-Chain, P-Chain ve C-Chain üzerinde kabul ettiği her bir konteyneri (bir blok, nokta veya işlem) kaydeder (dizine ekler). CaminoNode'ı dizinleme etkin hale getirilmiş olarak çalıştırmak için, komut satırı bayrağını true olarak ayarlayın. Camino-Node sadece --index-enabled
true olarak ayarlandığında kabul edilen konteynerleri dizine ekleyecektir. Düğümünüzün tam bir dizine sahip olmasını sağlamak için, yeni bir veritabanıyla ve --index-enabled
true olarak ayarlanmış bir düğüm çalıştırın. Düğüm, başlatma sırasında ağ tarihindeki her blok, nokta ve işlemi kabul edecek ve dizininizin tamamını sağlayacaktır. Dizinleme etkin haldeyken düğümünüzü kapatmakta herhangi bir sakınca yoktur. Eğer dizinleme hala etkin olarak yeniden başlatılırsa, çevrimdışı olduğu süre içinde kabul edilen tüm konteynerleri kabul edecektir. Dizinleyici, kabul edilen bir bloğu, noktayı veya işlemi dizine eklemekte asla başarısız olmamalıdır.
Dizine eklenen konteynerler (yani, kabul edilen bloklar, noktalar ve işlemler), düğümün o konteyneri kabul ettiği zamanla damgalanır. Eğer konteyner başlatma sırasında dizine eklenmişse, diğer düğümler bu konteyneri çok daha önce kabul etmiş olabilir. Başlatma sırasında dizine eklenen her konteyner, düğümün başlatıldığı zamanla damgalanır, ağ tarafından ilk kabul edildiği zamanla değil.
DAG'lar (X-Chain dahil) için, düğümler birbiriyle noktaları ve işlemleri farklı bir sırayla kabul edebilir.
Eğer --index-enabled
true'dan false'a değiştirilirse, Camino-Node başlamayacaktır çünkü bu, daha önce tam bir dizine sahip olan bir durumu eksik hale getirecek, kullanıcı açıkça --index-allow-incomplete
kullanmadıkça. Bu, daha önce etkin olarak çalıştırdıktan sonra yanlışlıkla dizinleme devre dışı bırakma durumunda kalmanızı önler, bu durumda eksik bir dizin ile sonuçlanır.
Bu belge, Camino-Node'un Index API'sinden veri sorgulama yöntemini göstermektedir. Index API, yalnızca --index-enabled
ile çalışırken kullanılabilir.
Format
Bu API, json 2.0
RPC formatını kullanmaktadır. JSON RPC çağrıları yapmak hakkında daha fazla bilgi için bakın.
Endpointler
Her bir zincirin bir veya daha fazla dizini vardır. Örneğin, C-Chain bloğunun kabul edilip edilmediğini görmek için, C-Chain blok dizinine bir API çağrısı gönderin. X-Chain noktasının kabul edilip edilmediğini kontrol etmek için ise, X-Chain nokta dizinine bir API çağrısı gönderin.
X-Chain İşlemleri
/ext/index/X/tx
X-Chain Noktaları
/ext/index/X/vtx
P-Chain Blokları
/ext/index/P/block
C-Chain Blokları
/ext/index/C/block
P/C Bloklarının Seri Hale Getirilmesi
Genel olarak blok konteynerleri, için ikili temsilde dizin depolamasında saklanmaktadır.
block.Block() baytları daha sonra P-Chain için platformVM.Block'a veya C-Chain için caminoethvm'deki types.Block'a ayrıştırılabilir.
Uygulama, Magellan akış dizinleyicilerinde bulunabilir.
C-Chain üzerindeki 0 dizinli konteyner, bir önerici Bloğa sarılmamıştır. Konteyneri doğrudan types.Block yapısına RLP olarak ayrıştırabilirsiniz.
API Yöntemleri
index.getLastAccepted
En son kabul edilen konteyneri alır.
İmza
index.getLastAccepted({
encoding:string
}) -> {
id: string,
bytes: string,
timestamp: string,
encoding: string,
index: string
}
Burada:
id
, konteynerin kimliğidirbytes
, konteynerin bayt temsilidirtimestamp
, bu düğümün konteyneri kabul ettiği zamanindex
, bu dizin içinde bu konteynerden önce kabul edilen konteynerlerin sayısıdırencoding
,"cb58"
veya"hex"
olur
Örnek Çağrı
curl --location --request POST 'localhost:9650/ext/index/X/tx' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "index.getLastAccepted",
"params": {
"encoding":"cb58"
},
"id": 1
}'
Örnek Yanıt
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"id": "6fXf5hncR8LXvwtM8iezFQBpK5cubV6y1dWgpJCcNyzGB1EzY",
"bytes": "111115HRzXVDSeonLBcv6QdJkQFjPzPEobMWy7PyGuoheggsMCx73MVXZo2hJMEXXvR5gFFasTRJH36aVkLiWHtTTFcghyFTqjaHnBhdXTRiLaYcro3jpseqLAFVn3ngnAB47nebQiBBKmg3nFWKzQUDxMuE6uDGXgnGouDSaEKZxfKreoLHYNUxH56rgi5c8gKFYSDi8AWBgy26siwAWj6V8EgFnPVgm9pmKCfXio6BP7Bua4vrupoX8jRGqdrdkN12dqGAibJ78Rf44SSUXhEvJtPxAzjEGfiTyAm5BWFqPdheKN72HyrBBtwC6y7wG6suHngZ1PMBh93Ubkbt8jjjGoEgs5NjpasJpE8YA9ZMLTPeNZ6ELFxV99zA46wvkjAwYHGzegBXvzGU5pGPbg28iW3iKhLoYAnReysY4x3fBhjPBsags37Z9P3SqioVifVX4wwzxYqbV72u1AWZ4JNmsnhVDP196Gu99QTzmySGTVGP5ABNdZrngTRfmGTFCRbt9CHsgNbhgetkxbsEG7tySi3gFxMzGuJ2Npk2gnSr68LgtYdSHf48Ns",
"timestamp": "2021-04-02T15:34:00.262979-07:00",
"encoding": "cb58",
"index": "0"
}
}
index.getContainerByIndex
Dizine göre konteyner alır. İlk kabul edilen konteyner 0 dizinindedir, ikinci konteyner 1 dizinindedir, vb.
İmza
index.getContainerByIndex({
index: uint64,
encoding: string
}) -> {
id: string,
bytes: string,
timestamp: string,
encoding: string,
index: string
}
id
, konteynerin kimliğidirbytes
, konteynerin bayt temsilidirtimestamp
, bu düğümün konteyneri kabul ettiği zamanindex
, bu dizin içinde bu konteynerden önce kabul edilen konteynerlerin sayısıdırencoding
,"cb58"
veya"hex"
olur
Örnek Çağrı
curl --location --request POST 'localhost:9650/ext/index/X/tx' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "index.getContainerByIndex",
"params": {
"index":0,
"encoding":"cb58"
},
"id": 1
}'
Örnek Yanıt
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"id": "6fXf5hncR8LXvwtM8iezFQBpK5cubV6y1dWgpJCcNyzGB1EzY",
"bytes": "111115HRzXVDSeonLBcv6QdJkQFjPzPEobMWy7PyGuoheggsMCx73MVXZo2hJMEXXvR5gFFasTRJH36aVkLiWHtTTFcghyFTqjaHnBhdXTRiLaYcro3jpseqLAFVn3ngnAB47nebQiBBKmg3nFWKzQUDxMuE6uDGXgnGouDSaEKZxfKreoLHYNUxH56rgi5c8gKFYSDi8AWBgy26siwAWj6V8EgFnPVgm9pmKCfXio6BP7Bua4vrupoX8jRGqdrdkN12dqGAibJ78Rf44SSUXhEvJtPxAzjEGfiTyAm5BWFqPdheKN72HyrBBtwC6y7wG6suHngZ1PMBh93Ubkbt8jjjGoEgs5NjpasJpE8YA9ZMLTPeNZ6ELFxV99zA46wvkjAwYHGzegBXvzGU5pGPbg28iW3iKhLoYAnReysY4x3fBhjPBsags37Z9P3SqioVifVX4wwzxYqbV72u1AWZ4JNmsnhVDP196Gu99QTzmySGTVGP5ABNdZrngTRfmGTFCRbt9CHsgNbhgetkxbsEG7tySi3gFxMzGuJ2Npk2gnSr68LgtYdSHf48Ns",
"timestamp": "2021-04-02T15:34:00.262979-07:00",
"encoding": "cb58",
"index": "0"
}
}
index.getContainerByID
ID ile konteyner alır.
İmza
index.getContainerByID({
containerID: string,
encoding: string
}) -> {
id: string,
bytes: string,
timestamp: string,
encoding: string,
index: string
}
id
, konteynerin kimliğidirbytes
, konteynerin bayt temsilidirtimestamp
, bu düğümün konteyneri kabul ettiği zamanindex
, bu dizin içinde bu konteynerden önce kabul edilen konteynerlerin sayısıdırencoding
,"cb58"
veya"hex"
olur
Örnek Çağrı
curl --location --request POST 'localhost:9650/ext/index/X/tx' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "index.getContainerByID",
"params": {
"containerID": "6fXf5hncR8LXvwtM8iezFQBpK5cubV6y1dWgpJCcNyzGB1EzY",
"encoding":"hex"
},
"id": 1
}'
Örnek Yanıt
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"id": "6fXf5hncR8LXvwtM8iezFQBpK5cubV6y1dWgpJCcNyzGB1EzY",
"bytes": "111115HRzXVDSeonLBcv6QdJkQFjPzPEobMWy7PyGuoheggsMCx73MVXZo2hJMEXXvR5gFFasTRJH36aVkLiWHtTTFcghyFTqjaHnBhdXTRiLaYcro3jpseqLAFVn3ngnAB47nebQiBBKmg3nFWKzQUDxMuE6uDGXgnGouDSaEKZxfKreoLHYNUxH56rgi5c8gKFYSDi8AWBgy26siwAWj6V8EgFnPVgm9pmKCfXio6BP7Bua4vrupoX8jRGqdrdkN12dqGAibJ78Rf44SSUXhEvJtPxAzjEGfiTyAm5BWFqPdheKN72HyrBBtwC6y7wG6suHngZ1PMBh93Ubkbt8jjjGoEgs5NjpasJpE8YA9ZMLTPeNZ6ELFxV99zA46wvkjAwYHGzegBXvzGU5pGPbg28iW3iKhLoYAnReysY4x3fBhjPBsags37Z9P3SqioVifVX4wwzxYqbV72u1AWZ4JNmsnhVDP196Gu99QTzmySGTVGP5ABNdZrngTRfmGTFCRbt9CHsgNbhgetkxbsEG7tySi3gFxMzGuJ2Npk2gnSr68LgtYdSHf48Ns",
"timestamp": "2021-04-02T15:34:00.262979-07:00",
"encoding": "hex",
"index": "0"
}
}
index.getContainerRange
Dizindeki indeksler [startIndex
, startIndex+1
, ... , startIndex
+ numToFetch
- 1] arasında konteyner döndürür. numToFetch
[0,1024]
aralığında olmalıdır.
İmza
index.getContainerRange({
startIndex: uint64,
numToFetch: uint64,
encoding: string
}) -> []{
id: string,
bytes: string,
timestamp: string,
encoding: string,
index: string
}
id
, konteynerin kimliğidirbytes
, konteynerin bayt temsilidirtimestamp
, bu düğümün konteyneri kabul ettiği zamanindex
, bu dizin içinde bu konteynerden önce kabul edilen konteynerlerin sayısıdırencoding
,"cb58"
veya"hex"
olur
Örnek Çağrı
curl --location --request POST 'localhost:9650/ext/index/X/tx' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "index.getContainerRange",
"params": {
"startIndex":0,
"numToFetch":100,
"encoding":"cb58"
},
"id": 1
}'
Örnek Yanıt
{
"jsonrpc": "2.0",
"id": 1,
"result": [
{
"id": "6fXf5hncR8LXvwtM8iezFQBpK5cubV6y1dWgpJCcNyzGB1EzY",
"bytes": "111115HRzXVDSeonLBcv6QdJkQFjPzPEobMWy7PyGuoheggsMCx73MVXZo2hJMEXXvR5gFFasTRJH36aVkLiWHtTTFcghyFTqjaHnBhdXTRiLaYcro3jpseqLAFVn3ngnAB47nebQiBBKmg3nFWKzQUDxMuE6uDGXgnGouDSaEKZxfKreoLHYNUxH56rgi5c8gKFYSDi8AWBgy26siwAWj6V8EgFnPVgm9pmKCfXio6BP7Bua4vrupoX8jRGqdrdkN12dqGAibJ78Rf44SSUXhEvJtPxAzjEGfiTyAm5BWFqPdheKN72HyrBBtwC6y7wG6suHngZ1PMBh93Ubkbt8jjjGoEgs5NjpasJpE8YA9ZMLTPeNZ6ELFxV99zA46wvkjAwYHGzegBXvzGU5pGPbg28iW3iKhLoYAnReysY4x3fBhjPBsags37Z9P3SqioVifVX4wwzxYqbV72u1AWZ4JNmsnhVDP196Gu99QTzmySGTVGP5ABNdZrngTRfmGTFCRbt9CHsgNbhgetkxbsEG7tySi3gFxMzGuJ2Npk2gnSr68LgtYdSHf48Ns",
"timestamp": "2021-04-02T15:34:00.262979-07:00",
"encoding": "cb58",
"index": "0"
}
]
}
index.getIndex
Konteynerin indeksini alır.
İmza
index.getIndex({
containerID: string,
encoding: string
}) -> {
index: string
}
Burada encoding
, "cb58"
veya "hex"
olmalıdır.
Örnek Çağrı
curl --location --request POST 'localhost:9650/ext/index/X/tx' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "index.getIndex",
"params": {
"containerID":"6fXf5hncR8LXvwtM8iezFQBpK5cubV6y1dWgpJCcNyzGB1EzY",
"encoding":"cb58"
},
"id": 1
}'
Örnek Yanıt
{
"jsonrpc": "2.0",
"result": {
"index": "0"
},
"id": 1
}
index.isAccepted
Konteynerin bu dizinde olup olmadığını kontrol eder.
İmza
index.isAccepted({
containerID: string,
encoding: string
}) -> {
isAccepted: bool
}
Örnek Çağrı
curl --location --request POST 'localhost:9650/ext/index/X/tx' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "index.isAccepted",
"params": {
"containerID":"6fXf5hncR8LXvwtM8iezFQBpK5cubV6y1dWgpJCcNyzGB1EzY",
"encoding":"cb58"
},
"id": 1
}'
Örnek Yanıt
{
"jsonrpc": "2.0",
"result": {
"isAccepted": true
},
"id": 1
}
Örnek: X-Chain İşlemlerini Döngü ile İşlem
X-Chain üzerinde kabul edilen tüm işlemlerin ID'sini almak için Index API'yi kullanabilirsiniz, ardından X-Chain API metodunu avm.getTx
kullanarak işlemin insan tarafından okunabilir bir temsilini elde edebilirsiniz.
X-Chain üzerindeki bir işlemi dizinine göre almak için Index API yöntemi olan metodunu kullanabilirsiniz.
Örneğin, X-Chain'de kabul edilen ikinci işlemi (dikkat edin: "index":1
) almak için:
curl --location --request POST 'https://indexer-test.camino.network/ext/index/X/tx' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "index.getContainerByIndex",
"params": {
"encoding":"hex",
"index":1
},
"id": 1
}'
Bu, X-Chain tarihindeki ikinci işlemin ID'sini döndürür. Üçüncü işlemi almak için "index":2
kullanın ve bu şekilde devam edin.
Yukarıdaki API çağrısı aşağıdaki yanıtı verir:
{
"jsonrpc": "2.0",
"result": {
"id": "ZGYTSU8w3zUP6VFseGC798vA2Vnxnfj6fz1QPfA9N93bhjJvo",
"bytes": "0x00000000000000000001ed5f38341e436e5d46e2bb00b45d62ae97d1b050c64bc634ae10626739e35c4b0000000221e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff000000070000000129f6afc0000000000000000000000001000000017416792e228a765c65e2d76d28ab5a16d18c342f21e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff0000000700000222afa575c00000000000000000000000010000000187d6a6dd3cd7740c8b13a410bea39b01fa83bb3e000000016f375c785edb28d52edb59b54035c96c198e9d80f5f5f5eee070592fe9465b8d0000000021e67317cbc4be2aeb00677ad6462778a8f52274b9d605df2591b23027a87dff0000000500000223d9ab67c0000000010000000000000000000000010000000900000001beb83d3d29f1247efb4a3a1141ab5c966f46f946f9c943b9bc19f858bd416d10060c23d5d9c7db3a0da23446b97cd9cf9f8e61df98e1b1692d764c84a686f5f801a8da6e40",
"timestamp": "2021-11-04T00:42:55.01643414Z",
"encoding": "hex",
"index": "1"
},
"id": 1
}
Bu işlemin ID'si ZGYTSU8w3zUP6VFseGC798vA2Vnxnfj6fz1QPfA9N93bhjJvo
'dir.
Bu işlemi ID'sine göre almak için avm.getTx
API metodunu kullanın:
curl -X POST --data '{
"jsonrpc":"2.0",
"id" :1,
"method" :"avm.getTx",
"params" :{
"txID":"ZGYTSU8w3zUP6VFseGC798vA2Vnxnfj6fz1QPfA9N93bhjJvo",
"encoding": "json"
}
}' -H 'content-type:application/json;' https://api.camino.network/ext/bc/X
Yanıt:
{
"jsonrpc": "2.0",
"result": {
"tx": {
"unsignedTx": {
"networkID": 1,
"blockchainID": "2oYMBNV4eNHyqk2fjjV5nVQLDbtmNJzq5s3qs3Lo6ftnC6FByM",
"outputs": [
{
"assetID": "o8seyjX6WupqJ1CE8CeaozK13kqVgc4DFvdvc4crfacLFBauW",
"fxID": "spdxUxVJQbX85MGxMHbKw1sHxMnSqJ3QBzDyDYEP3h6TLuxqQ",
"output": {
"addresses": [
"X-columbus1wst8jt3z3fm9ce0z6akj3266zmgccdp03hjlaj"
],
"amount": 4999000000,
"locktime": 0,
"threshold": 1
}
},
{
"assetID": "o8seyjX6WupqJ1CE8CeaozK13kqVgc4DFvdvc4crfacLFBauW",
"fxID": "spdxUxVJQbX85MGxMHbKw1sHxMnSqJ3QBzDyDYEP3h6TLuxqQ",
"output": {
"addresses": [
"X-columbus1slt2dhfu6a6qezcn5sgtagumq8ag8we75f84sw"
],
"amount": 2347999000000,
"locktime": 0,
"threshold": 1
}
}
],
"inputs": [
{
"txID": "qysTYUMCWdsR3MctzyfXiSvoSf6evbeFGRLLzA4j2BjNXTknh",
"outputIndex": 0,
"assetID": "o8seyjX6WupqJ1CE8CeaozK13kqVgc4DFvdvc4crfacLFBauW",
"fxID": "spdxUxVJQbX85MGxMHbKw1sHxMnSqJ3QBzDyDYEP3h6TLuxqQ",
"input": {
"amount": 2352999000000,
"signatureIndices": [0]
}
}
],
"memo": "0x"
},
"credentials": [
{
"fxID": "spdxUxVJQbX85MGxMHbKw1sHxMnSqJ3QBzDyDYEP3h6TLuxqQ",
"credential": {
"signatures": [
"0xbeb83d3d29f1247efb4a3a1141ab5c966f46f946f9c943b9bc19f858bd416d10060c23d5d9c7db3a0da23446b97cd9cf9f8e61df98e1b1692d764c84a686f5f801"
]
}
}
]
},
"encoding": "json"
},
"id": 1
}