Ana içeriğe geç

SDK ile Çapraz Zincir Erişim Kontrolü

ipucu

Bu öğretici, nesneler üzerindeki kontrolü BSC üzerindeki akıllı sözleşmeye aktarmak ve zincir üzerindeki yönetimi sağlamak için go-SDK kütüphanesini kullanmayı anlatmaktadır.

Nesne yansıtma, BNB Greenfield'daki merkeziyetsiz depolama üzerinde tüm BSC dApp'leri için daha büyük esneklik ve kontrol sağlar. Bu, BSC'nin yeteneklerinden ve akıllı sözleşme işlevselliğinden yararlanarak her iki platform arasında geliştirilmiş işlevsellik ve birlikte çalışabilirlik sağlar.

Ön koşullar

Başlamadan önce, aşağıdakilerle aşina olmalısınız:

  • Greenfield temelleri
  • Greenfield komut satırı örnekleri

Çapraz Zincir Mekanizması

Çapraz zincir iletişimi, farklı blok zincirleri arasında varlıkların, verilerin ve işlevlerin değişimini sağlayarak daha bağlı ve verimli bir merkeziyetsiz ekosistem oluşturmanın temelini oluşturur.

Not: BNB Greenfield ile BSC arasındaki çapraz iletişim, Polkadot, Chainlink ve Cosmos'un benimsediği yaklaşımlardan pek çok önemli açıdan ayrılmaktadır.

Çapraz zincir iletişim özellikleriBNB Greenfield/BSCCosmos/IBCPolkadotChainlink CCIP
Toplu mesajlaşmaÖzel ve performanslıGenel uygulamaGenel uygulamaGenel uygulama
UyumlulukEVM ve Ethereum L2'lerle tam uyumluYalnızca Cosmos ekosistemiYalnızca Polkadot ekosistemiHer blok zincir için belirli uygulamalar
Güvenlik ModeliKendi doğrulayıcılarıPaylaşılanPaylaşılanKendi doğrulayıcıları
TokenomikBNBATOMDOTLINK
Adres ŞemasıTek - aynı adreslerFarklı adresler olabilirFarklı adresler olabilirFarklı adresler olabilir
Bileşenlerin BirleştirilebilirliğiBNB Zincir ekosistemi ile paylaşılan bileşenlerUygulama aşamasındaPolkadot ekosistemi ile paylaşılan bileşenlerHer ağ için yeni uygulama

Hesap Ayarı

Go Projesi Oluşturma

Gerekli bağımlılıklarla bir Go projesi oluşturalım.

Başlat

$ mkdir ~/hellogreenfield
$ cd ~/hellogreenfield
$ go mod init hellogreenfield

SDK Bağımlılıklarını Ekle

$ go get github.com/bnb-chain/greenfield-go-sdk

go.mod dosyasını düzenleyerek bağımlılıkları değiştirin.

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ükle

go mod tidy

Basit Bir Fonksiyonu Test Etme

Basit bir main.go oluşturmak hakkında bilgi edinmek için genel bakışa bakabilirsiniz.

Her şey doğru bir şekilde ayarlandıysa, kodunuz Greenfield düğümüne bağlanabilir ve yukarıda gösterildiği gibi zincir verilerini döndürebilir.

Hesap Ayarı

account, err := types.NewAccountFromPrivateKey("test", privateKey)
if err != nil {
log.Fatalf("Özel anahtardan yeni hesap oluşturma hatası, %v", err)
}
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()

Kova Oluşturma

Şimdi, içe aktarılan hesapla bir kova oluşturalım.

Bu örnekte,

    // depolama sağlayıcıları listesini al
spLists, err := cli.ListStorageProviders(ctx, true)
if err != nil {
log.Fatalf("hizmetteki sp'leri listeleme başarısız oldu")
}
// ilk sp'yi birincil SP olarak seç
primarySP := spLists[0].GetOperatorAddress()

bucketName := storageTestUtil.GenRandomBucketName()

txHash, err := cli.CreateBucket(ctx, bucketName, primarySP, types.CreateBucketOptions{})
handleErr(err, "CreateBucket")
log.Printf("kova %s SP'de: %s başarıyla oluşturuldu \n", bucketName, spLists[0].Endpoint)

waitForTx, _ := cli.WaitForTx(ctx, txHash)
log.Printf("Tx için bekleyin: %s", waitForTx.TxResult.String())

Örnek dönüş mesajı aşağıdaki gibi olacaktır:

2023/10/31 13:14:54 Kovayı ylatitsb olarak SP'de: https://gnfd-testnet-sp1.bnbchain.org başarıyla oluşturuldu
2023/10/31 13:14:54 Tx için bekleyin: data:"\0225\n+/greenfield.storage.MsgCreateBucketResponse\022\006\n\0043175\032\010\000\000\000\000\000\000\201\006" log:"[{\"msg_index\":0,\"events\":[{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/greenfield.storage.MsgCreateBucket\"},{\"key\":\"sender\",\"value\":\"0x525482AB3922230e4D73079890dC905dCc3D37cd\"},{\"key\":\"module\",\"value\":\"storage\"}]},{\"type\":\"greenfield.storage.EventCreateBucket\",\"attributes\":[{\"key\":\"bucket_id\",\"value\":\"\\\"3175\\\"\"},{\"key\":\"bucket_name\",\"value\":\"\\\"ylatitsb\\\"\"},{\"key\":\"charged_read_quota\",\"value\":\"\\\"0\\\"\"},{\"key\":\"create_at\",\"value\":\"\\\"1698779691\\\"\"},{\"key\":\"global_virtual_group_family_id\",\"value\":\"40\"},{\"key\":\"owner\",\"value\":\"\\\"0x525482AB3922230e4D73079890dC905dCc3D37cd\\\"\"},{\"key\":\"payment_address\",\"value\":\"\\\"0x525482AB3922230e4D73079890dC905dCc3D37cd\\\"\"},{\"key\":\"primary_sp_id\",\"value\":\"1\"},{\"key\":\"source_type\",\"value\":\"\\\"SOURCE_TYPE_ORIGIN\\\"\"},{\"key\":\"status\",\"value\":\"\\\"BUCKET_STATUS_CREATED\\\"\"},{\"key\":\"visibility\",\"value\":\"\\\"VISIBILITY_TYPE_PRIVATE\\\"\"}]}]}]" gas_wanted:2400 gas_used:2400 events:<type:"coin_spent" attributes:<key:"spender" value:"0x525482AB3922230e4D73079890dC905dCc3D37cd" index:true > attributes:<key:"amount" value:"12000000000000BNB" index:true > > events:<type:"coin_received" attributes:<key:"receiver" value:"0xf1829676DB577682E944fc3493d451B67Ff3E29F" index:true > attributes:<key:"amount" value:"12000000000000BNB" index:true > > events:<type:"transfer" attributes:<key:"recipient" value:"0xf1829676DB577682E944fc3493d451B67Ff3E29F" index:true > attributes:<key:"sender" value:"0x525482AB3922230e4D73079890dC905dCc3D37cd" index:true > attributes:<key:"amount" value:"12000000000000BNB" index:true > > events:<type:"message" attributes:<key:"sender" value:"0x525482AB3922230e4D73079890dC905dCc3D37cd" index:true > > events:<type:"tx" attributes:<key:"fee" value:"12000000000000BNB" index:true > attributes:<key:"fee_payer" value:"0x525482AB3922230e4D73079890dC905dCc3D37cd" index:true > > events:<type:"tx" attributes:<key:"acc_seq" value:"0x525482AB3922230e4D73079890dC905dCc3D37cd/70" index:true > > events:<type:"tx" attributes:<key:"signature" value:"aKL7wpB1b0107d1OleaHKKBw5mXUskggINbq7hsr90s6MzgV88DxjAGak37xz9V4LsoH0sr7saqBmBrE5MKJtgA=" index:true > > events:<type:"message" attributes:<key:"action" value:"/greenfield.storage.MsgCreateBucket" index:true > attributes:<key:"sender" value:"0x525482AB3922230e4D73079890dC905dCc3D37cd" index:true > attributes:<key:"module" value:"storage" index:true > > events:<type:"greenfield.storage.EventCreateBucket" attributes:<key:"bucket_id" value:"\"3175\"" index:true > attributes:<key:"bucket_name" value:"\"ylatitsb\"" index:true > attributes:<key:"charged_read_quota" value:"\"0\"" index:true > attributes:<key:"create_at" value:"\"1698779691\"" index:true > attributes:<key:"global_virtual_group_family_id" value:"40" index:true > attributes:<key:"owner" value:"\"0x525482AB3922230e4D73079890dC905dCc3D37cd\"" index:true > attributes:<key:"payment_address" value:"\"0x525482AB3922230e4D73079890dC905dCc3D37cd\"" index:true > attributes:<key:"primary_sp_id" value:"1" index:true > attributes:<key:"source_type" value:"\"SOURCE_TYPE_ORIGIN\"" index:true > attributes:<key:"status" value:"\"BUCKET_STATUS_CREATED\"" index:true > attributes:<key:"visibility" value:"\"VISIBILITY_TYPE_PRIVATE\"" index:true > >
  • HeadBucket fonksiyonu ile kovayı sorgulama
    // başlık kova
bucketInfo, err := cli.HeadBucket(ctx, bucketName)
handleErr(err, "HeadBucket")
log.Println("kova bilgisi:", bucketInfo.String())

Örnek dönüş mesajı aşağıdaki gibi olacaktır:

2023/10/31 13:14:54 kova bilgisi: owner:"0x525482AB3922230e4D73079890dC905dCc3D37cd" bucket_name:"ylatitsb" visibility:VISIBILITY_TYPE_PRIVATE id:"3175" create_at:1698779691 payment_address:"0x525482AB3922230e4D73079890dC905dCc3D37cd" global_virtual_group_family_id:40

Grup Oluşturma

Sonraki adım, ana hesap tarafından nesneyi alma erişimini alacak bir grup oluşturmaktır.

  // grup oluştur
groupTx, err := cli.CreateGroup(ctx, groupName, types.CreateGroupOptions{})
handleErr(err, "CreateGroup")
_, err = cli.WaitForTx(ctx, groupTx)
if err != nil {
log.Fatalln("txn başarısız")
}

log.Printf("grup %s başarıyla oluşturuldu \n", groupName)

// grup bilgilerini al
creator, err := cli.GetDefaultAccount()
handleErr(err, "GetDefaultAccount")
groupInfo, err := cli.HeadGroup(ctx, groupName, creator.GetAddress().String())
handleErr(err, "HeadGroup")
log.Println("grup bilgileri:", groupInfo.String())

_, err = sdk.AccAddressFromHexUnsafe(memberAddress)
if err != nil {
log.Fatalln("grup üyesi geçersiz")
}
// grup üyesi ekle
updateTx, err := cli.UpdateGroupMember(ctx, groupName, creator.GetAddress().String(), []string{memberAddress}, []string{},
types.UpdateGroupMemberOption{})
handleErr(err, "UpdateGroupMember")
_, err = cli.WaitForTx(ctx, updateTx)
if err != nil {
log.Fatalln("txn başarısız")
}

log.Printf("gruba üye ekle: %s grup: %s başarıyla \n", memberAddress, groupName)

// grup üyesini başlık al
memIsExist := cli.HeadGroupMember(ctx, groupName, creator.GetAddress().String(), memberAddress)
if !memIsExist {
log.Fatalf("grup üyesi başlığı alma %s başarısız \n", memberAddress)
}

log.Printf(" üye %s mevcut \n", memberAddress)

Sonuç aşağıdaki gibi görünmelidir:

2023/10/31 09:34:54 grup oluşturma örnek-grubu başarıyla
2023/10/31 09:34:54 grup bilgileri: owner:"0x525482AB3922230e4D73079890dC905dCc3D37cd" group_name:"örnek-grubu" id:"720"
2023/10/31 09:35:01 grup üyesi: 0x843e77D639b6C382e91ef489881963209cB238E5 gruba başarıyla eklendi: örnek-grubu
2023/10/31 09:35:01 üye 0x843e77D639b6C382e91ef489881963209cB238E5 mevcut

Politika Oluşturma

Artık, ana hesap bu gruba nesneyi alma erişimi vermek için izin verebilir.

// kova politikasını koy
bucketActions := []permTypes.ActionType{
permTypes.ACTION_GET_OBJECT,
}
ctx := context.Background()
statements := utils.NewStatement(bucketActions, permTypes.EFFECT_ALLOW, nil, types.NewStatementOptions{})

policyTx, err := cli.PutBucketPolicy(ctx, bucketName, principalStr, []*permTypes.Statement{&statements},
types.PutPolicyOption{})
handleErr(err, "PutBucketPolicy")
_, err = cli.WaitForTx(ctx, policyTx)
if err != nil {
log.Fatalln("txn başarısız")
}
log.Printf("kova %s politikası başarıyla konuldu, ilke: %s.\n", bucketName, principal)

Kodunuzu çalıştırdıktan sonra sonuç aşağıdaki gibi görünmelidir:

2023/10/31 10:46:55 kova sdkexamplebucket politikası başarıyla konuldu, ilke:
2023/10/31 10:46:55 kova: sdkexamplebucket politika bilgisi:id:"2358" principal:<type:PRINCIPAL_TYPE_GNFD_ACCOUNT value:"0x843e77D639b6C382e91ef489881963209cB238E5" > resource_type:RESOURCE_TYPE_BUCKET resource_id:"429" statements:<effect:EFFECT_ALLOW actions:ACTION_UPDATE_BUCKET_INFO actions:ACTION_DELETE_BUCKET actions:ACTION_DELETE_OBJECT actions:ACTION_GET_OBJECT >

Blok tarayıcısı kullanarak da inceleyebilirsiniz, örneğin: https://greenfieldscan.com.


Grubu BSC'ye Yansıtma

Greenfield'de, nesne yansıtma, BNB Greenfield'da depolanan nesneler üzerindeki kontrolün BNB Akıllı Zincir (BSC) üzerindeki bir akıllı sözleşmeye aktarılmasını ifade eder.

Bu, nesnenin BSC'de zincir üzerinde tamamen yönetilmesini sağlar; bu, kullanıcıların veya diğer akıllı sözleşmelerin çeşitli işlemleri gerçekleştirmelerini ve nesne üzerinde değişiklikler yapmalarını sağlar.

Uyarı: BNB Greenfield'den BSC'ye yansıtma sürecinde, dosyanın kendisinin kopyalanmadığı anlamına gelir. Bu, BNB Greenfield blok zincirinde depolanan verilerin veya dosya meta verilerinin BSC'ye aktarılmadığı anlamına gelir.

    // grup bilgileri
groupInfo, err := cli.HeadGroup(ctx, groupName, creator.GetAddress().String())
handleErr(err, "HeadGroup")
log.Println("grup bilgileri:", groupInfo.String())

// kova yansıtma
txResp, err := cli.MirrorGroup(ctx, sdk.ChainID(crossChainDestBsChainId), groupInfo.Id, groupName, gnfdSdkTypes.TxOption{})
handleErr(err, "MirrorGroup")
waitForTx, _ = cli.WaitForTx(ctx, txResp.TxHash)
log.Printf("Tx için bekleyin: %s", waitForTx.TxResult.String())
log.Printf("başarıyla grup yansıtıldı id %s BSC'ye", groupInfo.Id)
2023/10/31 21:43:57 grup: sdkexamplegroup politika bilgisi:id:"712" principal:<type:PRINCIPAL_TYPE_GNFD_ACCOUNT value:"0x843e77D639b6C382e91ef489881963209cB238E5" > resource_type:RESOURCE_TYPE_BUCKET resource_id:"429" statements:<effect:EFFECT_ALLOW actions:ACTION_GET_OBJECT >
2023/10/31 21:43:57 kova bilgisi: owner:"0x525482AB3922230e4D73079890dC905dCc3D37cd" bucket_name:"ylatitsb" visibility:VISIBILITY_TYPE_PRIVATE id:"3175" create_at:1698779691 payment_address:"0x525482AB3922230e4D73079890dC905dCc3D37cd" global_virtual_group_family_id:40

Blok tarayıcısı kullanarak da inceleyebilirsiniz, örneğin: https://greenfieldscan.com.


BSC'deki Erişim Kontrol Yönetimi

Artık grubunuzu BSC'ye yansıttınız ve bir ERCC-721 tokenı çıkarıldı. Şu anda, NFT'ler taşınabilir değildir. Grup üyeliği BSC'deki akıllı sözleşmeler tarafından doğrudan yönetilebilir. Bu işlemler, Greenfield Sözleşmesi yardımıyla verilerin depolama formatı, erişim izinleri ve diğer yönlerini doğrudan etkiler.

Öncelikle, bağımlılıkları yüklemeli ve çevreyi kurmalısınız; kılavuzları takip edin.

Her şey hazır olduğunda, grubunuza üye eklemek için aşağıdaki betiği çalıştırabilirsiniz:

# özel anahtarınızı, operatör adresinizi, grup kimliğinizi ve ekleyeceğiniz üye adresini ayarlayın
forge script foundry-scripts/GroupHub.s.sol:GroupHubScript \
--private-key ${your private key} \
--sig "addMember(address operator, uint256 groupId, address member)" \
${the owner of the group} ${your group id} ${the member address to add} \
-f https://data-seed-prebsc-1-s1.binance.org:8545/ \
--legacy --ffi --broadcast

Kaynak Kodu