Hızlı Başlangıç
Greenfield SDK, geliştiricilerin veri depolama ve izin yönetimi gibi Greenfield hizmetlerini kullanarak Go uygulamaları inşa etmeleri için API'ler ve yardımcı araçlar sağlar.
SDK, doğrudan bir web hizmeti arayüzü ile programlama sürecini basitleştirir. Kimlik doğrulama, istekleri yeniden deneme ve hataları yönetme gibi birçok temel detayı üstlenir.
Bu kılavuz, yapılandırma bilgileri, örnek kod ve SDK yardımcı araçlarına bir giriş sağlamaktadır.
Kurulum
Greenfield SDK'sı için Go 1.20 veya daha yenisine ihtiyaç vardır. Mevcut Go sürümünüzü görüntülemek için go version
komutunu çalıştırabilirsiniz. Go'yu yükleme veya güncelleme hakkında bilgi için https://golang.org/doc/install adresine bakın.
SDK ve bağımlılıklarını yüklemek için aşağıdaki Go komutunu çalıştırın.
$ go get github.com/bnb-chain/greenfield-go-sdk
Bağımlılıkları değiştirmek için go.mod
dosyasını düzenleyin.
replace (
cosmossdk.io/api => github.com/bnb-chain/greenfield-cosmos-sdk/api v0.0.0-20230425074444-eb5869b05fe9
cosmossdk.io/math => github.com/bnb-chain/greenfield-cosmos-sdk/math v0.0.0-20230425074444-eb5869b05fe9
github.com/cometbft/cometbft => github.com/bnb-chain/greenfield-cometbft v0.0.2
github.com/cometbft/cometbft-db => github.com/bnb-chain/greenfield-cometbft-db v0.8.1-alpha.1
github.com/cosmos/cosmos-sdk => github.com/bnb-chain/greenfield-cosmos-sdk v0.2.3
github.com/cosmos/iavl => github.com/bnb-chain/greenfield-iavl v0.20.1-alpha.1
github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7
)
Bağımlılıkları yükleyin.
go mod tidy
Kullanım
Artık Greenfield test ağına bağlanmaya ve Greenfield API'leri ile etkileşimde bulunmaya hazırız. Her şeyin beklendiği gibi çalışıp çalışmadığını doğrulamak için Greenfield sürümünü sorgulayan basit bir betik yazalım.
İstemci Oluşturma
Projenizde bir main.go
dosyası oluşturun ve aşağıdaki kodu ekleyin.
package main
import (
"context"
"log"
"github.com/bnb-chain/greenfield-go-sdk/client"
"github.com/bnb-chain/greenfield-go-sdk/types"
)
const (
privateKey = ""
// Ana Ağ Bilgisi
rpcAddr = "https://greenfield-chain.bnbchain.org:443"
chainId = "greenfield_1017-1"
// Test Ağı Bilgisi
// rpcAddr = "https://gnfd-testnet-fullnode-tendermint-us.bnbchain.org:443"
// chainId = "greenfield_5600-1"
)
func main() {
// hesap içeri aktar
account, err := types.NewAccountFromPrivateKey("test", privateKey)
if err != nil {
log.Fatalf("Özel anahtardan yeni hesap oluşturma hatası, %v", err)
}
// istemci oluştur
cli, err := client.New(chainId, rpcAddr, client.Option{DefaultAccount: account})
if err != nil {
log.Fatalf("yeni greenfield istemcisi oluşturulamadı, %v", err)
}
ctx := context.Background()
// RPC'den düğüm bilgilerini al
nodeInfo, versionInfo, err := cli.GetNodeInfo(ctx)
if err != nil {
log.Fatalf("düğüm bilgileri alınamadı, %v", err)
}
log.Printf("düğüm bilgileri kimliği: %s, go sürümü: %s", nodeInfo.Moniker, versionInfo.GoVersion)
// en son blok yüksekliğini sorgula
height, err := cli.GetLatestBlockHeight(ctx)
if err != nil {
log.Fatalf("en son blok yüksekliği alınamadı, %v", err)
}
log.Printf("Mevcut blok yüksekliği: %d", height)
}
Proje dizininizde aşağıdaki komutu çalıştırın:
go run main.go
Bu, aşağıdaki gibi bir çıktı verecektir:
2023/06/22 10:44:16 düğüm bilgileri kimliği: validator-a, go sürümü: go version go1.20.4 linux/amd64
2023/06/22 10:44:16 Mevcut blok yüksekliği: 817082
Her şey doğru bir şekilde ayarlandığında, kodunuz Greenfield düğümüne bağlanabilir ve yukarıda gösterildiği gibi zincir verilerini döndürebilir.
Sorgular
Önceki adımda, düğüme bağlanmanın ve zincir verilerini sorgulamak için bir Client
başlatmanın temel adımlarını göstermek için bir main.go
dosyası oluşturduk. Şimdi, daha fazla işlev kullanmaya geçelim.
1. Mevcut Zincir Başını Al
Aşağıdaki kodu main.go
dosyasına ekleyerek zincirin mevcut başını sorgulayabiliriz.
// en son blok yüksekliğini sorgula
blockByHeight, err := cli.GetBlockByHeight(ctx,height)
if err != nil {
log.Fatalf("yükseklik ile bloğu almak mümkün olmadı, %v", err)
}
log.Printf("Mevcut blok yüksekliği: %d", blockByHeight.GetHeader())
2. Adres Bakiyesini Al
Verilen bir Greenfield cüzdan adresi ile GetAccountBalance
fonksiyonunu çağırarak bakiyesini sorgulayabilirsiniz.
// mevcut bakiyeyi sorgula
balance, err := cli.GetAccountBalance(ctx, account.GetAddress().String())
if err != nil {
log.Fatalf("bakiyeyi almak mümkün olmadı, %v", err)
}
log.Printf("%s Mevcut bakiye: %s", account.GetAddress().String(), balance.String())
3. Depolama Sağlayıcılarını Sorgulama
Ayrıca, SDK, mevcut depolama sağlayıcılarının listesini sorgulama desteği sağlar ve meta veri niteliklerini keşfetmek için genel arama yetenekleri sunar.
cli, err := client.New(chainId, rpcAddr, client.Option{DefaultAccount: account})
if err != nil {
log.Fatalf("yeni greenfield istemcisi oluşturulamadı, %v", err)
}
ctx := context.Background()
// depolama sağlayıcıları listesini al
spLists, err := cli.ListStorageProviders(ctx, true)
if err != nil {
log.Fatalf("hizmet sps'inde listeleme başarısız")
}
4. Depolama Fiyatını Sorgulama
// birinci sp'yi ana sp olarak seç
primarySP := spLists[0].GetOperatorAddress()
// veri depolama fiyatını sorgula
price, err := cli.GetStoragePrice(ctx,primarySP)
if err != nil {
log.Fatalf("hizmet sps'inde listeleme başarısız")
}
log.Printf("Okuma fiyatı %s ve Depolama fiyatı %s \n",price.ReadPrice,price.StorePrice)
5. Kova Sorguları
Kova bilgilerini aşağıdaki gibi sorgulayabilirsiniz:
// kova başlığı
bucketInfo, err := cli.HeadBucket(ctx, bucketName)
handleErr(err, "Kova Başlığı")
log.Println("kova bilgisi:", bucketInfo.String())
5. Nesneleri Sorgulama
Aynı kovanın altındaki tüm nesneleri listele
// nesneleri listele
objects, err := cli.ListObjects(ctx, bucketName, types.ListObjectsOptions{
ShowRemovedObject: false, Delimiter: "", MaxKeys: 100, EndPointOptions: &types.EndPointOptions{
Endpoint: httpsAddr, // sp son noktası
SPAddress: "",
}})
log.Println("nesneleri listele sonucu:")
for _, obj := range objects.Objects {
i := obj.ObjectInfo
log.Printf("nesne: %s, durum: %s\n", i.ObjectName, i.ObjectStatus)
}
Yukarıda gösterilen temel veri sorgularının yanı sıra birçok diğer özellik mevcuttur. Tüm Greenfield API tanımları için lütfen JSON-RPC API Referansı
na bakın.
İşlemler
1. Cüzdan Yönetimi
Greenfield cüzdanları, nesneleri yönetmek, işlemleri imzalamak ve gaz ücretlerini ödemek için kullanabileceğiniz adresleri saklar. Bu bölümde, cüzdanınızı yönetmenin farklı yollarını göstereceğiz.
- İlk olarak, bağlı düğümünüzün çalıştığından emin olun ve cüzdan adresinizin bazı test ağı BNB değerine sahip olduğunu kontrol edin.
- Önceki proje ile aynı projede
account.go
adında yeni bir dosya oluşturun. Burada tüm cüzdan ile ilgili kodları yazacağız. account.go
dosyasında modülleri içe aktarın ve özel anahtarınızı veya mnemonik ifadenizi başlatın.
// mnemonik içe aktar
account, err := types.NewAccountFromMnemonic("test", mnemonic)
// özel anahtarı içe aktar
account, err := types.NewAccountFromPrivateKey("test", privateKey)
Yeni bir cüzdan adresi oluşturalım böylece transferleri test edebiliriz. Yeni adres yerel olarak oluşturulacak ve 0 token bakiyesi ile başlayacaktır:
// farklı bir hesap oluştur
account2, _, err := types.NewAccount("test2")
Şimdi, tBNB'yi bu yeni adrese transfer etmeye çalışalım. Arkada, bu, tBNB'yi fromAddress
dan toAddress
a transfer etmek için bir işlem oluşturacak, işlemi SDK kullanarak imzalayacak ve imzalı işlemi Greenfield düğümüne gönderecektir.
// account2'ye jeton aktar
transferTxHash, err := cli.Transfer(ctx, account2.GetAddress().String(), math.NewIntFromUint64(1000000000000000000), types2.TxOption{})
if err != nil {
log.Fatalf("gönderme mümkün olmadı, %v", err)
}
log.Printf("Transfer yanıtı: %s", transferTxHash)
// işlem hash'ini bekle
waitForTx, err := cli.WaitForTx(ctx, transferTxHash)
log.Printf("tx için bekle: %s", waitForTx.String())
// account2'nin bakiyesini doğrula
balance, err = cli.GetAccountBalance(ctx, account2.GetAddress().String())
tBNB transferini test etmek için kodu çalıştırın:
go run account.go
Bu, aşağıdaki gibi bir çıktı verecektir:
raw_log: '[{"msg_index":0,"events":[{"type":"message","attributes":[{"key":"action","value":"/cosmos.bank.v1beta1.MsgSend"},{"key":"sender","value":"0x525482AB3922230e4D73079890dC905dCc3D37cd"},{"key":"module","value":"bank"}]},{"type":"coin_spent","attributes":[{"key":"spender","value":"0x525482AB3922230e4D73079890dC905dCc3D37cd"},{"key":"amount","value":"1BNB"}]},{"type":"coin_received","attributes":[{"key":"receiver","value":"0x78C3A3d10B1032bB2810366361dCE84E2e92eFCB"},{"key":"amount","value":"1BNB"}]},{"type":"transfer","attributes":[{"key":"recipient","value":"0x78C3A3d10B1032bB2810366361dCE84E2e92eFCB"},{"key":"sender","value":"0x525482AB3922230e4D73079890dC905dCc3D37cd"},{"key":"amount","value":"1BNB"}]},{"type":"message","attributes":[{"key":"sender","value":"0x525482AB3922230e4D73079890dC905dCc3D37cd"}]}]}]'
timestamp: "2023-06-22T20:02:19Z"
tx:
'@type': /cosmos.tx.v1beta1.Tx
auth_info:
fee:
amount:
- amount: "6000000000000"
denom: BNB
gas_limit: "1200"
granter: ""
payer: ""
signer_infos:
- mode_info:
single:
mode: SIGN_MODE_EIP_712
public_key:
'@type': /cosmos.crypto.eth.ethsecp256k1.PubKey
key: AirjhHwjRcZ34op5yCKHtDkn91RDgFOY8cJmbHH6Tmlu
sequence: "12"
tip: null
body:
extension_options: []
memo: ""
messages:
- '@type': /cosmos.bank.v1beta1.MsgSend
amount:
- amount: "1"
denom: BNB
from_address: 0x525482AB3922230e4D73079890dC905dCc3D37cd
to_address: 0x78C3A3d10B1032bB2810366361dCE84E2e92eFCB
non_critical_extension_options: []
timeout_height: "0"
signatures:
- FjUNT2dzpQZhCmVTLDGMEy1uR1NaNLeYjvqQiPr2xHM5xxeYP5Mic8CSxZtg3k4WHcAIEnQNcszqBi7fsgETagA=
txhash: DFC2CE0514FE334B5BCB6BC3EBCCCD7A6E16B4CAEDC4FFDBE3F2FA3B6E548E61
Depolama Anlaşması Yapma
Veri depolamak, Greenfield'ın en önemli özelliklerinden biridir. Bu bölümde, verilerinizi Greenfield ağına depolama sürecini baştan sona açıklayacağız. Verilerinizi içe aktararak başlayacağız, ardından bir depolama sağlayıcısıyla depolama anlaşması yapacağız ve sonunda anlaşmanın tamamlanmasını bekleyeceğiz.
1. storage.go
dosyası oluşturma
storage.go
adında bir dosya oluşturun ve aşağıdaki başlangıç kodunu ekleyin:
func main() {
// hesap başlat
account, err := types.NewAccountFromPrivateKey("test", privateKey)
log.Println("adres bilgisi:", account)
if err != nil {
log.Fatalf("Özel anahtardan yeni hesap oluşturma hatası, %v", err)
}
// istemci başlat
cli, err := client.New(chainId, rpcAddr, client.Option{DefaultAccount: account})
if err != nil {
log.Fatalf("yeni greenfield istemcisi oluşturulamadı, %v", err)
}
ctx := context.Background()
// 1. depolama sağlayıcısını seç
// 2. Bir kova oluştur
// 3. Verilerinizi yükleyin ve bir kota belirleyin
}
2. SP Seçme
SP listesini sorgulayabilirsiniz.
// depolama sağlayıcıları listesini al
spLists, err := cli.ListStorageProviders(ctx, true)
if err != nil {
log.Fatalf("hizmet sps'inde listeleme başarısız")
}
// birinci sp'yi ana sp olarak seç
primarySP := spLists[0].GetOperatorAddress()
3. Kovalar Oluşturma
Kovalar özel veya genel olabilir. Seçeneklerle özelleştirebilirsiniz.
- VISIBILITY_TYPE_PUBLIC_READ
- VISIBILITY_TYPE_PRIVATE
chargedQuota := uint64(100)
visibility := storageTypes.VISIBILITY_TYPE_PUBLIC_READ
opts := types.CreateBucketOptions{Visibility: visibility, ChargedQuota: chargedQuota}
kota
nın nasıl çalıştığını anlamak için şunu
okuyun.
4. Nesneleri Yükleme
Nesneler de özel veya genel olabilir.
Nesneleri yükleme işlemi iki bölümden oluşur: create
ve put
.
CreateObject
, bir nesne oluşturmanın onayını alır ve nesne oluşturma işlemini Greenfield ağına gönderir.PutObject
, nesneyi kova içine yüklemenin ikinci aşamasını destekler.
// nesne yarat ve yükle
txnHash, err := cli.CreateObject(ctx, bucketName, objectName, bytes.NewReader(buffer.Bytes()), types.CreateObjectOptions{})
handleErr(err, "Nesne Oluştur")
// nesnenizi yükleyin
err = cli.PutObject(ctx, bucketName, objectName, int64(buffer.Len()),
bytes.NewReader(buffer.Bytes()), types.PutObjectOptions{TxnHash: txnHash})
handleErr(err, "Nesne Yükle")
log.Printf("nesne: %s SP'ye yüklendi\n", objectName)
// SP'nin nesnenizi mühürlemesini bekleyin
waitObjectSeal(cli, bucketName, objectName)
Ana SP, veri yedekliliğini ayarlamak için ikincil SP'lerle senkronize olur ve ardından depolama için sonlandırılmış meta verilerle birlikte bir "Seal
" işlemi imzalar. Ana SP, dosyayı herhangi bir nedenle depolamak istemediğine karar verirse, isteği "SealReject
" edebilir.
Nesne Yönetimi
1. Nesneyi Okuma
Verileri indirmek için GetObject
fonksiyonunu çağırabilirsiniz.
// nesneyi al
reader, info, err := cli.GetObject(ctx, bucketName, objectName, types.GetObjectOption{})
handleErr(err, "Nesne Al")
log.Printf("nesneyi %s başarıyla aldık, boyut %d \n", info.ObjectName, info.Size)
handleErr(err, "Nesne Al")
objectBytes, err := io.ReadAll(reader)
if !bytes.Equal(objectBytes, buffer.Bytes()) {
handleErr(errors.New("indirilen içerik aynı değil"), "Nesne Al")
}
2. Nesne Görünürlüğünü Güncelleme
Nesne görünürlüğünü değiştirmek için UpdateObjectVisibility
fonksiyonunu çağırabilirsiniz.
// nesne görünürlüğünü güncelle
updateBucketTx, err := ccli.UpdateBucketVisibility(s.ClientContext, bucketName,
storageTypes.VISIBILITY_TYPE_PRIVATE, types.UpdateVisibilityOption{})
3. Nesneyi Silme
DeleteObject
fonksiyonu nesneleri silmeyi destekler.
// nesneyi sil
delTx, err := cli.DeleteObject(ctx, bucketName, objectName, types.DeleteObjectOption{})
handleErr(err, "Nesne Sil")
_, err = cli.WaitForTx(ctx, delTx)
if err != nil {
log.Fatalln("işlem başarısız")
}
log.Printf("nesne: %s silindi\n", objectName)
Greenfield İstemci Belgeleri
Kullanım
Greenfield Go SDK istemci paketini içe aktarın, istemci paketi Greenfield blok zinciri ve SP'lerle etkileşim için bir istemci sağlar.
import "github.com/bnb-chain/greenfield-go-sdk/client"
Greenfield blok zinciri RPC son noktası ve chainID bilgilerini sağlayarak, bir Greenfield Go SDK istemci örneği oluşturarak yolculuğa başlayın.
func New(chainID string, endpoint string, option Option) (Client, error)
API Belgeleri
Greenfield Go SDK istemcisi, Greenfield ile etkileşim için birçok API'yi sarmalar, bunlar arasında hesap, banka, depolama ve izin API'leri gibi bir dizi API bulunur. Daha fazla detay için Greenfield Go SDK Belgeleri adresine bakabilirsiniz.
Kod Havuzu
Daha Fazla Bilgi
- Greenfield'da Depolama Modülü: Greenfield Zincirindeki depolama modülü.
- Greenfield'da Depolama Sağlayıcısı: Greenfield Zincirindeki depolama sağlayıcısı.
- Veri Erişilebilirlik Mücadelesi: Yüklemenin SP'de saklanma doğruluğu.
Depolama Sağlayıcısı Tanıtımı
: Greenfield Depolama Sağlayıcı belgeleri.Depolama Sağlayıcı Derleme ve Bağımlılıklar
: SP derlenmesi ve bağımlılıkları hakkında ayrıntılı tanıtım.Yerel Depolama Sağlayıcı Ağı Çalıştırma
: Test için yerel SP ortamını çalıştırma tanıtımı.SP Ağına Katılma
: Test ağı veya ana ağda SP ağına katılma tanıtımı.